From 93a27d22e401bcbfaa972bea803baae309b45e05 Mon Sep 17 00:00:00 2001 From: Xottab_DUTY Date: Mon, 1 Apr 2019 00:20:31 +0500 Subject: [PATCH] Added sound libs from OpenXRay 1.6 --- cs/3rd party/libogg/.gitignore | 33 + cs/3rd party/libogg/AUTHORS | 7 + cs/3rd party/libogg/CHANGES | 88 + cs/3rd party/libogg/CMakeLists.txt | 114 + cs/3rd party/libogg/COPYING | 28 + cs/3rd party/libogg/Makefile.am | 32 + cs/3rd party/libogg/README.md | 131 + cs/3rd party/libogg/appveyor.yml | 19 + cs/3rd party/libogg/autogen.sh | 12 + cs/3rd party/libogg/configure.ac | 185 + cs/3rd party/libogg/doc/Makefile.am | 9 + cs/3rd party/libogg/doc/fish_xiph_org.png | Bin 0 -> 2536 bytes cs/3rd party/libogg/doc/framing.html | 429 + cs/3rd party/libogg/doc/index.html | 105 + cs/3rd party/libogg/doc/libogg/Makefile.am | 39 + .../libogg/doc/libogg/bitpacking.html | 103 + .../libogg/doc/libogg/datastructures.html | 59 + cs/3rd party/libogg/doc/libogg/decoding.html | 104 + cs/3rd party/libogg/doc/libogg/encoding.html | 76 + cs/3rd party/libogg/doc/libogg/general.html | 109 + cs/3rd party/libogg/doc/libogg/index.html | 39 + .../libogg/doc/libogg/ogg_iovec_t.html | 62 + .../libogg/doc/libogg/ogg_packet.html | 75 + .../libogg/doc/libogg/ogg_packet_clear.html | 64 + cs/3rd party/libogg/doc/libogg/ogg_page.html | 75 + .../libogg/doc/libogg/ogg_page_bos.html | 65 + .../doc/libogg/ogg_page_checksum_set.html | 62 + .../libogg/doc/libogg/ogg_page_continued.html | 64 + .../libogg/doc/libogg/ogg_page_eos.html | 65 + .../doc/libogg/ogg_page_granulepos.html | 65 + .../libogg/doc/libogg/ogg_page_packets.html | 75 + .../libogg/doc/libogg/ogg_page_pageno.html | 63 + .../libogg/doc/libogg/ogg_page_serialno.html | 63 + .../libogg/doc/libogg/ogg_page_version.html | 63 + .../libogg/doc/libogg/ogg_stream_check.html | 71 + .../libogg/doc/libogg/ogg_stream_clear.html | 61 + .../libogg/doc/libogg/ogg_stream_destroy.html | 71 + .../libogg/doc/libogg/ogg_stream_eos.html | 62 + .../libogg/doc/libogg/ogg_stream_flush.html | 67 + .../doc/libogg/ogg_stream_flush_fill.html | 74 + .../libogg/doc/libogg/ogg_stream_init.html | 66 + .../libogg/doc/libogg/ogg_stream_iovecin.html | 80 + .../doc/libogg/ogg_stream_packetin.html | 72 + .../doc/libogg/ogg_stream_packetout.html | 85 + .../doc/libogg/ogg_stream_packetpeek.html | 85 + .../libogg/doc/libogg/ogg_stream_pagein.html | 67 + .../libogg/doc/libogg/ogg_stream_pageout.html | 84 + .../doc/libogg/ogg_stream_pageout_fill.html | 89 + .../libogg/doc/libogg/ogg_stream_reset.html | 61 + .../doc/libogg/ogg_stream_reset_serialno.html | 67 + .../libogg/doc/libogg/ogg_stream_state.html | 121 + .../libogg/doc/libogg/ogg_sync_buffer.html | 67 + .../libogg/doc/libogg/ogg_sync_check.html | 71 + .../libogg/doc/libogg/ogg_sync_clear.html | 62 + .../libogg/doc/libogg/ogg_sync_destroy.html | 68 + .../libogg/doc/libogg/ogg_sync_init.html | 63 + .../libogg/doc/libogg/ogg_sync_pageout.html | 77 + .../libogg/doc/libogg/ogg_sync_pageseek.html | 68 + .../libogg/doc/libogg/ogg_sync_reset.html | 63 + .../libogg/doc/libogg/ogg_sync_state.html | 77 + .../libogg/doc/libogg/ogg_sync_wrote.html | 73 + .../libogg/doc/libogg/oggpack_adv.html | 64 + .../libogg/doc/libogg/oggpack_adv1.html | 62 + .../libogg/doc/libogg/oggpack_bits.html | 62 + .../libogg/doc/libogg/oggpack_buffer.html | 66 + .../libogg/doc/libogg/oggpack_bytes.html | 67 + .../libogg/doc/libogg/oggpack_get_buffer.html | 62 + .../libogg/doc/libogg/oggpack_look.html | 66 + .../libogg/doc/libogg/oggpack_look1.html | 63 + .../libogg/doc/libogg/oggpack_read.html | 65 + .../libogg/doc/libogg/oggpack_read1.html | 63 + .../libogg/doc/libogg/oggpack_readinit.html | 64 + .../libogg/doc/libogg/oggpack_reset.html | 62 + .../libogg/doc/libogg/oggpack_write.html | 68 + .../libogg/doc/libogg/oggpack_writealign.html | 65 + .../libogg/doc/libogg/oggpack_writecheck.html | 81 + .../libogg/doc/libogg/oggpack_writeclear.html | 62 + .../libogg/doc/libogg/oggpack_writecopy.html | 69 + .../libogg/doc/libogg/oggpack_writeinit.html | 62 + .../libogg/doc/libogg/oggpack_writetrunc.html | 65 + cs/3rd party/libogg/doc/libogg/overview.html | 44 + cs/3rd party/libogg/doc/libogg/reference.html | 98 + cs/3rd party/libogg/doc/libogg/style.css | 7 + cs/3rd party/libogg/doc/multiplex1.png | Bin 0 -> 54409 bytes cs/3rd party/libogg/doc/multiplex1.svg | 632 + cs/3rd party/libogg/doc/ogg-multiplex.html | 446 + cs/3rd party/libogg/doc/oggstream.html | 594 + cs/3rd party/libogg/doc/packets.png | Bin 0 -> 19776 bytes cs/3rd party/libogg/doc/packets.svg | 876 + cs/3rd party/libogg/doc/pages.png | Bin 0 -> 43547 bytes cs/3rd party/libogg/doc/pages.svg | 1219 ++ cs/3rd party/libogg/doc/rfc3533.txt | 843 + cs/3rd party/libogg/doc/rfc3534.txt | 339 + cs/3rd party/libogg/doc/rfc5334.txt | 787 + cs/3rd party/libogg/doc/skeleton.html | 222 + cs/3rd party/libogg/doc/stream.png | Bin 0 -> 2254 bytes cs/3rd party/libogg/doc/vorbisword2.png | Bin 0 -> 1394 bytes cs/3rd party/libogg/doc/white-ogg.png | Bin 0 -> 2652 bytes cs/3rd party/libogg/doc/white-xifish.png | Bin 0 -> 965 bytes cs/3rd party/libogg/include/Makefile.am | 3 + cs/3rd party/libogg/include/ogg/Makefile.am | 6 + .../libogg/include/ogg/config_types.h.in | 25 + cs/3rd party/libogg/include/ogg/ogg.h | 210 + cs/3rd party/libogg/include/ogg/os_types.h | 148 + cs/3rd party/libogg/libogg.spec.in | 109 + .../macosx/English.lproj/InfoPlist.strings | Bin 0 -> 136 bytes cs/3rd party/libogg/macosx/Info.plist | 30 + .../macosx/Ogg.xcodeproj/project.pbxproj | 363 + cs/3rd party/libogg/macosx/Ogg_Prefix.pch | 5 + cs/3rd party/libogg/ogg-uninstalled.pc.in | 14 + cs/3rd party/libogg/ogg.m4 | 116 + cs/3rd party/libogg/ogg.pc.in | 14 + cs/3rd party/libogg/releases.sha2 | 34 + cs/3rd party/libogg/src/Makefile.am | 28 + cs/3rd party/libogg/src/bitwise.c | 1088 ++ cs/3rd party/libogg/src/framing.c | 2111 +++ cs/3rd party/libogg/symbian/bld.inf | 35 + cs/3rd party/libogg/symbian/ogg.mmp | 39 + cs/3rd party/libogg/win32/.gitignore | 21 + .../libogg/win32/VS2015/libogg_dynamic.sln | 26 + .../win32/VS2015/libogg_dynamic.vcxproj | 187 + .../libogg/win32/VS2015/libogg_static.sln | 26 + .../libogg/win32/VS2015/libogg_static.vcxproj | 174 + cs/3rd party/libogg/win32/ogg.def | 78 + cs/3rd party/libogg_static.vcxproj | 156 + cs/3rd party/libtheora/.gitignore | 72 + cs/3rd party/libtheora/AUTHORS | 56 + cs/3rd party/libtheora/CHANGES | 255 + cs/3rd party/libtheora/COPYING | 28 + cs/3rd party/libtheora/LICENSE | 18 + cs/3rd party/libtheora/Makefile.am | 35 + cs/3rd party/libtheora/README | 156 + cs/3rd party/libtheora/SConstruct | 262 + cs/3rd party/libtheora/autogen.sh | 130 + cs/3rd party/libtheora/configure.ac | 646 + cs/3rd party/libtheora/doc/Doxyfile.in | 1630 ++ cs/3rd party/libtheora/doc/Makefile.am | 72 + cs/3rd party/libtheora/doc/color.html | 602 + .../doc/draft-ietf-avt-rtp-theora-00.txt | 1400 ++ .../doc/draft-ietf-avt-rtp-theora-00.xml | 1146 ++ .../doc/draft-kerr-avt-theora-rtp-00.txt | 1512 ++ .../doc/draft-kerr-avt-theora-rtp-00.xml | 1277 ++ cs/3rd party/libtheora/doc/spec/Makefile.am | 81 + cs/3rd party/libtheora/doc/spec/fdct.fig | 371 + .../libtheora/doc/spec/hilbert-block.fig | 104 + .../libtheora/doc/spec/hilbert-mb.fig | 32 + cs/3rd party/libtheora/doc/spec/idct.fig | 369 + cs/3rd party/libtheora/doc/spec/lflim.fig | 23 + cs/3rd party/libtheora/doc/spec/ltablex.sty | 237 + .../libtheora/doc/spec/macroblock.fig | 37 + cs/3rd party/libtheora/doc/spec/pic-frame.fig | 75 + cs/3rd party/libtheora/doc/spec/pic_even.fig | 102 + .../libtheora/doc/spec/pic_even_odd.fig | 88 + cs/3rd party/libtheora/doc/spec/pic_odd.fig | 90 + .../libtheora/doc/spec/pic_odd_even.fig | 84 + cs/3rd party/libtheora/doc/spec/pixel420.fig | 56 + cs/3rd party/libtheora/doc/spec/pixel422.fig | 70 + cs/3rd party/libtheora/doc/spec/pixel444.fig | 44 + .../libtheora/doc/spec/raster-block.fig | 91 + .../libtheora/doc/spec/reference-frames.fig | 46 + cs/3rd party/libtheora/doc/spec/spec.bib | 120 + cs/3rd party/libtheora/doc/spec/spec.tex | 8195 ++++++++++ .../libtheora/doc/spec/superblock.fig | 72 + cs/3rd party/libtheora/doc/spec/vp3huff.c | 918 ++ cs/3rd party/libtheora/doc/spec/xifish.fig | 85 + cs/3rd party/libtheora/doc/vp3-format.txt | 1305 ++ cs/3rd party/libtheora/examples/Makefile.am | 48 + .../libtheora/examples/README_SPLAYER | 21 + cs/3rd party/libtheora/examples/dump_psnr.c | 1210 ++ cs/3rd party/libtheora/examples/dump_video.c | 565 + .../libtheora/examples/encoder_example.c | 1889 +++ cs/3rd party/libtheora/examples/getopt.c | 1055 ++ cs/3rd party/libtheora/examples/getopt.h | 180 + cs/3rd party/libtheora/examples/getopt1.c | 188 + .../libtheora/examples/libtheora_info.c | 141 + .../libtheora/examples/player_example.c | 887 ++ cs/3rd party/libtheora/examples/png2theora.c | 942 ++ cs/3rd party/libtheora/examples/splayer.c | 1107 ++ cs/3rd party/libtheora/examples/tiff2theora.c | 885 ++ cs/3rd party/libtheora/include/Makefile.am | 3 + .../libtheora/include/theora/Makefile.am | 7 + cs/3rd party/libtheora/include/theora/codec.h | 606 + .../libtheora/include/theora/theora.h | 786 + .../libtheora/include/theora/theoradec.h | 329 + .../libtheora/include/theora/theoraenc.h | 548 + cs/3rd party/libtheora/libtheora.spec.in | 82 + cs/3rd party/libtheora/m4/Makefile.am | 6 + .../macosx/English.lproj/InfoPlist.strings | Bin 0 -> 142 bytes cs/3rd party/libtheora/macosx/Info.plist | 30 + .../macosx/Theora.xcodeproj/project.pbxproj | 872 + .../libtheora/macosx/Theora_Prefix.pch | 5 + cs/3rd party/libtheora/symbian/bld.inf | 35 + cs/3rd party/libtheora/symbian/theora.mmp | 41 + cs/3rd party/libtheora/tests/Makefile.am | 68 + cs/3rd party/libtheora/tests/comment.c | 91 + cs/3rd party/libtheora/tests/comment_theora.c | 91 + cs/3rd party/libtheora/tests/granulepos.c | 149 + .../libtheora/tests/granulepos_theora.c | 145 + cs/3rd party/libtheora/tests/noop.c | 123 + cs/3rd party/libtheora/tests/noop_theora.c | 94 + cs/3rd party/libtheora/tests/tests.h | 33 + .../libtheora/theora-uninstalled.pc.in | 14 + cs/3rd party/libtheora/theora.pc.in | 14 + .../libtheora/theoradec-uninstalled.pc.in | 14 + cs/3rd party/libtheora/theoradec.pc.in | 14 + .../libtheora/theoraenc-uninstalled.pc.in | 14 + cs/3rd party/libtheora/theoraenc.pc.in | 14 + .../libtheora/tools/process_modedec_stats.c | 240 + cs/3rd party/libtheora/win32/VS2005/README | 22 + .../dump_video/dump_video_dynamic.vcproj | 690 + .../dump_video/dump_video_static.vcproj | 690 + .../encoder_example_dynamic.vcproj | 706 + .../encoder_example_static.vcproj | 708 + .../libtheora/win32/VS2005/libogg.vsprops | 19 + .../VS2005/libtheora/libtheora_dynamic.vcproj | 2905 ++++ .../VS2005/libtheora/libtheora_static.vcproj | 2809 ++++ .../win32/VS2005/libtheora_dynamic.sln | 46 + .../win32/VS2005/libtheora_static.sln | 46 + .../libtheora/win32/VS2005/libvorbis.vsprops | 19 + cs/3rd party/libtheora/win32/VS2008/README | 22 + .../dump_video/dump_video_dynamic.vcproj | 683 + .../dump_video/dump_video_static.vcproj | 683 + .../encoder_example_dynamic.vcproj | 699 + .../encoder_example_static.vcproj | 699 + .../libtheora/win32/VS2008/libogg.vsprops | 19 + .../VS2008/libtheora/libtheora_dynamic.vcproj | 2598 +++ .../VS2008/libtheora/libtheora_static.vcproj | 2470 +++ .../win32/VS2008/libtheora_dynamic.sln | 146 + .../win32/VS2008/libtheora_static.sln | 146 + .../libtheora/win32/VS2008/libvorbis.vsprops | 19 + cs/3rd party/libtheora/win32/VS2010/README | 22 + .../dump_video/dump_video_dynamic.vcxproj | 198 + .../dump_video/dump_video_static.vcxproj | 198 + .../encoder_example_dynamic.vcxproj | 204 + .../encoder_example_static.vcxproj | 204 + .../libtheora/win32/VS2010/libogg.props | 22 + .../libtheora/libtheora_dynamic.vcxproj | 285 + .../VS2010/libtheora/libtheora_static.vcxproj | 251 + .../win32/VS2010/libtheora_dynamic.sln | 46 + .../win32/VS2010/libtheora_static.sln | 46 + .../libtheora/win32/VS2010/libvorbis.props | 22 + .../libtheora/win32/build_theora_static.bat | 18 + .../win32/build_theora_static_debug.bat | 18 + .../win32/experimental/dumpvid/dumpvid.dsp | 121 + .../win32/experimental/encoderwin/ReadMe.txt | 13 + .../experimental/encoderwin/encoderwin.dsp | 121 + .../experimental/transcoder/avi2vp3/avi2vp3.c | 82 + .../experimental/transcoder/avi2vp3/avilib.c | 1839 +++ .../experimental/transcoder/avi2vp3/avilib.h | 309 + .../transcoder/avi2vp3/outfile.vp3 | Bin 0 -> 233132 bytes .../experimental/transcoder/avi2vp3/vp31.avi | Bin 0 -> 299724 bytes .../win32/experimental/transcoder/readme.txt | 17 + .../experimental/transcoder/transcoder.dsp | 121 + .../transcoder/transcoder_example.c | 926 ++ .../win32/experimental/wincompat/README.txt | 1 + .../win32/experimental/wincompat/getopt.c | 122 + .../win32/experimental/wincompat/getopt.h | 110 + .../experimental/wincompat/getopt_long.c | 547 + .../win32/experimental/wincompat/unistd.h | 0 cs/3rd party/libtheora/win32/getopt.c | 1047 ++ cs/3rd party/libtheora/win32/getopt1.c | 188 + cs/3rd party/libtheora/win32/getopt_win.h | 169 + .../libtheora/win32/theora_static.dsp | 336 + .../win32/xmingw32/libtheoradec-all.def | 58 + .../win32/xmingw32/libtheoradec-all.rc | 39 + .../libtheora/win32/xmingw32/libtheoradec.rc | 3 + .../win32/xmingw32/libtheoradec70.rc | 3 + .../win32/xmingw32/libtheoradec70d.rc | 3 + .../win32/xmingw32/libtheoradec71.rc | 3 + .../win32/xmingw32/libtheoradec71d.rc | 3 + .../win32/xmingw32/libtheoradec80.rc | 3 + .../win32/xmingw32/libtheoradec80d.rc | 3 + .../libtheora/win32/xmingw32/libtheoradecd.rc | 3 + .../win32/xmingw32/libtheoraenc-all.def | 17 + .../win32/xmingw32/libtheoraenc-all.rc | 39 + .../libtheora/win32/xmingw32/libtheoraenc.rc | 3 + .../win32/xmingw32/libtheoraenc70.rc | 3 + .../win32/xmingw32/libtheoraenc70d.rc | 3 + .../win32/xmingw32/libtheoraenc71.rc | 3 + .../win32/xmingw32/libtheoraenc71d.rc | 3 + .../win32/xmingw32/libtheoraenc80.rc | 3 + .../win32/xmingw32/libtheoraenc80d.rc | 3 + .../libtheora/win32/xmingw32/libtheoraencd.rc | 3 + cs/3rd party/libtheora_static.vcxproj | 210 + cs/3rd party/libvorbis/.gitignore | 40 + cs/3rd party/libvorbis/AUTHORS | 3 + cs/3rd party/libvorbis/CHANGES | 152 + cs/3rd party/libvorbis/CMakeLists.txt | 81 + cs/3rd party/libvorbis/COPYING | 28 + cs/3rd party/libvorbis/Makefile.am | 47 + cs/3rd party/libvorbis/README.md | 149 + cs/3rd party/libvorbis/appveyor.yml | 32 + cs/3rd party/libvorbis/autogen.sh | 12 + cs/3rd party/libvorbis/configure.ac | 304 + cs/3rd party/libvorbis/debian/changelog | 208 + cs/3rd party/libvorbis/debian/control | 60 + cs/3rd party/libvorbis/debian/copyright | 38 + .../libvorbis/debian/libvorbis-dev.docs | 1 + .../libvorbis/debian/libvorbis-dev.examples | 2 + .../libvorbis/debian/libvorbis-dev.install | 16 + .../libvorbis/debian/libvorbis0a.install | 1 + .../libvorbis/debian/libvorbisenc2.install | 1 + .../libvorbis/debian/libvorbisfile3.install | 1 + cs/3rd party/libvorbis/debian/rules | 154 + cs/3rd party/libvorbis/debian/watch | 3 + .../libvorbis/doc/01-introduction.tex | 529 + cs/3rd party/libvorbis/doc/02-bitpacking.tex | 247 + cs/3rd party/libvorbis/doc/03-codebook.tex | 457 + cs/3rd party/libvorbis/doc/04-codec.tex | 661 + cs/3rd party/libvorbis/doc/05-comment.tex | 240 + cs/3rd party/libvorbis/doc/06-floor0.tex | 202 + cs/3rd party/libvorbis/doc/07-floor1.tex | 405 + cs/3rd party/libvorbis/doc/08-residue.tex | 452 + cs/3rd party/libvorbis/doc/09-helper.tex | 181 + cs/3rd party/libvorbis/doc/10-tables.tex | 77 + cs/3rd party/libvorbis/doc/Doxyfile.in | 1142 ++ cs/3rd party/libvorbis/doc/Makefile.am | 148 + cs/3rd party/libvorbis/doc/Vorbis_I_spec.cfg | 4 + cs/3rd party/libvorbis/doc/Vorbis_I_spec.css | 144 + cs/3rd party/libvorbis/doc/Vorbis_I_spec.html | 13243 ++++++++++++++++ cs/3rd party/libvorbis/doc/Vorbis_I_spec.pdf | Bin 0 -> 418532 bytes cs/3rd party/libvorbis/doc/Vorbis_I_spec.tex | 142 + .../libvorbis/doc/Vorbis_I_spec0x.png | Bin 0 -> 1341 bytes .../libvorbis/doc/Vorbis_I_spec10x.png | Bin 0 -> 3781 bytes .../libvorbis/doc/Vorbis_I_spec11x.png | Bin 0 -> 3825 bytes .../libvorbis/doc/Vorbis_I_spec12x.png | Bin 0 -> 3371 bytes .../libvorbis/doc/Vorbis_I_spec13x.png | Bin 0 -> 1768 bytes .../libvorbis/doc/Vorbis_I_spec14x.png | Bin 0 -> 1792 bytes .../libvorbis/doc/Vorbis_I_spec1x.png | Bin 0 -> 556 bytes .../libvorbis/doc/Vorbis_I_spec2x.png | Bin 0 -> 556 bytes .../libvorbis/doc/Vorbis_I_spec3x.png | Bin 0 -> 556 bytes .../libvorbis/doc/Vorbis_I_spec4x.png | Bin 0 -> 556 bytes .../libvorbis/doc/Vorbis_I_spec5x.png | Bin 0 -> 556 bytes .../libvorbis/doc/Vorbis_I_spec6x.png | Bin 0 -> 557 bytes .../libvorbis/doc/Vorbis_I_spec7x.png | Bin 0 -> 2436 bytes .../libvorbis/doc/Vorbis_I_spec8x.png | Bin 0 -> 2569 bytes .../libvorbis/doc/Vorbis_I_spec9x.png | Bin 0 -> 1819 bytes .../libvorbis/doc/a1-encapsulation-ogg.tex | 185 + .../libvorbis/doc/a2-encapsulation-rtp.tex | 9 + cs/3rd party/libvorbis/doc/components.png | Bin 0 -> 9741 bytes cs/3rd party/libvorbis/doc/eightphase.png | Bin 0 -> 11130 bytes cs/3rd party/libvorbis/doc/fish_xiph_org.png | Bin 0 -> 2503 bytes cs/3rd party/libvorbis/doc/floor1-1.png | Bin 0 -> 3420 bytes cs/3rd party/libvorbis/doc/floor1-2.png | Bin 0 -> 3752 bytes cs/3rd party/libvorbis/doc/floor1-3.png | Bin 0 -> 4627 bytes cs/3rd party/libvorbis/doc/floor1-4.png | Bin 0 -> 4163 bytes .../doc/floor1_inverse_dB_table.html | 154 + cs/3rd party/libvorbis/doc/floorval.png | Bin 0 -> 2545 bytes cs/3rd party/libvorbis/doc/footer.tex | 32 + cs/3rd party/libvorbis/doc/fourphase.png | Bin 0 -> 9992 bytes cs/3rd party/libvorbis/doc/framing.html | 431 + cs/3rd party/libvorbis/doc/helper.html | 239 + cs/3rd party/libvorbis/doc/hufftree-under.png | Bin 0 -> 1206 bytes cs/3rd party/libvorbis/doc/hufftree.png | Bin 0 -> 1228 bytes cs/3rd party/libvorbis/doc/index.html | 114 + .../libvorbis/doc/libvorbis/Makefile.am | 24 + .../libvorbis/doc/libvorbis/index.html | 44 + .../libvorbis/doc/libvorbis/overview.html | 136 + .../libvorbis/doc/libvorbis/reference.html | 86 + .../libvorbis/doc/libvorbis/return.html | 79 + .../libvorbis/doc/libvorbis/style.css | 7 + .../doc/libvorbis/vorbis_analysis.html | 86 + .../libvorbis/vorbis_analysis_blockout.html | 79 + .../doc/libvorbis/vorbis_analysis_buffer.html | 74 + .../libvorbis/vorbis_analysis_headerout.html | 83 + .../doc/libvorbis/vorbis_analysis_init.html | 66 + .../doc/libvorbis/vorbis_analysis_wrote.html | 80 + .../libvorbis/vorbis_bitrate_addblock.html | 74 + .../libvorbis/vorbis_bitrate_flushpacket.html | 80 + .../libvorbis/doc/libvorbis/vorbis_block.html | 60 + .../doc/libvorbis/vorbis_block_clear.html | 61 + .../doc/libvorbis/vorbis_block_init.html | 66 + .../doc/libvorbis/vorbis_comment.html | 80 + .../doc/libvorbis/vorbis_comment_add.html | 70 + .../doc/libvorbis/vorbis_comment_add_tag.html | 74 + .../doc/libvorbis/vorbis_comment_clear.html | 69 + .../doc/libvorbis/vorbis_comment_init.html | 72 + .../doc/libvorbis/vorbis_comment_query.html | 72 + .../libvorbis/vorbis_comment_query_count.html | 66 + .../libvorbis/vorbis_commentheader_out.html | 65 + .../doc/libvorbis/vorbis_dsp_clear.html | 63 + .../doc/libvorbis/vorbis_dsp_state.html | 57 + .../doc/libvorbis/vorbis_granule_time.html | 65 + .../libvorbis/doc/libvorbis/vorbis_info.html | 80 + .../doc/libvorbis/vorbis_info_blocksize.html | 66 + .../doc/libvorbis/vorbis_info_clear.html | 61 + .../doc/libvorbis/vorbis_info_init.html | 62 + .../libvorbis/vorbis_packet_blocksize.html | 66 + .../doc/libvorbis/vorbis_synthesis.html | 70 + .../libvorbis/vorbis_synthesis_blockin.html | 69 + .../libvorbis/vorbis_synthesis_halfrate.html | 68 + .../vorbis_synthesis_halfrate_p.html | 64 + .../libvorbis/vorbis_synthesis_headerin.html | 80 + .../libvorbis/vorbis_synthesis_idheader.html | 63 + .../doc/libvorbis/vorbis_synthesis_init.html | 69 + .../libvorbis/vorbis_synthesis_lapout.html | 74 + .../libvorbis/vorbis_synthesis_pcmout.html | 75 + .../doc/libvorbis/vorbis_synthesis_read.html | 67 + .../libvorbis/vorbis_synthesis_restart.html | 64 + .../libvorbis/vorbis_synthesis_trackonly.html | 71 + .../doc/libvorbis/vorbis_version_string.html | 56 + cs/3rd party/libvorbis/doc/oggstream.html | 234 + cs/3rd party/libvorbis/doc/programming.html | 554 + cs/3rd party/libvorbis/doc/release.txt | 16 + cs/3rd party/libvorbis/doc/residue-pack.png | Bin 0 -> 32318 bytes cs/3rd party/libvorbis/doc/residue2.png | Bin 0 -> 20427 bytes cs/3rd party/libvorbis/doc/rfc5215.txt | 1459 ++ cs/3rd party/libvorbis/doc/rfc5215.xml | 1176 ++ cs/3rd party/libvorbis/doc/squarepolar.png | Bin 0 -> 8406 bytes cs/3rd party/libvorbis/doc/stereo.html | 419 + cs/3rd party/libvorbis/doc/stream.png | Bin 0 -> 2171 bytes cs/3rd party/libvorbis/doc/v-comment.html | 285 + cs/3rd party/libvorbis/doc/vorbis-clip.txt | 139 + cs/3rd party/libvorbis/doc/vorbis-errors.txt | 103 + .../libvorbis/doc/vorbis-fidelity.html | 180 + .../libvorbis/doc/vorbisenc/Makefile.am | 11 + .../libvorbis/doc/vorbisenc/changes.html | 104 + .../libvorbis/doc/vorbisenc/examples.html | 133 + .../libvorbis/doc/vorbisenc/index.html | 40 + .../doc/vorbisenc/ovectl_ratemanage2_arg.html | 92 + .../doc/vorbisenc/ovectl_ratemanage_arg.html | 92 + .../libvorbis/doc/vorbisenc/overview.html | 382 + .../libvorbis/doc/vorbisenc/reference.html | 54 + .../libvorbis/doc/vorbisenc/style.css | 7 + .../doc/vorbisenc/vorbis_encode_ctl.html | 183 + .../doc/vorbisenc/vorbis_encode_init.html | 88 + .../doc/vorbisenc/vorbis_encode_init_vbr.html | 81 + .../vorbisenc/vorbis_encode_setup_init.html | 88 + .../vorbis_encode_setup_managed.html | 102 + .../vorbisenc/vorbis_encode_setup_vbr.html | 90 + .../libvorbis/doc/vorbisfile/Makefile.am | 25 + .../doc/vorbisfile/OggVorbis_File.html | 137 + .../libvorbis/doc/vorbisfile/callbacks.html | 121 + .../doc/vorbisfile/chaining_example_c.html | 90 + .../doc/vorbisfile/chainingexample.html | 175 + .../libvorbis/doc/vorbisfile/crosslap.html | 121 + .../doc/vorbisfile/datastructures.html | 61 + .../libvorbis/doc/vorbisfile/decoding.html | 92 + .../libvorbis/doc/vorbisfile/example.html | 208 + .../doc/vorbisfile/exampleindex.html | 39 + .../libvorbis/doc/vorbisfile/fileinfo.html | 95 + .../libvorbis/doc/vorbisfile/index.html | 49 + .../doc/vorbisfile/initialization.html | 118 + .../libvorbis/doc/vorbisfile/ov_bitrate.html | 72 + .../doc/vorbisfile/ov_bitrate_instant.html | 65 + .../doc/vorbisfile/ov_callbacks.html | 117 + .../libvorbis/doc/vorbisfile/ov_clear.html | 64 + .../libvorbis/doc/vorbisfile/ov_comment.html | 66 + .../libvorbis/doc/vorbisfile/ov_crosslap.html | 100 + .../libvorbis/doc/vorbisfile/ov_fopen.html | 124 + .../libvorbis/doc/vorbisfile/ov_info.html | 64 + .../libvorbis/doc/vorbisfile/ov_open.html | 183 + .../doc/vorbisfile/ov_open_callbacks.html | 147 + .../libvorbis/doc/vorbisfile/ov_pcm_seek.html | 83 + .../doc/vorbisfile/ov_pcm_seek_lap.html | 103 + .../doc/vorbisfile/ov_pcm_seek_page.html | 84 + .../doc/vorbisfile/ov_pcm_seek_page_lap.html | 112 + .../libvorbis/doc/vorbisfile/ov_pcm_tell.html | 63 + .../doc/vorbisfile/ov_pcm_total.html | 67 + .../libvorbis/doc/vorbisfile/ov_raw_seek.html | 83 + .../doc/vorbisfile/ov_raw_seek_lap.html | 110 + .../libvorbis/doc/vorbisfile/ov_raw_tell.html | 65 + .../doc/vorbisfile/ov_raw_total.html | 68 + .../libvorbis/doc/vorbisfile/ov_read.html | 148 + .../doc/vorbisfile/ov_read_filter.html | 114 + .../doc/vorbisfile/ov_read_float.html | 105 + .../libvorbis/doc/vorbisfile/ov_seekable.html | 63 + .../doc/vorbisfile/ov_serialnumber.html | 67 + .../libvorbis/doc/vorbisfile/ov_streams.html | 64 + .../libvorbis/doc/vorbisfile/ov_test.html | 104 + .../doc/vorbisfile/ov_test_callbacks.html | 111 + .../doc/vorbisfile/ov_test_open.html | 82 + .../doc/vorbisfile/ov_time_seek.html | 82 + .../doc/vorbisfile/ov_time_seek_lap.html | 105 + .../doc/vorbisfile/ov_time_seek_page.html | 83 + .../doc/vorbisfile/ov_time_seek_page_lap.html | 112 + .../doc/vorbisfile/ov_time_tell.html | 63 + .../doc/vorbisfile/ov_time_total.html | 67 + .../libvorbis/doc/vorbisfile/overview.html | 61 + .../libvorbis/doc/vorbisfile/reference.html | 86 + .../libvorbis/doc/vorbisfile/seekexample.html | 152 + .../libvorbis/doc/vorbisfile/seeking.html | 107 + .../doc/vorbisfile/seeking_example_c.html | 86 + .../doc/vorbisfile/seeking_test_c.html | 86 + .../doc/vorbisfile/seekingexample.html | 203 + .../libvorbis/doc/vorbisfile/style.css | 7 + .../libvorbis/doc/vorbisfile/threads.html | 50 + .../doc/vorbisfile/vorbisfile_example_c.html | 106 + cs/3rd party/libvorbis/doc/window1.png | Bin 0 -> 1703 bytes cs/3rd party/libvorbis/doc/window2.png | Bin 0 -> 1601 bytes cs/3rd party/libvorbis/examples/Makefile.am | 34 + .../libvorbis/examples/chaining_example.c | 72 + .../libvorbis/examples/decoder_example.c | 314 + .../libvorbis/examples/encoder_example.c | 252 + cs/3rd party/libvorbis/examples/frameview.pl | 630 + .../libvorbis/examples/seeking_example.c | 278 + .../libvorbis/examples/vorbisfile_example.c | 92 + cs/3rd party/libvorbis/include/Makefile.am | 3 + .../libvorbis/include/vorbis/Makefile.am | 7 + cs/3rd party/libvorbis/include/vorbis/codec.h | 243 + .../libvorbis/include/vorbis/vorbisenc.h | 436 + .../libvorbis/include/vorbis/vorbisfile.h | 206 + cs/3rd party/libvorbis/libvorbis.spec.in | 121 + cs/3rd party/libvorbis/m4/Makefile.am | 4 + cs/3rd party/libvorbis/m4/add_cflags.m4 | 15 + cs/3rd party/libvorbis/m4/ogg.m4 | 116 + cs/3rd party/libvorbis/m4/pkg.m4 | 157 + .../macosx/English.lproj/InfoPlist.strings | Bin 0 -> 142 bytes cs/3rd party/libvorbis/macosx/Info.plist | 30 + .../macosx/Vorbis.xcodeproj/project.pbxproj | 891 ++ cs/3rd party/libvorbis/symbian/bld.inf | 35 + cs/3rd party/libvorbis/symbian/vorbis.mmp | 43 + cs/3rd party/libvorbis/test/Makefile.am | 19 + cs/3rd party/libvorbis/test/test.c | 100 + cs/3rd party/libvorbis/test/util.c | 53 + cs/3rd party/libvorbis/test/util.h | 24 + cs/3rd party/libvorbis/test/write_read.c | 298 + cs/3rd party/libvorbis/test/write_read.h | 28 + .../libvorbis/vorbis-uninstalled.pc.in | 14 + cs/3rd party/libvorbis/vorbis.m4 | 136 + cs/3rd party/libvorbis/vorbis.pc.in | 15 + .../libvorbis/vorbisenc-uninstalled.pc.in | 14 + cs/3rd party/libvorbis/vorbisenc.pc.in | 14 + .../libvorbis/vorbisfile-uninstalled.pc.in | 14 + cs/3rd party/libvorbis/vorbisfile.pc.in | 14 + cs/3rd party/libvorbis/vq/16.vqs | 74 + cs/3rd party/libvorbis/vq/16u.vqs | 69 + cs/3rd party/libvorbis/vq/44c-1.vqs | 63 + cs/3rd party/libvorbis/vq/44c0.vqs | 65 + cs/3rd party/libvorbis/vq/44c1.vqs | 66 + cs/3rd party/libvorbis/vq/44c2.vqs | 37 + cs/3rd party/libvorbis/vq/44c3.vqs | 36 + cs/3rd party/libvorbis/vq/44c4.vqs | 36 + cs/3rd party/libvorbis/vq/44c5.vqs | 37 + cs/3rd party/libvorbis/vq/44c6.vqs | 37 + cs/3rd party/libvorbis/vq/44c7.vqs | 38 + cs/3rd party/libvorbis/vq/44c8.vqs | 39 + cs/3rd party/libvorbis/vq/44c9.vqs | 37 + cs/3rd party/libvorbis/vq/44p-1.vqs | 49 + cs/3rd party/libvorbis/vq/44p0.vqs | 49 + cs/3rd party/libvorbis/vq/44p1.vqs | 49 + cs/3rd party/libvorbis/vq/44p2.vqs | 52 + cs/3rd party/libvorbis/vq/44p3.vqs | 52 + cs/3rd party/libvorbis/vq/44p4.vqs | 52 + cs/3rd party/libvorbis/vq/44p5.vqs | 52 + cs/3rd party/libvorbis/vq/44p6.vqs | 52 + cs/3rd party/libvorbis/vq/44p7.vqs | 52 + cs/3rd party/libvorbis/vq/44p8.vqs | 52 + cs/3rd party/libvorbis/vq/44p9.vqs | 52 + cs/3rd party/libvorbis/vq/44u0.vqs | 33 + cs/3rd party/libvorbis/vq/44u1.vqs | 33 + cs/3rd party/libvorbis/vq/44u2.vqs | 32 + cs/3rd party/libvorbis/vq/44u3.vqs | 33 + cs/3rd party/libvorbis/vq/44u4.vqs | 33 + cs/3rd party/libvorbis/vq/44u5.vqs | 35 + cs/3rd party/libvorbis/vq/44u6.vqs | 35 + cs/3rd party/libvorbis/vq/44u7.vqs | 34 + cs/3rd party/libvorbis/vq/44u8.vqs | 35 + cs/3rd party/libvorbis/vq/44u9.vqs | 36 + cs/3rd party/libvorbis/vq/8.vqs | 43 + cs/3rd party/libvorbis/vq/8u.vqs | 41 + cs/3rd party/libvorbis/vq/Makefile.am | 36 + cs/3rd party/libvorbis/vq/bookutil.c | 477 + cs/3rd party/libvorbis/vq/bookutil.h | 43 + cs/3rd party/libvorbis/vq/distribution.c | 248 + cs/3rd party/libvorbis/vq/floor_11.vqs | 10 + cs/3rd party/libvorbis/vq/floor_22.vqs | 27 + cs/3rd party/libvorbis/vq/floor_44.vqs | 83 + cs/3rd party/libvorbis/vq/huffbuild.c | 198 + cs/3rd party/libvorbis/vq/latticebuild.c | 177 + cs/3rd party/libvorbis/vq/latticetune.c | 164 + cs/3rd party/libvorbis/vq/localcodebook.h | 121 + cs/3rd party/libvorbis/vq/make_floor_books.pl | 108 + .../libvorbis/vq/make_residue_books.pl | 177 + cs/3rd party/libvorbis/vq/metrics.c | 295 + cs/3rd party/libvorbis/vq/vqgen.c | 567 + cs/3rd party/libvorbis/vq/vqgen.h | 85 + cs/3rd party/libvorbis/win32/VS2005/README | 16 + .../libvorbis/win32/VS2005/libogg.vsprops | 19 + .../VS2005/libvorbis/libvorbis_dynamic.vcproj | 1200 ++ .../VS2005/libvorbis/libvorbis_static.vcproj | 1062 ++ .../libvorbisfile_dynamic.vcproj | 108 + .../libvorbisfile/libvorbisfile_static.vcproj | 96 + .../libvorbis/win32/VS2005/vorbis_dynamic.sln | 56 + .../libvorbis/win32/VS2005/vorbis_static.sln | 56 + .../VS2005/vorbisdec/vorbisdec_dynamic.vcproj | 106 + .../VS2005/vorbisdec/vorbisdec_static.vcproj | 106 + .../VS2005/vorbisenc/vorbisenc_dynamic.vcproj | 106 + .../VS2005/vorbisenc/vorbisenc_static.vcproj | 106 + cs/3rd party/libvorbis/win32/VS2008/README | 16 + .../libvorbis/win32/VS2008/libogg.vsprops | 19 + .../VS2008/libvorbis/libvorbis_dynamic.vcproj | 348 + .../VS2008/libvorbis/libvorbis_static.vcproj | 1069 ++ .../libvorbisfile_dynamic.vcproj | 108 + .../libvorbisfile/libvorbisfile_static.vcproj | 96 + .../libvorbis/win32/VS2008/vorbis_dynamic.sln | 92 + .../libvorbis/win32/VS2008/vorbis_static.sln | 92 + .../VS2008/vorbisdec/vorbisdec_dynamic.vcproj | 106 + .../VS2008/vorbisdec/vorbisdec_static.vcproj | 106 + .../VS2008/vorbisenc/vorbisenc_dynamic.vcproj | 106 + .../VS2008/vorbisenc/vorbisenc_static.vcproj | 106 + cs/3rd party/libvorbis/win32/VS2010/README | 16 + .../libvorbis/win32/VS2010/libogg.props | 22 + .../libvorbis/libvorbis_dynamic.vcxproj | 286 + .../VS2010/libvorbis/libvorbis_static.vcxproj | 235 + .../libvorbisfile_dynamic.vcxproj | 203 + .../libvorbisfile_static.vcxproj | 165 + .../libvorbis/win32/VS2010/vorbis_dynamic.sln | 56 + .../libvorbis/win32/VS2010/vorbis_static.sln | 56 + .../vorbisdec/vorbisdec_dynamic.vcxproj | 213 + .../VS2010/vorbisdec/vorbisdec_static.vcxproj | 213 + .../vorbisenc/vorbisenc_dynamic.vcxproj | 217 + .../VS2010/vorbisenc/vorbisenc_static.vcxproj | 217 + cs/3rd party/libvorbis/win32/vorbis.def | 59 + cs/3rd party/libvorbis/win32/vorbisenc.def | 13 + cs/3rd party/libvorbis/win32/vorbisfile.def | 42 + cs/3rd party/libvorbis_static.vcxproj | 215 + cs/3rd party/libvorbisfile_static.vcxproj | 156 + cs/sdk/libraries/ogg_static.lib | Bin 27042 -> 0 bytes cs/sdk/libraries/ogg_static_d.lib | Bin 67346 -> 0 bytes cs/sdk/libraries/theora_static.lib | Bin 197376 -> 0 bytes cs/sdk/libraries/theora_static_d.lib | Bin 490714 -> 0 bytes cs/sdk/libraries/vorbis_static.lib | Bin 254096 -> 0 bytes cs/sdk/libraries/vorbis_static_d.lib | Bin 513356 -> 0 bytes cs/sdk/libraries/vorbisenc_static.lib | Bin 1392776 -> 0 bytes cs/sdk/libraries/vorbisenc_static_d.lib | Bin 1859560 -> 0 bytes cs/sdk/libraries/vorbisfile_static.lib | Bin 287274 -> 0 bytes cs/sdk/libraries/vorbisfile_static_d.lib | Bin 594492 -> 0 bytes 628 files changed, 129755 insertions(+) create mode 100644 cs/3rd party/libogg/.gitignore create mode 100644 cs/3rd party/libogg/AUTHORS create mode 100644 cs/3rd party/libogg/CHANGES create mode 100644 cs/3rd party/libogg/CMakeLists.txt create mode 100644 cs/3rd party/libogg/COPYING create mode 100644 cs/3rd party/libogg/Makefile.am create mode 100644 cs/3rd party/libogg/README.md create mode 100644 cs/3rd party/libogg/appveyor.yml create mode 100644 cs/3rd party/libogg/autogen.sh create mode 100644 cs/3rd party/libogg/configure.ac create mode 100644 cs/3rd party/libogg/doc/Makefile.am create mode 100644 cs/3rd party/libogg/doc/fish_xiph_org.png create mode 100644 cs/3rd party/libogg/doc/framing.html create mode 100644 cs/3rd party/libogg/doc/index.html create mode 100644 cs/3rd party/libogg/doc/libogg/Makefile.am create mode 100644 cs/3rd party/libogg/doc/libogg/bitpacking.html create mode 100644 cs/3rd party/libogg/doc/libogg/datastructures.html create mode 100644 cs/3rd party/libogg/doc/libogg/decoding.html create mode 100644 cs/3rd party/libogg/doc/libogg/encoding.html create mode 100644 cs/3rd party/libogg/doc/libogg/general.html create mode 100644 cs/3rd party/libogg/doc/libogg/index.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_iovec_t.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_packet.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_packet_clear.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_page.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_page_bos.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_page_checksum_set.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_page_continued.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_page_eos.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_page_granulepos.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_page_packets.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_page_pageno.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_page_serialno.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_page_version.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_stream_check.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_stream_clear.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_stream_destroy.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_stream_eos.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_stream_flush.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_stream_flush_fill.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_stream_init.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_stream_iovecin.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_stream_packetin.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_stream_packetout.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_stream_packetpeek.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_stream_pagein.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_stream_pageout.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_stream_pageout_fill.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_stream_reset.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_stream_reset_serialno.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_stream_state.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_sync_buffer.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_sync_check.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_sync_clear.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_sync_destroy.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_sync_init.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_sync_pageout.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_sync_pageseek.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_sync_reset.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_sync_state.html create mode 100644 cs/3rd party/libogg/doc/libogg/ogg_sync_wrote.html create mode 100644 cs/3rd party/libogg/doc/libogg/oggpack_adv.html create mode 100644 cs/3rd party/libogg/doc/libogg/oggpack_adv1.html create mode 100644 cs/3rd party/libogg/doc/libogg/oggpack_bits.html create mode 100644 cs/3rd party/libogg/doc/libogg/oggpack_buffer.html create mode 100644 cs/3rd party/libogg/doc/libogg/oggpack_bytes.html create mode 100644 cs/3rd party/libogg/doc/libogg/oggpack_get_buffer.html create mode 100644 cs/3rd party/libogg/doc/libogg/oggpack_look.html create mode 100644 cs/3rd party/libogg/doc/libogg/oggpack_look1.html create mode 100644 cs/3rd party/libogg/doc/libogg/oggpack_read.html create mode 100644 cs/3rd party/libogg/doc/libogg/oggpack_read1.html create mode 100644 cs/3rd party/libogg/doc/libogg/oggpack_readinit.html create mode 100644 cs/3rd party/libogg/doc/libogg/oggpack_reset.html create mode 100644 cs/3rd party/libogg/doc/libogg/oggpack_write.html create mode 100644 cs/3rd party/libogg/doc/libogg/oggpack_writealign.html create mode 100644 cs/3rd party/libogg/doc/libogg/oggpack_writecheck.html create mode 100644 cs/3rd party/libogg/doc/libogg/oggpack_writeclear.html create mode 100644 cs/3rd party/libogg/doc/libogg/oggpack_writecopy.html create mode 100644 cs/3rd party/libogg/doc/libogg/oggpack_writeinit.html create mode 100644 cs/3rd party/libogg/doc/libogg/oggpack_writetrunc.html create mode 100644 cs/3rd party/libogg/doc/libogg/overview.html create mode 100644 cs/3rd party/libogg/doc/libogg/reference.html create mode 100644 cs/3rd party/libogg/doc/libogg/style.css create mode 100644 cs/3rd party/libogg/doc/multiplex1.png create mode 100644 cs/3rd party/libogg/doc/multiplex1.svg create mode 100644 cs/3rd party/libogg/doc/ogg-multiplex.html create mode 100644 cs/3rd party/libogg/doc/oggstream.html create mode 100644 cs/3rd party/libogg/doc/packets.png create mode 100644 cs/3rd party/libogg/doc/packets.svg create mode 100644 cs/3rd party/libogg/doc/pages.png create mode 100644 cs/3rd party/libogg/doc/pages.svg create mode 100644 cs/3rd party/libogg/doc/rfc3533.txt create mode 100644 cs/3rd party/libogg/doc/rfc3534.txt create mode 100644 cs/3rd party/libogg/doc/rfc5334.txt create mode 100644 cs/3rd party/libogg/doc/skeleton.html create mode 100644 cs/3rd party/libogg/doc/stream.png create mode 100644 cs/3rd party/libogg/doc/vorbisword2.png create mode 100644 cs/3rd party/libogg/doc/white-ogg.png create mode 100644 cs/3rd party/libogg/doc/white-xifish.png create mode 100644 cs/3rd party/libogg/include/Makefile.am create mode 100644 cs/3rd party/libogg/include/ogg/Makefile.am create mode 100644 cs/3rd party/libogg/include/ogg/config_types.h.in create mode 100644 cs/3rd party/libogg/include/ogg/ogg.h create mode 100644 cs/3rd party/libogg/include/ogg/os_types.h create mode 100644 cs/3rd party/libogg/libogg.spec.in create mode 100644 cs/3rd party/libogg/macosx/English.lproj/InfoPlist.strings create mode 100644 cs/3rd party/libogg/macosx/Info.plist create mode 100644 cs/3rd party/libogg/macosx/Ogg.xcodeproj/project.pbxproj create mode 100644 cs/3rd party/libogg/macosx/Ogg_Prefix.pch create mode 100644 cs/3rd party/libogg/ogg-uninstalled.pc.in create mode 100644 cs/3rd party/libogg/ogg.m4 create mode 100644 cs/3rd party/libogg/ogg.pc.in create mode 100644 cs/3rd party/libogg/releases.sha2 create mode 100644 cs/3rd party/libogg/src/Makefile.am create mode 100644 cs/3rd party/libogg/src/bitwise.c create mode 100644 cs/3rd party/libogg/src/framing.c create mode 100644 cs/3rd party/libogg/symbian/bld.inf create mode 100644 cs/3rd party/libogg/symbian/ogg.mmp create mode 100644 cs/3rd party/libogg/win32/.gitignore create mode 100644 cs/3rd party/libogg/win32/VS2015/libogg_dynamic.sln create mode 100644 cs/3rd party/libogg/win32/VS2015/libogg_dynamic.vcxproj create mode 100644 cs/3rd party/libogg/win32/VS2015/libogg_static.sln create mode 100644 cs/3rd party/libogg/win32/VS2015/libogg_static.vcxproj create mode 100644 cs/3rd party/libogg/win32/ogg.def create mode 100644 cs/3rd party/libogg_static.vcxproj create mode 100644 cs/3rd party/libtheora/.gitignore create mode 100644 cs/3rd party/libtheora/AUTHORS create mode 100644 cs/3rd party/libtheora/CHANGES create mode 100644 cs/3rd party/libtheora/COPYING create mode 100644 cs/3rd party/libtheora/LICENSE create mode 100644 cs/3rd party/libtheora/Makefile.am create mode 100644 cs/3rd party/libtheora/README create mode 100644 cs/3rd party/libtheora/SConstruct create mode 100644 cs/3rd party/libtheora/autogen.sh create mode 100644 cs/3rd party/libtheora/configure.ac create mode 100644 cs/3rd party/libtheora/doc/Doxyfile.in create mode 100644 cs/3rd party/libtheora/doc/Makefile.am create mode 100644 cs/3rd party/libtheora/doc/color.html create mode 100644 cs/3rd party/libtheora/doc/draft-ietf-avt-rtp-theora-00.txt create mode 100644 cs/3rd party/libtheora/doc/draft-ietf-avt-rtp-theora-00.xml create mode 100644 cs/3rd party/libtheora/doc/draft-kerr-avt-theora-rtp-00.txt create mode 100644 cs/3rd party/libtheora/doc/draft-kerr-avt-theora-rtp-00.xml create mode 100644 cs/3rd party/libtheora/doc/spec/Makefile.am create mode 100644 cs/3rd party/libtheora/doc/spec/fdct.fig create mode 100644 cs/3rd party/libtheora/doc/spec/hilbert-block.fig create mode 100644 cs/3rd party/libtheora/doc/spec/hilbert-mb.fig create mode 100644 cs/3rd party/libtheora/doc/spec/idct.fig create mode 100644 cs/3rd party/libtheora/doc/spec/lflim.fig create mode 100644 cs/3rd party/libtheora/doc/spec/ltablex.sty create mode 100644 cs/3rd party/libtheora/doc/spec/macroblock.fig create mode 100644 cs/3rd party/libtheora/doc/spec/pic-frame.fig create mode 100644 cs/3rd party/libtheora/doc/spec/pic_even.fig create mode 100644 cs/3rd party/libtheora/doc/spec/pic_even_odd.fig create mode 100644 cs/3rd party/libtheora/doc/spec/pic_odd.fig create mode 100644 cs/3rd party/libtheora/doc/spec/pic_odd_even.fig create mode 100644 cs/3rd party/libtheora/doc/spec/pixel420.fig create mode 100644 cs/3rd party/libtheora/doc/spec/pixel422.fig create mode 100644 cs/3rd party/libtheora/doc/spec/pixel444.fig create mode 100644 cs/3rd party/libtheora/doc/spec/raster-block.fig create mode 100644 cs/3rd party/libtheora/doc/spec/reference-frames.fig create mode 100644 cs/3rd party/libtheora/doc/spec/spec.bib create mode 100644 cs/3rd party/libtheora/doc/spec/spec.tex create mode 100644 cs/3rd party/libtheora/doc/spec/superblock.fig create mode 100644 cs/3rd party/libtheora/doc/spec/vp3huff.c create mode 100644 cs/3rd party/libtheora/doc/spec/xifish.fig create mode 100644 cs/3rd party/libtheora/doc/vp3-format.txt create mode 100644 cs/3rd party/libtheora/examples/Makefile.am create mode 100644 cs/3rd party/libtheora/examples/README_SPLAYER create mode 100644 cs/3rd party/libtheora/examples/dump_psnr.c create mode 100644 cs/3rd party/libtheora/examples/dump_video.c create mode 100644 cs/3rd party/libtheora/examples/encoder_example.c create mode 100644 cs/3rd party/libtheora/examples/getopt.c create mode 100644 cs/3rd party/libtheora/examples/getopt.h create mode 100644 cs/3rd party/libtheora/examples/getopt1.c create mode 100644 cs/3rd party/libtheora/examples/libtheora_info.c create mode 100644 cs/3rd party/libtheora/examples/player_example.c create mode 100644 cs/3rd party/libtheora/examples/png2theora.c create mode 100644 cs/3rd party/libtheora/examples/splayer.c create mode 100644 cs/3rd party/libtheora/examples/tiff2theora.c create mode 100644 cs/3rd party/libtheora/include/Makefile.am create mode 100644 cs/3rd party/libtheora/include/theora/Makefile.am create mode 100644 cs/3rd party/libtheora/include/theora/codec.h create mode 100644 cs/3rd party/libtheora/include/theora/theora.h create mode 100644 cs/3rd party/libtheora/include/theora/theoradec.h create mode 100644 cs/3rd party/libtheora/include/theora/theoraenc.h create mode 100644 cs/3rd party/libtheora/libtheora.spec.in create mode 100644 cs/3rd party/libtheora/m4/Makefile.am create mode 100644 cs/3rd party/libtheora/macosx/English.lproj/InfoPlist.strings create mode 100644 cs/3rd party/libtheora/macosx/Info.plist create mode 100644 cs/3rd party/libtheora/macosx/Theora.xcodeproj/project.pbxproj create mode 100644 cs/3rd party/libtheora/macosx/Theora_Prefix.pch create mode 100644 cs/3rd party/libtheora/symbian/bld.inf create mode 100644 cs/3rd party/libtheora/symbian/theora.mmp create mode 100644 cs/3rd party/libtheora/tests/Makefile.am create mode 100644 cs/3rd party/libtheora/tests/comment.c create mode 100644 cs/3rd party/libtheora/tests/comment_theora.c create mode 100644 cs/3rd party/libtheora/tests/granulepos.c create mode 100644 cs/3rd party/libtheora/tests/granulepos_theora.c create mode 100644 cs/3rd party/libtheora/tests/noop.c create mode 100644 cs/3rd party/libtheora/tests/noop_theora.c create mode 100644 cs/3rd party/libtheora/tests/tests.h create mode 100644 cs/3rd party/libtheora/theora-uninstalled.pc.in create mode 100644 cs/3rd party/libtheora/theora.pc.in create mode 100644 cs/3rd party/libtheora/theoradec-uninstalled.pc.in create mode 100644 cs/3rd party/libtheora/theoradec.pc.in create mode 100644 cs/3rd party/libtheora/theoraenc-uninstalled.pc.in create mode 100644 cs/3rd party/libtheora/theoraenc.pc.in create mode 100644 cs/3rd party/libtheora/tools/process_modedec_stats.c create mode 100644 cs/3rd party/libtheora/win32/VS2005/README create mode 100644 cs/3rd party/libtheora/win32/VS2005/dump_video/dump_video_dynamic.vcproj create mode 100644 cs/3rd party/libtheora/win32/VS2005/dump_video/dump_video_static.vcproj create mode 100644 cs/3rd party/libtheora/win32/VS2005/encoder_example/encoder_example_dynamic.vcproj create mode 100644 cs/3rd party/libtheora/win32/VS2005/encoder_example/encoder_example_static.vcproj create mode 100644 cs/3rd party/libtheora/win32/VS2005/libogg.vsprops create mode 100644 cs/3rd party/libtheora/win32/VS2005/libtheora/libtheora_dynamic.vcproj create mode 100644 cs/3rd party/libtheora/win32/VS2005/libtheora/libtheora_static.vcproj create mode 100644 cs/3rd party/libtheora/win32/VS2005/libtheora_dynamic.sln create mode 100644 cs/3rd party/libtheora/win32/VS2005/libtheora_static.sln create mode 100644 cs/3rd party/libtheora/win32/VS2005/libvorbis.vsprops create mode 100644 cs/3rd party/libtheora/win32/VS2008/README create mode 100644 cs/3rd party/libtheora/win32/VS2008/dump_video/dump_video_dynamic.vcproj create mode 100644 cs/3rd party/libtheora/win32/VS2008/dump_video/dump_video_static.vcproj create mode 100644 cs/3rd party/libtheora/win32/VS2008/encoder_example/encoder_example_dynamic.vcproj create mode 100644 cs/3rd party/libtheora/win32/VS2008/encoder_example/encoder_example_static.vcproj create mode 100644 cs/3rd party/libtheora/win32/VS2008/libogg.vsprops create mode 100644 cs/3rd party/libtheora/win32/VS2008/libtheora/libtheora_dynamic.vcproj create mode 100644 cs/3rd party/libtheora/win32/VS2008/libtheora/libtheora_static.vcproj create mode 100644 cs/3rd party/libtheora/win32/VS2008/libtheora_dynamic.sln create mode 100644 cs/3rd party/libtheora/win32/VS2008/libtheora_static.sln create mode 100644 cs/3rd party/libtheora/win32/VS2008/libvorbis.vsprops create mode 100644 cs/3rd party/libtheora/win32/VS2010/README create mode 100644 cs/3rd party/libtheora/win32/VS2010/dump_video/dump_video_dynamic.vcxproj create mode 100644 cs/3rd party/libtheora/win32/VS2010/dump_video/dump_video_static.vcxproj create mode 100644 cs/3rd party/libtheora/win32/VS2010/encoder_example/encoder_example_dynamic.vcxproj create mode 100644 cs/3rd party/libtheora/win32/VS2010/encoder_example/encoder_example_static.vcxproj create mode 100644 cs/3rd party/libtheora/win32/VS2010/libogg.props create mode 100644 cs/3rd party/libtheora/win32/VS2010/libtheora/libtheora_dynamic.vcxproj create mode 100644 cs/3rd party/libtheora/win32/VS2010/libtheora/libtheora_static.vcxproj create mode 100644 cs/3rd party/libtheora/win32/VS2010/libtheora_dynamic.sln create mode 100644 cs/3rd party/libtheora/win32/VS2010/libtheora_static.sln create mode 100644 cs/3rd party/libtheora/win32/VS2010/libvorbis.props create mode 100644 cs/3rd party/libtheora/win32/build_theora_static.bat create mode 100644 cs/3rd party/libtheora/win32/build_theora_static_debug.bat create mode 100644 cs/3rd party/libtheora/win32/experimental/dumpvid/dumpvid.dsp create mode 100644 cs/3rd party/libtheora/win32/experimental/encoderwin/ReadMe.txt create mode 100644 cs/3rd party/libtheora/win32/experimental/encoderwin/encoderwin.dsp create mode 100644 cs/3rd party/libtheora/win32/experimental/transcoder/avi2vp3/avi2vp3.c create mode 100644 cs/3rd party/libtheora/win32/experimental/transcoder/avi2vp3/avilib.c create mode 100644 cs/3rd party/libtheora/win32/experimental/transcoder/avi2vp3/avilib.h create mode 100644 cs/3rd party/libtheora/win32/experimental/transcoder/avi2vp3/outfile.vp3 create mode 100644 cs/3rd party/libtheora/win32/experimental/transcoder/avi2vp3/vp31.avi create mode 100644 cs/3rd party/libtheora/win32/experimental/transcoder/readme.txt create mode 100644 cs/3rd party/libtheora/win32/experimental/transcoder/transcoder.dsp create mode 100644 cs/3rd party/libtheora/win32/experimental/transcoder/transcoder_example.c create mode 100644 cs/3rd party/libtheora/win32/experimental/wincompat/README.txt create mode 100644 cs/3rd party/libtheora/win32/experimental/wincompat/getopt.c create mode 100644 cs/3rd party/libtheora/win32/experimental/wincompat/getopt.h create mode 100644 cs/3rd party/libtheora/win32/experimental/wincompat/getopt_long.c create mode 100644 cs/3rd party/libtheora/win32/experimental/wincompat/unistd.h create mode 100644 cs/3rd party/libtheora/win32/getopt.c create mode 100644 cs/3rd party/libtheora/win32/getopt1.c create mode 100644 cs/3rd party/libtheora/win32/getopt_win.h create mode 100644 cs/3rd party/libtheora/win32/theora_static.dsp create mode 100644 cs/3rd party/libtheora/win32/xmingw32/libtheoradec-all.def create mode 100644 cs/3rd party/libtheora/win32/xmingw32/libtheoradec-all.rc create mode 100644 cs/3rd party/libtheora/win32/xmingw32/libtheoradec.rc create mode 100644 cs/3rd party/libtheora/win32/xmingw32/libtheoradec70.rc create mode 100644 cs/3rd party/libtheora/win32/xmingw32/libtheoradec70d.rc create mode 100644 cs/3rd party/libtheora/win32/xmingw32/libtheoradec71.rc create mode 100644 cs/3rd party/libtheora/win32/xmingw32/libtheoradec71d.rc create mode 100644 cs/3rd party/libtheora/win32/xmingw32/libtheoradec80.rc create mode 100644 cs/3rd party/libtheora/win32/xmingw32/libtheoradec80d.rc create mode 100644 cs/3rd party/libtheora/win32/xmingw32/libtheoradecd.rc create mode 100644 cs/3rd party/libtheora/win32/xmingw32/libtheoraenc-all.def create mode 100644 cs/3rd party/libtheora/win32/xmingw32/libtheoraenc-all.rc create mode 100644 cs/3rd party/libtheora/win32/xmingw32/libtheoraenc.rc create mode 100644 cs/3rd party/libtheora/win32/xmingw32/libtheoraenc70.rc create mode 100644 cs/3rd party/libtheora/win32/xmingw32/libtheoraenc70d.rc create mode 100644 cs/3rd party/libtheora/win32/xmingw32/libtheoraenc71.rc create mode 100644 cs/3rd party/libtheora/win32/xmingw32/libtheoraenc71d.rc create mode 100644 cs/3rd party/libtheora/win32/xmingw32/libtheoraenc80.rc create mode 100644 cs/3rd party/libtheora/win32/xmingw32/libtheoraenc80d.rc create mode 100644 cs/3rd party/libtheora/win32/xmingw32/libtheoraencd.rc create mode 100644 cs/3rd party/libtheora_static.vcxproj create mode 100644 cs/3rd party/libvorbis/.gitignore create mode 100644 cs/3rd party/libvorbis/AUTHORS create mode 100644 cs/3rd party/libvorbis/CHANGES create mode 100644 cs/3rd party/libvorbis/CMakeLists.txt create mode 100644 cs/3rd party/libvorbis/COPYING create mode 100644 cs/3rd party/libvorbis/Makefile.am create mode 100644 cs/3rd party/libvorbis/README.md create mode 100644 cs/3rd party/libvorbis/appveyor.yml create mode 100644 cs/3rd party/libvorbis/autogen.sh create mode 100644 cs/3rd party/libvorbis/configure.ac create mode 100644 cs/3rd party/libvorbis/debian/changelog create mode 100644 cs/3rd party/libvorbis/debian/control create mode 100644 cs/3rd party/libvorbis/debian/copyright create mode 100644 cs/3rd party/libvorbis/debian/libvorbis-dev.docs create mode 100644 cs/3rd party/libvorbis/debian/libvorbis-dev.examples create mode 100644 cs/3rd party/libvorbis/debian/libvorbis-dev.install create mode 100644 cs/3rd party/libvorbis/debian/libvorbis0a.install create mode 100644 cs/3rd party/libvorbis/debian/libvorbisenc2.install create mode 100644 cs/3rd party/libvorbis/debian/libvorbisfile3.install create mode 100644 cs/3rd party/libvorbis/debian/rules create mode 100644 cs/3rd party/libvorbis/debian/watch create mode 100644 cs/3rd party/libvorbis/doc/01-introduction.tex create mode 100644 cs/3rd party/libvorbis/doc/02-bitpacking.tex create mode 100644 cs/3rd party/libvorbis/doc/03-codebook.tex create mode 100644 cs/3rd party/libvorbis/doc/04-codec.tex create mode 100644 cs/3rd party/libvorbis/doc/05-comment.tex create mode 100644 cs/3rd party/libvorbis/doc/06-floor0.tex create mode 100644 cs/3rd party/libvorbis/doc/07-floor1.tex create mode 100644 cs/3rd party/libvorbis/doc/08-residue.tex create mode 100644 cs/3rd party/libvorbis/doc/09-helper.tex create mode 100644 cs/3rd party/libvorbis/doc/10-tables.tex create mode 100644 cs/3rd party/libvorbis/doc/Doxyfile.in create mode 100644 cs/3rd party/libvorbis/doc/Makefile.am create mode 100644 cs/3rd party/libvorbis/doc/Vorbis_I_spec.cfg create mode 100644 cs/3rd party/libvorbis/doc/Vorbis_I_spec.css create mode 100644 cs/3rd party/libvorbis/doc/Vorbis_I_spec.html create mode 100644 cs/3rd party/libvorbis/doc/Vorbis_I_spec.pdf create mode 100644 cs/3rd party/libvorbis/doc/Vorbis_I_spec.tex create mode 100644 cs/3rd party/libvorbis/doc/Vorbis_I_spec0x.png create mode 100644 cs/3rd party/libvorbis/doc/Vorbis_I_spec10x.png create mode 100644 cs/3rd party/libvorbis/doc/Vorbis_I_spec11x.png create mode 100644 cs/3rd party/libvorbis/doc/Vorbis_I_spec12x.png create mode 100644 cs/3rd party/libvorbis/doc/Vorbis_I_spec13x.png create mode 100644 cs/3rd party/libvorbis/doc/Vorbis_I_spec14x.png create mode 100644 cs/3rd party/libvorbis/doc/Vorbis_I_spec1x.png create mode 100644 cs/3rd party/libvorbis/doc/Vorbis_I_spec2x.png create mode 100644 cs/3rd party/libvorbis/doc/Vorbis_I_spec3x.png create mode 100644 cs/3rd party/libvorbis/doc/Vorbis_I_spec4x.png create mode 100644 cs/3rd party/libvorbis/doc/Vorbis_I_spec5x.png create mode 100644 cs/3rd party/libvorbis/doc/Vorbis_I_spec6x.png create mode 100644 cs/3rd party/libvorbis/doc/Vorbis_I_spec7x.png create mode 100644 cs/3rd party/libvorbis/doc/Vorbis_I_spec8x.png create mode 100644 cs/3rd party/libvorbis/doc/Vorbis_I_spec9x.png create mode 100644 cs/3rd party/libvorbis/doc/a1-encapsulation-ogg.tex create mode 100644 cs/3rd party/libvorbis/doc/a2-encapsulation-rtp.tex create mode 100644 cs/3rd party/libvorbis/doc/components.png create mode 100644 cs/3rd party/libvorbis/doc/eightphase.png create mode 100644 cs/3rd party/libvorbis/doc/fish_xiph_org.png create mode 100644 cs/3rd party/libvorbis/doc/floor1-1.png create mode 100644 cs/3rd party/libvorbis/doc/floor1-2.png create mode 100644 cs/3rd party/libvorbis/doc/floor1-3.png create mode 100644 cs/3rd party/libvorbis/doc/floor1-4.png create mode 100644 cs/3rd party/libvorbis/doc/floor1_inverse_dB_table.html create mode 100644 cs/3rd party/libvorbis/doc/floorval.png create mode 100644 cs/3rd party/libvorbis/doc/footer.tex create mode 100644 cs/3rd party/libvorbis/doc/fourphase.png create mode 100644 cs/3rd party/libvorbis/doc/framing.html create mode 100644 cs/3rd party/libvorbis/doc/helper.html create mode 100644 cs/3rd party/libvorbis/doc/hufftree-under.png create mode 100644 cs/3rd party/libvorbis/doc/hufftree.png create mode 100644 cs/3rd party/libvorbis/doc/index.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/Makefile.am create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/index.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/overview.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/reference.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/return.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/style.css create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_analysis.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_analysis_blockout.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_analysis_buffer.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_analysis_headerout.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_analysis_init.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_analysis_wrote.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_bitrate_addblock.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_bitrate_flushpacket.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_block.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_block_clear.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_block_init.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_comment.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_comment_add.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_comment_add_tag.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_comment_clear.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_comment_init.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_comment_query.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_comment_query_count.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_commentheader_out.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_dsp_clear.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_dsp_state.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_granule_time.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_info.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_info_blocksize.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_info_clear.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_info_init.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_packet_blocksize.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_blockin.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_halfrate.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_halfrate_p.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_headerin.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_idheader.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_init.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_lapout.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_pcmout.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_read.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_restart.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_trackonly.html create mode 100644 cs/3rd party/libvorbis/doc/libvorbis/vorbis_version_string.html create mode 100644 cs/3rd party/libvorbis/doc/oggstream.html create mode 100644 cs/3rd party/libvorbis/doc/programming.html create mode 100644 cs/3rd party/libvorbis/doc/release.txt create mode 100644 cs/3rd party/libvorbis/doc/residue-pack.png create mode 100644 cs/3rd party/libvorbis/doc/residue2.png create mode 100644 cs/3rd party/libvorbis/doc/rfc5215.txt create mode 100644 cs/3rd party/libvorbis/doc/rfc5215.xml create mode 100644 cs/3rd party/libvorbis/doc/squarepolar.png create mode 100644 cs/3rd party/libvorbis/doc/stereo.html create mode 100644 cs/3rd party/libvorbis/doc/stream.png create mode 100644 cs/3rd party/libvorbis/doc/v-comment.html create mode 100644 cs/3rd party/libvorbis/doc/vorbis-clip.txt create mode 100644 cs/3rd party/libvorbis/doc/vorbis-errors.txt create mode 100644 cs/3rd party/libvorbis/doc/vorbis-fidelity.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisenc/Makefile.am create mode 100644 cs/3rd party/libvorbis/doc/vorbisenc/changes.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisenc/examples.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisenc/index.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisenc/ovectl_ratemanage2_arg.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisenc/ovectl_ratemanage_arg.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisenc/overview.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisenc/reference.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisenc/style.css create mode 100644 cs/3rd party/libvorbis/doc/vorbisenc/vorbis_encode_ctl.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisenc/vorbis_encode_init.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisenc/vorbis_encode_init_vbr.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisenc/vorbis_encode_setup_init.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisenc/vorbis_encode_setup_managed.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisenc/vorbis_encode_setup_vbr.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/Makefile.am create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/OggVorbis_File.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/callbacks.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/chaining_example_c.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/chainingexample.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/crosslap.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/datastructures.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/decoding.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/example.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/exampleindex.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/fileinfo.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/index.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/initialization.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_bitrate.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_bitrate_instant.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_callbacks.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_clear.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_comment.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_crosslap.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_fopen.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_info.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_open.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_open_callbacks.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_pcm_seek.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_pcm_seek_lap.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_pcm_seek_page.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_pcm_seek_page_lap.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_pcm_tell.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_pcm_total.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_raw_seek.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_raw_seek_lap.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_raw_tell.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_raw_total.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_read.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_read_filter.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_read_float.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_seekable.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_serialnumber.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_streams.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_test.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_test_callbacks.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_test_open.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_time_seek.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_time_seek_lap.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_time_seek_page.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_time_seek_page_lap.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_time_tell.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/ov_time_total.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/overview.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/reference.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/seekexample.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/seeking.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/seeking_example_c.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/seeking_test_c.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/seekingexample.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/style.css create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/threads.html create mode 100644 cs/3rd party/libvorbis/doc/vorbisfile/vorbisfile_example_c.html create mode 100644 cs/3rd party/libvorbis/doc/window1.png create mode 100644 cs/3rd party/libvorbis/doc/window2.png create mode 100644 cs/3rd party/libvorbis/examples/Makefile.am create mode 100644 cs/3rd party/libvorbis/examples/chaining_example.c create mode 100644 cs/3rd party/libvorbis/examples/decoder_example.c create mode 100644 cs/3rd party/libvorbis/examples/encoder_example.c create mode 100644 cs/3rd party/libvorbis/examples/frameview.pl create mode 100644 cs/3rd party/libvorbis/examples/seeking_example.c create mode 100644 cs/3rd party/libvorbis/examples/vorbisfile_example.c create mode 100644 cs/3rd party/libvorbis/include/Makefile.am create mode 100644 cs/3rd party/libvorbis/include/vorbis/Makefile.am create mode 100644 cs/3rd party/libvorbis/include/vorbis/codec.h create mode 100644 cs/3rd party/libvorbis/include/vorbis/vorbisenc.h create mode 100644 cs/3rd party/libvorbis/include/vorbis/vorbisfile.h create mode 100644 cs/3rd party/libvorbis/libvorbis.spec.in create mode 100644 cs/3rd party/libvorbis/m4/Makefile.am create mode 100644 cs/3rd party/libvorbis/m4/add_cflags.m4 create mode 100644 cs/3rd party/libvorbis/m4/ogg.m4 create mode 100644 cs/3rd party/libvorbis/m4/pkg.m4 create mode 100644 cs/3rd party/libvorbis/macosx/English.lproj/InfoPlist.strings create mode 100644 cs/3rd party/libvorbis/macosx/Info.plist create mode 100644 cs/3rd party/libvorbis/macosx/Vorbis.xcodeproj/project.pbxproj create mode 100644 cs/3rd party/libvorbis/symbian/bld.inf create mode 100644 cs/3rd party/libvorbis/symbian/vorbis.mmp create mode 100644 cs/3rd party/libvorbis/test/Makefile.am create mode 100644 cs/3rd party/libvorbis/test/test.c create mode 100644 cs/3rd party/libvorbis/test/util.c create mode 100644 cs/3rd party/libvorbis/test/util.h create mode 100644 cs/3rd party/libvorbis/test/write_read.c create mode 100644 cs/3rd party/libvorbis/test/write_read.h create mode 100644 cs/3rd party/libvorbis/vorbis-uninstalled.pc.in create mode 100644 cs/3rd party/libvorbis/vorbis.m4 create mode 100644 cs/3rd party/libvorbis/vorbis.pc.in create mode 100644 cs/3rd party/libvorbis/vorbisenc-uninstalled.pc.in create mode 100644 cs/3rd party/libvorbis/vorbisenc.pc.in create mode 100644 cs/3rd party/libvorbis/vorbisfile-uninstalled.pc.in create mode 100644 cs/3rd party/libvorbis/vorbisfile.pc.in create mode 100644 cs/3rd party/libvorbis/vq/16.vqs create mode 100644 cs/3rd party/libvorbis/vq/16u.vqs create mode 100644 cs/3rd party/libvorbis/vq/44c-1.vqs create mode 100644 cs/3rd party/libvorbis/vq/44c0.vqs create mode 100644 cs/3rd party/libvorbis/vq/44c1.vqs create mode 100644 cs/3rd party/libvorbis/vq/44c2.vqs create mode 100644 cs/3rd party/libvorbis/vq/44c3.vqs create mode 100644 cs/3rd party/libvorbis/vq/44c4.vqs create mode 100644 cs/3rd party/libvorbis/vq/44c5.vqs create mode 100644 cs/3rd party/libvorbis/vq/44c6.vqs create mode 100644 cs/3rd party/libvorbis/vq/44c7.vqs create mode 100644 cs/3rd party/libvorbis/vq/44c8.vqs create mode 100644 cs/3rd party/libvorbis/vq/44c9.vqs create mode 100644 cs/3rd party/libvorbis/vq/44p-1.vqs create mode 100644 cs/3rd party/libvorbis/vq/44p0.vqs create mode 100644 cs/3rd party/libvorbis/vq/44p1.vqs create mode 100644 cs/3rd party/libvorbis/vq/44p2.vqs create mode 100644 cs/3rd party/libvorbis/vq/44p3.vqs create mode 100644 cs/3rd party/libvorbis/vq/44p4.vqs create mode 100644 cs/3rd party/libvorbis/vq/44p5.vqs create mode 100644 cs/3rd party/libvorbis/vq/44p6.vqs create mode 100644 cs/3rd party/libvorbis/vq/44p7.vqs create mode 100644 cs/3rd party/libvorbis/vq/44p8.vqs create mode 100644 cs/3rd party/libvorbis/vq/44p9.vqs create mode 100644 cs/3rd party/libvorbis/vq/44u0.vqs create mode 100644 cs/3rd party/libvorbis/vq/44u1.vqs create mode 100644 cs/3rd party/libvorbis/vq/44u2.vqs create mode 100644 cs/3rd party/libvorbis/vq/44u3.vqs create mode 100644 cs/3rd party/libvorbis/vq/44u4.vqs create mode 100644 cs/3rd party/libvorbis/vq/44u5.vqs create mode 100644 cs/3rd party/libvorbis/vq/44u6.vqs create mode 100644 cs/3rd party/libvorbis/vq/44u7.vqs create mode 100644 cs/3rd party/libvorbis/vq/44u8.vqs create mode 100644 cs/3rd party/libvorbis/vq/44u9.vqs create mode 100644 cs/3rd party/libvorbis/vq/8.vqs create mode 100644 cs/3rd party/libvorbis/vq/8u.vqs create mode 100644 cs/3rd party/libvorbis/vq/Makefile.am create mode 100644 cs/3rd party/libvorbis/vq/bookutil.c create mode 100644 cs/3rd party/libvorbis/vq/bookutil.h create mode 100644 cs/3rd party/libvorbis/vq/distribution.c create mode 100644 cs/3rd party/libvorbis/vq/floor_11.vqs create mode 100644 cs/3rd party/libvorbis/vq/floor_22.vqs create mode 100644 cs/3rd party/libvorbis/vq/floor_44.vqs create mode 100644 cs/3rd party/libvorbis/vq/huffbuild.c create mode 100644 cs/3rd party/libvorbis/vq/latticebuild.c create mode 100644 cs/3rd party/libvorbis/vq/latticetune.c create mode 100644 cs/3rd party/libvorbis/vq/localcodebook.h create mode 100644 cs/3rd party/libvorbis/vq/make_floor_books.pl create mode 100644 cs/3rd party/libvorbis/vq/make_residue_books.pl create mode 100644 cs/3rd party/libvorbis/vq/metrics.c create mode 100644 cs/3rd party/libvorbis/vq/vqgen.c create mode 100644 cs/3rd party/libvorbis/vq/vqgen.h create mode 100644 cs/3rd party/libvorbis/win32/VS2005/README create mode 100644 cs/3rd party/libvorbis/win32/VS2005/libogg.vsprops create mode 100644 cs/3rd party/libvorbis/win32/VS2005/libvorbis/libvorbis_dynamic.vcproj create mode 100644 cs/3rd party/libvorbis/win32/VS2005/libvorbis/libvorbis_static.vcproj create mode 100644 cs/3rd party/libvorbis/win32/VS2005/libvorbisfile/libvorbisfile_dynamic.vcproj create mode 100644 cs/3rd party/libvorbis/win32/VS2005/libvorbisfile/libvorbisfile_static.vcproj create mode 100644 cs/3rd party/libvorbis/win32/VS2005/vorbis_dynamic.sln create mode 100644 cs/3rd party/libvorbis/win32/VS2005/vorbis_static.sln create mode 100644 cs/3rd party/libvorbis/win32/VS2005/vorbisdec/vorbisdec_dynamic.vcproj create mode 100644 cs/3rd party/libvorbis/win32/VS2005/vorbisdec/vorbisdec_static.vcproj create mode 100644 cs/3rd party/libvorbis/win32/VS2005/vorbisenc/vorbisenc_dynamic.vcproj create mode 100644 cs/3rd party/libvorbis/win32/VS2005/vorbisenc/vorbisenc_static.vcproj create mode 100644 cs/3rd party/libvorbis/win32/VS2008/README create mode 100644 cs/3rd party/libvorbis/win32/VS2008/libogg.vsprops create mode 100644 cs/3rd party/libvorbis/win32/VS2008/libvorbis/libvorbis_dynamic.vcproj create mode 100644 cs/3rd party/libvorbis/win32/VS2008/libvorbis/libvorbis_static.vcproj create mode 100644 cs/3rd party/libvorbis/win32/VS2008/libvorbisfile/libvorbisfile_dynamic.vcproj create mode 100644 cs/3rd party/libvorbis/win32/VS2008/libvorbisfile/libvorbisfile_static.vcproj create mode 100644 cs/3rd party/libvorbis/win32/VS2008/vorbis_dynamic.sln create mode 100644 cs/3rd party/libvorbis/win32/VS2008/vorbis_static.sln create mode 100644 cs/3rd party/libvorbis/win32/VS2008/vorbisdec/vorbisdec_dynamic.vcproj create mode 100644 cs/3rd party/libvorbis/win32/VS2008/vorbisdec/vorbisdec_static.vcproj create mode 100644 cs/3rd party/libvorbis/win32/VS2008/vorbisenc/vorbisenc_dynamic.vcproj create mode 100644 cs/3rd party/libvorbis/win32/VS2008/vorbisenc/vorbisenc_static.vcproj create mode 100644 cs/3rd party/libvorbis/win32/VS2010/README create mode 100644 cs/3rd party/libvorbis/win32/VS2010/libogg.props create mode 100644 cs/3rd party/libvorbis/win32/VS2010/libvorbis/libvorbis_dynamic.vcxproj create mode 100644 cs/3rd party/libvorbis/win32/VS2010/libvorbis/libvorbis_static.vcxproj create mode 100644 cs/3rd party/libvorbis/win32/VS2010/libvorbisfile/libvorbisfile_dynamic.vcxproj create mode 100644 cs/3rd party/libvorbis/win32/VS2010/libvorbisfile/libvorbisfile_static.vcxproj create mode 100644 cs/3rd party/libvorbis/win32/VS2010/vorbis_dynamic.sln create mode 100644 cs/3rd party/libvorbis/win32/VS2010/vorbis_static.sln create mode 100644 cs/3rd party/libvorbis/win32/VS2010/vorbisdec/vorbisdec_dynamic.vcxproj create mode 100644 cs/3rd party/libvorbis/win32/VS2010/vorbisdec/vorbisdec_static.vcxproj create mode 100644 cs/3rd party/libvorbis/win32/VS2010/vorbisenc/vorbisenc_dynamic.vcxproj create mode 100644 cs/3rd party/libvorbis/win32/VS2010/vorbisenc/vorbisenc_static.vcxproj create mode 100644 cs/3rd party/libvorbis/win32/vorbis.def create mode 100644 cs/3rd party/libvorbis/win32/vorbisenc.def create mode 100644 cs/3rd party/libvorbis/win32/vorbisfile.def create mode 100644 cs/3rd party/libvorbis_static.vcxproj create mode 100644 cs/3rd party/libvorbisfile_static.vcxproj delete mode 100644 cs/sdk/libraries/ogg_static.lib delete mode 100644 cs/sdk/libraries/ogg_static_d.lib delete mode 100644 cs/sdk/libraries/theora_static.lib delete mode 100644 cs/sdk/libraries/theora_static_d.lib delete mode 100644 cs/sdk/libraries/vorbis_static.lib delete mode 100644 cs/sdk/libraries/vorbis_static_d.lib delete mode 100644 cs/sdk/libraries/vorbisenc_static.lib delete mode 100644 cs/sdk/libraries/vorbisenc_static_d.lib delete mode 100644 cs/sdk/libraries/vorbisfile_static.lib delete mode 100644 cs/sdk/libraries/vorbisfile_static_d.lib diff --git a/cs/3rd party/libogg/.gitignore b/cs/3rd party/libogg/.gitignore new file mode 100644 index 000000000..255f7b01d --- /dev/null +++ b/cs/3rd party/libogg/.gitignore @@ -0,0 +1,33 @@ +aclocal.m4 +autom4te.cache +ChangeLog +compile +config.guess +config.h +config.h.in +config.h.in~ +config.log +config.status +config.sub +configure +depcomp +install-sh +libogg.spec +libtool +ltmain.sh +Makefile +Makefile.in +missing +mkinstalldirs +ogg.pc +ogg-uninstalled.pc +stamp-h1 +.project +include/ogg/config_types.h +src/*.o +src/*.lo +src/lib*.la +src/.libs +src/.deps +src/test_* +macosx/build/ diff --git a/cs/3rd party/libogg/AUTHORS b/cs/3rd party/libogg/AUTHORS new file mode 100644 index 000000000..a0023f2c1 --- /dev/null +++ b/cs/3rd party/libogg/AUTHORS @@ -0,0 +1,7 @@ +Monty +Greg Maxwell +Ralph Giles +Cristian Adam +Tim Terriberry + +and the rest of the Xiph.Org Foundation. diff --git a/cs/3rd party/libogg/CHANGES b/cs/3rd party/libogg/CHANGES new file mode 100644 index 000000000..3f2e0fb26 --- /dev/null +++ b/cs/3rd party/libogg/CHANGES @@ -0,0 +1,88 @@ +Version 1.3.2 (2014 May 27) + + * Fix an bug in oggpack_writecopy(). + +Version 1.3.1 (2013 May 12) + +* Guard against very large packets. +* Respect the configure --docdir override. +* Documentation fixes. +* More Windows build fixes. + +Version 1.3.0 (2011 August 4) + +* Add ogg_stream_flush_fill() call + This produces longer packets on flush, similar to + what ogg_stream_pageout_fill() does for single pages. +* Windows build fixes + +Version 1.2.2 (2010 December 07) + +* Build fix (types correction) for Mac OS X +* Update win32 project files to Visual Studio 2008 +* ogg_stream_pageout_fill documentation fix + +Version 1.2.1 (2010 November 01) + +* Various build updates (see SVN) +* Add ogg_stream_pageout_fill() to API to allow applications + greater explicit flexibility in page sizing. +* Documentation updates including multiplexing description, + terminology and API (incl. ogg_packet_clear(), + ogg_stream_pageout_fill()) +* Correct possible buffer overwrite in stream encoding on 32 bit + when a single packet exceed 250MB. +* Correct read-buffer overrun [without side effects] under + similar circumstances. +* Update unit testing to work properly with new page spill + heuristic. + +Version 1.2.0 (2010 March 25) + +* Alter default flushing behavior to span less often and use larger page + sizes when packet sizes are large. +* Build fixes for additional compilers +* Documentation updates + +Version 1.1.4 (2009 June 24) + +* New async error reporting mechanism. Calls made after a fatal error are + now safely handled in the event an error code is ignored +* Added allocation checks useful to some embedded applications +* fix possible read past end of buffer when reading 0 bits +* Updates to API documentation +* Build fixes + +Version 1.1.3 (2005 November 27) + + * Correct a bug in the granulepos field of pages where no packet ends + * New VS2003 and XCode builds, minor fixes to other builds + * documentation fixes and cleanup + +Version 1.1.2 (2004 September 23) + + * fix a bug with multipage packet assembly after seek + +Version 1.1.1 (2004 September 12) + + * various bugfixes + * important bugfix for 64-bit platforms + * various portability fixes + * autotools cleanup from Thomas Vander Stichele + * Symbian OS build support from Colin Ward at CSIRO + * new multiplexed Ogg stream documentation + +Version 1.1 (2003 November 17) + + * big-endian bitpacker routines for Theora + * various portability fixes + * improved API documenation + * RFC 3533 documentation of the format by Silvia Pfeiffer at CSIRO + * RFC 3534 documentation of the application/ogg mime-type by Linus Walleij + +Version 1.0 (2002 July 19) + + * First stable release + * little-endian bitpacker routines for Vorbis + * basic Ogg bitstream sync and coding support + diff --git a/cs/3rd party/libogg/CMakeLists.txt b/cs/3rd party/libogg/CMakeLists.txt new file mode 100644 index 000000000..78b660495 --- /dev/null +++ b/cs/3rd party/libogg/CMakeLists.txt @@ -0,0 +1,114 @@ +cmake_minimum_required(VERSION 2.8.7) +project(libogg) + +# Required modules +include(GNUInstallDirs) +include(CheckIncludeFiles) + +# Build options +option(BUILD_SHARED_LIBS "Build shared library" OFF) +if(APPLE) + option(BUILD_FRAMEWORK "Build Framework bundle for OSX" OFF) +endif() + +# Extract project version from configure.ac +file(READ configure.ac CONFIGURE_AC_CONTENTS) +string(REGEX MATCH "AC_INIT\\(\\[libogg\\],\\[([0-9]*).([0-9]*).([0-9]*)" DUMMY ${CONFIGURE_AC_CONTENTS}) +set(PROJECT_VERSION_MAJOR ${CMAKE_MATCH_1}) +set(PROJECT_VERSION_MINOR ${CMAKE_MATCH_2}) +set(PROJECT_VERSION_PATCH ${CMAKE_MATCH_3}) +set(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}) + +# Helper function to get version-info +function(get_version_info result current_var_name age_var_name revision_var_name) + string(REGEX MATCH "${current_var_name}=([0-9]*)" DUMMY ${CONFIGURE_AC_CONTENTS}) + set(VERSION_INFO_CURRENT ${CMAKE_MATCH_1}) + + string(REGEX MATCH "${age_var_name}=([0-9]*)" DUMMY ${CONFIGURE_AC_CONTENTS}) + set(VERSION_INFO_AGE ${CMAKE_MATCH_1}) + + string(REGEX MATCH "${revision_var_name}=([0-9]*)" DUMMY ${CONFIGURE_AC_CONTENTS}) + set(VERSION_INFO_REVISION ${CMAKE_MATCH_1}) + + math(EXPR VERSION_INFO_CURRENT_MINUS_AGE "${VERSION_INFO_CURRENT} - ${VERSION_INFO_AGE}") + + set(${result} "${VERSION_INFO_CURRENT_MINUS_AGE}.${VERSION_INFO_AGE}.${VERSION_INFO_REVISION}" PARENT_SCOPE) +endfunction() + +# Helper function to configure pkg-config files +function(configure_pkg_config_file pkg_config_file_in) + set(prefix ${CMAKE_INSTALL_PREFIX}) + set(exec_prefix ${CMAKE_INSTALL_FULL_BINDIR}) + set(libdir ${CMAKE_INSTALL_FULL_LIBDIR}) + set(includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR}) + set(VERSION ${PROJECT_VERSION}) + string(REPLACE ".in" "" pkg_config_file ${pkg_config_file_in}) + configure_file(${pkg_config_file_in} ${CMAKE_CURRENT_SOURCE_DIR}/${pkg_config_file} @ONLY) +endfunction() + +message(STATUS "Configuring ${PROJECT_NAME} ${PROJECT_VERSION}") + +# Configure config_type.h +check_include_files(inttypes.h INCLUDE_INTTYPES_H) +check_include_files(stdint.h INCLUDE_STDINT_H) +check_include_files(sys/types.h INCLUDE_SYS_TYPES_H) + +set(SIZE16 int16_t) +set(USIZE16 uint16_t) +set(SIZE32 int32_t) +set(USIZE32 uint32_t) +set(SIZE64 int64_t) + +configure_file(include/ogg/config_types.h.in ${CMAKE_CURRENT_SOURCE_DIR}/include/ogg/config_types.h @ONLY) + +set(OGG_HEADERS + include/ogg/config_types.h + include/ogg/ogg.h + include/ogg/os_types.h +) + +set(OGG_SOURCES + src/bitwise.c + src/framing.c +) + +if(MSVC) + list(APPEND OGG_SOURCES win32/ogg.def) +endif() + +if(BUILD_FRAMEWORK) + set(BUILD_SHARED_LIBS TRUE) +endif() + +include_directories(include) +add_library(ogg ${OGG_HEADERS} ${OGG_SOURCES}) + +get_version_info(OGG_VERSION_INFO "LIB_CURRENT" "LIB_AGE" "LIB_REVISION") +set_target_properties( + ogg PROPERTIES + SOVERSION ${OGG_VERSION_INFO} + PUBLIC_HEADER "${OGG_HEADERS}" +) + +if(BUILD_FRAMEWORK) + set_target_properties(ogg PROPERTIES + FRAMEWORK TRUE + FRAMEWORK_VERSION ${PROJECT_VERSION} + MACOSX_FRAMEWORK_IDENTIFIER org.xiph.ogg + MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${PROJECT_VERSION} + MACOSX_FRAMEWORK_BUNDLE_VERSION ${PROJECT_VERSION} + XCODE_ATTRIBUTE_INSTALL_PATH "@rpath" + OUTPUT_NAME Ogg + ) +endif() + +configure_pkg_config_file(ogg.pc.in) + +install(TARGETS ogg + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + FRAMEWORK DESTINATION ${CMAKE_INSTALL_PREFIX} + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ogg +) +install(FILES ogg.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) diff --git a/cs/3rd party/libogg/COPYING b/cs/3rd party/libogg/COPYING new file mode 100644 index 000000000..6111c6c5a --- /dev/null +++ b/cs/3rd party/libogg/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/cs/3rd party/libogg/Makefile.am b/cs/3rd party/libogg/Makefile.am new file mode 100644 index 000000000..8bfe30301 --- /dev/null +++ b/cs/3rd party/libogg/Makefile.am @@ -0,0 +1,32 @@ +## Process this file with automake to produce Makefile.in + + +#AUTOMAKE_OPTIONS = foreign 1.6 dist-zip +AUTOMAKE_OPTIONS = foreign 1.11 dist-zip dist-xz + +SUBDIRS = src include doc + +m4datadir = $(datadir)/aclocal +m4data_DATA = ogg.m4 + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = ogg.pc + +EXTRA_DIST = README.md AUTHORS CHANGES COPYING \ + libogg.spec libogg.spec.in \ + ogg.m4 ogg.pc.in ogg-uninstalled.pc.in \ + macosx win32 + +dist-hook: + for item in $(EXTRA_DIST); do \ + if test -d $$item; then \ + echo -n "cleaning dir $$item for distribution..."; \ + rm -rf `find $(distdir)/$$item -name .svn`; \ + echo "OK"; \ + fi; \ + done +debug: + $(MAKE) all CFLAGS="@DEBUG@" + +profile: + $(MAKE) all CFLAGS="@PROFILE@" diff --git a/cs/3rd party/libogg/README.md b/cs/3rd party/libogg/README.md new file mode 100644 index 000000000..2e8a3d7be --- /dev/null +++ b/cs/3rd party/libogg/README.md @@ -0,0 +1,131 @@ +# Ogg + +[![Travis Build Status](https://travis-ci.org/xiph/ogg.svg?branch=master)](https://travis-ci.org/xiph/ogg) +[![Jenkins Build Status](https://mf4.xiph.org/jenkins/job/libogg/badge/icon)](https://mf4.xiph.org/jenkins/job/libogg/) +[![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/github/xiph/ogg?branch=master&svg=true)](https://ci.appveyor.com/project/rillian/ogg) + +Ogg project codecs use the Ogg bitstream format to arrange the raw, +compressed bitstream into a more robust, useful form. For example, +the Ogg bitstream makes seeking, time stamping and error recovery +possible, as well as mixing several sepearate, concurrent media +streams into a single physical bitstream. + +## What's here ## +This source distribution includes libogg and nothing else. Other modules +(eg, the modules libvorbis, vorbis-tools for the Vorbis music codec, +libtheora for the Theora video codec) contain the codec libraries for +use with Ogg bitstreams. + +Directory: + +- `src` The source for libogg, a BSD-license inplementation of the public domain Ogg bitstream format + +- `include` Library API headers + +- `doc` Ogg specification and libogg API documents + +- `win32` Win32 projects and build automation + +- `macosx` Mac OS X project and build files + +## Contact ## + +The Ogg homepage is located at https://www.xiph.org/ogg/ . +Up to date technical documents, contact information, source code and +pre-built utilities may be found there. + +## Building ## + +#### Building from tarball distributions #### + + ./configure + make + +and optionally (as root): + + make install + +This will install the Ogg libraries (static and shared) into +/usr/local/lib, includes into /usr/local/include and API +documentation into /usr/local/share/doc. + +#### Building from repository source #### + +A standard svn build should consist of nothing more than: + + ./autogen.sh + ./configure + make + +and as root if desired : + + make install + +#### Building on Windows #### + +Use the project file in the win32 directory. It should compile out of the box. + +#### Cross-compiling from Linux to Windows #### + +It is also possible to cross compile from Linux to windows using the MinGW +cross tools and even to run the test suite under Wine, the Linux/*nix +windows emulator. + +On Debian and Ubuntu systems, these cross compiler tools can be installed +by doing: + + sudo apt-get mingw32 mingw32-binutils mingw32-runtime wine + +Once these tools are installed its possible to compile and test by +executing the following commands, or something similar depending on +your system: + + ./configure --host=i586-mingw32msvc --target=i586-mingw32msvc --build=i586-linux + make + make check + +(Build instructions for Ogg codecs such as vorbis are similar and may +be found in those source modules' README files) + +## Building with CMake ## + +Ogg supports building using [CMake](http://www.cmake.org/). CMake is a meta build system that generates native projects for each platform. +To generate projects just run cmake replacing `YOUR-PROJECT-GENERATOR` with a proper generator from a list [here](http://www.cmake.org/cmake/help/v3.2/manual/cmake-generators.7.html): + + cmake -G YOUR-PROJECT-GENERATOR . + +Note that by default cmake generates projects that will build static libraries. +To generate projects that will build dynamic library use `BUILD_SHARED_LIBS` option like this: + + cmake -G YOUR-PROJECT-GENERATOR -DBUILD_SHARED_LIBS=1 . + +After projects are generated use them as usual + +#### Building on Windows #### + +Use proper generator for your Visual Studio version like: + + cmake -G "Visual Studio 12 2013" . + +#### Building on Mac OS X #### + +Use Xcode generator. To build framework run: + + cmake -G Xcode -DBUILD_FRAMEWORK=1 . + +#### Building on Linux #### + +Use Makefile generator which is default one. + + cmake . + make + +## License ## + +THIS FILE IS PART OF THE OggVorbis SOFTWARE 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 SOURCE CODE IS COPYRIGHT (C) 1994-2015 +by the Xiph.Org Foundation https://www.xiph.org/ diff --git a/cs/3rd party/libogg/appveyor.yml b/cs/3rd party/libogg/appveyor.yml new file mode 100644 index 000000000..c419edbe4 --- /dev/null +++ b/cs/3rd party/libogg/appveyor.yml @@ -0,0 +1,19 @@ +image: Visual Studio 2015 +configuration: +- Debug +- Release + +platform: +- Win32 +- x64 + +build: + project: win32\VS2015\libogg_static.sln + parallel: true + verbosity: minimal + +after_build: +- cmd: 7z a ogg.zip win32\VS2015\%PLATFORM%\%CONFIGURATION%\libogg_static.lib include\ogg\*.h + +artifacts: +- path: ogg.zip diff --git a/cs/3rd party/libogg/autogen.sh b/cs/3rd party/libogg/autogen.sh new file mode 100644 index 000000000..c9782e127 --- /dev/null +++ b/cs/3rd party/libogg/autogen.sh @@ -0,0 +1,12 @@ +#!/bin/sh +# Run this to set up the build system: configure, makefiles, etc. +set -e + +package="libogg" + +srcdir=`dirname $0` +test -n "$srcdir" && cd "$srcdir" + +echo "Updating build configuration files for $package, please wait...." + +autoreconf -if diff --git a/cs/3rd party/libogg/configure.ac b/cs/3rd party/libogg/configure.ac new file mode 100644 index 000000000..e146d075f --- /dev/null +++ b/cs/3rd party/libogg/configure.ac @@ -0,0 +1,185 @@ +dnl Process this file with autoconf to produce a configure script. + +AC_INIT([libogg],[1.3.2],[ogg-dev@xiph.org]) + +AC_CONFIG_SRCDIR(src/framing.c) + +AM_INIT_AUTOMAKE +AM_MAINTAINER_MODE([enable]) + +dnl Library versioning + +LIB_CURRENT=8 +LIB_REVISION=2 +LIB_AGE=8 +AC_SUBST(LIB_CURRENT) +AC_SUBST(LIB_REVISION) +AC_SUBST(LIB_AGE) + +AC_PROG_CC +AM_PROG_LIBTOOL +AM_PROG_CC_C_O + +dnl Set some options based on environment + +cflags_save="$CFLAGS" +if test -z "$GCC"; then + case $host in + *-*-irix*) + DEBUG="-g -signed" + CFLAGS="-O2 -w -signed" + PROFILE="-p -g3 -O2 -signed" + ;; + sparc-sun-solaris*) + DEBUG="-v -g" + CFLAGS="-xO4 -fast -w -fsimple -native -xcg92" + PROFILE="-v -xpg -g -xO4 -fast -native -fsimple -xcg92 -Dsuncc" + ;; + *) + DEBUG="-g" + CFLAGS="-O" + PROFILE="-g -p" + ;; + esac +else + case $host in + *-*-linux*) + DEBUG="-g -Wall -fsigned-char" + CFLAGS="-O20 -Wall -ffast-math -fsigned-char" + PROFILE="-Wall -W -pg -g -O20 -ffast-math -fsigned-char" + ;; + sparc-sun-*) + DEBUG="-g -Wall -fsigned-char" + CFLAGS="-O20 -ffast-math -fsigned-char" + PROFILE="-pg -g -O20 -fsigned-char" + ;; + *-*-darwin*) + DEBUG="-fno-common -g -Wall -fsigned-char" + CFLAGS="-fno-common -O4 -Wall -fsigned-char -ffast-math" + PROFILE="-fno-common -O4 -Wall -pg -g -fsigned-char -ffast-math" + ;; + *) + DEBUG="-g -Wall -fsigned-char" + CFLAGS="-O20 -fsigned-char" + PROFILE="-O20 -g -pg -fsigned-char" + ;; + esac +fi +CFLAGS="$CFLAGS $cflags_save" +DEBUG="$DEBUG $cflags_save" +PROFILE="$PROFILE $cflags_save" + +dnl Checks for programs. + +dnl Checks for libraries. + +dnl Checks for header files. +AC_HEADER_STDC +INCLUDE_INTTYPES_H=0 +INCLUDE_STDINT_H=0 +INCLUDE_SYS_TYPES_H=0 +AC_CHECK_HEADER(inttypes.h,INCLUDE_INTTYPES_H=1) +AC_CHECK_HEADER(stdint.h,INCLUDE_STDINT_H=1) +AC_CHECK_HEADER(sys/types.h,INCLUDE_SYS_TYPES_H=1) + +dnl Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST + +dnl Check for types + +AC_CHECK_SIZEOF(int16_t) +AC_CHECK_SIZEOF(uint16_t) +AC_CHECK_SIZEOF(u_int16_t) +AC_CHECK_SIZEOF(int32_t) +AC_CHECK_SIZEOF(uint32_t) +AC_CHECK_SIZEOF(u_int32_t) +AC_CHECK_SIZEOF(int64_t) +AC_CHECK_SIZEOF(short) +AC_CHECK_SIZEOF(int) +AC_CHECK_SIZEOF(long) +AC_CHECK_SIZEOF(long long) + +case 2 in + $ac_cv_sizeof_int16_t) SIZE16="int16_t";; + $ac_cv_sizeof_short) SIZE16="short";; + $ac_cv_sizeof_int) SIZE16="int";; +esac + +case 2 in + $ac_cv_sizeof_uint16_t) USIZE16="uint16_t";; + $ac_cv_sizeof_short) USIZE16="unsigned short";; + $ac_cv_sizeof_int) USIZE16="unsigned int";; + $ac_cv_sizeof_u_int16_t) USIZE16="u_int16_t";; +esac + +case 4 in + $ac_cv_sizeof_int32_t) SIZE32="int32_t";; + $ac_cv_sizeof_short) SIZE32="short";; + $ac_cv_sizeof_int) SIZE32="int";; + $ac_cv_sizeof_long) SIZE32="long";; +esac + +case 4 in + $ac_cv_sizeof_uint32_t) USIZE32="uint32_t";; + $ac_cv_sizeof_short) USIZE32="unsigned short";; + $ac_cv_sizeof_int) USIZE32="unsigned int";; + $ac_cv_sizeof_long) USIZE32="unsigned long";; + $ac_cv_sizeof_u_int32_t) USIZE32="u_int32_t";; +esac + +case 8 in + $ac_cv_sizeof_int64_t) SIZE64="int64_t";; + $ac_cv_sizeof_int) SIZE64="int";; + $ac_cv_sizeof_long) SIZE64="long";; + $ac_cv_sizeof_long_long) SIZE64="long long";; +esac + +if test -z "$SIZE16"; then + AC_MSG_ERROR(No 16 bit type found on this platform!) +fi +if test -z "$USIZE16"; then + AC_MSG_ERROR(No unsigned 16 bit type found on this platform!) +fi +if test -z "$SIZE32"; then + AC_MSG_ERROR(No 32 bit type found on this platform!) +fi +if test -z "$USIZE32"; then + AC_MSG_ERROR(No unsigned 32 bit type found on this platform!) +fi +if test -z "$SIZE64"; then + AC_MSG_WARN(No 64 bit type found on this platform!) +fi + +dnl Checks for library functions. +AC_FUNC_MEMCMP + +dnl Make substitutions + +AC_SUBST(LIBTOOL_DEPS) +AC_SUBST(INCLUDE_INTTYPES_H) +AC_SUBST(INCLUDE_STDINT_H) +AC_SUBST(INCLUDE_SYS_TYPES_H) +AC_SUBST(SIZE16) +AC_SUBST(USIZE16) +AC_SUBST(SIZE32) +AC_SUBST(USIZE32) +AC_SUBST(SIZE64) +AC_SUBST(OPT) +AC_SUBST(LIBS) +AC_SUBST(DEBUG) +AC_SUBST(CFLAGS) +AC_SUBST(PROFILE) + + +AC_CONFIG_FILES([ +Makefile +src/Makefile +doc/Makefile doc/libogg/Makefile +include/Makefile include/ogg/Makefile include/ogg/config_types.h +libogg.spec +ogg.pc +ogg-uninstalled.pc +]) +AC_CONFIG_HEADERS([config.h]) + +AC_OUTPUT diff --git a/cs/3rd party/libogg/doc/Makefile.am b/cs/3rd party/libogg/doc/Makefile.am new file mode 100644 index 000000000..3dd47b92c --- /dev/null +++ b/cs/3rd party/libogg/doc/Makefile.am @@ -0,0 +1,9 @@ +## Process this with automake to create Makefile.in + +SUBDIRS = libogg + +dist_html_DATA = framing.html index.html oggstream.html ogg-multiplex.html \ + fish_xiph_org.png multiplex1.png packets.png pages.png stream.png \ + vorbisword2.png white-ogg.png white-xifish.png \ + rfc3533.txt rfc5334.txt skeleton.html + diff --git a/cs/3rd party/libogg/doc/fish_xiph_org.png b/cs/3rd party/libogg/doc/fish_xiph_org.png new file mode 100644 index 0000000000000000000000000000000000000000..b398c06cf4357b0f020ba2f68d8e037cb863345e GIT binary patch literal 2536 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 + + + + +Ogg Documentation + + + + + + + + + +

Ogg logical bitstream framing

+ +

Ogg bitstreams

+ +

The Ogg transport bitstream is designed to provide framing, error +protection and seeking structure for higher-level codec streams that +consist of raw, unencapsulated data packets, such as the Vorbis audio +codec or Theora video codec.

+ +

Application example: Vorbis

+ +

Vorbis encodes short-time blocks of PCM data into raw packets of +bit-packed data. These raw packets may be used directly by transport +mechanisms that provide their own framing and packet-separation +mechanisms (such as UDP datagrams). For stream based storage (such as +files) and transport (such as TCP streams or pipes), Vorbis uses the +Ogg bitstream format to provide framing/sync, sync recapture +after error, landmarks during seeking, and enough information to +properly separate data back into packets at the original packet +boundaries without relying on decoding to find packet boundaries.

+ +

Design constraints for Ogg bitstreams

+ +
    +
  1. True streaming; we must not need to seek to build a 100% + complete bitstream.
  2. +
  3. Use no more than approximately 1-2% of bitstream bandwidth for + packet boundary marking, high-level framing, sync and seeking.
  4. +
  5. Specification of absolute position within the original sample + stream.
  6. +
  7. Simple mechanism to ease limited editing, such as a simplified + concatenation mechanism.
  8. +
  9. Detection of corruption, recapture after error and direct, random + access to data at arbitrary positions in the bitstream.
  10. +
+ +

Logical and Physical Bitstreams

+ +

A logical Ogg bitstream is a contiguous stream of +sequential pages belonging only to the logical bitstream. A +physical Ogg bitstream is constructed from one or more +than one logical Ogg bitstream (the simplest physical bitstream +is simply a single logical bitstream). We describe below the exact +formatting of an Ogg logical bitstream. Combining logical +bitstreams into more complex physical bitstreams is described in the +Ogg bitstream overview. The exact +mapping of raw Vorbis packets into a valid Ogg Vorbis physical +bitstream is described in the Vorbis I Specification.

+ +

Bitstream structure

+ +

An Ogg stream is structured by dividing incoming packets into +segments of up to 255 bytes and then wrapping a group of contiguous +packet segments into a variable length page preceded by a page +header. Both the header size and page size are variable; the page +header contains sizing information and checksum data to determine +header/page size and data integrity.

+ +

The bitstream is captured (or recaptured) by looking for the beginning +of a page, specifically the capture pattern. Once the capture pattern +is found, the decoder verifies page sync and integrity by computing +and comparing the checksum. At that point, the decoder can extract the +packets themselves.

+ +

Packet segmentation

+ +

Packets are logically divided into multiple segments before encoding +into a page. Note that the segmentation and fragmentation process is a +logical one; it's used to compute page header values and the original +page data need not be disturbed, even when a packet spans page +boundaries.

+ +

The raw packet is logically divided into [n] 255 byte segments and a +last fractional segment of < 255 bytes. A packet size may well +consist only of the trailing fractional segment, and a fractional +segment may be zero length. These values, called "lacing values" are +then saved and placed into the header segment table.

+ +

An example should make the basic concept clear:

+ +
+
+raw packet:
+  ___________________________________________
+ |______________packet data__________________| 753 bytes
+
+lacing values for page header segment table: 255,255,243
+
+
+ +

We simply add the lacing values for the total size; the last lacing +value for a packet is always the value that is less than 255. Note +that this encoding both avoids imposing a maximum packet size as well +as imposing minimum overhead on small packets (as opposed to, eg, +simply using two bytes at the head of every packet and having a max +packet size of 32k. Small packets (<255, the typical case) are +penalized with twice the segmentation overhead). Using the lacing +values as suggested, small packets see the minimum possible +byte-aligned overhead (1 byte) and large packets, over 512 bytes or +so, see a fairly constant ~.5% overhead on encoding space.

+ +

Note that a lacing value of 255 implies that a second lacing value +follows in the packet, and a value of < 255 marks the end of the +packet after that many additional bytes. A packet of 255 bytes (or a +multiple of 255 bytes) is terminated by a lacing value of 0:

+ +

+raw packet:
+  _______________________________
+ |________packet data____________|          255 bytes
+
+lacing values: 255, 0
+
+ +

Note also that a 'nil' (zero length) packet is not an error; it +consists of nothing more than a lacing value of zero in the header.

+ +

Packets spanning pages

+ +

Packets are not restricted to beginning and ending within a page, +although individual segments are, by definition, required to do so. +Packets are not restricted to a maximum size, although excessively +large packets in the data stream are discouraged.

+ +

After segmenting a packet, the encoder may decide not to place all the +resulting segments into the current page; to do so, the encoder places +the lacing values of the segments it wishes to belong to the current +page into the current segment table, then finishes the page. The next +page is begun with the first value in the segment table belonging to +the next packet segment, thus continuing the packet (data in the +packet body must also correspond properly to the lacing values in the +spanned pages. The segment data in the first packet corresponding to +the lacing values of the first page belong in that page; packet +segments listed in the segment table of the following page must begin +the page body of the subsequent page).

+ +

The last mechanic to spanning a page boundary is to set the header +flag in the new page to indicate that the first lacing value in the +segment table continues rather than begins a packet; a header flag of +0x01 is set to indicate a continued packet. Although mandatory, it +is not actually algorithmically necessary; one could inspect the +preceding segment table to determine if the packet is new or +continued. Adding the information to the packet_header flag allows a +simpler design (with no overhead) that needs only inspect the current +page header after frame capture. This also allows faster error +recovery in the event that the packet originates in a corrupt +preceding page, implying that the previous page's segment table +cannot be trusted.

+ +

Note that a packet can span an arbitrary number of pages; the above +spanning process is repeated for each spanned page boundary. Also a +'zero termination' on a packet size that is an even multiple of 255 +must appear even if the lacing value appears in the next page as a +zero-length continuation of the current packet. The header flag +should be set to 0x01 to indicate that the packet spanned, even though +the span is a nil case as far as data is concerned.

+ +

The encoding looks odd, but is properly optimized for speed and the +expected case of the majority of packets being between 50 and 200 +bytes (note that it is designed such that packets of wildly different +sizes can be handled within the model; placing packet size +restrictions on the encoder would have only slightly simplified design +in page generation and increased overall encoder complexity).

+ +

The main point behind tracking individual packets (and packet +segments) is to allow more flexible encoding tricks that requiring +explicit knowledge of packet size. An example is simple bandwidth +limiting, implemented by simply truncating packets in the nominal case +if the packet is arranged so that the least sensitive portion of the +data comes last.

+ + +

Page header

+ +

The headering mechanism is designed to avoid copying and re-assembly +of the packet data (ie, making the packet segmentation process a +logical one); the header can be generated directly from incoming +packet data. The encoder buffers packet data until it finishes a +complete page at which point it writes the header followed by the +buffered packet segments.

+ +

capture_pattern

+ +

A header begins with a capture pattern that simplifies identifying +pages; once the decoder has found the capture pattern it can do a more +intensive job of verifying that it has in fact found a page boundary +(as opposed to an inadvertent coincidence in the byte stream).

+ +

+ byte value
+
+  0  0x4f 'O'
+  1  0x67 'g'
+  2  0x67 'g'
+  3  0x53 'S'  
+
+ +

stream_structure_version

+ +

The capture pattern is followed by the stream structure revision:

+ +

+ byte value
+
+  4  0x00
+
+ +

header_type_flag

+ +

The header type flag identifies this page's context in the bitstream:

+ +

+ byte value
+
+  5  bitflags: 0x01: unset = fresh packet
+	               set = continued packet
+	       0x02: unset = not first page of logical bitstream
+                       set = first page of logical bitstream (bos)
+	       0x04: unset = not last page of logical bitstream
+                       set = last page of logical bitstream (eos)
+
+ +

absolute granule position

+ +

(This is packed in the same way the rest of Ogg data is packed; LSb +of LSB first. Note that the 'position' data specifies a 'sample' +number (eg, in a CD quality sample is four octets, 16 bits for left +and 16 bits for right; in video it would likely be the frame number. +It is up to the specific codec in use to define the semantic meaning +of the granule position value). The position specified is the total +samples encoded after including all packets finished on this page +(packets begun on this page but continuing on to the next page do not +count). The rationale here is that the position specified in the +frame header of the last page tells how long the data coded by the +bitstream is. A truncated stream will still return the proper number +of samples that can be decoded fully.

+ +

A special value of '-1' (in two's complement) indicates that no packets +finish on this page.

+ +

+ byte value
+
+  6  0xXX LSB
+  7  0xXX
+  8  0xXX
+  9  0xXX
+ 10  0xXX
+ 11  0xXX
+ 12  0xXX
+ 13  0xXX MSB
+
+ +

stream serial number

+ +

Ogg allows for separate logical bitstreams to be mixed at page +granularity in a physical bitstream. The most common case would be +sequential arrangement, but it is possible to interleave pages for +two separate bitstreams to be decoded concurrently. The serial +number is the means by which pages physical pages are associated with +a particular logical stream. Each logical stream must have a unique +serial number within a physical stream:

+ +

+ byte value
+
+ 14  0xXX LSB
+ 15  0xXX
+ 16  0xXX
+ 17  0xXX MSB
+
+ +

page sequence no

+ +

Page counter; lets us know if a page is lost (useful where packets +span page boundaries).

+ +

+ byte value
+
+ 18  0xXX LSB
+ 19  0xXX
+ 20  0xXX
+ 21  0xXX MSB
+
+ +

page checksum

+ +

32 bit CRC value (direct algorithm, initial val and final XOR = 0, +generator polynomial=0x04c11db7). The value is computed over the +entire header (with the CRC field in the header set to zero) and then +continued over the page. The CRC field is then filled with the +computed value.

+ +

(A thorough discussion of CRC algorithms can be found in "A +Painless Guide to CRC Error Detection Algorithms" by Ross +Williams ross@ross.net.)

+ +

+ byte value
+
+ 22  0xXX LSB
+ 23  0xXX
+ 24  0xXX
+ 25  0xXX MSB
+
+ +

page_segments

+ +

The number of segment entries to appear in the segment table. The +maximum number of 255 segments (255 bytes each) sets the maximum +possible physical page size at 65307 bytes or just under 64kB (thus +we know that a header corrupted so as destroy sizing/alignment +information will not cause a runaway bitstream. We'll read in the +page according to the corrupted size information that's guaranteed to +be a reasonable size regardless, notice the checksum mismatch, drop +sync and then look for recapture).

+ +

+ byte value
+
+ 26 0x00-0xff (0-255)
+
+ +

segment_table (containing packet lacing values)

+ +

The lacing values for each packet segment physically appearing in +this page are listed in contiguous order.

+ +

+ byte value
+
+ 27 0x00-0xff (0-255)
+ [...]
+ n  0x00-0xff (0-255, n=page_segments+26)
+
+ +

Total page size is calculated directly from the known header size and +lacing values in the segment table. Packet data segments follow +immediately after the header.

+ +

Page headers typically impose a flat .25-.5% space overhead assuming +nominal ~8k page sizes. The segmentation table needed for exact +packet recovery in the streaming layer adds approximately .5-1% +nominal assuming expected encoder behavior in the 44.1kHz, 128kbps +stereo encodings.

+ + + + + diff --git a/cs/3rd party/libogg/doc/index.html b/cs/3rd party/libogg/doc/index.html new file mode 100644 index 000000000..6e02f7971 --- /dev/null +++ b/cs/3rd party/libogg/doc/index.html @@ -0,0 +1,105 @@ + + + + + +Ogg Documentation + + + + + + + + + +

Ogg Documentation

+ +

Ogg programming documentation

+ + + +

Ogg bitstream documentation

+ + + +

RFC documentation

+ + + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/Makefile.am b/cs/3rd party/libogg/doc/libogg/Makefile.am new file mode 100644 index 000000000..4007907a9 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/Makefile.am @@ -0,0 +1,39 @@ +## Process this file with automake to produce Makefile.in + +apidocdir = $(htmldir)/libogg + +dist_apidoc_DATA = bitpacking.html datastructures.html decoding.html encoding.html\ + general.html index.html ogg_iovec_t.html ogg_packet.html ogg_packet_clear.html\ + ogg_page.html ogg_page_bos.html ogg_page_checksum_set.html\ + ogg_page_continued.html ogg_page_eos.html ogg_page_granulepos.html\ + ogg_page_packets.html ogg_page_pageno.html ogg_page_serialno.html\ + ogg_page_version.html ogg_stream_check.html ogg_stream_clear.html ogg_stream_destroy.html\ + ogg_stream_eos.html ogg_stream_flush.html ogg_stream_flush_fill.html ogg_stream_init.html\ + ogg_stream_iovecin.html ogg_stream_packetin.html ogg_stream_packetout.html\ + ogg_stream_packetpeek.html ogg_stream_pagein.html\ + ogg_stream_pageout.html ogg_stream_pageout_fill.html ogg_stream_reset.html\ + ogg_stream_reset_serialno.html ogg_stream_state.html\ + ogg_sync_buffer.html ogg_sync_check.html ogg_sync_clear.html ogg_sync_destroy.html\ + ogg_sync_init.html ogg_sync_pageout.html ogg_sync_pageseek.html\ + ogg_sync_reset.html ogg_sync_state.html ogg_sync_wrote.html\ + oggpack_adv.html oggpack_adv1.html oggpack_bits.html\ + oggpack_buffer.html oggpack_bytes.html oggpack_get_buffer.html\ + oggpack_look.html oggpack_look1.html oggpack_read.html\ + oggpack_read1.html oggpack_readinit.html oggpack_reset.html\ + oggpack_write.html oggpack_writealign.html oggpack_writecheck.html oggpack_writeclear.html\ + oggpack_writecopy.html oggpack_writeinit.html oggpack_writetrunc.html\ + overview.html reference.html style.css + +update-doc-version: + @YEAR=$$(date +%Y); DAY=$$(date +%Y%m%d); \ + for f in $(srcdir)/*.html; do \ + sed -e "s/2000-[0-9]\{4\} Xiph.Org/2000-$$YEAR Xiph.Org/g" \ + -e "s/libogg release [0-9. -]\+/libogg release $(VERSION) - $$DAY/g"\ + < $$f > $$f.tmp; \ + if diff -q $$f $$f.tmp > /dev/null; then \ + rm $$f.tmp; \ + else \ + mv $$f.tmp $$f; \ + fi; \ + done; + diff --git a/cs/3rd party/libogg/doc/libogg/bitpacking.html b/cs/3rd party/libogg/doc/libogg/bitpacking.html new file mode 100644 index 000000000..cc76015e2 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/bitpacking.html @@ -0,0 +1,103 @@ + + + +libogg - Bitpacking Functions + + + + + + + + + +

libogg documentation

libogg release 1.3.2 - 20140527

+ +

Bitpacking Functions

+

Libogg contains a basic bitpacking library that is useful for manipulating data within a buffer. +

+All the libogg specific functions are declared in "ogg/ogg.h". +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
functionpurpose
oggpack_writeinitInitializes a buffer for writing using this bitpacking library.
oggpack_writecheckAsynchronously checks error status of bitpacker write buffer.
oggpack_resetClears and resets the buffer to the initial position.
oggpack_writeclearFrees the memory used by the buffer.
oggpack_readinitInitializes a buffer for reading using this bitpacking library.
oggpack_writeWrites bytes to the specified location within the buffer.
oggpack_lookLook at a specified number of bits, <=32, without advancing the location pointer.
oggpack_look1Looks at one bit without advancing the location pointer.
oggpack_advAdvances the location pointer by a specified number of bits.
oggpack_adv1Advances the location pointer by one bit.
oggpack_readReads a specified number of bits from the buffer.
oggpack_read1Reads one bit from the buffer.
oggpack_bytesReturns the total number of bytes contained within the buffer.
oggpack_bitsReturns the total number of bits contained within the buffer.
oggpack_get_bufferReturns a pointer to the buffer encapsulated within the oggpack_buffer struct.
+ +

+


+ + + + + + + + +

copyright © 2000-2014 Xiph.Org

Ogg Container Format

libogg documentation

libogg release 1.3.2 - 20140527

+ + + + diff --git a/cs/3rd party/libogg/doc/libogg/datastructures.html b/cs/3rd party/libogg/doc/libogg/datastructures.html new file mode 100644 index 000000000..0f56102f2 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/datastructures.html @@ -0,0 +1,59 @@ + + + +libogg - Base Data Structures + + + + + + + + + +

libogg documentation

libogg release 1.3.2 - 20140527

+ +

Base Data Structures

+

Libogg uses several data structures to hold data and state information. +

+All the libogg specific data structures are declared in "ogg/ogg.h". +

+ + + + + + + + + + + + + + + + + + + + + + +
datatypepurpose
ogg_pageThis structure encapsulates data into one ogg bitstream page.
ogg_stream_stateThis structure contains current encode/decode data for a logical bitstream.
ogg_packetThis structure encapsulates the data and metadata for a single Ogg packet.
ogg_sync_stateContains bitstream synchronization information.
+ +

+


+ + + + + + + + +

copyright © 2000-2014 Xiph.Org

Ogg Container Format

libogg documentation

libogg release 1.3.2 - 20140527

+ + + + diff --git a/cs/3rd party/libogg/doc/libogg/decoding.html b/cs/3rd party/libogg/doc/libogg/decoding.html new file mode 100644 index 000000000..f393a07cc --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/decoding.html @@ -0,0 +1,104 @@ + + + +libogg - Decoding + + + + + + + + + +

libogg documentation

libogg release 1.3.2 - 20140527

+ +

Decoding

+

Libogg contains a set of functions used in the decoding process. +

+All the libogg specific functions are declared in "ogg/ogg.h". +

+

Decoding is based around the ogg synchronization layer. The ogg_sync_state struct coordinates between incoming data and the decoder. We read data into the synchronization layer, submit the data to the stream, and output raw packets to the decoder. +

Decoding through the Ogg layer follows a specific logical sequence. A read loop follows these logical steps: +

+

In practice, streams are more complex, and Ogg also must handle headers, incomplete or dropped pages, and other errors in input. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
functionpurpose
ogg_sync_initInitializes an Ogg bitstream.
ogg_sync_clearClears the status information from the synchronization struct. +
ogg_sync_resetResets the synchronization status to initial values.
ogg_sync_destroyFrees the synchronization struct.
ogg_sync_checkCheck for asynchronous errors.
ogg_sync_bufferExposes a buffer from the synchronization layer in order to read data.
ogg_sync_wroteTells the synchronization layer how many bytes were written into the buffer.
ogg_sync_pageseekFinds the borders of pages and resynchronizes the stream.
ogg_sync_pageoutOutputs a page from the synchronization layer.
ogg_stream_pageinSubmits a complete page to the stream layer.
ogg_stream_packetoutOutputs a packet to the codec-specific decoding engine.
ogg_stream_packetpeekProvides access to the next packet in the bitstream without +advancing decoding.
+ +

+


+ + + + + + + + +

copyright © 2000-2014 Xiph.Org

Ogg Container Format

libogg documentation

libogg release 1.3.2 - 20140527

+ + + + diff --git a/cs/3rd party/libogg/doc/libogg/encoding.html b/cs/3rd party/libogg/doc/libogg/encoding.html new file mode 100644 index 000000000..6aa84709f --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/encoding.html @@ -0,0 +1,76 @@ + + + +libogg - Encoding + + + + + + + + + +

libogg documentation

libogg release 1.3.2 - 20140527

+ +

Encoding

+

Libogg contains a set of functions used in the encoding process. +

+All the libogg specific functions are declared in "ogg/ogg.h". +

+

When encoding, the encoding engine will output raw packets which must be placed into an Ogg bitstream. +

Raw packets are inserted into the stream, and an ogg_page is output when enough packets have been written to create a full page. The pages output are pointers to buffered packet segments, and can then be written out and saved as an ogg stream. +

There are a couple of basic steps: +

    +
  • Use the encoding engine to produce a raw packet of data. +
  • Call ogg_stream_packetin to submit a raw packet to the stream. +
  • Use ogg_stream_pageout to output a page, if enough data has been submitted. Otherwise, continue submitting data. +
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
functionpurpose
ogg_stream_packetinSubmits a raw packet to the streaming layer, so that it can be formed into a page.
ogg_stream_ioveciniovec version of ogg_stream_packetin() above.
ogg_stream_pageoutOutputs a completed page if the stream contains enough packets to form a full page. +
ogg_stream_pageout_fillSimilar to ogg_stream_pageout(), but specifies a page spill threshold in bytes. +
ogg_stream_flushForces any remaining packets in the stream to be returned as a page of any size. +
ogg_stream_flush_fillSimilar to ogg_stream_flush(), but specifies a page spill threshold in bytes. +
+ +

+
+ + + + + + + + +

copyright © 2000-2014 Xiph.Org

Ogg Container Format

libogg documentation

libogg release 1.3.2 - 20140527

+ + + + diff --git a/cs/3rd party/libogg/doc/libogg/general.html b/cs/3rd party/libogg/doc/libogg/general.html new file mode 100644 index 000000000..d892dd38e --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/general.html @@ -0,0 +1,109 @@ + + + +libogg - General Functions + + + + + + + + + +

libogg documentation

libogg release 1.3.2 - 20140527

+ +

General Functions

+

Libogg contains several functions which are generally useful when using Ogg streaming, whether encoding or decoding. +

+All the libogg specific functions are declared in "ogg/ogg.h". +

+

These functions can be used to manipulate some of the basic elements of Ogg - streams and pages. Streams and pages are important during both the encode and decode process. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
functionpurpose
ogg_stream_initInitializes an Ogg bitstream.
ogg_stream_clearClears the storage within the Ogg stream, but does not free the stream itself. +
ogg_stream_resetResets the stream status to its initial position.
ogg_stream_destroyFrees the entire Ogg stream.
ogg_stream_checkCheck for asyncronous errors.
ogg_stream_eosIndicates whether we are at the end of the stream.
ogg_page_versionReturns the version of ogg_page that this stream/page uses
ogg_page_continuedIndicates if the current page contains a continued packet from the last page.
ogg_page_packetsIndicates the number of packets contained in a page.
ogg_page_bosIndicates if the current page is the beginning of the stream.
ogg_page_eosIndicates if the current page is the end of the stream.
ogg_page_granuleposReturns the precise playback location of this page.
ogg_page_serialnoReturns the unique serial number of the logical bitstream associated with this page.
ogg_page_pagenoReturns the sequential page number for this page.
ogg_packet_clearClears the ogg_packet structure.
ogg_page_checksum_setChecksums an ogg_page.
+ +

+


+ + + + + + + + +

copyright © 2000-2014 Xiph.Org

Ogg Container Format

libogg documentation

libogg release 1.3.2 - 20140527

+ + + + diff --git a/cs/3rd party/libogg/doc/libogg/index.html b/cs/3rd party/libogg/doc/libogg/index.html new file mode 100644 index 000000000..6d3feaba0 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/index.html @@ -0,0 +1,39 @@ + + + +libogg - Documentation + + + + + + + + + +

libogg documentation

libogg release 1.3.2 - 20140527

+ +

Libogg Documentation

+ +

+Libogg contains necessary functionality to create, decode, and work with Ogg bitstreams. +

This document explains how to use the libogg API in detail. +

+libogg api overview
+libogg api reference
+ +

+


+ + + + + + + + +

copyright © 2000-2014 Xiph.Org

Ogg Container Format

libogg documentation

libogg release 1.3.2 - 20140527

+ + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_iovec_t.html b/cs/3rd party/libogg/doc/libogg/ogg_iovec_t.html new file mode 100644 index 000000000..2cf7e8bc4 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_iovec_t.html @@ -0,0 +1,62 @@ + + + +libogg - datatype - ogg_iovec_t + + + + + + + + + +

libogg documentation

libogg release 1.3.2 - 20140527

+ +

ogg_iovec_t

+ +

declared in "ogg/ogg.h"

+ +

+The ogg_iovec_t struct encapsulates a length-encoded buffer. An array +of ogg_iovec_t is used to pass a list of buffers to functions that +accept data in ogg_iovec_t* form. +

+ + + + + +
+

+typedef struct {
+  void *iov_base;
+  size_t iov_len;
+} ogg_iovec_t;
+
+
+ +

Relevant Struct Members

+
+
iov_base
+
Pointer to the buffer data.
+
iov_len
+
Length of buffer data in bytes.
+
+ + +

+
+ + + + + + + + +

copyright © 2000-2014 Xiph.Org

Ogg Container Format

libogg documentation

libogg release 1.3.2 - 20140527

+ + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_packet.html b/cs/3rd party/libogg/doc/libogg/ogg_packet.html new file mode 100644 index 000000000..5672eba3b --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_packet.html @@ -0,0 +1,75 @@ + + + +libogg - datatype - ogg_packet + + + + + + + + + +

libogg documentation

libogg release 1.3.2 - 20140527

+ +

ogg_packet

+ +

declared in "ogg/ogg.h"

+ +

+The ogg_packet struct encapsulates the data for a single raw packet of data +and is used to transfer data between the ogg framing layer and the handling codec. +

+ + + + + +
+

+typedef struct {
+  unsigned char *packet;
+  long  bytes;
+  long  b_o_s;
+  long  e_o_s;
+
+  ogg_int64_t  granulepos;
+  ogg_int64_t  packetno; 
+
+} ogg_packet;
+
+
+ +

Relevant Struct Members

+
+
packet
+
Pointer to the packet's data. This is treated as an opaque type by the ogg layer.
+
bytes
+
Indicates the size of the packet data in bytes. Packets can be of arbitrary size.
+
b_o_s
+
Flag indicating whether this packet begins a logical bitstream. 1 indicates this is the first packet, 0 indicates any other position in the stream.
+
e_o_s
+
Flag indicating whether this packet ends a bitstream. 1 indicates the last packet, 0 indicates any other position in the stream.
+
granulepos
+
A number indicating the position of this packet in the decoded data. This is the last sample, frame or other unit of information ('granule') that can be completely decoded from this packet.
+
packetno
+
Sequential number of this packet in the ogg bitstream.
+
+ + +

+
+ + + + + + + + +

copyright © 2000-2014 Xiph.Org

Ogg Container Format

libogg documentation

libogg release 1.3.2 - 20140527

+ + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_packet_clear.html b/cs/3rd party/libogg/doc/libogg/ogg_packet_clear.html new file mode 100644 index 000000000..87dadea5f --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_packet_clear.html @@ -0,0 +1,64 @@ + + + +libogg - function - ogg_packet_clear + + + + + + + + + +

libogg documentation

libogg release 1.3.2 - 20140527

+ +

ogg_packet_clear

+ +

declared in "ogg/ogg.h";

+ +

This function clears the memory used by the ogg_packet struct, +but does not free the structure itself. +It unconditionally frees the packet data buffer, +then it zeros all structure members. +

+ + + + +
+

+void ogg_packet_clear(ogg_packet *op);
+
+
+ +

Parameters

+
+
op
+
Pointer to the ogg_packet struct to be cleared.
+
+ + +

Return Values

+
+
  • +None.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_page.html b/cs/3rd party/libogg/doc/libogg/ogg_page.html new file mode 100644 index 000000000..ac1a9942c --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_page.html @@ -0,0 +1,75 @@ + + + +libogg - datatype - ogg_page + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_page

    + +

    declared in "ogg/ogg.h"

    + +

    +The ogg_page struct encapsulates the data for an Ogg page. +

    +Ogg pages are the fundamental unit of framing and interleave in an ogg bitstream. +They are made up of packet segments of 255 bytes each. There can be as many as +255 packet segments per page, for a maximum page size of a little under 64 kB. +This is not a practical limitation as the segments can be joined across +page boundaries allowing packets of arbitrary size. In practice many +applications will not completely fill all pages because they flush the +accumulated packets periodically order to bound latency more tightly. +

    +

    For a complete description of ogg pages and headers, please refer to the framing document. + + + + + +
    +
    
    +typedef struct {
    +  unsigned char *header;
    +  long           header_len;
    +  unsigned char *body;
    +  long           body_len;
    +} ogg_page;
    +
    +
    + +

    Relevant Struct Members

    +
    +
    header
    +
    Pointer to the page header for this page. The exact contents of this header are defined in the framing spec document.
    +
    header_len
    +
    Length of the page header in bytes. +
    body
    +
    Pointer to the data for this page.
    +
    body_len
    +
    Length of the body data in bytes.
    +
    + + +

    +
    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_page_bos.html b/cs/3rd party/libogg/doc/libogg/ogg_page_bos.html new file mode 100644 index 000000000..9286e1acb --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_page_bos.html @@ -0,0 +1,65 @@ + + + +libogg - function - ogg_page_bos + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_page_bos

    + +

    declared in "ogg/ogg.h";

    + +

    Indicates whether this page is at the beginning of the logical bitstream. +

    +

    + + + + +
    +
    
    +int ogg_page_bos(ogg_page *og);
    +
    +
    +
    + +

    Parameters

    +
    +
    og
    +
    Pointer to the current ogg_page struct.
    +
    + + +

    Return Values

    +
    +
  • +greater than 0 if this page is the beginning of a bitstream.
  • +
  • +0 if this page is from any other location in the stream.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_page_checksum_set.html b/cs/3rd party/libogg/doc/libogg/ogg_page_checksum_set.html new file mode 100644 index 000000000..9af7d4ea0 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_page_checksum_set.html @@ -0,0 +1,62 @@ + + + +libogg - function - ogg_page_checksum_set + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_page_checksum_set

    + +

    declared in "ogg/ogg.h";

    + +

    Checksums an ogg_page. +

    +

    + + + + +
    +
    
    +int ogg_page_checksum_set(ogg_page *og);
    +
    +
    +
    + +

    Parameters

    +
    +
    og
    +
    Pointer to an ogg_page struct.
    +
    + + +

    Return Values

    +
    +None. +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_page_continued.html b/cs/3rd party/libogg/doc/libogg/ogg_page_continued.html new file mode 100644 index 000000000..20b4edee0 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_page_continued.html @@ -0,0 +1,64 @@ + + + +libogg - function - ogg_page_version + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_page_continued

    + +

    declared in "ogg/ogg.h";

    + +

    Indicates whether this page contains packet data which has been continued from the previous page. +

    + + + + +
    +
    
    +int ogg_page_continued(ogg_page *og);
    +
    +
    +
    + +

    Parameters

    +
    +
    og
    +
    Pointer to the current ogg_page struct.
    +
    + + +

    Return Values

    +
    +
  • +1 if this page contains packet data continued from the last page.
  • +
  • +0 if this page does not contain continued data.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_page_eos.html b/cs/3rd party/libogg/doc/libogg/ogg_page_eos.html new file mode 100644 index 000000000..d81ebae21 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_page_eos.html @@ -0,0 +1,65 @@ + + + +libogg - function - ogg_page_eos + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_page_eos

    + +

    declared in "ogg/ogg.h";

    + +

    Indicates whether this page is at the end of the logical bitstream. +

    +

    + + + + +
    +
    
    +int ogg_page_eos(ogg_page *og);
    +
    +
    +
    + +

    Parameters

    +
    +
    og
    +
    Pointer to the current ogg_page struct.
    +
    + + +

    Return Values

    +
    +
  • +greater than zero if this page contains the end of a bitstream.
  • +
  • +0 if this page is from any other location in the stream.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_page_granulepos.html b/cs/3rd party/libogg/doc/libogg/ogg_page_granulepos.html new file mode 100644 index 000000000..826b48eb7 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_page_granulepos.html @@ -0,0 +1,65 @@ + + + +libogg - function - ogg_page_granulepos + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_page_granulepos

    + +

    declared in "ogg/ogg.h";

    + +

    Returns the exact granular position of the packet data contained at the end of this page. +

    This is useful for tracking location when seeking or decoding. +

    For example, in audio codecs this position is the pcm sample number and in video this is the frame number. +

    +

    + + + + +
    +
    
    +ogg_in64_t ogg_page_granulepos(ogg_page *og);
    +
    +
    +
    + +

    Parameters

    +
    +
    og
    +
    Pointer to the current ogg_page struct.
    +
    + + +

    Return Values

    +
    +
  • +n is the specific last granular position of the decoded data contained in the page.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_page_packets.html b/cs/3rd party/libogg/doc/libogg/ogg_page_packets.html new file mode 100644 index 000000000..011577706 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_page_packets.html @@ -0,0 +1,75 @@ + + + +libogg - function - ogg_page_packets + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_page_packets

    + +

    declared in "ogg/ogg.h";

    + +

    Returns the number of packets that are completed on this page. If the +leading packet is begun on a previous page, but ends on this page, it's +counted. +

    +

    + + + + +
    +
    
    +int ogg_page_packets(ogg_page *og);
    +
    +
    +
    + +

    Parameters

    +
    +
    og
    +
    Pointer to the current ogg_page struct.
    +
    + + +

    Return Values

    +
    +If a page consists of a packet begun on a previous page, and a new packet +begun (but not completed) on this page, the return will be:
    +
    +ogg_page_packets(page) will return 1,
    +ogg_page_continued(paged) will return non-zero.
    +

    +If a page happens to be a single packet that was begun on a previous page, and +spans to the next page (in the case of a three or more page packet), the +return will be:
    +
    +ogg_page_packets(page) will return 0,
    +ogg_page_continued(page) will return non-zero.
    +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_page_pageno.html b/cs/3rd party/libogg/doc/libogg/ogg_page_pageno.html new file mode 100644 index 000000000..b70b5509e --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_page_pageno.html @@ -0,0 +1,63 @@ + + + +libogg - function - ogg_page_pageno + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_page_pageno

    + +

    declared in "ogg/ogg.h";

    + +

    Returns the sequential page number. +

    This is useful for ordering pages or determining when pages have been lost. +

    + + + + +
    +
    
    +long ogg_page_pageno(ogg_page *og);
    +
    +
    +
    + +

    Parameters

    +
    +
    og
    +
    Pointer to the current ogg_page struct.
    +
    + + +

    Return Values

    +
    +
  • +n is the page number for this page.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_page_serialno.html b/cs/3rd party/libogg/doc/libogg/ogg_page_serialno.html new file mode 100644 index 000000000..12ff58006 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_page_serialno.html @@ -0,0 +1,63 @@ + + + +libogg - function - ogg_page_serialno + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_page_serialno

    + +

    declared in "ogg/ogg.h";

    + +

    Returns the unique serial number for the logical bitstream of this page. Each page contains the serial number for the logical bitstream that it belongs to. +

    +

    + + + + +
    +
    
    +int ogg_page_serialno(ogg_page *og);
    +
    +
    +
    + +

    Parameters

    +
    +
    og
    +
    Pointer to the current ogg_page struct.
    +
    + + +

    Return Values

    +
    +
  • +n is the serial number for this page.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_page_version.html b/cs/3rd party/libogg/doc/libogg/ogg_page_version.html new file mode 100644 index 000000000..01062ffdf --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_page_version.html @@ -0,0 +1,63 @@ + + + +libogg - function - ogg_page_version + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_page_version

    + +

    declared in "ogg/ogg.h";

    + +

    This function returns the version of ogg_page used in this page. +

    In current versions of libogg, all ogg_page structs have the same version, so 0 should always be returned. +

    + + + + +
    +
    
    +int ogg_page_version(ogg_page *og);
    +
    +
    +
    + +

    Parameters

    +
    +
    og
    +
    Pointer to the current ogg_page struct.
    +
    + + +

    Return Values

    +
    +
  • +n is the version number. In the current version of Ogg, the version number is always 0. Nonzero return values indicate an error in page encoding.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_stream_check.html b/cs/3rd party/libogg/doc/libogg/ogg_stream_check.html new file mode 100644 index 000000000..64d171f6c --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_stream_check.html @@ -0,0 +1,71 @@ + + + +libogg - function - ogg_stream_check + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_stream_check

    + +

    declared in "ogg/ogg.h";

    + +

    This function is used to check the error or readiness condition of an ogg_stream_state structure. +

    It is safe practice to ignore unrecoverable errors (such as an internal error caused by a malloc() failure) returned by ogg stream synchronization calls. Should an +internal error occur, the ogg_stream_state structure will be cleared (equivalent to a +call to +ogg_stream_clear) and subsequent calls +using this ogg_stream_state will be +noops. Error detection is then handled via a single call to +ogg_stream_check at the end of the operational block.

    + +

    + + + + +
    +
    
    +int ogg_stream_check(ogg_stream_state *os);
    +
    +
    + +

    Parameters

    +
    +
    os
    +
    Pointer to a previously declared ogg_stream_state struct.
    +
    + + +

    Return Values

    +
    +
  • +0 is returned if the ogg_stream_state structure is initialized and ready.
  • +
  • +nonzero is returned if the structure was never initialized, or if an unrecoverable internal error occurred in a previous call using the passed in ogg_stream_state struct.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_stream_clear.html b/cs/3rd party/libogg/doc/libogg/ogg_stream_clear.html new file mode 100644 index 000000000..83149e058 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_stream_clear.html @@ -0,0 +1,61 @@ + + + +libogg - function - ogg_stream_clear + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_stream_clear

    + +

    declared in "ogg/ogg.h";

    + +

    This function clears and frees the internal memory used by the ogg_stream_state struct, but does not free the structure itself. It is safe to call ogg_stream_clear on the same structure more than once. +

    + + + + +
    +
    
    +int ogg_stream_clear(ogg_stream_state *os);
    +
    +
    + +

    Parameters

    +
    +
    os
    +
    Pointer to the ogg_stream_state struct to be cleared.
    +
    + + +

    Return Values

    +
    +
  • +0 is always returned.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_stream_destroy.html b/cs/3rd party/libogg/doc/libogg/ogg_stream_destroy.html new file mode 100644 index 000000000..5eee7f064 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_stream_destroy.html @@ -0,0 +1,71 @@ + + + +libogg - function - ogg_stream_destroy + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_stream_destroy

    + +

    declared in "ogg/ogg.h";

    + +

    This function frees the internal memory used by +the ogg_stream_state struct as +well as the structure itself. + +

    This should be called when you are done working with an ogg stream. +It can also be called to make sure that the struct does not exist.

    + +

    It calls free() on its argument, so if the ogg_stream_state +is not malloc()'d or will otherwise be freed by your own code, use +ogg_stream_clear instead.

    + +

    + + + + +
    +
    
    +int ogg_stream_destroy(ogg_stream_state *os);
    +
    +
    + +

    Parameters

    +
    +
    os
    +
    Pointer to the ogg_stream_state struct to be destroyed.
    +
    + + +

    Return Values

    +
    +
  • +0 is always returned.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_stream_eos.html b/cs/3rd party/libogg/doc/libogg/ogg_stream_eos.html new file mode 100644 index 000000000..519e618d6 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_stream_eos.html @@ -0,0 +1,62 @@ + + + +libogg - function - ogg_stream_eos + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_stream_eos

    + +

    declared in "ogg/ogg.h";

    + +

    This function indicates whether we have reached the end of the stream or not. +

    + + + + +
    +
    
    +int ogg_stream_eos(ogg_stream_state *os);
    +
    +
    + +

    Parameters

    +
    +
    os
    +
    Pointer to the current ogg_stream_state struct.
    +
    + + +

    Return Values

    +
    +
  • 1 if we are at the end of the stream or an internal error occurred.
  • +
  • +0 if we have not yet reached the end of the stream.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_stream_flush.html b/cs/3rd party/libogg/doc/libogg/ogg_stream_flush.html new file mode 100644 index 000000000..317f442cc --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_stream_flush.html @@ -0,0 +1,67 @@ + + + +libogg - function - ogg_stream_flush + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_stream_flush

    + +

    declared in "ogg/ogg.h";

    + +

    This function checks for remaining packets inside the stream and forces remaining packets into a page, regardless of the size of the page. +

    This should only be used when you want to flush an undersized page from the middle of the stream. Otherwise, ogg_stream_pageout or ogg_stream_pageout_fill should always be used. +

    This function can also be used to verify that all packets have been flushed. If the return value is 0, all packets have been placed into a page. Like ogg_stream_pageout, it should generally be called in a loop until available packet data has been flushes, since even a single packet may span multiple pages. + +

    + + + + +
    +
    
    +int ogg_stream_flush(ogg_stream_state *os, ogg_page *og);
    +
    +
    + +

    Parameters

    +
    +
    os
    +
    Pointer to a previously declared ogg_stream_state struct, which represents the current logical bitstream.
    +
    og
    +
    Pointer to a page of data. The remaining packets in the stream will be placed into this page, if any remain. +
    + + +

    Return Values

    +
    +
  • 0 means that all packet data has already been flushed into pages, and there are no packets to put into the page. 0 is also returned in the case of an ogg_stream_state that has been cleared explicitly or implicitly due to an internal error.
  • +
  • +Nonzero means that remaining packets have successfully been flushed into the page.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_stream_flush_fill.html b/cs/3rd party/libogg/doc/libogg/ogg_stream_flush_fill.html new file mode 100644 index 000000000..62aa11a53 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_stream_flush_fill.html @@ -0,0 +1,74 @@ + + + +libogg - function - ogg_stream_flush_fill + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_stream_flush_fill

    + +

    declared in "ogg/ogg.h";

    + +

    This function flushes available packets into pages, similar to +ogg_stream_flush(), but +allows applications to explicitly request a specific page spill +size.

    + +

    This function checks for remaining packets inside the stream and forces remaining packets into pages of approximately the requested size. +This should be used when you want to flush all remaining data from a stream. ogg_stream_flush may be used instead if a particular page size isn't important. +

    This function can be used to verify that all packets have been flushed. If the return value is 0, all packets have been placed into a page. Generally speaking, it should be called in a loop until all packets are flushed, since even a single packet may span multiple pages. + +

    + + + + +
    +
    
    +int ogg_stream_flush_fill(ogg_stream_state *os, ogg_page *og, int fillbytes);
    +
    +
    + +

    Parameters

    +
    +
    os
    +
    Pointer to a previously declared ogg_stream_state struct, which represents the current logical bitstream.
    +
    og
    +
    Pointer to a page of data. The remaining packets in the stream will be placed into this page, if any remain. +
    fillbytes
    +
    Packet data watermark in bytes.
    +
    + + +

    Return Values

    +
    +
  • 0 means that all packet data has already been flushed into pages, and there are no packets to put into the page. 0 is also returned in the case of an ogg_stream_state that has been cleared explicitly or implicitly due to an internal error.
  • +
  • +Nonzero means that remaining packets have successfully been flushed into the page.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_stream_init.html b/cs/3rd party/libogg/doc/libogg/ogg_stream_init.html new file mode 100644 index 000000000..4459ee968 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_stream_init.html @@ -0,0 +1,66 @@ + + + +libogg - function - ogg_stream_init + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_stream_init

    + +

    declared in "ogg/ogg.h";

    + +

    This function is used to initialize an ogg_stream_state struct and allocates appropriate memory in preparation for encoding or decoding. +

    It also assigns the stream a given serial number. +

    + + + + +
    +
    
    +int ogg_stream_init(ogg_stream_state *os,int serialno);
    +
    +
    + +

    Parameters

    +
    +
    os
    +
    Pointer to the ogg_stream_state struct that we will be initializing.
    +
    serialno
    +
    Serial number that we will attach to this stream.
    +
    + + +

    Return Values

    +
    +
  • +0 if successful
  • +
  • +-1 if unsuccessful.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_stream_iovecin.html b/cs/3rd party/libogg/doc/libogg/ogg_stream_iovecin.html new file mode 100644 index 000000000..b7cfe67f4 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_stream_iovecin.html @@ -0,0 +1,80 @@ + + + +libogg - function - ogg_stream_iovecin + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_stream_iovecin

    + +

    declared in "ogg/ogg.h";

    + +

    This function submits packet data (in the form of +an array of ogg_iovec_t, rather than using +an ogg_packet structure) to the +bitstream for page encapsulation. After this is called, more packets +can be submitted, or pages can be written out.

    + +

    In a typical encoding situation, this should be used after filling a +packet with data. +The data in the packet is copied into the internal storage managed by +the ogg_stream_state, so the caller +is free to alter the contents of os after this call has returned. + +

    + + + + +
    +
    
    +int ogg_stream_iovecin(ogg_stream_state *os, ogg_iovec_t *iov, int count, long e_o_s, ogg_int64_t granulepos);
    +
    +
    + +

    Parameters

    +
    +
    os
    +
    Pointer to a previously declared ogg_stream_state struct.
    +
    iov
    +
    Length-encoded buffers held in an array of ogg_iovec_t. +
    count
    +
    Length of the iov array. +
    e_o_s
    +
    End of stream flag, analagous to the e_o_s field in an ogg_packet. +
    granulepos
    +
    Granule position value, analagous to the granpos field in an ogg_packet. +
    + + +

    Return Values

    +
    +
  • +0 returned on success. -1 returned in the event of internal error.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_stream_packetin.html b/cs/3rd party/libogg/doc/libogg/ogg_stream_packetin.html new file mode 100644 index 000000000..bc05f5278 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_stream_packetin.html @@ -0,0 +1,72 @@ + + + +libogg - function - ogg_stream_packetin + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_stream_packetin

    + +

    declared in "ogg/ogg.h";

    + +

    This function submits a packet to the bitstream for page +encapsulation. After this is called, more packets can be submitted, +or pages can be written out.

    + +

    In a typical encoding situation, this should be used after filling a +packet with data. +The data in the packet is copied into the internal storage managed by +the ogg_stream_state, so the caller +is free to alter the contents of op after this call has returned. + +

    + + + + +
    +
    
    +int ogg_stream_packetin(ogg_stream_state *os,ogg_packet *op);
    +
    +
    + +

    Parameters

    +
    +
    os
    +
    Pointer to a previously declared ogg_stream_state struct.
    +
    op
    +
    Pointer to the packet we are putting into the bitstream. +
    + + +

    Return Values

    +
    +
  • +0 returned on success. -1 returned in the event of internal error.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_stream_packetout.html b/cs/3rd party/libogg/doc/libogg/ogg_stream_packetout.html new file mode 100644 index 000000000..148f782a9 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_stream_packetout.html @@ -0,0 +1,85 @@ + + + +libogg - function - ogg_stream_packetout + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_stream_packetout

    + +

    declared in "ogg/ogg.h";

    + +

    This function assembles a data packet for output to the codec +decoding engine. The data has already been submitted to the +ogg_stream_state and broken +into segments. Each successive call returns the next complete packet +built from those segments.

    + +

    In a typical decoding situation, this should be used after calling +ogg_stream_pagein() to submit a +page of data to the bitstream. If the function returns 0, more data is +needed and another page should be submitted. A non-zero return value +indicates successful return of a packet.

    + +

    The op is filled in with pointers to memory managed by +the stream state and is only valid until the next call. The client +must copy the packet data if a longer lifetime is required.

    + +

    + + + + +
    +
    
    +int ogg_stream_packetout(ogg_stream_state *os,ogg_packet *op);
    +
    +
    + +

    Parameters

    +
    +
    os
    +
    Pointer to a previously declared ogg_stream_state struct. Before this function is called, an ogg_page should be submitted to the stream using ogg_stream_pagein().
    +
    op
    +
    Pointer to the packet to be filled in with pointers to the new data. +This will typically be submitted to a codec for decode after this +function is called. The pointers are only valid until the next call +on this stream state.
    +
    + + +

    Return Values

    +
    +
      +
    • -1 if we are out of sync and there is a gap in the data. This is usually a recoverable error and subsequent calls to ogg_stream_packetout are likely to succeed. op has not been updated.
    • +
    • 0 if there is insufficient data available to complete a packet, or on unrecoverable internal error occurred. op has not been updated. +
    • 1 if a packet was assembled normally. op contains the next packet from the stream.
    • +
    +
    + +

    + +
    + + + + + + + + + +

    copyright © 2000-2010 xiph.org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_stream_packetpeek.html b/cs/3rd party/libogg/doc/libogg/ogg_stream_packetpeek.html new file mode 100644 index 000000000..a6dc6788d --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_stream_packetpeek.html @@ -0,0 +1,85 @@ + + + +libogg - function - ogg_stream_packetpeek + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_stream_packetpeek

    + +

    declared in "ogg/ogg.h";

    + +

    This function attempts to assemble a raw data packet and returns +it without advancing decoding.

    + +

    In a typical situation, this would be called +speculatively after ogg_stream_pagein() to check +the packet contents before handing it off to a codec for +decompression. To advance page decoding and remove +the packet from the sync structure, call +ogg_stream_packetout().

    + +

    + + + + + +
    +
    
    +int ogg_stream_packetpeek(ogg_stream_state *os,ogg_packet *op);
    +
    +
    + +

    Parameters

    +
    +
    os
    +
    Pointer to a previously declared +ogg_stream_state struct. Before this +function is called, an ogg_page should be +submitted to the stream using +ogg_stream_pagein().
    +
    op
    +
    Pointer to the next packet available in the bitstream, if +any. A NULL value may be passed in the case of a simple "is there a +packet?" check.
    +
    + + +

    Return Values

    +
    +
      +
    • -1 if there's no packet available due to lost sync or a hole in the data.
    • +
    • 0 if there is insufficient data available to complete a packet, or on unrecoverable internal error occurred.
    • +
    • 1 if a packet is available.
    • +
    +
    + + +

    + +
    + + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_stream_pagein.html b/cs/3rd party/libogg/doc/libogg/ogg_stream_pagein.html new file mode 100644 index 000000000..fddaed1f9 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_stream_pagein.html @@ -0,0 +1,67 @@ + + + +libogg - function - ogg_stream_pagein + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_stream_pagein

    + +

    declared in "ogg/ogg.h";

    + +

    This function adds a complete page to the bitstream. +

    In a typical decoding situation, this function would be called after using ogg_sync_pageout to create a valid ogg_page struct. +

    Internally, this function breaks the page into packet segments in preparation for outputting a valid packet to the codec decoding layer. + +

    + + + + +
    +
    
    +int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og);
    +
    +
    + +

    Parameters

    +
    +
    os
    +
    Pointer to a previously declared ogg_stream_state struct, which represents the current logical bitstream.
    +
    og
    +
    Pointer to a page of data. The data inside this page is being submitted to the streaming layer in order to be allocated into packets. +
    + + +

    Return Values

    +
    +
  • -1 indicates failure. This means that the serial number of the page did not match the serial number of the bitstream, the page version was incorrect, or an internal error occurred.
  • +
  • +0 means that the page was successfully submitted to the bitstream.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_stream_pageout.html b/cs/3rd party/libogg/doc/libogg/ogg_stream_pageout.html new file mode 100644 index 000000000..66139e319 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_stream_pageout.html @@ -0,0 +1,84 @@ + + + +libogg - function - ogg_stream_pageout + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_stream_pageout

    + +

    declared in "ogg/ogg.h";

    + +

    This function forms packets into pages.

    + +

    In a typical encoding situation, this would be called after using ogg_stream_packetin() to submit +data packets to the bitstream. Internally, this function assembles +the accumulated packet bodies into an Ogg page suitable for writing +to a stream. The function is typically called in a loop until there +are no more pages ready for output.

    + +

    This function will only return a page when a "reasonable" amount of +packet data is available. Normally this is appropriate since it +limits the overhead of the Ogg page headers in the bitstream, and so +calling ogg_stream_pageout() after ogg_stream_packetin() should be the +common case. Call ogg_stream_flush() +if immediate page generation is desired. This may be occasionally +necessary, for example, to limit the temporal latency of a variable +bitrate stream.

    + +

    + + + + +
    +
    
    +int ogg_stream_pageout(ogg_stream_state *os, ogg_page *og);
    +
    +
    + +

    Parameters

    +
    +
    os
    +
    Pointer to a previously declared ogg_stream struct, which represents the current logical bitstream.
    +
    og
    +
    Pointer to an ogg_page structure to fill +in. Data pointed to is owned by libogg. The structure is valid until the +next call to ogg_stream_pageout(), ogg_stream_packetin(), or +ogg_stream_flush().
    +
    + + +

    Return Values

    +
    +
  • Zero means that insufficient data has accumulated to fill a page, or an internal error occurred. In +this case og is not modified.
  • +
  • Non-zero means that a page has been completed and returned.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2010 xiph.org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_stream_pageout_fill.html b/cs/3rd party/libogg/doc/libogg/ogg_stream_pageout_fill.html new file mode 100644 index 000000000..af9553143 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_stream_pageout_fill.html @@ -0,0 +1,89 @@ + + + +libogg - function - ogg_stream_pageout_fill + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_stream_pageout_fill

    + +

    declared in "ogg/ogg.h";

    + +

    This function forms packets into pages, similar +to ogg_stream_pageout(), but +allows applications to explicitly request a specific page spill +size.

    + +

    In a typical encoding situation, this would be called after using ogg_stream_packetin() to submit +data packets to the bitstream. Internally, this function assembles +the accumulated packet bodies into an Ogg page suitable for writing +to a stream. The function is typically called in a loop until there +are no more pages ready for output.

    + +

    This function will return a page when at least four packets have +been accumulated and accumulated packet data meets or exceeds the +specified number of bytes, and/or when the accumulated packet +data meets/exceeds the maximum page size regardless of accumulated +packet count. +Call ogg_stream_flush() or +ogg_stream_flush_fill() if +immediate page generation is desired regardless of accumulated data.

    + +

    + + + + +
    +
    
    +int ogg_stream_pageout_fill(ogg_stream_state *os, ogg_page *og, int fillbytes);
    +
    +
    + +

    Parameters

    +
    +
    os
    +
    Pointer to a previously declared ogg_stream struct, which represents the current logical bitstream.
    +
    og
    +
    Pointer to an ogg_page structure to fill +in. Data pointed to is owned by libogg. The structure is valid until the +next call to ogg_stream_pageout(), ogg_stream_packetin(), or +ogg_stream_flush().
    +
    fillbytes
    +
    Packet data watermark in bytes.
    +
    + + +

    Return Values

    +
    +
  • Zero means that insufficient data has accumulated to fill a page, or an internal error occurred. In +this case og is not modified.
  • +
  • Non-zero means that a page has been completed and returned.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2010 xiph.org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_stream_reset.html b/cs/3rd party/libogg/doc/libogg/ogg_stream_reset.html new file mode 100644 index 000000000..eb7ee3600 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_stream_reset.html @@ -0,0 +1,61 @@ + + + +libogg - function - ogg_stream_reset + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_stream_reset

    + +

    declared in "ogg/ogg.h";

    + +

    This function sets values in the ogg_stream_state struct back to initial values. +

    + + + + +
    +
    
    +int ogg_stream_reset(ogg_stream_state *os);
    +
    +
    + +

    Parameters

    +
    +
    os
    +
    Pointer to the ogg_stream_state struct to be cleared.
    +
    + + +

    Return Values

    +
    +
  • +0 indicates success. nonzero is returned on internal error.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_stream_reset_serialno.html b/cs/3rd party/libogg/doc/libogg/ogg_stream_reset_serialno.html new file mode 100644 index 000000000..68050181c --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_stream_reset_serialno.html @@ -0,0 +1,67 @@ + + + +libogg - function - ogg_stream_reset_serialno + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_stream_reset

    + +

    declared in "ogg/ogg.h";

    + +

    This function reinitializes the values in the +ogg_stream_state, +just like ogg_stream_reset(). +Additionally, it sets the stream serial number to the given value.

    + +

    + + + + +
    +
    
    +int ogg_stream_reset_serialno(ogg_stream_state *os, int serialno);
    +
    +
    + +

    Parameters

    +
    +
    os
    +
    Pointer to the ogg_stream_state struct to be cleared.
    +
    serialno
    +
    New stream serial number to use
    +
    + + +

    Return Values

    +
    +
  • +0 indicates success. nonzero is returned on internal error.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org Foundation

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_stream_state.html b/cs/3rd party/libogg/doc/libogg/ogg_stream_state.html new file mode 100644 index 000000000..6f42faf7d --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_stream_state.html @@ -0,0 +1,121 @@ + + + +libogg - datatype - ogg_stream_state + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_stream_state

    + +

    declared in "ogg/ogg.h"

    + +

    +The ogg_stream_state struct tracks the current encode/decode state of the current logical bitstream. +

    + + + + + +
    +
    
    +typedef struct {
    +  unsigned char   *body_data;    /* bytes from packet bodies */
    +  long    body_storage;          /* storage elements allocated */
    +  long    body_fill;             /* elements stored; fill mark */
    +  long    body_returned;         /* elements of fill returned */
    +
    +
    +  int     *lacing_vals;    /* The values that will go to the segment table */
    +  ogg_int64_t *granule_vals;      /* granulepos values for headers. Not compact
    +                             this way, but it is simple coupled to the
    +                             lacing fifo */
    +  long    lacing_storage;
    +  long    lacing_fill;
    +  long    lacing_packet;
    +  long    lacing_returned;
    +
    +  unsigned char    header[282];      /* working space for header encode */
    +  int              header_fill;
    +
    +  int     e_o_s;          /* set when we have buffered the last packet in the
    +                             logical bitstream */
    +  int     b_o_s;          /* set after we've written the initial page
    +                             of a logical bitstream */
    +  long     serialno;
    +  int      pageno;
    +  ogg_int64_t  packetno;      /* sequence number for decode; the framing
    +                             knows where there's a hole in the data,
    +                             but we need coupling so that the codec
    +                             (which is in a seperate abstraction
    +                             layer) also knows about the gap */
    +  ogg_int64_t   granulepos;
    +
    +} ogg_stream_state;
    +
    +
    + +

    Relevant Struct Members

    +
    +
    body_data
    +
    Pointer to data from packet bodies.
    +
    body_storage
    +
    Storage allocated for bodies in bytes (filled or unfilled).
    +
    body_fill
    +
    Amount of storage filled with stored packet bodies.
    +
    body_returned
    +
    Number of elements returned from storage.
    +
    lacing_vals
    +
    String of lacing values for the packet segments within the current page. Each value is a byte, indicating packet segment length.
    +
    granule_vals
    +
    Pointer to the lacing values for the packet segments within the current page.
    +
    lacing_storage
    +
    Total amount of storage (in bytes) allocated for storing lacing values.
    +
    lacing_fill
    +
    Fill marker for the current vs. total allocated storage of lacing values for the page.
    +
    lacing_packet
    +
    Lacing value for current packet segment.
    +
    lacing_returned
    +
    Number of lacing values returned from lacing_storage.
    +
    header
    +
    Temporary storage for page header during encode process, while the header is being created.
    +
    header_fill
    +
    Fill marker for header storage allocation. Used during the header creation process.
    +
    e_o_s
    +
    Marker set when the last packet of the logical bitstream has been buffered.
    +
    b_o_s
    +
    Marker set after we have written the first page in the logical bitstream.
    +
    serialno
    +
    Serial number of this logical bitstream.
    +
    pageno
    +
    Number of the current page within the stream.
    +
    packetno
    +
    Number of the current packet.
    +
    granulepos
    +
    Exact position of decoding/encoding process.
    +
    + + +

    +
    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_sync_buffer.html b/cs/3rd party/libogg/doc/libogg/ogg_sync_buffer.html new file mode 100644 index 000000000..be7915aea --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_sync_buffer.html @@ -0,0 +1,67 @@ + + + +libogg - function - ogg_sync_buffer + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_sync_buffer

    + +

    declared in "ogg/ogg.h";

    + +

    This function is used to provide a properly-sized buffer for writing. +

    Buffer space which has already been returned is cleared, and the buffer is extended as necessary by the size plus some additional bytes. Within the current implementation, an extra 4096 bytes are allocated, but applications should not rely on this additional buffer space. +

    The buffer exposed by this function is empty internal storage from the ogg_sync_state struct, beginning at the fill mark within the struct. +

    A pointer to this buffer is returned to be used by the calling application. + +

    + + + + +
    +
    
    +char *ogg_sync_buffer(ogg_sync_state *oy, long size);
    +
    +
    + +

    Parameters

    +
    +
    oy
    +
    Pointer to a previously declared ogg_sync_state struct.
    +
    size
    +
    Size of the desired buffer. The actual size of the buffer returned will be this size plus some extra bytes (currently 4096). +
    + + +

    Return Values

    +
    +
  • +Returns a pointer to the newly allocated buffer or NULL on error
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_sync_check.html b/cs/3rd party/libogg/doc/libogg/ogg_sync_check.html new file mode 100644 index 000000000..daac33019 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_sync_check.html @@ -0,0 +1,71 @@ + + + +libogg - function - ogg_sync_check + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_sync_check

    + +

    declared in "ogg/ogg.h";

    + +

    This function is used to check the error or readiness condition of an ogg_sync_state structure. +

    It is safe practice to ignore unrecoverable errors (such as an internal error caused by a malloc() failure) returned by ogg stream synchronization calls. Should an +internal error occur, the ogg_sync_state structure will be cleared (equivalent to a +call to +ogg_sync_clear) and subsequent calls +using this ogg_sync_state will be +noops. Error detection is then handled via a single call to +ogg_sync_check at the end of the operational block.

    + +

    + + + + +
    +
    
    +int ogg_sync_check(ogg_sync_state *oy);
    +
    +
    + +

    Parameters

    +
    +
    oy
    +
    Pointer to a previously declared ogg_sync_state struct.
    +
    + + +

    Return Values

    +
    +
  • +0 is returned if the ogg_sync_state structure is initialized and ready.
  • +
  • +nonzero is returned if the structure was never initialized, or if an unrecoverable internal error occurred in a previous call using the passed in ogg_sync_state struct.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_sync_clear.html b/cs/3rd party/libogg/doc/libogg/ogg_sync_clear.html new file mode 100644 index 000000000..209317b38 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_sync_clear.html @@ -0,0 +1,62 @@ + + + +libogg - function - ogg_sync_clear + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_sync_clear

    + +

    declared in "ogg/ogg.h";

    + +

    This function is used to free the internal storage of an ogg_sync_state struct and resets the struct to the initial state. To free the entire struct, ogg_sync_destroy should be used instead. In situations where the struct needs to be reset but the internal storage does not need to be freed, ogg_sync_reset should be used. + +

    + + + + +
    +
    
    +int ogg_sync_clear(ogg_sync_state *oy);
    +
    +
    + +

    Parameters

    +
    +
    oy
    +
    Pointer to a previously declared ogg_sync_state struct.
    +
    + + +

    Return Values

    +
    +
  • +0 is always returned.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_sync_destroy.html b/cs/3rd party/libogg/doc/libogg/ogg_sync_destroy.html new file mode 100644 index 000000000..333faf3b3 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_sync_destroy.html @@ -0,0 +1,68 @@ + + + +libogg - function - ogg_sync_destroy + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_sync_destroy

    + +

    declared in "ogg/ogg.h";

    + +

    This function is used to destroy an ogg_sync_state struct and free all memory used.

    + +

    Note this calls free() on its argument so you should only use this +function if you've allocated the ogg_sync_state on the heap. If it is +allocated on the stack, or it will otherwise be freed by your +own code, use ogg_sync_clear instead +to release just the internal memory.

    + +

    + + + + +
    +
    
    +int ogg_sync_destroy(ogg_sync_state *oy);
    +
    +
    + +

    Parameters

    +
    +
    oy
    +
    Pointer to a previously declared ogg_sync_state struct.
    +
    + + +

    Return Values

    +
    +
  • +0 is always returned.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_sync_init.html b/cs/3rd party/libogg/doc/libogg/ogg_sync_init.html new file mode 100644 index 000000000..590edc80a --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_sync_init.html @@ -0,0 +1,63 @@ + + + +libogg - function - ogg_sync_init + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_sync_init

    + +

    declared in "ogg/ogg.h";

    + +

    This function is used to initialize an ogg_sync_state struct to a known initial value in preparation for manipulation of an Ogg bitstream. +

    The ogg_sync struct is important when decoding, as it synchronizes retrieval and return of data. + +

    + + + + +
    +
    
    +int ogg_sync_init(ogg_sync_state *oy);
    +
    +
    + +

    Parameters

    +
    +
    oy
    +
    Pointer to a previously declared ogg_sync_state struct. After this function call, this struct has been initialized.
    +
    + + +

    Return Values

    +
    +
  • +0 is always returned.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_sync_pageout.html b/cs/3rd party/libogg/doc/libogg/ogg_sync_pageout.html new file mode 100644 index 000000000..5f3f24c62 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_sync_pageout.html @@ -0,0 +1,77 @@ + + + +libogg - function - ogg_sync_pageout + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_sync_pageout

    + +

    declared in "ogg/ogg.h";

    + +

    This function takes the data stored in the buffer of the ogg_sync_state struct and inserts them into an ogg_page. + +

    In an actual decoding loop, this function should be called first to ensure that the buffer is cleared. The example code below illustrates a clean reading loop which will fill and output pages. +

    Caution:This function should be called before reading into the buffer to ensure that data does not remain in the ogg_sync_state struct. Failing to do so may result in a memory leak. See the example code below for details. + +

    + + + + +
    +
    
    +int ogg_sync_pageout(ogg_sync_state *oy, ogg_page *og);
    +
    +
    + +

    Parameters

    +
    +
    oy
    +
    Pointer to a previously declared ogg_sync_state struct. Normally, the internal storage of this struct should be filled with newly read data and verified using ogg_sync_wrote.
    +
    og
    +
    Pointer to page struct filled by this function. +
    + + +

    Return Values

    +
    +
  • -1 returned if stream has not yet captured sync (bytes were skipped).
  • +
  • 0 returned if more data needed or an internal error occurred.
  • +
  • 1 indicated a page was synced and returned.
  • +
    +

    + +

    Example Usage

    +
    +if (ogg_sync_pageout(&oy, &og) != 1) {
    +	buffer = ogg_sync_buffer(&oy, 8192);
    +	bytes = fread(buffer, 1, 8192, stdin);
    +	ogg_sync_wrote(&oy, bytes);
    +}
    +
    + +

    +
    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_sync_pageseek.html b/cs/3rd party/libogg/doc/libogg/ogg_sync_pageseek.html new file mode 100644 index 000000000..b2efe892c --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_sync_pageseek.html @@ -0,0 +1,68 @@ + + + +libogg - function - ogg_sync_pageseek + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_sync_pageseek

    + +

    declared in "ogg/ogg.h";

    + +

    This function synchronizes the ogg_sync_state struct to the next ogg_page. +

    This is useful when seeking within a bitstream. ogg_sync_pageseek will synchronize to the next page in the bitstream and return information about how many bytes we advanced or skipped in order to do so. + +

    + + + + +
    +
    
    +int ogg_sync_pageseek(ogg_sync_state *oy, ogg_page *og);
    +
    +
    + +

    Parameters

    +
    +
    oy
    +
    Pointer to a previously declared ogg_sync_state struct.
    +
    og
    +
    Pointer to a page (or an incomplete page) of data. This is the page we are attempting to sync. +
    + + +

    Return Values

    +
    +
  • -n means that we skipped n bytes within the bitstream.
  • +
  • +0 means that the page isn't ready and we need more data, or than an internal error occurred. No bytes have been skipped.
  • +
  • +n means that the page was synced at the current location, with a page length of n bytes. +
  • +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_sync_reset.html b/cs/3rd party/libogg/doc/libogg/ogg_sync_reset.html new file mode 100644 index 000000000..12cd6c1b8 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_sync_reset.html @@ -0,0 +1,63 @@ + + + +libogg - function - ogg_sync_reset + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_sync_reset

    + +

    declared in "ogg/ogg.h";

    + +

    This function is used to reset the internal counters of the ogg_sync_state struct to initial values. +

    It is a good idea to call this before seeking within a bitstream. + +

    + + + + +
    +
    
    +int ogg_sync_reset(ogg_sync_state *oy);
    +
    +
    + +

    Parameters

    +
    +
    oy
    +
    Pointer to a previously declared ogg_sync_state struct.
    +
    + + +

    Return Values

    +
    +
  • +0 is always returned.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_sync_state.html b/cs/3rd party/libogg/doc/libogg/ogg_sync_state.html new file mode 100644 index 000000000..78f83880b --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_sync_state.html @@ -0,0 +1,77 @@ + + + +libogg - datatype - ogg_sync_state + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_sync_state

    + +

    declared in "ogg/ogg.h"

    + +

    +The ogg_sync_state struct tracks the synchronization of the current page. +

    It is used during decoding to track the status of data as it is read in, synchronized, verified, and parsed into pages belonging to the various logical bistreams in the current physical bitstream link. +

    + + + + + +
    +
    
    +typedef struct {
    +  unsigned char *data;
    +  int storage;
    +  int fill;
    +  int returned;
    +
    +  int unsynced;
    +  int headerbytes;
    +  int bodybytes;
    +} ogg_sync_state;
    +
    +
    + +

    Relevant Struct Members

    +
    +
    data
    +
    Pointer to buffered stream data.
    +
    storage
    +
    Current allocated size of the stream buffer held in *data.
    +
    fill
    +
    The number of valid bytes currently held in *data; functions as the buffer head pointer.
    +
    returned
    +
    The number of bytes at the head of *data that have already been returned as pages; functions as the buffer tail pointer.
    +
    unsynced
    +
    Synchronization state flag; nonzero if sync has not yet been attained or has been lost.
    +
    headerbytes
    +
    If synced, the number of bytes used by the synced page's header.
    +
    bodybytes
    +
    If synced, the number of bytes used by the synced page's body.
    +
    + + +

    +
    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + diff --git a/cs/3rd party/libogg/doc/libogg/ogg_sync_wrote.html b/cs/3rd party/libogg/doc/libogg/ogg_sync_wrote.html new file mode 100644 index 000000000..182518500 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/ogg_sync_wrote.html @@ -0,0 +1,73 @@ + + + +libogg - function - ogg_sync_wrote + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    ogg_sync_wrote

    + +

    declared in "ogg/ogg.h";

    + +

    This function is used to tell the ogg_sync_state struct how many bytes we wrote into the buffer. + +

    +The general proceedure is to request a pointer into an internal +ogg_sync_state buffer by calling +ogg_sync_buffer(). The buffer +is then filled up to the requested size with new input, and +ogg_sync_wrote() is called to advance the fill pointer by however +much data was actually available.

    + +
    + + + + +
    +
    
    +int ogg_sync_wrote(ogg_sync_state *oy, long bytes);
    +
    +
    + +

    Parameters

    +
    +
    oy
    +
    Pointer to a previously declared ogg_sync_state struct.
    +
    bytes
    +
    Number of bytes of new data written.
    +
    + + +

    Return Values

    +
    +
  • -1 if the number of bytes written overflows the internal storage of the ogg_sync_state struct or an internal error occurred. +
  • +0 in all other cases.
  • +
    + + +

    +
    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/oggpack_adv.html b/cs/3rd party/libogg/doc/libogg/oggpack_adv.html new file mode 100644 index 000000000..0e67b9374 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/oggpack_adv.html @@ -0,0 +1,64 @@ + + + +libogg - function - oggpack_adv + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    oggpack_adv

    + +

    declared in "ogg/ogg.h";

    + +

    This function advances the location pointer by the specified number of bits without reading any data. + +

    + + + + +
    +
    
    +void  oggpack_adv(oggpack_buffer *b,int bits);
    +
    +
    + +

    Parameters

    +
    +
    b
    +
    Pointer to the current oggpack_buffer.
    +
    bits
    +
    Number of bits to advance.
    +
    + + +

    Return Values

    +
    +
  • +No values are returned.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org Foundation

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/oggpack_adv1.html b/cs/3rd party/libogg/doc/libogg/oggpack_adv1.html new file mode 100644 index 000000000..0b7dd8943 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/oggpack_adv1.html @@ -0,0 +1,62 @@ + + + +libogg - function - oggpack_adv1 + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    oggpack_adv1

    + +

    declared in "ogg/ogg.h";

    + +

    This function advances the location pointer by one bit without reading any data. + +

    + + + + +
    +
    
    +void  oggpack_adv1(oggpack_buffer *b);
    +
    +
    + +

    Parameters

    +
    +
    b
    +
    Pointer to the current oggpack_buffer.
    +
    + + +

    Return Values

    +
    +
  • No values are returned. +
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/oggpack_bits.html b/cs/3rd party/libogg/doc/libogg/oggpack_bits.html new file mode 100644 index 000000000..a31bd1b0f --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/oggpack_bits.html @@ -0,0 +1,62 @@ + + + +libogg - function - oggpack_bits + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    oggpack_bits

    + +

    declared in "ogg/ogg.h";

    + +

    This function returns the total number of bits currently in the oggpack_buffer's internal buffer. + +

    + + + + +
    +
    
    +long oggpack_bits(oggpack_buffer *b);
    +
    +
    + +

    Parameters

    +
    +
    b
    +
    oggpack_buffer struct to be .
    +
    + + +

    Return Values

    +
    +
  • +n is the total number of bits within the current buffer.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/oggpack_buffer.html b/cs/3rd party/libogg/doc/libogg/oggpack_buffer.html new file mode 100644 index 000000000..906cbf96b --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/oggpack_buffer.html @@ -0,0 +1,66 @@ + + + +libogg - datatype - oggpack_buffer + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    oggpack_buffer

    + +

    declared in "ogg/ogg.h"

    + +

    +The oggpack_buffer struct is used with libogg's bitpacking functions. You should never need to directly access anything in this structure. +

    + + + + + +
    +
    
    +typedef struct {
    +  long endbyte;
    +  int  endbit;
    +
    +  unsigned char *buffer;
    +  unsigned char *ptr;
    +  long storage;
    +} oggpack_buffer;
    +
    +
    + +

    Relevant Struct Members

    +
    +
    buffer
    +
    Pointer to data being manipulated.
    +
    ptr
    +
    Location pointer to mark which data has been read.
    +
    storage
    +
    Size of buffer. +
    + + +

    +
    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + diff --git a/cs/3rd party/libogg/doc/libogg/oggpack_bytes.html b/cs/3rd party/libogg/doc/libogg/oggpack_bytes.html new file mode 100644 index 000000000..4eb48fe93 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/oggpack_bytes.html @@ -0,0 +1,67 @@ + + + +libogg - function - oggpack_bytes + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    oggpack_bytes

    + +

    declared in "ogg/ogg.h";

    + +

    This function returns the total number of bytes behind the current +access point in the oggpack_buffer. +For write-initialized buffers, this is the number of complete bytes +written so far. For read-initialized buffers, it is the number of +complete bytes that have been read so far. +

    The return value is the number of complete bytes in the buffer. +There may be extra (<8) bits. +

    + + + + +
    +
    
    +long oggpack_bytes(oggpack_buffer *b);
    +
    +
    + +

    Parameters

    +
    +
    b
    +
    oggpack_buffer struct to be checked.
    +
    + + +

    Return Values

    +
    +
  • +n is the total number of bytes within the current buffer.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2010 xiph.org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/oggpack_get_buffer.html b/cs/3rd party/libogg/doc/libogg/oggpack_get_buffer.html new file mode 100644 index 000000000..a4bfad2ff --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/oggpack_get_buffer.html @@ -0,0 +1,62 @@ + + + +libogg - function - oggpack_get_buffer + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    oggpack_get_buffer

    + +

    declared in "ogg/ogg.h";

    + +

    This function returns a pointer to the data buffer within the given oggpack_buffer struct. + +

    + + + + +
    +
    
    +unsigned char *oggpack_get_buffer(oggpack_buffer *b);
    +
    +
    + +

    Parameters

    +
    +
    b
    +
    Pointer to the current oggpack_buffer.
    +
    + + +

    Return Values

    +
    +
  • +No values are returned.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/oggpack_look.html b/cs/3rd party/libogg/doc/libogg/oggpack_look.html new file mode 100644 index 000000000..076eff3a3 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/oggpack_look.html @@ -0,0 +1,66 @@ + + + +libogg - function - oggpack_look + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    oggpack_look

    + +

    declared in "ogg/ogg.h";

    + +

    This function looks at a specified number of bits inside the buffer without advancing the location pointer. +

    The specified number of bits are read, starting from the location pointer. +

    This function can be used to read 32 or fewer bits. + +

    + + + + +
    +
    
    +long  oggpack_look(oggpack_buffer *b,int bits);
    +
    +
    + +

    Parameters

    +
    +
    b
    +
    Pointer to oggpack_buffer to be read.
    +
    bits
    +
    Number of bits to look at. For this function, must be 32 or fewer.
    +
    + + +

    Return Values

    +
    +
  • +n represents the requested bits.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/oggpack_look1.html b/cs/3rd party/libogg/doc/libogg/oggpack_look1.html new file mode 100644 index 000000000..536116429 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/oggpack_look1.html @@ -0,0 +1,63 @@ + + + +libogg - function - oggpack_look1 + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    oggpack_look1

    + +

    declared in "ogg/ogg.h";

    + +

    This function looks at the next bit without advancing the location pointer. +

    The next bit is read starting from the location pointer. + +

    + + + + +
    +
    
    +long  oggpack_look1(oggpack_buffer *b);
    +
    +
    + +

    Parameters

    +
    +
    b
    +
    Pointer to an oggpack_buffer struct containing our buffer.
    +
    + + +

    Return Values

    +
    +
  • +n represents the value of the next bit after the location pointer.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/oggpack_read.html b/cs/3rd party/libogg/doc/libogg/oggpack_read.html new file mode 100644 index 000000000..a8269164e --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/oggpack_read.html @@ -0,0 +1,65 @@ + + + +libogg - function - oggpack_read + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    oggpack_read

    + +

    declared in "ogg/ogg.h";

    + +

    This function reads the requested number of bits from the buffer and advances the location pointer. +

    Before reading, the buffer should be initialized using oggpack_readinit. + +

    + + + + +
    +
    
    +long oggpack_read(oggpack_buffer *b,int bits);
    +
    +
    + +

    Parameters

    +
    +
    b
    +
    Pointer to an oggpack_buffer struct containing buffered data to be read.
    +
    bits
    +
    Number of bits to read.
    +
    + + +

    Return Values

    +
    +
  • +n represents the requested bits.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/oggpack_read1.html b/cs/3rd party/libogg/doc/libogg/oggpack_read1.html new file mode 100644 index 000000000..9a7e1cbe7 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/oggpack_read1.html @@ -0,0 +1,63 @@ + + + +libogg - function - oggpack_read1 + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    oggpack_read1

    + +

    declared in "ogg/ogg.h";

    + +

    This function reads one bit from the oggpack_buffer data buffer and advances the location pointer. +

    Before reading, the buffer should be initialized using oggpack_readinit. + +

    + + + + +
    +
    
    +long  oggpack_read1(oggpack_buffer *b);
    +
    +
    + +

    Parameters

    +
    +
    b
    +
    Pointer to an oggpack_buffer struct containing buffered data to be read.
    +
    + + +

    Return Values

    +
    +
  • +n is the bit read by this function.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/oggpack_readinit.html b/cs/3rd party/libogg/doc/libogg/oggpack_readinit.html new file mode 100644 index 000000000..6f27ee9ff --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/oggpack_readinit.html @@ -0,0 +1,64 @@ + + + +libogg - function - oggpack_readinit + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    oggpack_readinit

    + +

    declared in "ogg/ogg.h";

    + +

    This function takes an ordinary buffer and prepares an oggpack_buffer for reading using the Ogg bitpacking functions. + +

    + + + + +
    +
    
    +void oggpack_readinit(oggpack_buffer *b,unsigned char *buf,int bytes);
    +
    +
    + +

    Parameters

    +
    +
    b
    +
    Pointer to oggpack_buffer to be initialized with some extra markers to ease bit navigation and manipulation.
    +
    buf
    +
    Original data buffer, to be inserted into the oggpack_buffer so that it can be read using bitpacking functions. +
    + + +

    Return Values

    +
    +
  • +No values are returned.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/oggpack_reset.html b/cs/3rd party/libogg/doc/libogg/oggpack_reset.html new file mode 100644 index 000000000..d9fedbc6d --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/oggpack_reset.html @@ -0,0 +1,62 @@ + + + +libogg - function - oggpack_reset + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    oggpack_reset

    + +

    declared in "ogg/ogg.h";

    + +

    This function resets the contents of an oggpack_buffer to their original state but does not free the memory used. + +

    + + + + +
    +
    
    +void  oggpack_reset(oggpack_buffer *b);
    +
    +
    + +

    Parameters

    +
    +
    b
    +
    oggpack_buffer to be reset.
    +
    + + +

    Return Values

    +
    +
  • +No values are returned.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/oggpack_write.html b/cs/3rd party/libogg/doc/libogg/oggpack_write.html new file mode 100644 index 000000000..ad1d7ee38 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/oggpack_write.html @@ -0,0 +1,68 @@ + + + +libogg - function - oggpack_write + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    oggpack_write

    + +

    declared in "ogg/ogg.h";

    + +

    This function writes bits into an oggpack_buffer. +

    The oggpack_buffer must already be initialized for writing using oggpack_writeinit. +

    Only 32 bits can be written at a time. + +

    + + + + +
    +
    
    +void  oggpack_write(oggpack_buffer *b,unsigned long value,int bits);
    +
    +
    + +

    Parameters

    +
    +
    b
    +
    Buffer to be used for writing.
    +
    value
    +
    The data to be written into the buffer. This must be 32 bits or fewer.
    +
    bits
    +
    The number of bits being written into the buffer.
    +
    + + +

    Return Values

    +
    +
  • +No values are returned.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/oggpack_writealign.html b/cs/3rd party/libogg/doc/libogg/oggpack_writealign.html new file mode 100644 index 000000000..acedc2c03 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/oggpack_writealign.html @@ -0,0 +1,65 @@ + + + +libogg - function - oggpack_writealign + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    oggpack_writealign

    + +

    declared in "ogg/ogg.h";

    + +

    This function pads the oggpack_buffer with zeros out to the +next byte boundary.

    +

    The oggpack_buffer must already be initialized for writing using oggpack_writeinit. +

    Only 32 bits can be written at a time.

    + +

    + + + + +
    +
    
    +void  oggpack_writetrunc(oggpack_buffer *b);
    +
    +
    + +

    Parameters

    +
    +
    b
    +
    Buffer to be used for writing.
    +
    + + +

    Return Values

    +
    +
  • +No values are returned.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org Foundation

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/oggpack_writecheck.html b/cs/3rd party/libogg/doc/libogg/oggpack_writecheck.html new file mode 100644 index 000000000..e23131b7d --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/oggpack_writecheck.html @@ -0,0 +1,81 @@ + + + +libogg - function - oggpack_writecheck + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    oggpack_writecheck

    + +

    declared in "ogg/ogg.h";

    + +

    This function checks the readiness status of +an oggpack_buffer previously +initialized for writing using the +Ogg bitpacking functions. A write +buffer that encounters an error (such as a failed malloc) will clear +its internal state and release any in-use memory, flagging itself as +'not ready'. Subsequent attempts to write using the buffer will +silently fail. This error state may be detected at any later time by +using oggpack_writecheck(). It is safe but not necessary to +call oggpack_writeclear() on a buffer that +has flagged an error and released its resources. + +

    Important note to developers: Although libogg checks the +results of memory allocations, these checks are only useful on a +narrow range of embedded platforms. Allocation checks perform no +useful service on a general purpose desktop OS where pages are +routinely overallocated and all allocations succeed whether memory is +available or not. The only way to detect an out of memory condition +on the vast majority of OSes is to watch for and capture segmentation +faults. This function is useful only to embedded developers. + +

    + + + + +
    +
    
    +int  oggpack_writecheck(oggpack_buffer *b);
    +
    +
    + +

    Parameters

    +
    +
    b
    +
    An oggpack_buffer previously initialized for writing.
    +
    + + +

    Return Values

    +
    +
  • zero: buffer is ready for writing
  • +
  • nonzero: buffer is not ready or encountered an error
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/oggpack_writeclear.html b/cs/3rd party/libogg/doc/libogg/oggpack_writeclear.html new file mode 100644 index 000000000..5dadaa9ab --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/oggpack_writeclear.html @@ -0,0 +1,62 @@ + + + +libogg - function - oggpack_reset + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    oggpack_writeclear

    + +

    declared in "ogg/ogg.h";

    + +

    This function clears the buffer after writing and frees the memory used by the oggpack_buffer. + +

    + + + + +
    +
    
    +void oggpack_writeclear(oggpack_buffer *b);
    +
    +
    + +

    Parameters

    +
    +
    b
    +
    Our oggpack_buffer. This is an ordinary data buffer with some extra markers to ease bit navigation and manipulation.
    +
    + + +

    Return Values

    +
    +
  • +No values are returned.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/oggpack_writecopy.html b/cs/3rd party/libogg/doc/libogg/oggpack_writecopy.html new file mode 100644 index 000000000..94d3124ac --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/oggpack_writecopy.html @@ -0,0 +1,69 @@ + + + +libogg - function - oggpack_writecopy + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    oggpack_writecopy

    + +

    declared in "ogg/ogg.h";

    + +

    This function copies a sequence of bits from a source buffer into an +oggpack_buffer.

    +

    The oggpack_buffer must already be initialized for writing using oggpack_writeinit.

    +

    Only 32 bits can be written at a time.

    + +

    + + + + +
    +
    
    +void  oggpack_writecopy(oggpack_buffer *b, void *source, long bits);
    +
    +
    + +

    Parameters

    +
    +
    b
    +
    Buffer to be used for writing.
    +
    source
    +
    A pointer to the data to be written into the buffer.
    +
    bits
    +
    The number of bits to be copied into the buffer.
    +
    + + +

    Return Values

    +
    +
  • +No values are returned.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org Foundation

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/oggpack_writeinit.html b/cs/3rd party/libogg/doc/libogg/oggpack_writeinit.html new file mode 100644 index 000000000..7999b9c6e --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/oggpack_writeinit.html @@ -0,0 +1,62 @@ + + + +libogg - function - oggpack_writeinit + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    oggpack_writeinit

    + +

    declared in "ogg/ogg.h";

    + +

    This function initializes an oggpack_buffer for writing using the Ogg bitpacking functions. + +

    + + + + +
    +
    
    +void  oggpack_writeinit(oggpack_buffer *b);
    +
    +
    + +

    Parameters

    +
    +
    b
    +
    Buffer to be used for writing. This is an ordinary data buffer with some extra markers to ease bit navigation and manipulation.
    +
    + + +

    Return Values

    +
    +
  • +No values are returned.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/oggpack_writetrunc.html b/cs/3rd party/libogg/doc/libogg/oggpack_writetrunc.html new file mode 100644 index 000000000..bf23b2e0f --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/oggpack_writetrunc.html @@ -0,0 +1,65 @@ + + + +libogg - function - oggpack_writetrunc + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    oggpack_writetrunc

    + +

    declared in "ogg/ogg.h";

    + +

    This function truncates an already written-to oggpack_buffer.

    +

    The oggpack_buffer must already be initialized for writing using oggpack_writeinit.

    + +

    + + + + +
    +
    
    +void  oggpack_writetrunc(oggpack_buffer *b, long bits);
    +
    +
    + +

    Parameters

    +
    +
    b
    +
    Buffer to be truncated.
    +
    bits
    +
    Number of bits to keep in the buffer (size after truncation)
    +
    + + +

    Return Values

    +
    +
  • +No values are returned.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org Foundation

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + + diff --git a/cs/3rd party/libogg/doc/libogg/overview.html b/cs/3rd party/libogg/doc/libogg/overview.html new file mode 100644 index 000000000..347ebeb98 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/overview.html @@ -0,0 +1,44 @@ + + + +libogg - API Overview + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    Libogg API Overview

    + +

    +The libogg API consists of the following functional categories: +

    +

    + +

    +
    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + diff --git a/cs/3rd party/libogg/doc/libogg/reference.html b/cs/3rd party/libogg/doc/libogg/reference.html new file mode 100644 index 000000000..cfe1608e0 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/reference.html @@ -0,0 +1,98 @@ + + + +Libogg API Reference + + + + + + + + + +

    libogg documentation

    libogg release 1.3.2 - 20140527

    + +

    Libogg API Reference

    + +

    +Data Structures
    +oggpack_buffer
    +ogg_page
    +ogg_stream_state
    +ogg_packet
    +ogg_sync_state
    +
    +Bitpacking
    +oggpack_writeinit()
    +oggpack_writecheck()
    +oggpack_reset()
    +oggpack_writetrunc()
    +oggpack_writealign()
    +oggpack_writecopy()
    +oggpack_writeclear()
    +oggpack_readinit()
    +oggpack_write()
    +oggpack_look()
    +oggpack_look1()
    +oggpack_adv()
    +oggpack_adv1()
    +oggpack_read()
    +oggpack_read1()
    +oggpack_bytes()
    +oggpack_bits()
    +oggpack_get_buffer()
    +
    +Decoding-Related
    +ogg_sync_init()
    +ogg_sync_check()
    +ogg_sync_clear()
    +ogg_sync_destroy()
    +ogg_sync_reset()
    +ogg_sync_buffer()
    +ogg_sync_wrote()
    +ogg_sync_pageseek()
    +ogg_sync_pageout()
    +ogg_stream_pagein()
    +ogg_stream_packetout()
    +ogg_stream_packetpeek()
    +
    +Encoding-Related
    +ogg_stream_packetin()
    +ogg_stream_pageout()
    +ogg_stream_pageout_fill()
    +ogg_stream_flush()
    +ogg_stream_flush_fill()
    +
    +General
    +ogg_stream_init()
    +ogg_stream_check()
    +ogg_stream_clear()
    +ogg_stream_reset()
    +ogg_stream_reset_serialno()
    +ogg_stream_destroy()
    +ogg_page_version()
    +ogg_page_continued()
    +ogg_page_packets()
    +ogg_page_bos()
    +ogg_page_eos()
    +ogg_page_granulepos()
    +ogg_page_serialno()
    +ogg_page_pageno()
    +ogg_packet_clear()
    +ogg_page_checksum_set()
    +

    +


    + + + + + + + + +

    copyright © 2000-2014 Xiph.Org Foundation

    Ogg Container Format

    libogg documentation

    libogg release 1.3.2 - 20140527

    + + + + diff --git a/cs/3rd party/libogg/doc/libogg/style.css b/cs/3rd party/libogg/doc/libogg/style.css new file mode 100644 index 000000000..81cf41795 --- /dev/null +++ b/cs/3rd party/libogg/doc/libogg/style.css @@ -0,0 +1,7 @@ +BODY { font-family: Helvetica, sans-serif } +TD { font-family: Helvetica, sans-serif } +P { font-family: Helvetica, sans-serif } +H1 { font-family: Helvetica, sans-serif } +H2 { font-family: Helvetica, sans-serif } +H4 { font-family: Helvetica, sans-serif } +P.tiny { font-size: 8pt } diff --git a/cs/3rd party/libogg/doc/multiplex1.png b/cs/3rd party/libogg/doc/multiplex1.png new file mode 100644 index 0000000000000000000000000000000000000000..e48d1dd6bbcb22387685ab20d82bcf74e54a8788 GIT binary patch literal 54409 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 Rw=Vzy002ovPDHLkV1k$_kyZcz literal 0 HcmV?d00001 diff --git a/cs/3rd party/libogg/doc/multiplex1.svg b/cs/3rd party/libogg/doc/multiplex1.svg new file mode 100644 index 000000000..46e6d52c3 --- /dev/null +++ b/cs/3rd party/libogg/doc/multiplex1.svg @@ -0,0 +1,632 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + elementary physical bitstream A + logical bitstream A + OggS + OggS + OggS + OggS + OggS + OggS + + + + + + + + + + + + + elementary physical bitstream B + logical bitstream B + OggS + OggS + OggS + OggS + OggS + OggS + + + + + + + + + + + + + + + multiplexed physical bitstream + + + + + + + + + + OggS + OggS + OggS + OggS + OggS + OggS + + diff --git a/cs/3rd party/libogg/doc/ogg-multiplex.html b/cs/3rd party/libogg/doc/ogg-multiplex.html new file mode 100644 index 000000000..bd08e255c --- /dev/null +++ b/cs/3rd party/libogg/doc/ogg-multiplex.html @@ -0,0 +1,446 @@ + + + + + +Ogg Documentation + + + + + + + + + +

    Page Multiplexing and Ordering in a Physical Ogg Stream

    + +

    The low-level mechanisms of an Ogg stream (as described in the Ogg +Bitstream Overview) provide means for mixing multiple logical streams +and media types into a single linear-chronological stream. This +document specifies the high-level arrangement and use of page +structure to multiplex multiple streams of mixed media type within a +physical Ogg stream.

    + +

    Design Elements

    + +

    The design and arrangement of the Ogg container format is governed by +several high-level design decisions that form the reasoning behind +specific low-level design decisions.

    + +

    Linear media

    + +

    The Ogg bitstream is intended to encapsulate chronological, +time-linear mixed media into a single delivery stream or file. The +design is such that an application can always encode and/or decode a +full-featured bitstream in one pass with no seeking and minimal +buffering. Seeking to provide optimized encoding (such as two-pass +encoding) or interactive decoding (such as scrubbing or instant +replay) is not disallowed or discouraged, however no bitstream feature +must require nonlinear operation on the bitstream.

    + +

    Multiplexing

    + +

    Ogg bitstreams multiplex multiple logical streams into a single +physical stream at the page level. Each page contains an abstract +time stamp (the Granule Position) that represents an absolute time +landmark within the stream. After the pages representing stream +headers (all logical stream headers occur at the beginning of a +physical bitstream section before any logical stream data), logical +stream data pages are arranged in a physical bitstream in strict +non-decreasing order by chronological absolute time as +specified by the granule position.

    + +

    The only exception to arranging pages in strictly ascending time order +by granule position is those pages that do not set the granule +position value. This is a special case when exceptionally large +packets span multiple pages; the specifics of handling this special +case are described later under 'Continuous and Discontinuous +Streams'.

    + +

    Seeking

    + +

    Ogg is designed to use an interpolated bisection search to +implement exact positional seeking. Interpolated bisection search is +a spec-mandated mechanism.

    + +

    An index may improve objective performance, but it seldom +improves subjective performance outside of a few high-latency use +cases and adds no additional functionality as bisection search +delivers the same functionality for both one- and two-pass stream +types. For these reasons, use of indexes is discouraged, except in +cases where an index provides demonstrable and noticable performance +improvement.

    + +

    Seek operations are by absolute time; a direct bisection search must +find the exact time position requested. Information in the Ogg +bitstream is arranged such that all information to be presented for +playback from the desired seek point will occur at or after the +desired seek point. Seek operations are neither 'fuzzy' nor +heuristic.

    + +

    Although key frame handling in video appears to be an exception to +"all needed playback information lies ahead of a given seek", +key frames can still be handled directly within this indexless +framework. Seeking to a key frame in video (as well as seeking in other +media types with analogous restraints) is handled as two seeks; first +a seek to the desired time which extracts state information that +decodes to the time of the last key frame, followed by a second seek +directly to the key frame. The location of the previous key frame is +embedded as state information in the granulepos; this mechanism is +described in more detail later.

    + +

    Continuous and Discontinuous Streams

    + +

    Logical streams within a physical Ogg stream belong to one of two +categories, "Continuous" streams and "Discontinuous" streams. +Although these are discussed in more detail later, the distinction is +important to a high-level understanding of how to buffer an Ogg +stream.

    + +

    A stream that provides a gapless, time-continuous media type with a +fine-grained timebase is considered to be 'Continuous'. A continuous +stream should never be starved of data. Clear examples of continuous +data types include broadcast audio and video.

    + +

    A stream that delivers data in a potentially irregular pattern or with +widely spaced timing gaps is considered to be 'Discontinuous'. A +discontinuous stream may be best thought of as data representing +scattered events; although they happen in order, they are typically +unconnected data often located far apart. One possible example of a +discontinuous stream types would be captioning. Although it's +possible to design captions as a continuous stream type, it's most +natural to think of captions as widely spaced pieces of text with +little happening between.

    + +

    The fundamental design distinction between continuous and +discontinuous streams concerns buffering.

    + +

    Buffering

    + +

    Because a continuous stream is, by definition, gapless, Ogg buffering +is based on the simple premise of never allowing any active continuous +stream to starve for data during decode; buffering proceeds ahead +until all continuous streams in a physical stream have data ready to +decode on demand.

    + +

    Discontinuous stream data may occur on a fairly regular basis, but the +timing of, for example, a specific caption is impossible to predict +with certainty in most captioning systems. Thus the buffering system +should take discontinuous data 'as it comes' rather than working ahead +(for a potentially unbounded period) to look for future discontinuous +data. As such, discontinuous streams are ignored when managing +buffering; their pages simply 'fall out' of the stream when continuous +streams are handled properly.

    + +

    Buffering requirements need not be explicitly declared or managed for +the encoded stream; the decoder simply reads as much data as is +necessary to keep all continuous stream types gapless (also ensuring +discontinuous data arrives in time) and no more, resulting in optimum +implicit buffer usage for a given stream. Because all pages of all +data types are stamped with absolute timing information within the +stream, inter-stream synchronization timing is always explicitly +maintained without the need for explicitly declared buffer-ahead +hinting.

    + +

    Further details, mechanisms and reasons for the differing arrangement +and behavior of continuous and discontinuous streams is discussed +later.

    + +

    Whole-stream navigation

    + +

    Ogg is designed so that the simplest navigation operations treat the +physical Ogg stream as a whole summary of its streams, rather than +navigating each interleaved stream as a separate entity.

    + +

    First Example: seeking to a desired time position in a multiplexed (or +unmultiplexed) Ogg stream can be accomplished through a bisection +search on time position of all pages in the stream (as encoded in the +granule position). More powerful searches (such as a key frame-aware +seek within video) are also possible with additional search +complexity, but similar computational complexity.

    + +

    Second Example: A bitstream section may consist of three multiplexed +streams of differing lengths. The result of multiplexing these +streams should be thought of as a single mixed stream with a length +equal to the longest of the three component streams. Although it is +also possible to think of the multiplexed results as three concurrent +streams of different lengths and it is possible to recover the three +original streams, it will also become obvious that once multiplexed, +it isn't possible to find the internal lengths of the component +streams without a linear search of the whole bitstream section. +However, it is possible to find the length of the whole bitstream +section easily (in near-constant time per section) just as it is for a +single-media unmultiplexed stream.

    + +

    Granule Position

    + +

    Description

    + +

    The Granule Position is a signed 64 bit field appearing in the header +of every Ogg page. Although the granule position represents absolute +time within a logical stream, its value does not necessarily directly +encode a simple timestamp. It may represent frames elapsed (as in +Vorbis), a simple timestamp, or a more complex bit-division encoding +(such as in Theora). The exact encoding of the granule position is up +to a specific codec.

    + +

    The granule position is governed by the following rules:

    + +
      + +
    • Granule Position must always increase forward or remain equal from +page to page, be unset, or be zero for a header page. The absolute +time to which any correct sequence of granule position maps must +similarly always increase forward or remain equal. (A codec may +make use of data, such as a control sequence, that only affects codec +working state without producing data and thus advancing granule +position and time. Although the packet sequence number increases in +this case, the granule position, and thus the time position, do +not.)
    • + +
    • Granule position may only be unset if there no packet defining a +time boundary on the page (that is, if no packet in a continuous +stream ends on the page, or no packet in a discontinuous stream begins +on the page. This will be discussed in more detail under Continuous +and Discontinuous streams).
    • + +
    • A codec must be able to translate a given granule position value +to a unique, deterministic absolute time value through direct +calculation. A codec is not required to be able to translate an +absolute time value into a unique granule position value.
    • + +
    • Codecs shall choose a granule position definition that allows that +codec means to seek as directly as possible to an immediately +decodable point, such as the bit-divided granule position encoding of +Theora allows the codec to seek efficiently to key frame without using +an index. That is, additional information other than absolute time +may be encoded into a granule position value so long as the granule +position obeys the above points.
    • + +
    + +

    Example: timestamp

    + +

    In general, a codec/stream type should choose the simplest granule +position encoding that addresses its requirements. The examples here +are by no means exhaustive of the possibilities within Ogg.

    + +

    A simple granule position could encode a timestamp directly. For +example, a granule position that encoded milliseconds from beginning +of stream would allow a logical stream length of over 100,000,000,000 +days before beginning a new logical stream (to avoid the granule +position wrapping).

    + +

    Example: framestamp

    + +

    A simple millisecond timestamp granule encoding might suit many stream +types, but a millisecond resolution is inappropriate to, eg, most +audio encodings where exact single-sample resolution is generally a +requirement. A millisecond is both too large a granule and often does +not represent an integer number of samples.

    + +

    In the event that audio frames are always encoded as the same number of +samples, the granule position could simply be a linear count of frames +since beginning of stream. This has the advantages of being exact and +efficient. Position in time would simply be [granule_position] * +[samples_per_frame] / [samples_per_second].

    + +

    Example: samplestamp (Vorbis)

    + +

    Frame counting is insufficient in codecs such as Vorbis where an audio +frame [packet] encodes a variable number of samples. In Vorbis's +case, the granule position is a count of the number of raw samples +from the beginning of stream; the absolute time of +a granule position is [granule_position] / +[samples_per_second].

    + +

    Example: bit-divided framestamp (Theora)

    + +

    Some video codecs may be able to use the simple framestamp scheme for +granule position. However, most modern video codecs introduce at +least the following complications:

    + +
      + +
    • video frames are relatively far apart compared to audio samples; +for this reason, the point at which a video frame changes to the next +frame is usually a strictly defined offset within the frame 'period'. +That is, video at 50fps could just as easily define frame transitions +<.015, .035, .055...> as at <.00, .02, .04...>.
    • + +
    • frame rates often include drop-frames, leap-frames or other +rational-but-non-integer timings.
    • + +
    • Decode must begin at a 'key frame' or 'I frame'. Keyframes usually +occur relatively seldom.
    • + +
    + +

    The first two points can be handled straightforwardly via the fact +that the codec has complete control mapping granule position to +absolute time; non-integer frame rates and offsets can be set in the +codec's initial header, and the rest is just arithmetic.

    + +

    The third point appears trickier at first glance, but it too can be +handled through the granule position mapping mechanism. Here we +arrange the granule position in such a way that granule positions of +key frames are easy to find. Divide the granule position into two +fields; the most-significant bits are an absolute frame counter, but +it's only updated at each key frame. The least significant bits encode +the number of frames since the last key frame. In this way, each +granule position both encodes the absolute time of the current frame +as well as the absolute time of the last key frame.

    + +

    Seeking to a most recent preceding key frame is then accomplished by +first seeking to the original desired point, inspecting the granulepos +of the resulting video page, extracting from that granulepos the +absolute time of the desired key frame, and then seeking directly to +that key frame's page. Of course, it's still possible for an +application to ignore key frames and use a simpler seeking algorithm +(decode would be unable to present decoded video until the next +key frame). Surprisingly many player applications do choose the +simpler approach.

    + +

    granule position, packets and pages

    + +

    Although each packet of data in a logical stream theoretically has a +specific granule position, only one granule position is encoded +per page. It is possible to encode a logical stream such that each +page contains only a single packet (so that granule positions are +preserved for each packet), however a one-to-one packet/page mapping +is not intended to be the general case.

    + +

    Because Ogg functions at the page, not packet, level, this +once-per-page time information provides Ogg with the finest-grained +time information is can use. Ogg passes this granule positioning data +to the codec (along with the packets extracted from a page); it is the +responsibility of codecs to track timing information at granularities +finer than a single page.

    + +

    start-time and end-time positioning

    + +

    A granule position represents the instantaneous time location +between two pages. However, continuous streams and discontinuous +streams differ on whether the granulepos represents the end-time of +the data on a page or the start-time. Continuous streams are +'end-time' encoded; the granulepos represents the point in time +immediately after the last data decoded from a page. Discontinuous +streams are 'start-time' encoded; the granulepos represents the point +in time of the first data decoded from the page.

    + +

    An Ogg stream type is declared continuous or discontinuous by its +codec. A given codec may support both continuous and discontinuous +operation so long as any given logical stream is continuous or +discontinuous for its entirety and the codec is able to ascertain (and +inform the Ogg layer) as to which after decoding the initial stream +header. The majority of codecs will always be continuous (such as +Vorbis) or discontinuous (such as Writ).

    + +

    Start- and end-time encoding do not affect multiplexing sort-order; +pages are still sorted by the absolute time a given granulepos maps to +regardless of whether that granulepos represents start- or +end-time.

    + +

    Multiplex/Demultiplex Division of Labor

    + +

    The Ogg multiplex/demultiplex layer provides mechanisms for encoding +raw packets into Ogg pages, decoding Ogg pages back into the original +codec packets, determining the logical structure of an Ogg stream, and +navigating through and synchronizing with an Ogg stream at a desired +stream location. Strict multiplex/demultiplex operations are entirely +in the Ogg domain and require no intervention from codecs.

    + +

    Implementation of more complex operations does require codec +knowledge, however. Unlike other framing systems, Ogg maintains +strict separation between framing and the framed bitstream data; Ogg +does not replicate codec-specific information in the page/framing +data, nor does Ogg blur the line between framing and stream +data/metadata. Because Ogg is fully data-agnostic toward the data it +frames, operations which require specifics of bitstream data (such as +'seek to key frame') also require interaction with the codec layer +(because, in this example, the Ogg layer is not aware of the concept +of key frames). This is different from systems that blur the +separation between framing and stream data in order to simplify the +separation of code. The Ogg system purposely keeps the distinction in +data simple so that later codec innovations are not constrained by +framing design.

    + +

    For this reason, however, complex seeking operations require +interaction with the codecs in order to decode the granule position of +a given stream type back to absolute time or in order to find +'decodable points' such as key frames in video.

    + +

    Unsorted Discussion Points

    + +

    flushes around key frames? RFC suggestion: repaginating or building a +stream this way is nice but not required

    + +

    Appendix A: multiplexing examples

    + + + + + diff --git a/cs/3rd party/libogg/doc/oggstream.html b/cs/3rd party/libogg/doc/oggstream.html new file mode 100644 index 000000000..71bbce7b3 --- /dev/null +++ b/cs/3rd party/libogg/doc/oggstream.html @@ -0,0 +1,594 @@ + + + + + +Ogg Documentation + + + + + + +
    + + + +

    Ogg bitstream overview

    + +

    This document serves as starting point for understanding the design +and implementation of the Ogg container format. If you're new to Ogg +or merely want a high-level technical overview, start reading here. +Other documents linked from the index page +give distilled technical descriptions and references of the container +mechanisms. This document is intended to aid understanding. + +

    Container format design points

    + +

    Ogg is intended to be a simplest-possible container, concerned only +with framing, ordering, and interleave. It can be used as a stream delivery +mechanism, for media file storage, or as a building block toward +implementing a more complex, non-linear container (for example, see +the Skeleton or Annodex/CMML). + +

    The Ogg container is not intended to be a monolithic +'kitchen-sink'. It exists only to frame and deliver in-order stream +data and as such is vastly simpler than most other containers. +Elementary and multiplexed streams are both constructed entirely from a +single building block (an Ogg page) comprised of eight fields +totalling twenty-eight bytes (the page header) a list of packet lengths +(up to 255 bytes) and payload data (up to 65025 bytes). The structure +of every page is the same. There are no optional fields or alternate +encodings. + +

    Stream and media metadata is contained in Ogg and not built into +the Ogg container itself. Metadata is thus compartmentalized and +layered rather than part of a monolithic design, an especially good +idea as no two groups seem able to agree on what a complete or +complete-enough metadata set should be. In this way, the container and +container implementation are isolated from unnecessary metadata design +flux. + +

    Streaming

    + +

    The Ogg container is primarily a streaming format, +encapsulating chronological, time-linear mixed media into a single +delivery stream or file. The design is such that an application can +always encode and/or decode all features of a bitstream in one pass +with no seeking and minimal buffering. Seeking to provide optimized +encoding (such as two-pass encoding) or interactive decoding (such as +scrubbing or instant replay) is not disallowed or discouraged, however +no container feature requires nonlinear access of the bitstream. + +

    Variable Bit Rate, Variable Payload Size

    + +

    Ogg is designed to contain any size data payload with bounded, +predictable efficiency. Ogg packets have no maximum size and a +zero-byte minimum size. There is no restriction on size changes from +packet to packet. Variable size packets do not require the use of any +optional or additional container features. There is no optimal +suggested packet size, though special consideration was paid to make +sure 50-200 byte packets were no less efficient than larger packet +sizes. The original design criteria was a 2% overhead at 50 byte +packets, dropping to a maximum working overhead of 1% with larger +packets, and a typical working overhead of .5-.7% for most practical +uses. + +

    Simple pagination

    + +

    Ogg is a byte-aligned container with no context-dependent, optional +or variable-length fields. Ogg requires no repacking of codec data. +The page structure is written out in-line as packet data is submitted +to the streaming abstraction. In addition, it is possible to +implement both Ogg mux and demux as MT-hot zero-copy abstractions (as +is done in the Tremor sourcebase). + +

    Capture

    + +

    Ogg is designed for efficient and immediate stream capture with +high confidence. Although packets have no size limit in Ogg, pages +are a maximum of just under 64kB meaning that any Ogg stream can be +captured with confidence after seeing 128kB of data or less [worst +case; typical figure is 6kB] from any random starting point in the +stream. + +

    Seeking

    + +

    Ogg implements simple coarse- and fine-grained seeking by design. + +

    Coarse seeking may be performed by simply 'moving the tone arm' to a +new position and 'dropping the needle'. Rapid capture with +accompanying timecode from any location in an Ogg file is guaranteed +by the stream design. From the acquisition of the first timecode, +all data needed to play back from that time code forward is ahead of +the stream cursor. + +

    Ogg implements full sample-granularity seeking using an +interpolated bisection search built on the capture and timecode +mechanisms used by coarse seeking. As above, once a search finds +the desired timecode, all data needed to play back from that time code +forward is ahead of the stream cursor. + +

    Both coarse and fine seeking use the page structure and sequencing +inherent to the Ogg format. All Ogg streams are fully seekable from +creation; seekability is unaffected by truncation or missing data, and +is tolerant of gross corruption. Seek operations are neither 'fuzzy' nor +heuristic. + +

    Seeking without use of an index is a major point of the Ogg +design. There two primary reasons why Ogg transport forgoes an index: + +

      + +
    1. An index is only marginally useful in Ogg for the complexity +added; it adds no new functionality and seldom improves performance +noticeably. Empirical testing shows that indexless interpolation +search does not require many more seeks in practice than using an +index would. + +
    2. 'Optional' indexes encourage lazy implementations that can seek +only when indexes are present, or that implement indexless seeking +only by building an internal index after reading the entire file +beginning to end. This has been the fate of other containers that +specify optional indexing. + +
    + +

    In addition, it must be possible to create an Ogg stream in a +single pass. Although an optional index can simply be tacked on the +end of the created stream, some software groups object to +end-positioned indexes and claim to be unwilling to support indexes +not located at the stream beginning. + +

    All this said, it's become clear that an optional index is a +demanded feature. For this reason, the OggSkeleton now defines a +proposed index. + +

    Simple multiplexing

    + +

    Ogg multiplexes streams by interleaving pages from multiple elementary streams into a +multiplexed stream in time order. The multiplexed pages are not +altered. Muxing an Ogg AV stream out of separate audio, +video and data streams is akin to shuffling several decks of cards +together into a single deck; the cards themselves remain unchanged. +Demultiplexing is similarly simple (as the cards are marked). + +

    The goal of this design is to make the mux/demux operation as +trivial as possible to allow live streaming systems to build and +rebuild streams on the fly with minimal CPU usage and no additional +storage or latency requirements. + +

    Continuous and Discontinuous Media

    + +

    Ogg streams belong to one of two categories, "Continuous" streams and +"Discontinuous" streams. + +

    A stream that provides a gapless, time-continuous media type with a +fine-grained timebase is considered to be 'Continuous'. A continuous +stream should never be starved of data. Examples of continuous data +types include broadcast audio and video. + +

    A stream that delivers data in a potentially irregular pattern or +with widely spaced timing gaps is considered to be 'Discontinuous'. A +discontinuous stream may be best thought of as data representing +scattered events; although they happen in order, they are typically +unconnected data often located far apart. One example of a +discontinuous stream types would be captioning such as Ogg Kate. Although it's +possible to design captions as a continuous stream type, it's most +natural to think of captions as widely spaced pieces of text with +little happening between. + +

    The fundamental reason for distinction between continuous and +discontinuous streams concerns buffering. + +

    Buffering

    + +

    A continuous stream is, by definition, gapless. Ogg buffering is based +on the simple premise of never allowing an active continuous stream +to starve for data during decode; buffering works ahead until all +continuous streams in a physical stream have data ready and no further. + +

    Discontinuous stream data is not assumed to be predictable. The +buffering design takes discontinuous data 'as it comes' rather than +working ahead to look for future discontinuous data for a potentially +unbounded period. Thus, the buffering process makes no attempt to fill +discontinuous stream buffers; their pages simply 'fall out' of the +stream when continuous streams are handled properly. + +

    Buffering requirements in this design need not be explicitly +declared or managed in the encoded stream. The decoder simply reads as +much data as is necessary to keep all continuous stream types gapless +and no more, with discontinuous data processed as it arrives in the +continuous data. Buffering is implicitly optimal for the given +stream. Because all pages of all data types are stamped with absolute +timing information within the stream, inter-stream synchronization +timing is always maintained without the need for explicitly declared +buffer-ahead hinting. + +

    Codec metadata

    + +

    Ogg does not replicate codec-specific metadata into the mux layer +in an attempt to make the mux and codec layer implementations 'fully +separable'. Things like specific timebase, keyframing strategy, frame +duration, etc, do not appear in the Ogg container. The mux layer is, +instead, expected to query a codec through a centralized interface, +left to the implementation, for this data when it is needed. + +

    Though modern design wisdom usually prefers to predict all possible +needs of current and future codecs then embed these dependencies and +the required metadata into the container itself, this strategy +increases container specification complexity, fragility, and rigidity. +The mux and codec code becomes more independent, but the +specifications become logically less independent. A codec can't do +what a container hasn't already provided for. Novel codecs are harder +to support, and you can do fewer useful things with the ones you've +already got (eg, try to make a good splitter without using any codecs. +Such a splitter is limited to splitting at keyframes only, or building +yet another new mechanism into the container layer to mark what frames +to skip displaying). + +

    Ogg's design goes the opposite direction, where the specification +is to be as simple, easy to understand, and 'proofed' against novel +codecs as possible. When an Ogg mux layer requires codec-specific +information, it queries the codec (or a codec stub). This trades a +more complex implementation for a simpler, more flexible +specification. + +

    Stream structure metadata

    + +

    The Ogg container itself does not define a metadata system for +declaring the structure and interrelations between multiple media +types in a muxed stream. That is, the Ogg container itself does not +specify data like 'which steam is the subtitle stream?' or 'which +video stream is the primary angle?'. This metadata still exists, but +is stored by the Ogg container rather than being built into the Ogg +container itself. Xiph specifies the 'Skeleton' metadata format for Ogg +streams, but this decoupling of container and stream structure +metadata means it is possible to use Ogg with any metadata +specification without altering the container itself, or without stream +structure metadata at all. + +

    Frame accurate absolute position

    + +

    Every Ogg page is stamped with a 64 bit 'granule position' that +serves as an absolute timestamp for mux and seeking. A few nifty +little tricks are usually also embedded in the granpos state, but +we'll leave those aside for the moment (strictly speaking, they're +part of each codec's mapping, not Ogg). + +

    As previously mentioned above, granule positions are mapped into +absolute timestamps by the codec, rather than being a hard timestamp. +This allows maximally efficient use of the available 64 bits to +address every sample/frame position without approximation while +supporting new and previously unknown timebase encodings without +needing to extend or update the mux layer. When a codec needs a novel +timebase, it simply brings the code for that mapping along with it. +This is not a theoretical curiosity; new, wholly novel timebases were +deployed with the adoption of both Theora and Dirac. "Rolling INTRA" +(keyframeless video) also benefits from novel use of the granule +position. + +

    Ogg stream arrangement

    + +

    Packets, pages, and bitstreams

    + +

    Ogg codecs place raw compressed data into packets. +Packets are octet payloads containing the data needed for a single +decompressed unit, eg, one video frame. Packets have no maximum size +and may be zero length. They do not generally have any framing +information; strung together, the unframed packets form a logical +bitstream of codec data with no internal landmarks. + +

    + + +

    Packets of raw codec data are not typically internally framed. + When they are strung together into a stream without any container to + provide framing, they lose their individual boundaries. Seek and + capture are not possible within an unframed stream, and for many + codecs with variable length payloads and/or early-packet termination + (such as Vorbis), it may become impossible to recover the original + frame boundaries even if the stream is scanned linearly from + beginning to end. + +

    + +

    Logical bitstream packets are grouped and framed into Ogg pages +along with a unique stream serial number to produce a +physical bitstream. An elementary stream is a +physical bitstream containing only a single logical bitstream. Each +page is a self contained entity, although a packet may be split and +encoded across one or more pages. The page decode mechanism is +designed to recognize, verify and handle single pages at a time from +the overall bitstream. + +

    + + +

    The primary purpose of a container is to provide framing for raw + packets, marking the packet boundaries so the exact packets can be + retrieved for decode later. The container also provides secondary + functions such as capture, timestamping, sequencing, stream + identification and so on. Not all of these functions are represented in the diagram. + +

    In the Ogg container, pages do not necessarily contain + integer numbers of packets. Packets may span across page boundaries + or even multiple pages. This is necessary as pages have a maximum + possible size in order to provide capture guarantees, but packet + size is unbounded. +

    + + +

    Ogg Bitstream Framing specifies +the page format of an Ogg bitstream, the packet coding process +and elementary bitstreams in detail. + +

    Multiplexed bitstreams

    + +

    Multiple logical/elementary bitstreams can be combined into a single +multiplexed bitstream by interleaving whole pages from each +contributing elementary stream in time order. The result is a single +physical stream that multiplexes and frames multiple logical streams. +Each logical stream is identified by the unique stream serial number +stamped in its pages. A physical stream may include a 'meta-header' +(such as the Ogg Skeleton) comprising its +own Ogg page at the beginning of the physical stream. A decoder +recovers the original logical/elementary bitstreams out of the +physical bitstream by taking the pages in order from the physical +bitstream and redirecting them into the appropriate logical decoding +entity. + +

    + + +

    Multiple media types are mutliplexed into a single Ogg stream by +interleaving the pages from each elementary physical stream. + +

    + +

    Ogg Bitstream Multiplexing specifies +proper multiplexing of an Ogg bitstream in detail. + +

    Chaining

    + +

    Multiple Ogg physical bitstreams may be concatenated into a single new +stream; this is chaining. The bitstreams do not overlap; the +final page of a given logical bitstream is immediately followed by the +initial page of the next.

    + +

    Each logical bitstream in a chain must have a unique serial number +within the scope of the full physical bitstream, not only within a +particular link or segment of the chain.

    + +

    Continuous and discontinuous streams

    + +

    Within Ogg, each stream must be declared (by the codec) to be +continuous- or discontinuous-time. Most codecs treat all streams they +use as either inherently continuous- or discontinuous-time, although +this is not a requirement. A codec may, as part of its mapping, choose +according to data in the initial header. + +

    Continuous-time pages are stamped by end-time, discontinuous pages +are stamped by begin-time. Pages in a multiplexed stream are +interleaved in order of the time stamp regardless of stream type. +Both continuous and discontinuous logical streams are used to seek +within a physical stream, however only continuous streams are used to +determine buffering depth; because discontinuous streams are stamped +by start time, they will always 'fall out' at the proper time when +buffering the continuous streams. See 'Examples' for an illustration +of the buffering mechanism. + +

    Multiplexing Requirements

    + +

    Multiplexing requirements within Ogg are straightforward. When +constructing a single-link (unchained) physical bitstream consisting +of multiple elementary streams: + +

      + +
    1. The initial header for each stream appears in sequence, each +header on a single page. All initial headers must appear with no +intervening data (no auxiliary header pages or packets, no data pages +or packets). Order of the initial headers is unspecified. The +'beginning of stream' flag is set on each initial header. + +

    2. All auxiliary headers for all streams must follow. Order +is unspecified. The final auxiliary header of each stream must flush +its page. + +

    3. Data pages for each stream follow, interleaved in time order. + +

    4. The final page of each stream sets the 'end of stream' flag. +Unlike initial pages, terminal pages for the logical bitstreams need +not occur contiguously; indeed it may not be possible for them to do so. +

    + +

    Each grouped bitstream must have a unique serial number within the +scope of the physical bitstream.

    + +

    chaining and multiplexing

    + +

    Multiplexed and/or unmultiplexed bitstreams may be chained +consecutively. Such a physical bitstream obeys all the rules of both +chained and multiplexed streams. Each link, when unchained, must +stand on its own as a valid physical bitstream. Chained streams do +not mix or interleave; a new segment may not begin until all streams +in the preceding segment have terminated.

    + +

    Codec Mapping Requirements

    + +

    Each codec is allowed some freedom in deciding how its logical +bitstream is encapsulated into an Ogg bitstream (even if it is a +trivial mapping, eg, 'plop the packets in and go'). This is the +codec's mapping. Ogg imposes a few mapping requirements +on any codec. + +

      + +
    1. The framing specification defines +'beginning of stream' and 'end of stream' page markers via a header +flag (it is possible for a stream to consist of a single page). A +correct stream always consists of an integer number of pages, an easy +requirement given the variable size nature of pages.

      + +
    2. The first page of an elementary Ogg bitstream consists of a single, +small 'initial header' packet that must include sufficient information +to identify the exact CODEC type. From this initial header, the codec +must also be able to determine its timebase and whether or not it is a +continuous- or discontinuous-time stream. The initial header must fit +on a single page. If a codec makes use of auxiliary headers (for +example, Vorbis uses two auxiliary headers), these headers must follow +the initial header immediately. The last header finishes its page; +data begins on a fresh page. + +

      As an example, Ogg Vorbis places the name and revision of the +Vorbis CODEC, the audio rate and the audio quality into this initial +header. Vorbis comments and detailed codec setup appears in the larger +auxiliary headers.

      + +
    3. Granule positions must be translatable to an exact absolute +time value. As described above, the mux layer is permitted to query a +codec or codec stub plugin to perform this mapping. It is not +necessary for an absolute time to be mappable into a single unique +granule position value. + +

    4. Codecs are not required to use a fixed duration-per-packet (for +example, Vorbis does not). the mux layer is permitted to query a +codec or codec stub plugin for the time duration of a packet. + +

    5. Although an absolute time need not be translatable to a unique +granule position, a codec must be able to determine the unique granule +position of the current packet using the granule position of a +preceeding packet. + +

    6. Packets and pages must be arranged in ascending +granule-position and time order. + +

    + +

    Examples

    + +[More to come shortly; this section is currently being revised and expanded] + +

    Below, we present an example of a multiplexed and chained bitstream:

    + +

    stream

    + +

    In this example, we see pages from five total logical bitstreams +multiplexed into a physical bitstream. Note the following +characteristics:

    + +
      +
    1. Multiplexed bitstreams in a given link begin together; all of the +initial pages must appear before any data pages. When concurrently +multiplexed groups are chained, the new group does not begin until all +the bitstreams in the previous group have terminated.
    2. + +
    3. The ordering of pages of concurrently multiplexed bitstreams is +goverened by timestamp (not shown here); there is no regular +interleaving order. Pages within a logical bitstream appear in +sequence order.
    4. +
    + + + +
    + + diff --git a/cs/3rd party/libogg/doc/packets.png b/cs/3rd party/libogg/doc/packets.png new file mode 100644 index 0000000000000000000000000000000000000000..917b6c167f9b4e1e3482f48bd787229e833a8659 GIT binary patch literal 19776 zcmdVC2T)W^`?pCH6bXueC{YC@D?xHnkqkO28HOMNj^xacK@mYvq9Q>giR3I9$r&XK zVaQP!GBQJ)*&fvAdH?(QRqejDyH#tI3VP<8?ml320DcQutLPhB`gKtMpLqI?@d zKtRL?zCI*B0see|z^#M7NStn}JRk?ZyvQHD0N#|B@^` zLK`Vh^vIutoGsgr?PUO6D7@4R6<}vGZ)1}^Shiobj+`H=u{%JZS3kQJmJR0BmeS=? zym-lWDS(_jNR*whfxe9;QeCKh@5o_2=zV*TdStsy)VuZVy)G{M^~CLjgKi1S+6v5= z@N!Y%GHQ6wD~9l3Tp++uQ_A0xk?%F zUPyt4M1dv<%XTu9jXZ#j{7l3ZKJZrn+imH{0{lM&&}=Fh-z_WRdn&+{F^gQv-Y(i- z8&tp~jyXo|K=tIVco+6T)k~rMKIJp3uDA_zPp@n9zVr9~oHu z8oJ9=i0{*=A7$f1E2()o0*~%}`m!p#8sVDE?W^XZ_AUJ6UEfbE&?v#7~vkq?0Lkgz^# zkn~~}N&GQt@7*m+RqOuxJ44u-S|Ys3CfVAz8@3-U3zI@OpEy|BlJ+* zkdtSt^@7YbyLtgRFw5q_nbh=3QoCG+@sz5>y7C^ikcw3CsatV$1#eSN;qwu##JvQC*q(ULmjrQkHR{q z0(y;TihdaWp1KO|x!uzbW=4vOIO@Y~`M9Iatj(~Rr+n`e-x0g+U1x@J(V=*BG0iTC zI5z}^yvI4c{-U=#S$elx7}SoMZy$)Rx(QF%VyLgl$-dnZdmvIU^PDab=ev1X@Wf6J z{MyesF{_41Ny(UWoc^i$0T8^sbC$O20HUe?A>Ty>95#zv&|M`1|=-ER1_XQV_NVZFKRi%_kPp0%GYmi^J}#4@LSWwiHDs!g}Yp#Dm|(!ufbquLNKo-zIJ?&+ZdvL zEhI!rm$`4SZtQ@x9A#aVjlvEvWfOPp&+$12b6&sfa93JWy>&?CrasX-TA}aE@fUFp zm#r(TZ%zDV@=`To*rPj;JLw;!iMLN^=q98sr1gz{QymGl7+}q^JRF>56osF2v2bxN zak(~AeTMk6pY<<`*rR>UL16#0J2hd{;pLY!@g7{$-mbn^04EV3Y2m6I{DNMAr3SUSOM)5rMKHiG!tQk$@KQ1t z()70jjd@a2KKh>=(lD9pdNUA<2zWjn^*s22X8sWRiP{rAhsIN=du0rrpLok3|3t(M z6{F=4R6nj<`g*)9=021ttP?YSw~{5xwWSOO6TDChn_XS6?cOYp2=1M)clJtT()WI` zXzLShR5#h|Pe%sqn>6QO*TA>dMS0&Wqwf5Zx{M>+7UU|HaG{m#K6bfgFz1T{={okO z5ml}I>;1+Zzny_dC(V0yKjRCY9-{ATG0Zs~R3h7<(UTS4T_3Lxu;yj%J#doy%qsE6 zMdb3O&b&Hh>xt$Rz-`VaB4d=^)Ll!aHP8%drhT!ryT4hwJG{|N*|pcjWNYAL5LZXv z%6EYlz3tY?znzFDb>1#`6vF|W`kMEtOO@czDgq} z&mrr_K4zSoSw`zD9y2mcnN9tM%(b-6f9&S|dg8|)`pR41-;qf|-NnCHYF$lf;^*;)3Am8$5Ur)s-Ir{))GW-g+aCL-V#UB?r(d@xwIO&WAR`;o72}6D={(d3wDWC z%a_xTI~fJD$;{C(wI>nOX4iOka z#;)tL+^e-eIM7e7-G4s1_Y677FexSH6+G@cs_{gVr&d@N)o1=txL8&ulwys#R=MwP zM1BZJ`{d@GnexyZ*N?bUGVn#KJ#uhTxm3MFVhE4 zEzw$f)~Hxbvksg44Yl>*Cw~WlMck0rseHbzNj5R3ydaG zN-pj_^vk z6=j#y6^+dJX`P#FOdGou*U9MH?Vd4ly%bsN=DTm396Lx!TJD{3^nFcuUaoBVeCp$f zOP02p?n0J9{8LhGN~*-p(>aY>ca$?2(Y(l#6JWM|)`fA%NLY$ao+ zw>Lx&hBtO76Ok8qF6eq=p0pT=hJU0!-2=_cm_>1M3y0_>$2VtVYE}DHP)I$O;KxTg zi2DZmogZ<=B7aRcpc|#6Pj~lE@RaMg+9LOMHPMGI)H>MZj@O+_qNeRt;t`}cJ3^Rj z`SZ#^mz9G$@29?xq|{jS8rt+OALtyAZ@oh+RrN;832=vVMDXEV`qQIk?Rd=_h5NMG z?FJ@$WEA-DXTEp(RNT3(4w?LKqu)AO>}=8;;T%KKK9t;-@Bc@7@))0PL5HbivbKtA!Otd*$O8{+pkTq~J_ojyDtjU2T_hT2~JxRNe(ik{&v)=`3B zq`$cReB5`tIIw$m`du?#y%giAv=RLB(U11M*0r6>_a%(H;`^I3RW2mm#&QrFs5SCK zbAB@1$NR@zynj4=%fhO@N1ZEsTM4dX_xK)X2xG{cU{_{(#xvmRu11(0iq78R5w>dB z>Y<)Y$xY$^aWPz*W&X!SB`F+h_@6*H;J=b6v8 zNDMG>Db`7ee>a5KEXcnJwr2ymaZ+-g!GVIzD`iK+&&{9ijy`8wC)dnB*@?}>M2U)K zBhmMYmF}S-j1!V}ZAEwOe+ALwwL6Km`WO&>kDEykeuXbd9v@eXJeax464+q+n94^Q z?KAZ+iT}eP{73vg@}1N|m#jqyM#Kxh>|0c`hMkse<$Mj|_iFBH$&Iqe_^8pNS7@C( z2MpsU$!rgf4XSSvGJbY|7@^adEaAY(#{y~$R9brFv*t@pWMsdL{0^tEt!dci8%fC*VqXKfCT`ugu$lmma|m%r3)iId+*@x$DS=d9 zxs!TQ81?6Y$;PiW2iMl(;4Z-#hx3ll=cy?|TSJz1B~@78_kcnp0NeZklshYn>(2#a z_d`SQ702@Kl;f|Z_4Rrp-LBWJP!kN5QHLAA+hCJFJ=LrZOJ_Y$@9i9B5@~->QC|3r zeo#0oCUw5p>U2osOYg|Xf!R=w=Sl1@+@s17uMa{s9_*(5HP6)g;!1R}*3_FrKC}GGOXj+9 zg|9P2Gxu-mHyYz22$NJX?owzgWKEm2bn9_K*z;kYngupvc3=5;CKcO>d%N^Vb| ztc})~L^h$Jwp^yVL^iK%t~|a{v{A<( zh&;UE;CyuNLWG#>fo6aQbq}gs`uAMshnVAmX9US@dTDKGXKe$9foc>=hd25Kc}lMG zgtV-p_DZ*>QL*n^2Bb2mRQ~ZM|0a>X3r&pSHsXlx?3r^;a$;g>LZG$|ul0z=+skgW zd$o&kA4Q+F_?X|z`;U6bk6^S}M4tEN_+(bjuMJ`8FcKO*jnpTb8v8KMoI3aXVVOWK8m!IaPv%g;Pyr6epG|1}4 z4iCH4^(8}=+%zpmE_Ukfjz4psk)G>fO;D=`Ym`}<5@Qqb)cmUsgZ-en&Ku*mJ-PW4 z9Xr0YNhQ@K1<-}R7Z&`us%I)h855b}B-tCx^Y;=YSZe90 z$I-{hONpGtfS#6yipC;(nl`xK{tNq47SPGKs0?|0Hi?89xGZ3mEORVF6QEB3&9-$!5oV z9P2?3OrxeYV8M(x9_zO8QeY&5EzmW^*07@5w?6`UjpdQ=ZWvcA(rH#Z1yI!4PuKTc zA^Kxy?!JWhR>Erh8(}3Omyrh(d(%?YJKg11L8bzV{l*1H{BA!heDq(mH490DOeT5rSc z;wnYT(AIma{`>H4%5=1O$0AoW`r<1e5bW>3R~N$GY`U=-%drbGks(rTD{o<>zIgxH z?E44%3d~d>f`{af1ap0z)j$2$<`uB;4@+_7m>|W*+Dy#7!$;R&(Y^XXr2))3V@&oL zW2dEVu}@>jFSp2u-vXwn-f~B?{*zw(vNKV$?FO$~$9j7$cGDF01?Yi4o`P)^&TcYC zOW(ig^sv~48t!#sanf6s)-FL@#QXXHG^_-e9m8?50=j3<4=ZmKuj9~#2U=CupR5Qd zvm~>lZ#Oit-y;azChw`ErFg!gT?t>WUB}2qTP4IFg-d(8kpgq((2zvAChIFWle511NZ=8IoYT$LE_s5 zYmkV{oVXs-O>OfSlk67kBJcW_e#&JZ8;@R4FLq&nj@%I5%m|5=)#(7e#;FEe^|dsl z!(ug6s+7no|El_KeUR-z3qPZh;Z4KEu1WjfRU+q6?PJzwYNx6+Xu{N9rrN8p=Thd% zR2Sp$X=vHPjkEocY3-@b_63SZgmt5Y!+a5L>1Z6ytn1(xw#kT33bS&I?M}X`^OSyH zTNeUaK6B8>Nsr!aP{@JR))?t1Ruj?sk_TTv=#2extkH6yH;`kkCyhy2Y^xKg+h#c| zeAU{P^yXE04|1s^DT%p^Gzy<42j>TF+e$=~*B;T6L8Yz6Q}Z#7Ub7CM#(j&Ks_v=8 zcS$!YFWBz=lO8pLX54h^PtX^Vn;t#+6#MnD=Bl{j1cwKLDYiVq=}9a1<4HIoTl(eZ zP}q7QzQP8vne@UF%n+oiuFR>bb=GvzT&hZ&=QP)kKeb}37)$089Xf(wW7(#ZIBJ(Q zsiO&N%{sTrZQOS4HNmIEdHB9u;%4DNMAfFd^aI=6G)I_4+|j!9PtC=;V#`O=?te9> z`&iHh@5lpTpu4shy8R*AtTo>);mEgvfHsy|cKa*ggW~l+-FzHAbLmK{n7GCamBSaW z=CjQA7DHpOW}or-JDpwmK`?7SzE0^|jD4P-@QuZX9>^Ue3fErzzaVq`uYyTx2_ge^ ztg8grYtEhe?7z2$hZKK=8=9WMuR^FGvG0A; zo{ShsY7B%T8Zt7?H*^mxl0Fdd^{Q0l>mWtEG;|`4n((53_KB=RCI45`nkAPgRdkP+ z@P+#$D*S{@PNxspn^4))d?M%}6ChnKOu8i1*Ld(4x!y^tNmx~acn^2zF6(3^P9Q;8 z=XT!wluATT=um$n*Co+>lC+-BgrtCW_(Q3!!%8w$f+fza67r<*Xq`TH2g&}0iy)5J zLta=r%y>v&XXHST>^U-6P+N7c?)z>5V*dk#hxQAB_@`3Yoap!yhD28+7n4WIvloc_ zSBIY>^jUwTXh!*k7S8CBtu($&rxF)vmd(2fGx``UNe%nxEmNQmGrCBV$?JDv$^y6N zq5$I;^k`Qz_Vyvf5MbVV)>VI;CFMIIvLQNUeK2W*?tMJf!?y0xI+5>B)mo=R@J=C| zl`Lm@T1HGV9Ns>W!Gw(T!xfkN_SW@c3#haoU%!Uj#AY(JibLnwn-*Zu2ezr`~8Jz{&2*`5{53epPo^uGCj{v~g)Hgf6?H z-fF6jfOSJBhvWyzHAddT!$Ko8b!Cj1WL0cj^_-{(w2hA5lEkTyogv(V^amMbTva^jYfbUA(>Qrlef;b+ zPQ9}^o{aDs>8I0M{vHAdGb0NLD9rm>8+N-OPo8OMTE&d|?f@B7tOOCGnzc@dJ6U}y zL0dKVL=q|1n(Lf*ib&fH+@mRY3?!MnNbWmU;tUKTqMDWMr^K{AD9>w|EZIW==}BQj z@~kAc_7vK^bxJ*UuQ#vE;!p;JSJUZDyDP3X$Ey`y6#r0)=1Iqr!6usJ*I5opch7AY zr4JbC!=Uw8k`K+UJ5B9`2*TW*@@PmMfozCq#KPpt5O4jUH(#DaTN%m0VyLdlJ*^eu zyQ*}Ay(S!2-OR>?klCfS5Y=(YL;3^Ex%!I8?ANq{$4)9pnQb_iq+lU(V5vBwe!|bC zY6_{3stdl`BAe6dT^ulWb}0nzFI*oeUj$jE%5}*$$Jv??ZR8;KZF`T`SOBnDhq%*=5-vtV7|gnhb=QZb8?YW%r-r?9GM$M$nz4I(vIB~+TpTg#`T{i} z?@Hz?qE0Wirme&BR8C9^)mNT}rw-e(>j#Z@u`D?u9p$5&C`#WIYALZ%t=r=xN^Z$- zj$QQ&63K$IftTQrMXwxD^$)1j4uh5C$$P5Z4^^AF(*+tlmzzB3ntHVgY+1b@a_?y1 z$ciCP(jd#W=>zF950zm@qB)sid1S_SRnteRSeiXg?}n;ovGSz1aECgl4=Ac;C3C0S zI-YwN<}yEfBYl7w9W=PKc+b4MH$W+^j-E&DFh;iNf zx)4c{l+5sjwT;C1p{h}Kv}*Az^h5OiC&+Ssc=@h5PBDGpU}ac~*qF_vw%z0xi9mDm zkQ}yI1j$iszG0r*>JW$6H)?gLBQtKPY}gP$7)EN;8`L-YKYIcj9LX+7+TWwMf51K8 ztj~-o*M&v?e1X{aEyzpbBh=9^Jg`USQTqNcgILZ5bZR%l5Se$c9B!3j#tJ?z9L1#gp~Av^iR z(66fc0&^>Uhp<&7+t&#ParOR9SC>{_9+FSa&3(YGRzTf(J}*{}n-XWnB7R4CI+E?0Zmne}Kf7uz^sSjTJ#4OPO)P(=iRGVc;opmYB^E(1l+OOw7X@8aTmpW@1`(#9q`c319t4Cg~A|E*;t{q9I@WK%+ZqRvl-M*P& zx4gM#-+7C16D~p5NJk0F{Is8M)5Iq(x4&d-A^;ic&C?EfY0VDmTJ53RW#2392eX2& z%yUoGCPkiWg>&eE+bCG)Y7Bw57q`?)<}JTfL~cdQGNg~IOm_J~_T{2-y(;9e{6o(> za8p72O=<8q4HJ4z?WMHU_o39MJQ?dDFX^oeVOoy?6EQoU$aBV*tcSM>dji-_C$JZz z0ZlaBimk`=TEBZzDOepaWM*9Z zE`bM<%N&2Z*p&P0e|w(cW7f|O6RzVMf4hiJ=V{Ic#*`=*T_V4E6;DCkYzvaIegkF| zbocl{vS;#seRx0M_`~n~Ie&dv2S3OZ=ufd>j*6#~1={GLug8Id-Zbd@YV%|NN(& z@~={ji_xmNsivV;zS{k;ySiZI*|8*$C8etroS%wxg%(Ft7FE7hO!-F%PT&ik8Mt$tc=b9kXXZCMlrkb1bU% zO`|?cD-#oBuN!xNTo=6L;{0S08&nb`fMdP-M>v~wE($5jxB=w;6d=&OV@)2Z(DFFf z*mAm&mUW_H0k2_zb`8J@0kDu$;Y&Gmv{Wf@5T$e_N<`XPdGCK^CVVp82DcvaVcX3j zizCVADB}ynttCfpceI^*kg%*2a}fTgOI9vgmLeqr1mVEtlXxNmbSLjy&;k(b-uz#> z3cmgAoWC)!mhQc-1iM6(Uy$j^l0@s&M~WvwJ4u--R$1Tn0zkn;lAmyLNLk3!UHe1X zfF3+(zA|}lUnPTzw`DPBw!M2FnBUwAIIAdGPVf3euJd4`O5BPw1-CDRi`?CMdUBq( zvpqgm@#YhvOxJ_}DrI%*$>2AC)rh!Gt9>Y~9o)*}xeO==pz;9_tPe8YH{a1&@ndJy z*hYn)*H+h5rUPxp=rWH8o7ms-L||J-2@`K$**%s^yYfxPee-4q;n4Z1Z8C|HeHs(W zCOcn@O?aKRw3h%G7~9;p`LF0}HpN zv~#)jxbuG>i-(b_?|s$iooJeula*4q>v3+6Vq2nc{`N0LlNA~oK{+{ApU~SiT_#%o zCe{tzhk2`L-r$4%Yd@@R6M2ylKBC)MRX<(x^faJ6fndNM}P z6z#Vpcj`^mi^la$q5Fp6O(UIK|Xi$6<|ySXGn z9pzf*`M+VbCMQOLKFouM0Gl$MclPaMo-fN-Hhi2p2O6~^Ixd1apjlYU3DxD||IKEp z_SKTlUa@$NIdkm~Ez}EemQ+-PqgVe3 ze6`Z(epyl2viBfBCFEMG4kAEz4{#U?U=O(-x{}o{6bCv2t0L28G64wR--HWVpZR-p zJ-rq~>uxS8`tdyPuVT%wr!IzZn(E%PvUs+oyWJ6yo3`|THe@LT@NM7ROWpwF)9`3_ z@O1LPQRKAzZ+ajK>*ljdRfQ{gKalXi%hC&x-un6RV{cD-hB04-;bV@oJ;Y73V8ID? zmqk&@fXrILdLU-#jVMPbEcwfgIfYA+UWEftb-Xz6FUjEhOEgwgdq{E8`s9@~u5Y^E zl^wN(h7Q**2!#sW;>jEeBK$&7f#?AM=C!slUVi7*Ij3OY)%90=54L%)=wlFQ8<&)q37c(^XN=uQ z*Mc2^5E)%(*s}|3Asff6X-!&81Wq4mQv7*izxl3H`#O+r?1d+)Pk?n^<-_CDs8)l; zbWb}`4~9h-&>~jiR?k25&VK+F_8xGJ%jGiFukh{fvO2uPhKo32SJ@Bv z<0yxiKhN%v8Ly+e(|~u&!OlJTu~TV=1ASO77^|ULH#TolIU6YoLPhxfDox72smpac zmIe|(J5oOEaC?+p0gRH-lIw2MboFMs7;uG+1&5{tKzHftX?1hlvCHEW<*J@k_=hXg zTeQFvO5zneSAbkhCVxwjSkU*-0#H+q*zv{SUsNcN{99=kP5Uuo*FoF+%4s!uH!F}L z$P6BQ*4x@Rdlu5@7BTTxI!Ku7Q4zKi)n0Keb6X`XF=9P!H=^0_Xm~I!{8Tp*)(|Os zBe5hwWa4o2{W;@%cusbBzc|-$ualQ-9#!z$KSWQ`uBU7qJ$s59bdArBZwJUjCk`tF z!~(~qa)D3_n`zgxPW zqF<#)b0OERT5&q^CLTOrtsCokSXcS-Uh$o0hMLMzwuG*SkICTJqF@k4^L9t*0@1^9 z+`k#*i&SD80Pyk;NT6`~a;OwXz3f)73;1t2AdjKHmOik}zwL2uNXCPC>DdzCpZ~(o zu145ePU2Qm0YwHVHg-D&jKuB5OR~c)xAIv&rskq*I)64eN8Y*e#!ZC6FJUc9_rmR5#Df4uneDm*JJpqUidHI+R2=To5;i=W7291$N!XI{OuMN;Hl zooZU3RX=Kb0EDy!=S}O#=Ui`m+v^d1_J0wi?qhFdQ-A+HG5B6DTE*nPXc1L4XaYg!g^*aEw^d9D&`y;Mox+OjaET8ja%5>?0ajK`C%djCH zP;bXGS`Qr_maoFGmBGL+nIiuoZvVyMafz%ojbG!az^wrQbi>Q$R@*%A94o$_a(efR zD{WW-o^Bx+Go8EroR8vPICN|O48VH9GubR2oKixtoDAin0gT;!9plyzey+B7M2&#n z{UY&#nfkxx*uJ<)Oq2|NRh3)MRn=s{^xW$u5;qprbw>@5);3Qm_th(Lys7UsZ#>hT zpZJHuk6n&s8G>r0+-byC+JFAukfxB7g#8{QMd0hkDo?f1Vos{g-avZ^Km|C;dqVzLVTqt=t8QT%ykt#)pA3%>a6Mt@Lia7i6%jrZo4Mfh6F z1P?L&2bHCl&5{vz$}!oA;GaVxUm2*1mf-KLY@Txb%VbT#C{EZAiUG;J51dN?JeJa6 z5)V-1t?gh+ZdRN=_LnH?YG~*fCg{}uDv{Q5vf6nqQHJNp^!^tf#Uq6kc-3>>iGFc8ms#bWte5XGgJv5c9)dc5->_NQ=l9(KL z>kUvJ0FYq$KX%2xLcXPD!Zbi5$E$fXuVb8?ZtujB!!=n$YCO zDm!$i0PI8?Ae~eVZ!(F=IMJ#lLpwkLD74VG;mc9_C-}$7>ZpQr$<_z^7+^_FKczB@ zS6*509j@J!c3^Q_SPbg^<-c!~6s^9o;oDs%%JW>|>7(ec*cmja!1fMB#m3$FN=N#) zEb%_}|4$GVOvnuY#M>+ht>Kev9~y_g!xer;7VPQ}{uKP4kPxH3N{D*5^RsXX;L=^2 z8@cX()bk^((oe7fvbeLB#$>%_>@QG>1$EE1I(reTbf`B(O|eVxzRT#y=FJQV!_pjOXh|rL=T=Q zSBN|VA%1vsn2I1gN9rcPY(Q*1J!crU{|ktftF{uSv(qMc4R}M0&k+k8R~82jH*{#n z6#jsRHq1ES4NR!T@|#yBqur}Gkc>alY67CrjK(4fAfy6nL=~V};5bwl z+{Ab|SucLLZWp5|X-eaG?>ej8tN?S}x&5Ipx+ z!3zLlv&D7SBEWtqcdE<=90-u3F5UZU4VWx4reDPc2(c02B5se2pc$^vC974FwZ+9q z33d^?I)tgUjTOiB@kEXmjbFua$K-c}|JpY|2T@jb;)z}m;9OQwgkxL(^q&6p07sk8 z%lzsz;Mt|lg$7)Uf0`_uCoTbhIs-#bt89FsC;m6Y{YOm#j(1q?&#%guelJ*G^2Sq0 z=8BgqZ$*J)cHHG!rY&2Hh@46L-%YC%N1|j;@Wpq+urm=TPj=_rx9I1tW44_bWv$(Z zrHw#xP6j-&6w9OnC`3ebL=7+nt(Nv6Ul!hM3AxqJaO-UKe0v=q)d7$Tq1ik}_Zhg6DJi)r)iE-4kctGkaxnhr3aCwp?`|2M+zDQ8 z#O5ac)4l`85@Ou)ZZ~stPKdl&VomG;3I2oCJhR?p%r$KM=9R}mI6?g3hayn7i5IPr zlZH~ft?=Tk*mkmpJxv9*YNSxqc@H0V2ApH#KZ)0WoDw-`zAMC1RV!} zke^qtY2-WUCRMI*XH3Y(NML%GijJn#$n0&83&V>N(=x-^zaTwj{zD3oMjaQU>$O69qiAKp|^3SrCKVot?=>YOxl=OU1zHBJlMJti61dc`wSIZy*}~R!mNUmRo9R z;73$wB|M)ccTm#!-v*u8Ex~Rsxc-fYRoUWYo9DqfR`p72$YLQlAktW75(ylFH3*#l{U z5TiNcw`$;An>(t8Y0^Cb*fNOp`P=!6Y11kI%#yp}^_R27cvQGsZn*0O_vN;#D-mBv zI^oBplvI_l={=S~iG0rU;AAsy|6AQn<2+3GE4Lt@6K7_AoioNw)U8?|1Ilz?$>iTz z3(eS-lHlay#yrjGOaJAG?Eia>`K!6}Rn)(vfT#aYO98JSPpToyp6LTZ=>w`}gl+!Nv2$*%m9u5)RRaXip|_ z@@n!!$}i1NUm4D0>fLTiqcwAO&z&}Qsk}bqYCIdcZj2NIFi0k{bz&fR3wOe+xk7o_lb;*CPEvkx@$!Hug;Wv9i*Y8eK`hOQKyQMBPU0^RxsK5Ov3d^{#p4B~vq2 z`zt2M2>(~|9RwZBc5$2OgwbaTo8IU7fg|!H*O1t~7YNVn@A2g0-}LiIGvf1#(_YCE z5S&iO|6Bm2FW>Z)x+}hf;N_y*fT1wVq0R;ZY=@usW&d~bA&AO`33_TiBA!x26_9i5 z=jAyI^k6k3n^@EOXZ3vW`~Jstl$hUb6GD4+SPhi>A&KFsIly{Z#Z40mv{Z^-JN1d6 z>`AU0nM7P+{S_0kyLMHAM6N`3PjZnfvuFL(3i8k^WZKrbNcama`fHQudzmC_e=?}gMPJXVKk&Q6Mu|dC8t9{Di6s^Zf?M+z({&ed&k>Rvs;68p zW}{p0aJw+Rwpp)L=N>e}RRJc;j5XDdL)V*~8TF)JGe^9XH+`#c^eiBZn9W)H&3cR5 z2`5M*3r4%2)l25?NQLir6D$n3uC+YjqEzU)d?s5)wju#!L{}(iBJsiBLIKTRijkQbzA-j|KDXfk zw;u=}x*Tr4NV4Ko8(An&2%8$xb&^gvnDr-_Dls<*o?XoM`{K7RYqDO~js0dHTh59K zv^r}qZ8FI#4|%mR3*CTSvLl4=lWg=SET6Z5s~zxL&Anry|5t|y-3T0EJ4@)QdEE(VW_#K0`b33^)WXQSINU|JRUkF;pxECgeAT$M&i4_klNPmw zl}WXC7jzW|4RcZJsKcSqSiYP+QGW+X5<_}>s%N??dQ*kD^tyH?19mdn zeUw_3GLAh&!o9clWfRsojBCPMSP17{jc;;gl)-;Oqge0*&1a zFG3R!5nV1k%S^4^uqBS5OL&??{Vlz|6Me8o`DvXve2b-w>?lh&%2;%RI*0nGmpFBm z(5tj&y`K=YJ|?gy5HW8_s@5V#kgTW0vFm7bvboVoRbttYn2nO_enF(XjGr4+{niRP zdm2?oMK+w}8Ow)}lP7wJ&mm%pY~=YzXNJ_sFB7wmhi7Yuj~9>t2liU(xt-h@js zm~n(Mm>ShEnc~*OM#51K#VybRP|6siox)uhiRzi^ssh<+Z+QKKbh{|yF6S7<;2kt$_uilOYOD>un(N*)BRLPlo@SDKTeluG?@Tr%@ zJ^aAHj67RlyTr8R`$+=LZ9<`a>8zdI`;Z-mjd(Vf9jL?w<%X@-HLFev;gcroRc(bf z<=(X(3Nx#9k`6sVq$us6mP(`VlVvW#ggWCZt6JYMLFtUGWR*2`{x$0reyc`j>ETEU zG`fT>T&y7PaT5j-m*vV>w`N)=XS!$e+MBfqcc!#m1%-LS-dY>$4R*lVn>FQ94GN$rgbLd$y>T>Vcq1UZR zw9O>04+!;qRntfH_fYDi$_s6MtL^+O>cU*AHsENlME|W!HsoPMm>lDmTd*T~Z6awg z`(y}@8n??k$g-bCYsFln|>T}@0KTP zC(o*NFl4#2KCVz8G*C3TA=rhk$=oh~HP==*%4K?GYBk>p{J*<=V&<@%oQ*@ptIEdfQlsnN}!)&EBcPNVBr@$>5 zUqn32ypn^YB~Aw={OPx!qdNxlhjxlrM zi}D;!9&SYYZ>Z%|oT+P$KVPMk?EN_>-l;s*e+K7`MyBL)rPA}HgV2@hLA&uVXKsG7 z1fhi~Y%^Jv_zDoR9Aws4E9b+5i@N3F$;~fOEK{!&P3+PadHG~YK}@eX4y2Mh=w1f} z^n8`x8#b?R*gaN#6hGlXgTwn2uEPlRA?sXU+J?<}aE-1Omjq*|sERXNG!X-DdSvO* z)uO=maPvc#?+GH!)o}0X60VQcunM&%3dhQ z|HO(lej|Yo`jTX;$zN+xEkC#R^mOCut4_|`A<6Fd#P{78^qiuhhh~5TIo}5le zS=B70I2CP$2us_fxc_7I)02=*kl? zGt*DL_b`mPF1+@vuL-Nod`)Ms;jz_+AEGPobMHjY?lRZQ`SZp=sJYYc3{OgJ-gJSAGSupl700aF;}o%c|e)_9ROT^3|~ z-vly;kWbMz>4WvHfIq#bs!`T^c~D^XKs75uYNCjg*Lp8$d;t;z=`66VBYoc~V!wYN z{1Tww_Zg^Ggs9x$ExoTS+^egF3rQ@r%;7udB5;N3xXTsL zxs}Ulmzi1*SYfp{l=ZZ}H>Q^8YQ;yBjrd5}_nnE;Rx+A6C4Pg#eY|ioSTt_>Nkg&y zShH@FM54ntT@_{R*Ny_SE0P=+#QjS@B>8GwupH|twI8!%vJhu@;3U8#mRwA6Sc)wC z-0FE{?>yq==N`x8A4_g$=A`M7tv-Rpu$Ltg%iD!)>n9N>g1@_%%5{%Co2A0ohjY}I z_&LU!jbj~Sg?lE3ay3p=yOAI~uYNT&Ht~?3+`wTaSI`5e_=qPODk&HEkT~7#0k(;9 z|5%pg0iv8i{nQmoAak5~RTMj1cM4`&@Jct(@I(z?H)~o#vv{mxc{!b_jAVr(Z2ZS? zQkc0lmSs7{Z-@OlDJtakD}7X8kHxpr9UUJ4GL|9+3Fp;Y^>a}CHbx2#YgObMR;cSE z^1jcFS{Ze6sv9L59zb&sPYr_{GeG7xSGysCPQDVM>b|wXs5yV z5!HA2zACP7UWT@S{>HYTLLCdQgSs12KeF#oxPYaCzhS??M~SS9yQow5W$B$Bs+`Gw z>+}H*`S;uI=>rcAzS!1Jm`7(Ac=on^`ySJy49&WL0^eabE>fCc2lZbu?xi;e6kn5V7Au z)VVElx#pE*R150D8R9-)A!K=FZ~mSEqMPQ2>S#%m& + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + packet + packet + packet + packet + packet + packet + packet + packet + packet + packet + packet + packet + packet + packet + packet + packet + packet + packet + packet + + + + + + + + + + + + + + + + + + + + + + + packet + packet + packet + packet + packet + packet + packet + packet + packet + packet + packet + packet + packet + packet + packet + packet + packet + packet + packet + + packet stream + unframed logical bitstream + + diff --git a/cs/3rd party/libogg/doc/pages.png b/cs/3rd party/libogg/doc/pages.png new file mode 100644 index 0000000000000000000000000000000000000000..b4b431e9978afa43e0b189ca3a78d8dce6378827 GIT binary patch literal 43547 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 + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + OggS + OggS + OggS + + + + + + + + + + + + + + + 23 + 24 + 25 + + ... + ... + physical bitstream + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + framed logical bitstream + + + + + + + + + + + + + + + + + + + + + + + packet + packet + packet + packet + packet + packet + packet + packet + packet + packet + packet + packet + packet + packet + packet + packet + packet + packet + packet + + + diff --git a/cs/3rd party/libogg/doc/rfc3533.txt b/cs/3rd party/libogg/doc/rfc3533.txt new file mode 100644 index 000000000..f2fcd1a0c --- /dev/null +++ b/cs/3rd party/libogg/doc/rfc3533.txt @@ -0,0 +1,843 @@ + + + + + + +Network Working Group S. Pfeiffer +Request for Comments: 3533 CSIRO +Category: Informational May 2003 + + + The Ogg Encapsulation Format Version 0 + +Status of this Memo + + This memo provides information for the Internet community. It does + not specify an Internet standard of any kind. Distribution of this + memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (2003). All Rights Reserved. + +Abstract + + This document describes the Ogg bitstream format version 0, which is + a general, freely-available encapsulation format for media streams. + It is able to encapsulate any kind and number of video and audio + encoding formats as well as other data streams in a single bitstream. + +Terminology + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + document are to be interpreted as described in BCP 14, RFC 2119 [2]. + +Table of Contents + + 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 2 + 2. Definitions . . . . . . . . . . . . . . . . . . . . . . . . . 2 + 3. Requirements for a generic encapsulation format . . . . . . . 3 + 4. The Ogg bitstream format . . . . . . . . . . . . . . . . . . . 3 + 5. The encapsulation process . . . . . . . . . . . . . . . . . . 6 + 6. The Ogg page format . . . . . . . . . . . . . . . . . . . . . 9 + 7. Security Considerations . . . . . . . . . . . . . . . . . . . 11 + 8. References . . . . . . . . . . . . . . . . . . . . . . . . . . 12 + A. Glossary of terms and abbreviations . . . . . . . . . . . . . 13 + B. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 14 + Author's Address . . . . . . . . . . . . . . . . . . . . . . . 14 + Full Copyright Statement . . . . . . . . . . . . . . . . . . . 15 + + + + + + + +Pfeiffer Informational [Page 1] + +RFC 3533 OGG May 2003 + + +1. Introduction + + The Ogg bitstream format has been developed as a part of a larger + project aimed at creating a set of components for the coding and + decoding of multimedia content (codecs) which are to be freely + available and freely re-implementable, both in software and in + hardware for the computing community at large, including the Internet + community. It is the intention of the Ogg developers represented by + Xiph.Org that it be usable without intellectual property concerns. + + This document describes the Ogg bitstream format and how to use it to + encapsulate one or several media bitstreams created by one or several + encoders. The Ogg transport bitstream is designed to provide + framing, error protection and seeking structure for higher-level + codec streams that consist of raw, unencapsulated data packets, such + as the Vorbis audio codec or the upcoming Tarkin and Theora video + codecs. It is capable of interleaving different binary media and + other time-continuous data streams that are prepared by an encoder as + a sequence of data packets. Ogg provides enough information to + properly separate data back into such encoder created data packets at + the original packet boundaries without relying on decoding to find + packet boundaries. + + Please note that the MIME type application/ogg has been registered + with the IANA [1]. + +2. Definitions + + For describing the Ogg encapsulation process, a set of terms will be + used whose meaning needs to be well understood. Therefore, some of + the most fundamental terms are defined now before we start with the + description of the requirements for a generic media stream + encapsulation format, the process of encapsulation, and the concrete + format of the Ogg bitstream. See the Appendix for a more complete + glossary. + + The result of an Ogg encapsulation is called the "Physical (Ogg) + Bitstream". It encapsulates one or several encoder-created + bitstreams, which are called "Logical Bitstreams". A logical + bitstream, provided to the Ogg encapsulation process, has a + structure, i.e., it is split up into a sequence of so-called + "Packets". The packets are created by the encoder of that logical + bitstream and represent meaningful entities for that encoder only + (e.g., an uncompressed stream may use video frames as packets). They + do not contain boundary information - strung together they appear to + be streams of random bytes with no landmarks. + + + + + +Pfeiffer Informational [Page 2] + +RFC 3533 OGG May 2003 + + + Please note that the term "packet" is not used in this document to + signify entities for transport over a network. + +3. Requirements for a generic encapsulation format + + The design idea behind Ogg was to provide a generic, linear media + transport format to enable both file-based storage and stream-based + transmission of one or several interleaved media streams independent + of the encoding format of the media data. Such an encapsulation + format needs to provide: + + o framing for logical bitstreams. + + o interleaving of different logical bitstreams. + + o detection of corruption. + + o recapture after a parsing error. + + o position landmarks for direct random access of arbitrary positions + in the bitstream. + + o streaming capability (i.e., no seeking is needed to build a 100% + complete bitstream). + + o small overhead (i.e., use no more than approximately 1-2% of + bitstream bandwidth for packet boundary marking, high-level + framing, sync and seeking). + + o simplicity to enable fast parsing. + + o simple concatenation mechanism of several physical bitstreams. + + All of these design considerations have been taken into consideration + for Ogg. Ogg supports framing and interleaving of logical + bitstreams, seeking landmarks, detection of corruption, and stream + resynchronisation after a parsing error with no more than + approximately 1-2% overhead. It is a generic framework to perform + encapsulation of time-continuous bitstreams. It does not know any + specifics about the codec data that it encapsulates and is thus + independent of any media codec. + +4. The Ogg bitstream format + + A physical Ogg bitstream consists of multiple logical bitstreams + interleaved in so-called "Pages". Whole pages are taken in order + from multiple logical bitstreams multiplexed at the page level. The + logical bitstreams are identified by a unique serial number in the + + + +Pfeiffer Informational [Page 3] + +RFC 3533 OGG May 2003 + + + header of each page of the physical bitstream. This unique serial + number is created randomly and does not have any connection to the + content or encoder of the logical bitstream it represents. Pages of + all logical bitstreams are concurrently interleaved, but they need + not be in a regular order - they are only required to be consecutive + within the logical bitstream. Ogg demultiplexing reconstructs the + original logical bitstreams from the physical bitstream by taking the + pages in order from the physical bitstream and redirecting them into + the appropriate logical decoding entity. + + Each Ogg page contains only one type of data as it belongs to one + logical bitstream only. Pages are of variable size and have a page + header containing encapsulation and error recovery information. Each + logical bitstream in a physical Ogg bitstream starts with a special + start page (bos=beginning of stream) and ends with a special page + (eos=end of stream). + + The bos page contains information to uniquely identify the codec type + and MAY contain information to set up the decoding process. The bos + page SHOULD also contain information about the encoded media - for + example, for audio, it should contain the sample rate and number of + channels. By convention, the first bytes of the bos page contain + magic data that uniquely identifies the required codec. It is the + responsibility of anyone fielding a new codec to make sure it is + possible to reliably distinguish his/her codec from all other codecs + in use. There is no fixed way to detect the end of the codec- + identifying marker. The format of the bos page is dependent on the + codec and therefore MUST be given in the encapsulation specification + of that logical bitstream type. Ogg also allows but does not require + secondary header packets after the bos page for logical bitstreams + and these must also precede any data packets in any logical + bitstream. These subsequent header packets are framed into an + integral number of pages, which will not contain any data packets. + So, a physical bitstream begins with the bos pages of all logical + bitstreams containing one initial header packet per page, followed by + the subsidiary header packets of all streams, followed by pages + containing data packets. + + The encapsulation specification for one or more logical bitstreams is + called a "media mapping". An example for a media mapping is "Ogg + Vorbis", which uses the Ogg framework to encapsulate Vorbis-encoded + audio data for stream-based storage (such as files) and transport + (such as TCP streams or pipes). Ogg Vorbis provides the name and + revision of the Vorbis codec, the audio rate and the audio quality on + the Ogg Vorbis bos page. It also uses two additional header pages + per logical bitstream. The Ogg Vorbis bos page starts with the byte + 0x01, followed by "vorbis" (a total of 7 bytes of identifier). + + + + +Pfeiffer Informational [Page 4] + +RFC 3533 OGG May 2003 + + + Ogg knows two types of multiplexing: concurrent multiplexing (so- + called "Grouping") and sequential multiplexing (so-called + "Chaining"). Grouping defines how to interleave several logical + bitstreams page-wise in the same physical bitstream. Grouping is for + example needed for interleaving a video stream with several + synchronised audio tracks using different codecs in different logical + bitstreams. Chaining on the other hand, is defined to provide a + simple mechanism to concatenate physical Ogg bitstreams, as is often + needed for streaming applications. + + In grouping, all bos pages of all logical bitstreams MUST appear + together at the beginning of the Ogg bitstream. The media mapping + specifies the order of the initial pages. For example, the grouping + of a specific Ogg video and Ogg audio bitstream may specify that the + physical bitstream MUST begin with the bos page of the logical video + bitstream, followed by the bos page of the audio bitstream. Unlike + bos pages, eos pages for the logical bitstreams need not all occur + contiguously. Eos pages may be 'nil' pages, that is, pages + containing no content but simply a page header with position + information and the eos flag set in the page header. Each grouped + logical bitstream MUST have a unique serial number within the scope + of the physical bitstream. + + In chaining, complete logical bitstreams are concatenated. The + bitstreams do not overlap, i.e., the eos page of a given logical + bitstream is immediately followed by the bos page of the next. Each + chained logical bitstream MUST have a unique serial number within the + scope of the physical bitstream. + + It is possible to consecutively chain groups of concurrently + multiplexed bitstreams. The groups, when unchained, MUST stand on + their own as a valid concurrently multiplexed bitstream. The + following diagram shows a schematic example of such a physical + bitstream that obeys all the rules of both grouped and chained + multiplexed bitstreams. + + physical bitstream with pages of + different logical bitstreams grouped and chained + ------------------------------------------------------------- + |*A*|*B*|*C*|A|A|C|B|A|B|#A#|C|...|B|C|#B#|#C#|*D*|D|...|#D#| + ------------------------------------------------------------- + bos bos bos eos eos eos bos eos + + In this example, there are two chained physical bitstreams, the first + of which is a grouped stream of three logical bitstreams A, B, and C. + The second physical bitstream is chained after the end of the grouped + bitstream, which ends after the last eos page of all its grouped + logical bitstreams. As can be seen, grouped bitstreams begin + + + +Pfeiffer Informational [Page 5] + +RFC 3533 OGG May 2003 + + + together - all of the bos pages MUST appear before any data pages. + It can also be seen that pages of concurrently multiplexed bitstreams + need not conform to a regular order. And it can be seen that a + grouped bitstream can end long before the other bitstreams in the + group end. + + Ogg does not know any specifics about the codec data except that each + logical bitstream belongs to a different codec, the data from the + codec comes in order and has position markers (so-called "Granule + positions"). Ogg does not have a concept of 'time': it only knows + about sequentially increasing, unitless position markers. An + application can only get temporal information through higher layers + which have access to the codec APIs to assign and convert granule + positions or time. + + A specific definition of a media mapping using Ogg may put further + constraints on its specific use of the Ogg bitstream format. For + example, a specific media mapping may require that all the eos pages + for all grouped bitstreams need to appear in direct sequence. An + example for a media mapping is the specification of "Ogg Vorbis". + Another example is the upcoming "Ogg Theora" specification which + encapsulates Theora-encoded video data and usually comes multiplexed + with a Vorbis stream for an Ogg containing synchronised audio and + video. As Ogg does not specify temporal relationships between the + encapsulated concurrently multiplexed bitstreams, the temporal + synchronisation between the audio and video stream will be specified + in this media mapping. To enable streaming, pages from various + logical bitstreams will typically be interleaved in chronological + order. + +5. The encapsulation process + + The process of multiplexing different logical bitstreams happens at + the level of pages as described above. The bitstreams provided by + encoders are however handed over to Ogg as so-called "Packets" with + packet boundaries dependent on the encoding format. The process of + encapsulating packets into pages will be described now. + + From Ogg's perspective, packets can be of any arbitrary size. A + specific media mapping will define how to group or break up packets + from a specific media encoder. As Ogg pages have a maximum size of + about 64 kBytes, sometimes a packet has to be distributed over + several pages. To simplify that process, Ogg divides each packet + into 255 byte long chunks plus a final shorter chunk. These chunks + are called "Ogg Segments". They are only a logical construct and do + not have a header for themselves. + + + + + +Pfeiffer Informational [Page 6] + +RFC 3533 OGG May 2003 + + + A group of contiguous segments is wrapped into a variable length page + preceded by a header. A segment table in the page header tells about + the "Lacing values" (sizes) of the segments included in the page. A + flag in the page header tells whether a page contains a packet + continued from a previous page. Note that a lacing value of 255 + implies that a second lacing value follows in the packet, and a value + of less than 255 marks the end of the packet after that many + additional bytes. A packet of 255 bytes (or a multiple of 255 bytes) + is terminated by a lacing value of 0. Note also that a 'nil' (zero + length) packet is not an error; it consists of nothing more than a + lacing value of zero in the header. + + The encoding is optimized for speed and the expected case of the + majority of packets being between 50 and 200 bytes large. This is a + design justification rather than a recommendation. This encoding + both avoids imposing a maximum packet size as well as imposing + minimum overhead on small packets. In contrast, e.g., simply using + two bytes at the head of every packet and having a max packet size of + 32 kBytes would always penalize small packets (< 255 bytes, the + typical case) with twice the segmentation overhead. Using the lacing + values as suggested, small packets see the minimum possible byte- + aligned overhead (1 byte) and large packets (>512 bytes) see a fairly + constant ~0.5% overhead on encoding space. + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Pfeiffer Informational [Page 7] + +RFC 3533 OGG May 2003 + + + The following diagram shows a schematic example of a media mapping + using Ogg and grouped logical bitstreams: + + logical bitstream with packet boundaries + ----------------------------------------------------------------- + > | packet_1 | packet_2 | packet_3 | < + ----------------------------------------------------------------- + + |segmentation (logically only) + v + + packet_1 (5 segments) packet_2 (4 segs) p_3 (2 segs) + ------------------------------ -------------------- ------------ + .. |seg_1|seg_2|seg_3|seg_4|s_5 | |seg_1|seg_2|seg_3|| |seg_1|s_2 | .. + ------------------------------ -------------------- ------------ + + | page encapsulation + v + + page_1 (packet_1 data) page_2 (pket_1 data) page_3 (packet_2 data) +------------------------ ---------------- ------------------------ +|H|------------------- | |H|----------- | |H|------------------- | +|D||seg_1|seg_2|seg_3| | |D|seg_4|s_5 | | |D||seg_1|seg_2|seg_3| | ... +|R|------------------- | |R|----------- | |R|------------------- | +------------------------ ---------------- ------------------------ + + | +pages of | +other --------| | +logical ------- +bitstreams | MUX | + ------- + | + v + + page_1 page_2 page_3 + ------ ------ ------- ----- ------- + ... || | || | || | || | || | ... + ------ ------ ------- ----- ------- + physical Ogg bitstream + + In this example we take a snapshot of the encapsulation process of + one logical bitstream. We can see part of that bitstream's + subdivision into packets as provided by the codec. The Ogg + encapsulation process chops up the packets into segments. The + packets in this example are rather large such that packet_1 is split + into 5 segments - 4 segments with 255 bytes and a final smaller one. + Packet_2 is split into 4 segments - 3 segments with 255 bytes and a + + + +Pfeiffer Informational [Page 8] + +RFC 3533 OGG May 2003 + + + final very small one - and packet_3 is split into two segments. The + encapsulation process then creates pages, which are quite small in + this example. Page_1 consists of the first three segments of + packet_1, page_2 contains the remaining 2 segments from packet_1, and + page_3 contains the first three pages of packet_2. Finally, this + logical bitstream is multiplexed into a physical Ogg bitstream with + pages of other logical bitstreams. + +6. The Ogg page format + + A physical Ogg bitstream consists of a sequence of concatenated + pages. Pages are of variable size, usually 4-8 kB, maximum 65307 + bytes. A page header contains all the information needed to + demultiplex the logical bitstreams out of the physical bitstream and + to perform basic error recovery and landmarks for seeking. Each page + is a self-contained entity such that the page decode mechanism can + recognize, verify, and handle single pages at a time without + requiring the overall bitstream. + + The Ogg page header has the following format: + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1| Byte ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| capture_pattern: Magic number for page start "OggS" | 0-3 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| version | header_type | granule_position | 4-7 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| | 8-11 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| | bitstream_serial_number | 12-15 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| | page_sequence_number | 16-19 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| | CRC_checksum | 20-23 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| |page_segments | segment_table | 24-27 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| ... | 28- ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + The LSb (least significant bit) comes first in the Bytes. Fields + with more than one byte length are encoded LSB (least significant + byte) first. + + + + + + + +Pfeiffer Informational [Page 9] + +RFC 3533 OGG May 2003 + + + The fields in the page header have the following meaning: + + 1. capture_pattern: a 4 Byte field that signifies the beginning of a + page. It contains the magic numbers: + + 0x4f 'O' + + 0x67 'g' + + 0x67 'g' + + 0x53 'S' + + It helps a decoder to find the page boundaries and regain + synchronisation after parsing a corrupted stream. Once the + capture pattern is found, the decoder verifies page sync and + integrity by computing and comparing the checksum. + + 2. stream_structure_version: 1 Byte signifying the version number of + the Ogg file format used in this stream (this document specifies + version 0). + + 3. header_type_flag: the bits in this 1 Byte field identify the + specific type of this page. + + * bit 0x01 + + set: page contains data of a packet continued from the previous + page + + unset: page contains a fresh packet + + * bit 0x02 + + set: this is the first page of a logical bitstream (bos) + + unset: this page is not a first page + + * bit 0x04 + + set: this is the last page of a logical bitstream (eos) + + unset: this page is not a last page + + 4. granule_position: an 8 Byte field containing position information. + For example, for an audio stream, it MAY contain the total number + of PCM samples encoded after including all frames finished on this + page. For a video stream it MAY contain the total number of video + + + +Pfeiffer Informational [Page 10] + +RFC 3533 OGG May 2003 + + + frames encoded after this page. This is a hint for the decoder + and gives it some timing and position information. Its meaning is + dependent on the codec for that logical bitstream and specified in + a specific media mapping. A special value of -1 (in two's + complement) indicates that no packets finish on this page. + + 5. bitstream_serial_number: a 4 Byte field containing the unique + serial number by which the logical bitstream is identified. + + 6. page_sequence_number: a 4 Byte field containing the sequence + number of the page so the decoder can identify page loss. This + sequence number is increasing on each logical bitstream + separately. + + 7. CRC_checksum: a 4 Byte field containing a 32 bit CRC checksum of + the page (including header with zero CRC field and page content). + The generator polynomial is 0x04c11db7. + + 8. number_page_segments: 1 Byte giving the number of segment entries + encoded in the segment table. + + 9. segment_table: number_page_segments Bytes containing the lacing + values of all segments in this page. Each Byte contains one + lacing value. + + The total header size in bytes is given by: + header_size = number_page_segments + 27 [Byte] + + The total page size in Bytes is given by: + page_size = header_size + sum(lacing_values: 1..number_page_segments) + [Byte] + +7. Security Considerations + + The Ogg encapsulation format is a container format and only + encapsulates content (such as Vorbis-encoded audio). It does not + provide for any generic encryption or signing of itself or its + contained content bitstreams. However, it encapsulates any kind of + content bitstream as long as there is a codec for it, and is thus + able to contain encrypted and signed content data. It is also + possible to add an external security mechanism that encrypts or signs + an Ogg physical bitstream and thus provides content confidentiality + and authenticity. + + As Ogg encapsulates binary data, it is possible to include executable + content in an Ogg bitstream. This can be an issue with applications + that are implemented using the Ogg format, especially when Ogg is + used for streaming or file transfer in a networking scenario. As + + + +Pfeiffer Informational [Page 11] + +RFC 3533 OGG May 2003 + + + such, Ogg does not pose a threat there. However, an application + decoding Ogg and its encapsulated content bitstreams has to ensure + correct handling of manipulated bitstreams, of buffer overflows and + the like. + +8. References + + [1] Walleij, L., "The application/ogg Media Type", RFC 3534, May + 2003. + + [2] Bradner, S., "Key words for use in RFCs to Indicate Requirement + Levels", BCP 14, RFC 2119, March 1997. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Pfeiffer Informational [Page 12] + +RFC 3533 OGG May 2003 + + +Appendix A. Glossary of terms and abbreviations + + bos page: The initial page (beginning of stream) of a logical + bitstream which contains information to identify the codec type + and other decoding-relevant information. + + chaining (or sequential multiplexing): Concatenation of two or more + complete physical Ogg bitstreams. + + eos page: The final page (end of stream) of a logical bitstream. + + granule position: An increasing position number for a specific + logical bitstream stored in the page header. Its meaning is + dependent on the codec for that logical bitstream and specified in + a specific media mapping. + + grouping (or concurrent multiplexing): Interleaving of pages of + several logical bitstreams into one complete physical Ogg + bitstream under the restriction that all bos pages of all grouped + logical bitstreams MUST appear before any data pages. + + lacing value: An entry in the segment table of a page header + representing the size of the related segment. + + logical bitstream: A sequence of bits being the result of an encoded + media stream. + + media mapping: A specific use of the Ogg encapsulation format + together with a specific (set of) codec(s). + + (Ogg) packet: A subpart of a logical bitstream that is created by the + encoder for that bitstream and represents a meaningful entity for + the encoder, but only a sequence of bits to the Ogg encapsulation. + + (Ogg) page: A physical bitstream consists of a sequence of Ogg pages + containing data of one logical bitstream only. It usually + contains a group of contiguous segments of one packet only, but + sometimes packets are too large and need to be split over several + pages. + + physical (Ogg) bitstream: The sequence of bits resulting from an Ogg + encapsulation of one or several logical bitstreams. It consists + of a sequence of pages from the logical bitstreams with the + restriction that the pages of one logical bitstream MUST come in + their correct temporal order. + + + + + + +Pfeiffer Informational [Page 13] + +RFC 3533 OGG May 2003 + + + (Ogg) segment: The Ogg encapsulation process splits each packet into + chunks of 255 bytes plus a last fractional chunk of less than 255 + bytes. These chunks are called segments. + +Appendix B. Acknowledgements + + The author gratefully acknowledges the work that Christopher + Montgomery and the Xiph.Org foundation have done in defining the Ogg + multimedia project and as part of it the open file format described + in this document. The author hopes that providing this document to + the Internet community will help in promoting the Ogg multimedia + project at http://www.xiph.org/. Many thanks also for the many + technical and typo corrections that C. Montgomery and the Ogg + community provided as feedback to this RFC. + +Author's Address + + Silvia Pfeiffer + CSIRO, Australia + Locked Bag 17 + North Ryde, NSW 2113 + Australia + + Phone: +61 2 9325 3141 + EMail: Silvia.Pfeiffer@csiro.au + URI: http://www.cmis.csiro.au/Silvia.Pfeiffer/ + + + + + + + + + + + + + + + + + + + + + + + + + +Pfeiffer Informational [Page 14] + +RFC 3533 OGG May 2003 + + +Full Copyright Statement + + Copyright (C) The Internet Society (2003). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +Acknowledgement + + Funding for the RFC Editor function is currently provided by the + Internet Society. + + + + + + + + + + + + + + + + + + + +Pfeiffer Informational [Page 15] + diff --git a/cs/3rd party/libogg/doc/rfc3534.txt b/cs/3rd party/libogg/doc/rfc3534.txt new file mode 100644 index 000000000..840f1ecc0 --- /dev/null +++ b/cs/3rd party/libogg/doc/rfc3534.txt @@ -0,0 +1,339 @@ + + + + + + +Network Working Group L. Walleij +Request for Comments: 3534 The Ogg Vorbis Community +Category: Standards Track May 2003 + + + The application/ogg Media Type + +Status of this Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Copyright Notice + + Copyright (C) The Internet Society (2003). All Rights Reserved. + +Abstract + + The Ogg Bitstream Format aims at becoming a general, freely-available + standard for transporting multimedia content across computing + platforms and networks. The intention of this document is to define + the MIME media type application/ogg to refer to this kind of content + when transported across the Internet. It is the intention of the Ogg + Bitstream Format developers that it be usable without intellectual + property concerns. + +Conventions used in this Document + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + document are to be interpreted as described in RFC 2119 [2]. + +1. The Ogg Bitstream Format + + The Ogg Bitstream format has been developed as a part of a larger + project aimed at creating a set of components for the coding and + decoding of multimedia content (codecs) which are to be freely + available and freely re-implementable both in software and in + hardware for the computing community at large, including the Internet + community. + + Raw packets from these codecs may be used directly by transport + mechanisms that provide their own framing and packet-separation + mechanisms (such as UDP datagrams). + + + + +Walleij Standards Track [Page 1] + +RFC 3534 The application/ogg Media Type May 2003 + + + One such framing and content-separation mechanism is the real-time + transport protocol (RTP). RTP allows the streaming of synchronous + lossy data for broadcasting and similar purposes. If this function + is desired then a separate RTP wrapping mechanism should be used. A + wrapping mechanism is currently under development. + + For stream based storage (such as files) and transport (such as TCP + streams or pipes), Ogg codecs use the Ogg Bitstream Format to provide + framing/sync, sync recapture after error, landmarks during seeking, + and enough information to properly separate data back into packets at + the original packet boundaries without relying on decoding to find + packet boundaries. The application/ogg MIME type refers to this kind + of bitstreams, when no further knowledge of the bitstream content + exists. + + The bitstream format in itself is documented in [1]. + +2. Registration Information + + To: ietf-types@iana.org + + Subject: Registration of MIME media type application/ogg + + MIME media type name: application + + MIME subtype name: ogg + + Required parameters: none + + Optional parameters: none + + Encoding Considerations: + + The Ogg bitstream format is binary data, and must be encoded for + non-binary transport; the Base64 encoding is suitable for Email. + Binary encoding could also be used. + + Security Considerations: + + As the Ogg bitstream file is a container format and only a carrier of + content (such as Vorbis audio) with a very rigid definition (see + [1]), this format in itself is not more vulnerable than any other + content framing mechanism. The main security consideration for the + receiving application is to ensure that manipulated packages can not + cause buffer overflows and the like. It is possible to encapsulate + even executable content in the bitstream, so for such uses additional + security considerations must be taken. + + + + +Walleij Standards Track [Page 2] + +RFC 3534 The application/ogg Media Type May 2003 + + + Ogg bitstream files are not signed or encrypted using any applicable + encryption schemes. External security mechanisms must be added if + content confidentiality and authenticity is to be achieved. + + Interoperability considerations: + + The Ogg bitstream format has proved to be widely implementable across + different computing platforms. A broadly portable reference + implementation is available under a BSD license. + + The Ogg bitstream format is not patented and can be implemented by + third parties without patent considerations. + + Published specification: + + See [1]. + + Applications which use this media type: + + Any application that implements the specification will be able to + encode or decode Ogg bitstream files. Specifically, the format is + supposed to be used by subcodecs that implement, for example, Vorbis + audio. + + Additional information: + + Magic number(s): + + In Ogg bitstream files, the first four bytes are 0x4f 0x67 0x67 0x53 + corresponding to the string "OggS". + + File extension: .ogg + + Macintosh File Type Code(s): OggS + + Object Identifier(s) or OID(s): none + + Person & email address to contact for further information: + + Questions about this proposal should be directed to Linus Walleij + . Technical questions about the Ogg bitstream + standard may be asked on the mailing lists for the developer + community. + + Intended usage: COMMON + + + + + + +Walleij Standards Track [Page 3] + +RFC 3534 The application/ogg Media Type May 2003 + + + Author/Change controller: + + This document was written by Linus Walleij . + Changes to this document will either be handled by him, a + representative of the Xiph.org, or the associated development + communities. + + The Ogg bitstream format is controlled by the Xiph.org and the + respective development communities. + +3. Security Considerations + + Security considerations are discussed in the security considerations + clause of the MIME registration in section 2. + +4. Normative References + + [1] Pfeiffer, S., "The Ogg encapsulation format version 0", RFC + 3533, May 2003. + + [2] Bradner, S., "Key words for use in RFCs to Indicate Requirement + Levels", BCP 14, RFC 2119, March 1997. + +5. Intellectual Property Statement + + The IETF takes no position regarding the validity or scope of any + intellectual property or other rights that might be claimed to + pertain to the implementation or use of the technology described in + this document or the extent to which any license under such rights + might or might not be available; neither does it represent that it + has made any effort to identify any such rights. Information on the + IETF's procedures with respect to rights in standards-track and + standards-related documentation can be found in BCP-11. Copies of + claims of rights made available for publication and any assurances of + licenses to be made available, or the result of an attempt made to + obtain a general license or permission for the use of such + proprietary rights by implementors or users of this specification can + be obtained from the IETF Secretariat. + + The IETF invites any interested party to bring to its attention any + copyrights, patents or patent applications, or other proprietary + rights which may cover technology that may be required to practice + this standard. Please address the information to the IETF Executive + Director. + + + + + + + +Walleij Standards Track [Page 4] + +RFC 3534 The application/ogg Media Type May 2003 + + +6. Author's Address + + Linus Walleij + The Ogg Vorbis Community + Master Olofs Vag 24 + Lund 224 66 + SE + + Phone: +46 703 193678 + EMail: triad@df.lth.se + URI: http://www.xiph.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Walleij Standards Track [Page 5] + +RFC 3534 The application/ogg Media Type May 2003 + + +7. Full Copyright Statement + + Copyright (C) The Internet Society (2003). All Rights Reserved. + + This document and translations of it may be copied and furnished to + others, and derivative works that comment on or otherwise explain it + or assist in its implementation may be prepared, copied, published + and distributed, in whole or in part, without restriction of any + kind, provided that the above copyright notice and this paragraph are + included on all such copies and derivative works. However, this + document itself may not be modified in any way, such as by removing + the copyright notice or references to the Internet Society or other + Internet organizations, except as needed for the purpose of + developing Internet standards in which case the procedures for + copyrights defined in the Internet Standards process must be + followed, or as required to translate it into languages other than + English. + + The limited permissions granted above are perpetual and will not be + revoked by the Internet Society or its successors or assigns. + + This document and the information contained herein is provided on an + "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING + TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION + HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +Acknowledgement + + Funding for the RFC Editor function is currently provided by the + Internet Society. + + + + + + + + + + + + + + + + + + + +Walleij Standards Track [Page 6] + diff --git a/cs/3rd party/libogg/doc/rfc5334.txt b/cs/3rd party/libogg/doc/rfc5334.txt new file mode 100644 index 000000000..fea91fb14 --- /dev/null +++ b/cs/3rd party/libogg/doc/rfc5334.txt @@ -0,0 +1,787 @@ + + + + + + +Network Working Group I. Goncalves +Request for Comments: 5334 S. Pfeiffer +Obsoletes: 3534 C. Montgomery +Category: Standards Track Xiph + September 2008 + + + Ogg Media Types + +Status of This Memo + + This document specifies an Internet standards track protocol for the + Internet community, and requests discussion and suggestions for + improvements. Please refer to the current edition of the "Internet + Official Protocol Standards" (STD 1) for the standardization state + and status of this protocol. Distribution of this memo is unlimited. + +Abstract + + This document describes the registration of media types for the Ogg + container format and conformance requirements for implementations of + these types. This document obsoletes RFC 3534. + +Table of Contents + + 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . 2 + 2. Changes Since RFC 3534 . . . . . . . . . . . . . . . . . . 2 + 3. Conformance and Document Conventions . . . . . . . . . . . 3 + 4. Deployed Media Types and Compatibility . . . . . . . . . . 3 + 5. Relation between the Media Types . . . . . . . . . . . . . 5 + 6. Encoding Considerations . . . . . . . . . . . . . . . . . . 5 + 7. Security Considerations . . . . . . . . . . . . . . . . . . 6 + 8. Interoperability Considerations . . . . . . . . . . . . . . 7 + 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . 7 + 10. Ogg Media Types . . . . . . . . . . . . . . . . . . . . . . 7 + 10.1. application/ogg . . . . . . . . . . . . . . . . . . . . . . 7 + 10.2. video/ogg . . . . . . . . . . . . . . . . . . . . . . . . . 8 + 10.3. audio/ogg . . . . . . . . . . . . . . . . . . . . . . . . . 9 + 11. Acknowledgements . . . . . . . . . . . . . . . . . . . . . 10 + 12. Copying Conditions . . . . . . . . . . . . . . . . . . . . 10 + 13. References . . . . . . . . . . . . . . . . . . . . . . . . 11 + 13.1. Normative References . . . . . . . . . . . . . . . . . . . 11 + 13.2. Informative References . . . . . . . . . . . . . . . . . . 11 + + + + + + + + +Goncalves, et al. Standards Track [Page 1] + +RFC 5334 Ogg Media Types September 2008 + + +1. Introduction + + This document describes media types for Ogg, a data encapsulation + format defined by the Xiph.Org Foundation for public use. Refer to + "Introduction" in [RFC3533] and "Overview" in [Ogg] for background + information on this container format. + + Binary data contained in Ogg, such as Vorbis and Theora, has + historically been interchanged using the application/ogg media type + as defined by [RFC3534]. This document obsoletes [RFC3534] and + defines three media types for different types of content in Ogg to + reflect this usage in the IANA media type registry, to foster + interoperability by defining underspecified aspects, and to provide + general security considerations. + + The Ogg container format is known to contain [Theora] or [Dirac] + video, [Speex] (narrow-band and wide-band) speech, [Vorbis] or [FLAC] + audio, and [CMML] timed text/metadata. As Ogg encapsulates binary + data, it is possible to include any other type of video, audio, + image, text, or, generally speaking, any time-continuously sampled + data. + + While raw packets from these data sources may be used directly by + transport mechanisms that provide their own framing and packet- + separation mechanisms (such as UDP datagrams or RTP), Ogg is a + solution for stream based storage (such as files) and transport (such + as TCP streams or pipes). The media types defined in this document + are needed to correctly identify such content when it is served over + HTTP, included in multi-part documents, or used in other places where + media types [RFC2045] are used. + +2. Changes Since RFC 3534 + + o The type "application/ogg" is redefined. + + o The types "video/ogg" and "audio/ogg" are defined. + + o New file extensions are defined. + + o New Macintosh file type codes are defined. + + o The codecs parameter is defined for optional use. + + o The Ogg Skeleton extension becomes a recommended addition for + content served under the new types. + + + + + + +Goncalves, et al. Standards Track [Page 2] + +RFC 5334 Ogg Media Types September 2008 + + +3. Conformance and Document Conventions + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + document are to be interpreted as described in BCP 14, [RFC2119] and + indicate requirement levels for compliant implementations. + Requirements apply to all implementations unless otherwise stated. + + An implementation is a software module that supports one of the media + types defined in this document. Software modules may support + multiple media types, but conformance is considered individually for + each type. + + Implementations that fail to satisfy one or more "MUST" requirements + are considered non-compliant. Implementations that satisfy all + "MUST" requirements, but fail to satisfy one or more "SHOULD" + requirements, are said to be "conditionally compliant". All other + implementations are "unconditionally compliant". + +4. Deployed Media Types and Compatibility + + The application/ogg media type has been used in an ad hoc fashion to + label and exchange multimedia content in Ogg containers. + + Use of the "application" top-level type for this kind of content is + known to be problematic, in particular since it obfuscates video and + audio content. This document thus defines the media types, + + o video/ogg + + o audio/ogg + + which are intended for common use and SHOULD be used when dealing + with video or audio content, respectively. This document also + obsoletes the [RFC3534] definition of application/ogg and marks it + for complex data (e.g., multitrack visual, audio, textual, and other + time-continuously sampled data), which is not clearly video or audio + data and thus not suited for either the video/ogg or audio/ogg types. + Refer to the following section for more details. + + An Ogg bitstream generally consists of one or more logical bitstreams + that each consist of a series of header and data pages packetising + time-continuous binary data [RFC3533]. The content types of the + logical bitstreams may be identified without decoding the header + pages of the logical bitstreams through use of a [Skeleton] + bitstream. Using Ogg Skeleton is REQUIRED for content served under + + + + + +Goncalves, et al. Standards Track [Page 3] + +RFC 5334 Ogg Media Types September 2008 + + + the application/ogg type and RECOMMENDED for video/ogg and audio/ogg, + as Skeleton contains identifiers to describe the different + encapsulated data. + + Furthermore, it is RECOMMENDED that implementations that identify a + logical bitstream that they cannot decode SHOULD ignore it, while + continuing to decode the ones they can. Such precaution ensures + backward and forward compatibility with existing and future data. + + These media types can optionally use the "codecs" parameter described + in [RFC4281]. Codecs encapsulated in Ogg require a text identifier + at the beginning of the first header page, hence a machine-readable + method to identify the encapsulated codecs would be through this + header. The following table illustrates how those header values map + into strings that are used in the "codecs" parameter when dealing + with Ogg media types. + + Codec Identifier | Codecs Parameter + ----------------------------------------------------------- + char[5]: 'BBCD\0' | dirac + char[5]: '\177FLAC' | flac + char[7]: '\x80theora' | theora + char[7]: '\x01vorbis' | vorbis + char[8]: 'CELT ' | celt + char[8]: 'CMML\0\0\0\0' | cmml + char[8]: '\213JNG\r\n\032\n' | jng + char[8]: '\x80kate\0\0\0' | kate + char[8]: 'OggMIDI\0' | midi + char[8]: '\212MNG\r\n\032\n' | mng + char[8]: 'PCM ' | pcm + char[8]: '\211PNG\r\n\032\n' | png + char[8]: 'Speex ' | speex + char[8]: 'YUV4MPEG' | yuv4mpeg + + An up-to-date version of this table is kept at Xiph.org (see + [Codecs]). + + Possible examples include: + + o application/ogg; codecs="theora, cmml, ecmascript" + + o video/ogg; codecs="theora, vorbis" + + o audio/ogg; codecs=speex + + + + + + + +Goncalves, et al. Standards Track [Page 4] + +RFC 5334 Ogg Media Types September 2008 + + +5. Relation between the Media Types + + As stated in the previous section, this document describes three + media types that are targeted at different data encapsulated in Ogg. + Since Ogg is capable of encapsulating any kind of data, the multiple + usage scenarios have revealed interoperability issues between + implementations when dealing with content served solely under the + application/ogg type. + + While this document does redefine the earlier definition of + application/ogg, this media type will continue to embrace the widest + net possible of content with the video/ogg and audio/ogg types being + smaller subsets of it. However, the video/ogg and audio/ogg types + take precedence in a subset of the usages, specifically when serving + multimedia content that is not complex enough to warrant the use of + application/ogg. Following this line of thought, the audio/ogg type + is an even smaller subset within video/ogg, as it is not intended to + refer to visual content. + + As such, the application/ogg type is the recommended choice to serve + content aimed at scientific and other applications that require + various multiplexed signals or streams of continuous data, with or + without scriptable control of content. For bitstreams containing + visual, timed text, and any other type of material that requires a + visual interface, but that is not complex enough to warrant serving + under application/ogg, the video/ogg type is recommended. In + situations where the Ogg bitstream predominantly contains audio data + (lyrics, metadata, or cover art notwithstanding), it is recommended + to use the audio/ogg type. + +6. Encoding Considerations + + Binary: The content consists of an unrestricted sequence of octets. + + Note: + + o Ogg encapsulated content is binary data and should be transmitted + in a suitable encoding without CR/LF conversion, 7-bit stripping, + etc.; base64 [RFC4648] is generally preferred for binary-to-text + encoding. + + o Media types described in this document are used for stream based + storage (such as files) and transport (such as TCP streams or + pipes); separate types are used to identify codecs such as in + real-time applications for the RTP payload formats of Theora + [ThRTP] video, Vorbis [RFC5215], or Speex [SpRTP] audio, as well + as for identification of encapsulated data within Ogg through + Skeleton. + + + +Goncalves, et al. Standards Track [Page 5] + +RFC 5334 Ogg Media Types September 2008 + + +7. Security Considerations + + Refer to [RFC3552] for a discussion of terminology used in this + section. + + The Ogg encapsulation format is a container and only a carrier of + content (such as audio, video, and displayable text data) with a very + rigid definition. This format in itself is not more vulnerable than + any other content framing mechanism. + + Ogg does not provide for any generic encryption or signing of itself + or its contained bitstreams. However, it encapsulates any kind of + binary content and is thus able to contain encrypted and signed + content data. It is also possible to add an external security + mechanism that encrypts or signs an Ogg bitstream and thus provides + content confidentiality and authenticity. + + As Ogg encapsulates binary data, it is possible to include executable + content in an Ogg bitstream. Implementations SHOULD NOT execute such + content without prior validation of its origin by the end-user. + + Issues may arise on applications that use Ogg for streaming or file + transfer in a networking scenario. In such cases, implementations + decoding Ogg and its encapsulated bitstreams have to ensure correct + handling of manipulated bitstreams, of buffer overflows, and similar + issues. + + It is also possible to author malicious Ogg bitstreams, which attempt + to call for an excessively large picture size, high sampling-rate + audio, etc. Implementations SHOULD protect themselves against this + kind of attack. + + Ogg has an extensible structure, so that it is theoretically possible + that metadata fields or media formats might be defined in the future + which might be used to induce particular actions on the part of the + recipient, thus presenting additional security risks. However, this + type of capability is currently not supported in the referenced + specification. + + Implementations may fail to implement a specific security model or + other means to prevent possibly dangerous operations. Such failure + might possibly be exploited to gain unauthorized access to a system + or sensitive information; such failure constitutes an unknown factor + and is thus considered out of the scope of this document. + + + + + + + +Goncalves, et al. Standards Track [Page 6] + +RFC 5334 Ogg Media Types September 2008 + + +8. Interoperability Considerations + + The Ogg container format is device-, platform-, and vendor-neutral + and has proved to be widely implementable across different computing + platforms through a wide range of encoders and decoders. A broadly + portable reference implementation [libogg] is available under the + revised (3-clause) BSD license, which is a Free Software license. + + The Xiph.Org Foundation has defined the specification, + interoperability, and conformance and conducts regular + interoperability testing. + + The use of the Ogg Skeleton extension has been confirmed to not cause + interoperability issues with existing implementations. Third parties + are, however, welcome to conduct their own testing. + +9. IANA Considerations + + In accordance with the procedures set forth in [RFC4288], this + document registers two new media types and redefines the existing + application/ogg as defined in the following section. + +10. Ogg Media Types + +10.1. application/ogg + + Type name: application + + Subtype name: ogg + + Required parameters: none + + Optional parameters: codecs, whose syntax is defined in RFC 4281. + See section 4 of RFC 5334 for a list of allowed values. + + Encoding considerations: See section 6 of RFC 5334. + + Security considerations: See section 7 of RFC 5334. + + Interoperability considerations: None, as noted in section 8 of RFC + 5334. + + Published specification: RFC 3533 + + Applications which use this media type: Scientific and otherwise that + require various multiplexed signals or streams of data, with or + without scriptable control of content. + + + + +Goncalves, et al. Standards Track [Page 7] + +RFC 5334 Ogg Media Types September 2008 + + + Additional information: + + Magic number(s): The first four bytes, 0x4f 0x67 0x67 0x53, + correspond to the string "OggS". + + File extension(s): .ogx + + RFC 3534 defined the file extension .ogg for application/ogg, + which RFC 5334 obsoletes in favor of .ogx due to concerns where, + historically, some implementations expect .ogg files to be solely + Vorbis-encoded audio. + + Macintosh File Type Code(s): OggX + + Person & Email address to contact for further information: See + "Authors' Addresses" section. + + Intended usage: COMMON + + Restrictions on usage: The type application/ogg SHOULD only be used + in situations where it is not appropriate to serve data under the + video/ogg or audio/ogg types. Data served under the application/ogg + type SHOULD use the .ogx file extension and MUST contain an Ogg + Skeleton logical bitstream to identify all other contained logical + bitstreams. + + Author: See "Authors' Addresses" section. + + Change controller: The Xiph.Org Foundation. + +10.2. video/ogg + + Type name: video + + Subtype name: ogg + + Required parameters: none + + Optional parameters: codecs, whose syntax is defined in RFC 4281. + See section 4 of RFC 5334 for a list of allowed values. + + Encoding considerations: See section 6 of RFC 5334. + + Security considerations: See section 7 of RFC 5334. + + Interoperability considerations: None, as noted in section 8 of RFC + 5334. + + + + +Goncalves, et al. Standards Track [Page 8] + +RFC 5334 Ogg Media Types September 2008 + + + Published specification: RFC 3533 + + Applications which use this media type: Multimedia applications, + including embedded, streaming, and conferencing tools. + + Additional information: + + Magic number(s): The first four bytes, 0x4f 0x67 0x67 0x53, + correspond to the string "OggS". + + File extension(s): .ogv + + Macintosh File Type Code(s): OggV + + Person & Email address to contact for further information: See + "Authors' Addresses" section. + + Intended usage: COMMON + + Restrictions on usage: The type "video/ogg" SHOULD be used for Ogg + bitstreams containing visual, audio, timed text, or any other type of + material that requires a visual interface. It is intended for + content not complex enough to warrant serving under "application/ + ogg"; for example, a combination of Theora video, Vorbis audio, + Skeleton metadata, and CMML captioning. Data served under the type + "video/ogg" SHOULD contain an Ogg Skeleton logical bitstream. + Implementations interacting with the type "video/ogg" SHOULD support + multiplexed bitstreams. + + Author: See "Authors' Addresses" section. + + Change controller: The Xiph.Org Foundation. + +10.3. audio/ogg + + Type name: audio + + Subtype name: ogg + + Required parameters: none + + Optional parameters: codecs, whose syntax is defined in RFC 4281. + See section 4 of RFC 5334 for a list of allowed values. + + Encoding considerations: See section 6 of RFC 5334. + + Security considerations: See section 7 of RFC 5334. + + + + +Goncalves, et al. Standards Track [Page 9] + +RFC 5334 Ogg Media Types September 2008 + + + Interoperability considerations: None, as noted in section 8 of RFC + 5334. + + Published specification: RFC 3533 + + Applications which use this media type: Multimedia applications, + including embedded, streaming, and conferencing tools. + + Additional information: + + Magic number(s): The first four bytes, 0x4f 0x67 0x67 0x53, + correspond to the string "OggS". + + File extension(s): .oga, .ogg, .spx + + Macintosh File Type Code(s): OggA + + Person & Email address to contact for further information: See + "Authors' Addresses" section. + + Intended usage: COMMON + + Restrictions on usage: The type "audio/ogg" SHOULD be used when the + Ogg bitstream predominantly contains audio data. Content served + under the "audio/ogg" type SHOULD have an Ogg Skeleton logical + bitstream when using the default .oga file extension. The .ogg and + .spx file extensions indicate a specialization that requires no + Skeleton due to backward compatibility concerns with existing + implementations. In particular, .ogg is used for Ogg files that + contain only a Vorbis bitstream, while .spx is used for Ogg files + that contain only a Speex bitstream. + + Author: See "Authors' Addresses" section. + + Change controller: The Xiph.Org Foundation. + +11. Acknowledgements + + The authors gratefully acknowledge the contributions of Magnus + Westerlund, Alfred Hoenes, and Peter Saint-Andre. + +12. Copying Conditions + + The authors agree to grant third parties the irrevocable right to + copy, use and distribute the work, with or without modification, in + any medium, without royalty, provided that, unless separate + permission is granted, redistributed modified works do not contain + misleading author, version, name of work, or endorsement information. + + + +Goncalves, et al. Standards Track [Page 10] + +RFC 5334 Ogg Media Types September 2008 + + +13. References + +13.1. Normative References + + [RFC2045] Freed, N. and N. Borenstein, "Multipurpose Internet Mail + Extensions (MIME) Part One: Format of Internet Message + Bodies", RFC 2045, November 1996. + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, March 1997. + + [RFC3533] Pfeiffer, S., "The Ogg Encapsulation Format Version 0", + RFC 3533, May 2003. + + [RFC4281] Gellens, R., Singer, D., and P. Frojdh, "The Codecs + Parameter for "Bucket" Media Types", RFC 4281, + November 2005. + + [RFC4288] Freed, N. and J. Klensin, "Media Type Specifications and + Registration Procedures", BCP 13, RFC 4288, + December 2005. + +13.2. Informative References + + [CMML] Pfeiffer, S., Parker, C., and A. Pang, "The Continuous + Media Markup Language (CMML)", Work in Progress, + March 2006. + + [Codecs] Pfeiffer, S. and I. Goncalves, "Specification of MIME + types and respective codecs parameter", July 2008, + . + + [Dirac] Dirac Group, "Dirac Specification", + . + + [FLAC] Coalson, J., "The FLAC Format", + . + + [libogg] Xiph.Org Foundation, "The libogg API", June 2000, + . + + [Ogg] Xiph.Org Foundation, "Ogg bitstream documentation: Ogg + logical and physical bitstream overview, Ogg logical + bitstream framing, Ogg multi-stream multiplexing", + . + + [RFC3534] Walleij, L., "The application/ogg Media Type", RFC 3534, + May 2003. + + + +Goncalves, et al. Standards Track [Page 11] + +RFC 5334 Ogg Media Types September 2008 + + + [RFC3552] Rescorla, E. and B. Korver, "Guidelines for Writing RFC + Text on Security Considerations", BCP 72, RFC 3552, + July 2003. + + [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data + Encodings", RFC 4648, October 2006. + + [RFC5215] Barbato, L., "RTP Payload Format for Vorbis Encoded + Audio", RFC 5215, August 2008. + + [Skeleton] Pfeiffer, S. and C. Parker, "The Ogg Skeleton Metadata + Bitstream", November 2007, + . + + [Speex] Valin, J., "The Speex Codec Manual", February 2002, + . + + [SpRTP] Herlein, G., Valin, J., Heggestad, A., and A. Moizard, + "RTP Payload Format for the Speex Codec", Work + in Progress, February 2008. + + [Theora] Xiph.Org Foundation, "Theora Specification", + October 2007, . + + [ThRTP] Barbato, L., "RTP Payload Format for Theora Encoded + Video", Work in Progress, June 2006. + + [Vorbis] Xiph.Org Foundation, "Vorbis I Specification", July 2004, + . + + + + + + + + + + + + + + + + + + + + + + +Goncalves, et al. Standards Track [Page 12] + +RFC 5334 Ogg Media Types September 2008 + + +Authors' Addresses + + Ivo Emanuel Goncalves + Xiph.Org Foundation + 21 College Hill Road + Somerville, MA 02144 + US + + EMail: justivo@gmail.com + URI: xmpp:justivo@gmail.com + + + Silvia Pfeiffer + Xiph.Org Foundation + + EMail: silvia@annodex.net + URI: http://annodex.net/ + + + Christopher Montgomery + Xiph.Org Foundation + + EMail: monty@xiph.org + URI: http://xiph.org + + + + + + + + + + + + + + + + + + + + + + + + + + + +Goncalves, et al. Standards Track [Page 13] + +RFC 5334 Ogg Media Types September 2008 + + +Full Copyright Statement + + Copyright (C) The IETF Trust (2008). + + This document is subject to the rights, licenses and restrictions + contained in BCP 78, and except as set forth therein, the authors + retain all their rights. + + This document and the information contained herein are provided on an + "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS + OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY, THE IETF TRUST AND + THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF + THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED + WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +Intellectual Property + + The IETF takes no position regarding the validity or scope of any + Intellectual Property Rights or other rights that might be claimed to + pertain to the implementation or use of the technology described in + this document or the extent to which any license under such rights + might or might not be available; nor does it represent that it has + made any independent effort to identify any such rights. Information + on the procedures with respect to rights in RFC documents can be + found in BCP 78 and BCP 79. + + Copies of IPR disclosures made to the IETF Secretariat and any + assurances of licenses to be made available, or the result of an + attempt made to obtain a general license or permission for the use of + such proprietary rights by implementers or users of this + specification can be obtained from the IETF on-line IPR repository at + http://www.ietf.org/ipr. + + The IETF invites any interested party to bring to its attention any + copyrights, patents or patent applications, or other proprietary + rights that may cover technology that may be required to implement + this standard. Please address the information to the IETF at + ietf-ipr@ietf.org. + + + + + + + + + + + + +Goncalves, et al. Standards Track [Page 14] + diff --git a/cs/3rd party/libogg/doc/skeleton.html b/cs/3rd party/libogg/doc/skeleton.html new file mode 100644 index 000000000..8b29c18af --- /dev/null +++ b/cs/3rd party/libogg/doc/skeleton.html @@ -0,0 +1,222 @@ + + + + + +The Ogg Skeleton Metadata Bitstream + + + + + + + + + +

    The Ogg Skeleton Metadata Bitstream

    + +

    Overview

    + +

    Ogg Skeleton provides structuring information for multitrack Ogg files. It is compatible with Ogg Theora and provides extra clues for synchronization and content negotiation such as language selection.

    + +

    Ogg is a generic container format for time-continuous data streams, enabling interleaving of several tracks of frame-wise encoded content in a time-multiplexed manner. As an example, an Ogg physical bitstream could encapsulate several tracks of video encoded in Theora and multiple tracks of audio encoded in Speex or Vorbis or FLAC at the same time. A player that decodes such a bitstream could then, for example, play one video channel as the main video playback, alpha-blend another one on top of it (e.g. a caption track), play a main Vorbis audio together with several FLAC audio tracks simultaneously (e.g. as sound effects), and provide a choice of Speex channels (e.g. providing commentary in different languages). Such a file is generally possible to create with Ogg, it is however not possible to generically parse such a file, seek on it, understand what codecs are contained in such a file, and dynamically handle and play back such content.

    + +

    Ogg does not know anything about the content it carries and leaves it to the media mapping of each codec to declare and describe itself. There is no meta information available at the Ogg level about the content tracks encapsulated within an Ogg physical bitstream. This is particularly a problem if you don't have all the decoder libraries available and just want to parse an Ogg file to find out what type of data it encapsulates (such as the "file" command under *nix to determine what file it is through magic numbers), or want to seek to a temporal offset without having to decode the data (such as on a Web server that just serves out Ogg files and parts thereof).

    + +

    Ogg Skeleton is being designed to overcome these problems. Ogg Skeleton is a logical bitstream within an Ogg stream that contains information about the other encapsulated logical bitstreams. For each logical bitstream it provides information such as its media type, and explains the way the granulepos field in Ogg pages is mapped to time.

    + +

    Ogg Skeleton is also designed to allow the creation of substreams from Ogg physical bitstreams that retain the original timing information. For example, when cutting out the segment between the 7th and the 59th second of an Ogg file, it would be nice to continue to start this cut out file with a playback time of 7 seconds and not of 0. This is of particular interest if you're streaming this file from a Web server after a query for a temporal subpart such as in http://example.com/video.ogv?t=7-59

    + +

    Specification

    + +

    How to describe the logical bitstreams within an Ogg container?

    + +

    The following information about a logical bitstream is of interest to contain as meta information in the Skeleton:

    +
      +
    • the serial number: it identifies a content track
    • +
    • the mime type: it identifies the content type
    • +
    • other generic name-value fields that can provide meta information such as the language of a track or the video height and width
    • +
    • the number of header packets: this informs a parser about the number of actual header packets in an Ogg logical bitstream
    • +
    • the granule rate: the granule rate represents the data rate in Hz at which content is sampled for the particular logical bitstream, allowing to map a granule position to time by calculating "granulepos / granulerate"
    • +
    • the preroll: the number of past content packets to take into account when decoding the current Ogg page, which is necessary for seeking (vorbis has generally 2, speex 3)
    • +
    • the granuleshift: the number of lower bits from the granulepos field that are used to provide position information for sub-seekable units (like the keyframe shift in theora)
    • +
    • a basetime: it provides a mapping for granule position 0 (for all logical bitstreams) to a playback time; an example use: most content in professional analog video creation actually starts at a time of 1 hour and thus adding this additional field allows them retain this mapping on digitizing their content
    • +
    • a UTC time: it provides a mapping for granule position 0 (for all logical bitstreams) to a real-world clock time allowing to remember e.g. the recording or broadcast time of some content
    • +
    + +

    How to allow the creation of substreams from an Ogg physical bitstream?

    + +

    When cutting out a subpart of an Ogg physical bitstream, the aim is to keep all the content pages intact (including the framing and granule positions) and just change some information in the Skeleton that allows reconstruction of the accurate time mapping. When remultiplexing such a bitstream, it is necessary to take into account all the different contained logical bitstreams. A given cut-in time maps to several different byte positions in the Ogg physical bitstream because each logical bitstream has its relevant information for that time at a different location. In addition, the resolution of each logical bitstream may not be high enough to accommodate for the given cut-in time and thus there may be some surplus information necessary to be remuxed into the new bitstream.

    + +

    The following information is necessary to be added to the Skeleton to allow a correct presentation of a subpart of an Ogg bitstream:

    +
      +
    • the presentation time: this is the actual cut-in time and all logical bitstreams are meant to start presenting from this time onwards, not from the time their data starts, which may be some time before that (because this time may have mapped right into the middle of a packet, or because the logical bitstream has a preroll or a keyframe shift)
    • +
    • the basegranule: this represents the granule number with which this logical bitstream starts in the remuxed stream and provides for each logical bitstream the accurate start time of its data stream; this information is necessary to allow correct decoding and timing of the first data packets contained in a logcial bitstream of a remuxed Ogg stream
    • +
    + +

    Ogg Skeleton version 3.0 Format Specification

    + +

    Adding the above information into an Ogg bitstream without breaking existing Ogg functionality and code requires the use of a logical bitstream for Ogg Skeleton. This logical bitstream may be ignored on decoding such that existing players can still continue to play back Ogg files that have a Skeleton bitstream. Skeleton enriches the Ogg bitstream to provide meta information about structure and content of the Ogg bitstream.

    + +

    The Skeleton logical bitstream starts with an ident header that contains information about all of the logical bitstreams and is mapped into the Skeleton bos page. The first 8 bytes provide the magic identifier "fishead\0". +After the fishead follows a set of secondary header packets, each of which contains information about one logical bitstream. These secondary header packets are identified by an 8 byte code of "fisbone\0". The Skeleton logical bitstream has no actual content packets. Its eos page is included into the stream before any data pages of the other logical bitstreams appear and contains a packet of length 0.

    + +

    The fishead ident header looks as follows:

    +
    +
    +  0                   1                   2                   3
    +  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1| Byte
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    + | Identifier 'fishead\0'                                        | 0-3
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    + |                                                               | 4-7
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    + | Version major                 | Version minor                 | 8-11
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    + | Presentationtime numerator                                    | 12-15
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    + |                                                               | 16-19
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    + | Presentationtime denominator                                  | 20-23
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    + |                                                               | 24-27
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    + | Basetime numerator                                            | 28-31
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    + |                                                               | 32-35
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    + | Basetime denominator                                          | 36-39
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    + |                                                               | 40-43
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    + | UTC                                                           | 44-47
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    + |                                                               | 48-51
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    + |                                                               | 52-55
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    + |                                                               | 56-59
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    + |                                                               | 60-63
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    +
    +
    +

    The version fields provide version information for the Skeleton track, currently being 3.0 (the number having evolved within the Annodex project).

    + +

    Presentation time and basetime are specified as a rational number, the denominator providing the temporal resolution at which the time is given (e.g. to specify time in milliseconds, provide a denominator of 1000).

    + +

    The fisbone secondary header packet looks as follows:

    +
    +
    +  0                   1                   2                   3
    +  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1| Byte
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    + | Identifier 'fisbone\0'                                        | 0-3
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    + |                                                               | 4-7
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    + | Offset to message header fields                               | 8-11
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    + | Serial number                                                 | 12-15
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    + | Number of header packets                                      | 16-19
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    + | Granulerate numerator                                         | 20-23
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    + |                                                               | 24-27
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    + | Granulerate denominator                                       | 28-31
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    + |                                                               | 32-35
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    + | Basegranule                                                   | 36-39
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    + |                                                               | 40-43
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    + | Preroll                                                       | 44-47
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    + | Granuleshift  | Padding/future use                            | 48-51
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    + | Message header fields ...                                     | 52-
    + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    +
    +
    +

    The mime type is provided as a message header field specified in the same way that HTTP header fields are given (e.g. "Content-Type: audio/vorbis"). Further meta information (such as language and screen size) are also included as message header fields. The offset to the message header fields at the beginning of a fisbone packet is included for forward compatibility - to allow further fields to be included into the packet without disrupting the message header field parsing.

    + +

    The granule rate is again given as a rational number in the same way that presentation time and basetime were provided above.

    + +

    A further restriction on how to encapsulate Skeleton into Ogg is proposed to allow for easier parsing:

    +
      +
    • there can only be one Skeleton logical bitstream in a Ogg bitstream
    • +
    • the Skeleton bos page is the very first bos page in the Ogg stream such that it can be identified straight away and decoders don't get confused about it being e.g. Ogg Vorbis without this meta information
    • +
    • the bos pages of all the other logical bistreams come next (a requirement of Ogg)
    • +
    • the secondary header pages of all logical bitstreams come next, including Skeleton's secondary header packets
    • +
    • the Skeleton eos page end the control section of the Ogg stream before any content pages of any of the other logical bitstreams appear
    • +
    + + + + + \ No newline at end of file diff --git a/cs/3rd party/libogg/doc/stream.png b/cs/3rd party/libogg/doc/stream.png new file mode 100644 index 0000000000000000000000000000000000000000..ce2d2da67a62165c9633042c305aab3d16bee409 GIT binary patch literal 2254 zcmV;<2r>7GP)C{-b9<5*qCO+t=0HF7K(ITj5a3r$ZSLPQ!lIXR%9pglc3 zot>TF;NWFtWzf*jRaI4ZczD3Tz%el~mzS4=gM&v$M>aM#V`F2Hk&$U>Y4GsyQBhHF zaB!TQoV2vGfPjFis;V_LHEL>VTwGjvd3jJ!P+?(V`Tu36szXy%A>HFy!pBaEjyP{} zEjKw9932Z~b^k+7sv##;S!m-UUBsi~=r zjg9(3+zbE!00Cl4M??UK1szBL000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2h;%^ z6fYa$g3luW00$OHL_t(|+U=W*cG^Y|hG_;Qv_c>dAOVKfBr=Yiq>kgXj#JklY-7L} zC(y)AdcUOY`@cYUB?OXLR^WuwQ)|a!I9#-rWnj8{Nhe^X>z6Y;mC03zYfggGqF)hj$;S z`hJW9wN{|at*NHivF?7!+cYUa3ErWLVq8cP?>%w?D|rDyC?Uzjdym{u>fV_dMo}*j z?>&klP`i&Ou{AfJ2KJJr+W?gmLVzmiETCFm`fa<}Y7_50a)Ii3)b#t^-UadAqve1) zIF3<(njUm26$gR%08rCNC`tk(;)6g-Y>?b!QY1@By!nBufKk__4PbZazWET#=(>jASfWnEdx|Cud0y5 z84^SgAumGa22iD1wF)Ji1Kj`vY6fihOP&p#^K*<40Sbe3-m&3i3e*U?WBBgP+wORb zfx5&Xy}jP5*75#_XEdNx$BU%oIZ8?Z!4H(?ctlE`qogE|0zg$AZ;+DbC@CHE zC;|mDiE8a6=1Lxpnt}tTIeNj}mMD2R6)Btz)e#}?7A$!<*kv5=sv|Sp%@0(^@ir-W zj*@CY%desO*WK?iR^u*=-eKQ+KZ4%!K;b@b_t2sMB?f>}K@9?h0zhe?-2lo609A!* zG=VzUd@;RTpB_?xLI8*aZZ)7p0Fh*4Ay5W@LE=pX$_@b4fzAz}`rRLVKwZOY7_9U;q`RE_zebXyd+Q`j&}Yw z>0RE$3nJ%$4#|&7kEgEmHH9MYMcLpwR*@ zfJz%gf`Uv-dKRcaRSX(X0_2m_v4MVog_~nP_ln+w`?p^y$5C46N_qR-X0DW9yzSF~ z8un*EH6Fo%6^pF^R7Ox!tXSkEO<|qXhF&etkDpelKxH*5P)J4+CE#LG6ljAu@18$W zjS5tyN(CxSA3G;e(J07@930y^oal0EyAc9ZHkXrf0ie>8RVEUp#kq0cwK(<_XDNyW z)LE-@!UF15?|Lx*`taHZ)Nj9=^WQ0F0woGqOfi5$5>`_TpbQ2gfT&QQjSYnxGt~6^W{qtt><`5_=0F_c{ zuqyP~51gkdpADPPNQ43?f1rh}qb8XpFQ>`O zlDAPUeJoHpB*_$@GNM4!IVh{qlCC)G9LoYFrd5GHHVszId3ye{VGLH{wm_wX)JFmp zIzyeEb=u65_v-p06sTtN@MU8aQBKtoK2aXLHs?jTp;IS-G<|Z(QmYkdizqsW^gTd1 zq8vSah+6W>6&g@UkvjXyh9jb(!uPyR83Kyh2kFNz{~%KV3(>-&i(zEY!j(%iUlT`tIy`!Mc^)1dVrFFS z{_Nu7kE00202MObuGZ)S9NVRB^vSXLlbWpZSuRRjpsom(@dadVzFI9?`n0GjS%) z#F;n~XW~qpi8FB~&cvBG6KCT56&!l{?;AkzD>!cBCZ368m!qi@NQHC>M=}dC(Bm(O z4cdG4<%0zFY#1F6uUBxqY0zIlx_G3)di=fxNGl3}$9%vHJgUxcz%RxH9H!BHDZazw zy~ef^vSSabU$BnxK9<(3g;NoC3FXUc(n;DfTAx zIAE<}%CI0N5;KkEbr7R2xukNS1O_A=zCafYqaiq3fOX;HLu4FNrBRiHz+@M!oY9Aw z1rfBEjmNL>_DVzYyVhuD7{?K3IJj$84tcwZ);lMC&jPp5bi4)6lfyKskiiK6Q2w+1o^#L#+?RdW{IG%18Y*H8_x2;VO

    |kqM ztK^%zI3*X?T#GUf;fOBL#MtR^;0#B0g%0tj=?&7D>Ml+hUvw}iIGS-B*9vvO6H%pI z3YfslB?G@4`q<&c^(M6I{$n^h*tprCQJfIzrp-H$;zUNi=s+nc>9&+eQ(Jw^iyy=} zemx{oOQTgmyJ^dG6ugiXc|%!$i{UHOH`^3*C^B8Z!5f@C77aLx;~E?)wut*}Z-!ne zn!2c&j&0^@_nW-*fU*fw{Me4-P!k4_W-5Kkck*b}c%N>BIr`|lJhrA z#7*8&RT5rCaRLEU+c)g@bjcBU@9pkxvi%}1x8l&wRh_zEkaBFR0<=}_H@>+R?dE#h zbL61l1~Pha-RbD;WTy7T+A_soY!^Hq}ovzdBo6{%))=t}!zw)ycWHEJAV*0}P<~|{l>h($07*qoM6N<$g6eyV AdH?_b literal 0 HcmV?d00001 diff --git a/cs/3rd party/libogg/doc/white-ogg.png b/cs/3rd party/libogg/doc/white-ogg.png new file mode 100644 index 0000000000000000000000000000000000000000..2694296b2c1abd924f5c1f8a60d26e0d9771afce GIT binary patch literal 2652 zcmV-i3ZwOjP)mF z)d@*$(wH(+Ya5$R)5&PY)M=YIgTYDaWVAKGpa~?gCKmiE)6oS)MLt$!1>C*b3*GG9 zU6&8Pwm)7td%3&F?z$xX;WLbL?z!(h=ixoidC&VEk$Jsd{Qn{9yCx7AcWH%!yR<^V zU0R{wF0D`yCapoY&}%kDmWmj%Fb z_SyuwGQ7dVUqliQE@}OJzwrK&FZ7j%pbcMJl zZOt~;&P`Q&4!qG;Sr*2~;V&Y9LAT()Oy^DYJxBh^@dAJ!to+UOQ+u-3?FxBlZ&)Z@ zUKAG_OFswxxl8ia<8pkp<=G9zkC;!^g*SdU-YU#Z2axli0)XwNy7th~PY-+`*?I$2 z**5@S zL&^NwH;Z+O_~N2Gdg~w4V{%th&<9|yd1tCVmQ^?58yBR$4zsr{s6|R zkG9G(vSH%uce#SkU_(fn#Y@2PLT;)Wz~U@j&Vvean6=Z*f+xodM5xuw_q$vG<~%f= zB^{BZ)z6)0?N@gk+uP9H&}Lhlr8|4cNu3nW2zJLvXWs?(IOn11KizgH__;!$)pW)z zeiZ8rz~U?&HFS!2n{$XfL{KLst=#-c@DqhbtMT*!2?NFnK(clg;N^IMcBncji7|Wj z^{t_%sUgs+*!Begid7nw{8Vp$VOC0Ao0XPwo@y9~qvM%Dos=~5M=t~~snBRq8U5ZX zOW3yJ9q!yzHOC7ZO6C`4r6jB3?2ZwwMyXNBd54>Qn5>F>=DBccjmh(^Ub89j^d9!e zJKQ$s5UmsdQ`Z&t%Ba7eyoj+4xan_4!mBbSiCZn6vnO0%Njf=RFm+wAIfvLuOs*o* zWI&cvRr%a!9WJog0o11_*QX}~(5U1jAaVHaceyxTptv6qOhQY%e8f+}jH*I)QWANq z^S-=@&ekxNHL#vr5pV8yRdmrvx zeRJGr7M#eqJkgjr!tCh5*j27ox0&~Li@3_Qsyb^wO_Q0eKYY%o8=G^8Xz3L3?=L;V z{6xk8IPIVmWnWL(|1e^JWPa^>29Q{T>8i*79)ZKb2b+m)Z~%hqZ6G%9)Dth_HD zJTBoxkh%~6P#wLWnXR|3n`r8BwD#@YO^tul?H+UsDKVn8OGk&d>(%(flJ9@FV9P{9 zw_AH8Jr%-ENl%OC>?E{$&89WazeF|Nw%=~rwQGmJ^=Ikb94}CA4xm0gdED~(K{D(5 zSgCtnxc=-UvmX7HGKy`eDp;ig-u<90bCPo!Q3W2gE&WRtdfzvtX3&&3(kF zL{_@|(qlD-IBg_^HWpv9}pyd+YKV3xWDDQB;b*u4~4jPsGCt|UWxvJ!N2FD9g zav1GMxDY}@RYf;(TP*&|LEgI z=jN{*ojB>=mK#?{ymZGb#?a*fB%#(*1DSM&OqssJ+tqIEiH?m0usr55_9|+WX&_D| z$1~Edo}oiVa%P*lu4Fg&7Fg^B7W?KSS~{0ftlvvk#g)0U#g<=QKMufp-Oh$(({Gx& z**Bd9&!_mJT9kj}rH`MoWR$tHsYazthP|f*@Sv%exY8>vmtYui*&QPsFZioo97vhi zixYi|n<>+aAEVY=*ZD$@#mDKz&TN*j6BsjAXpH4s0AL(`fUTfJ^^#C77FJ_gQ>ILx zDbw$o`H|RWEQ1(hrsWbgUf7s+^$f|JI;pG>XUW8XmHdRc1`XBtQ8ues_3hRk@uL{? z5_4L!+Wh;Y-c6|#KmXxtW0~cezn^kb)lV4pl1nzpBPGxrFFZYMBL#6E#(r(Fu5SaG z*XwQZoZW2wb&Q!?VqH^K7mKv39^-!}`hcaTU+|X)AHr=CEsMfA~ra&m*gO#}183 zPI}isF1hC*Xf;ZbRI8c)a8bYR@-_ivevcrJ%Hc)c+CkCSkpw-OZ z$=?%93Tc#2H5hq^TfBnQ7WZ(xuwvcsr;ZaQx;tfmB_KHp>83RQ=bOT~JdOY@0E2Gf z=*iFTX+FsQCye8Tq(@hUcXJ#uT8v!P8>IlW8l~aMUrn`>82$&(<|p^hRJc+A0000< KMNUMnLSTYTEjs%E literal 0 HcmV?d00001 diff --git a/cs/3rd party/libogg/doc/white-xifish.png b/cs/3rd party/libogg/doc/white-xifish.png new file mode 100644 index 0000000000000000000000000000000000000000..ab25cc8f94358cddab1990722c655c92ecfbd930 GIT binary patch literal 965 zcmV;$13LVPP)E#n{#gze7qGDeOKzJ3 zad48c$9|9$Gfs2(`2_>~`F^5o1hB33_VrEvuf){gLYiD}aU(u%G^n`7i<6dbi<)A- zWKUK%|NsAe>EeF?00202MObuGZ)S9NVRB^vSXLlbWpZcX@O}K zhV4d{x&N!&q@0z`Xdd+k_>$zyp}_as2B{l;^DfdiRr4OwH%*mdAVn~eU?4>Za?U`C zh{!1eDPls-7)TK_a>780SdeE1QbbcZ=S~?oCx#IX02t+-88{?@u;qcF>xjDEXz#raXf{s=23F!`nyv@vI<#I)7n=yoAP%g|4(TO{J4aP@oe?C+ z7ZyL6k{T&x#uX7CSfHfRHOA|Uzj&*C5o0U4I&)$zEJ!m9iZj5m7vjQ+cFq}+#t#ACNKY5;C!SMY9y!o)Dp@yC z!A#Gd#$Oq(ghS~~{^0#__L-4&hv=N*aM)BVUbN1|2p z2>rB^=?tNtH$Oci^xOGDj|lyKiqR3FSI$b>BlOydOdCS4p8K>Q^!nSy+&lEnJB;*b zf=Iq8@eZMP-^VCLeE$ba2HedGZ1vgz000McNliru&;}3&AQoh9`SAb%02XvbSad^g nZEa<4bO23ZWMv?CX>@2HM@dakeq|k%00000NkvXXu0mjf0&k%@ literal 0 HcmV?d00001 diff --git a/cs/3rd party/libogg/include/Makefile.am b/cs/3rd party/libogg/include/Makefile.am new file mode 100644 index 000000000..0084e4d82 --- /dev/null +++ b/cs/3rd party/libogg/include/Makefile.am @@ -0,0 +1,3 @@ +## Process this file with automake to produce Makefile.in + +SUBDIRS = ogg diff --git a/cs/3rd party/libogg/include/ogg/Makefile.am b/cs/3rd party/libogg/include/ogg/Makefile.am new file mode 100644 index 000000000..142699d35 --- /dev/null +++ b/cs/3rd party/libogg/include/ogg/Makefile.am @@ -0,0 +1,6 @@ +## Process this file with automake to produce Makefile.in + +oggincludedir = $(includedir)/ogg + +ogginclude_HEADERS = ogg.h os_types.h +nodist_ogginclude_HEADERS = config_types.h diff --git a/cs/3rd party/libogg/include/ogg/config_types.h.in b/cs/3rd party/libogg/include/ogg/config_types.h.in new file mode 100644 index 000000000..750e29ddc --- /dev/null +++ b/cs/3rd party/libogg/include/ogg/config_types.h.in @@ -0,0 +1,25 @@ +#ifndef __CONFIG_TYPES_H__ +#define __CONFIG_TYPES_H__ + +/* these are filled in by configure */ +#define INCLUDE_INTTYPES_H @INCLUDE_INTTYPES_H@ +#define INCLUDE_STDINT_H @INCLUDE_STDINT_H@ +#define INCLUDE_SYS_TYPES_H @INCLUDE_SYS_TYPES_H@ + +#if INCLUDE_INTTYPES_H +# include +#endif +#if INCLUDE_STDINT_H +# include +#endif +#if INCLUDE_SYS_TYPES_H +# include +#endif + +typedef @SIZE16@ ogg_int16_t; +typedef @USIZE16@ ogg_uint16_t; +typedef @SIZE32@ ogg_int32_t; +typedef @USIZE32@ ogg_uint32_t; +typedef @SIZE64@ ogg_int64_t; + +#endif diff --git a/cs/3rd party/libogg/include/ogg/ogg.h b/cs/3rd party/libogg/include/ogg/ogg.h new file mode 100644 index 000000000..7609fc24d --- /dev/null +++ b/cs/3rd party/libogg/include/ogg/ogg.h @@ -0,0 +1,210 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE 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 SOURCE CODE IS (C) COPYRIGHT 1994-2007 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: toplevel libogg include + last mod: $Id$ + + ********************************************************************/ +#ifndef _OGG_H +#define _OGG_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +typedef struct { + void *iov_base; + size_t iov_len; +} ogg_iovec_t; + +typedef struct { + long endbyte; + int endbit; + + unsigned char *buffer; + unsigned char *ptr; + long storage; +} oggpack_buffer; + +/* ogg_page is used to encapsulate the data in one Ogg bitstream page *****/ + +typedef struct { + unsigned char *header; + long header_len; + unsigned char *body; + long body_len; +} ogg_page; + +/* ogg_stream_state contains the current encode/decode state of a logical + Ogg bitstream **********************************************************/ + +typedef struct { + unsigned char *body_data; /* bytes from packet bodies */ + long body_storage; /* storage elements allocated */ + long body_fill; /* elements stored; fill mark */ + long body_returned; /* elements of fill returned */ + + + int *lacing_vals; /* The values that will go to the segment table */ + ogg_int64_t *granule_vals; /* granulepos values for headers. Not compact + this way, but it is simple coupled to the + lacing fifo */ + long lacing_storage; + long lacing_fill; + long lacing_packet; + long lacing_returned; + + unsigned char header[282]; /* working space for header encode */ + int header_fill; + + int e_o_s; /* set when we have buffered the last packet in the + logical bitstream */ + int b_o_s; /* set after we've written the initial page + of a logical bitstream */ + long serialno; + long pageno; + ogg_int64_t packetno; /* sequence number for decode; the framing + knows where there's a hole in the data, + but we need coupling so that the codec + (which is in a separate abstraction + layer) also knows about the gap */ + ogg_int64_t granulepos; + +} ogg_stream_state; + +/* ogg_packet is used to encapsulate the data and metadata belonging + to a single raw Ogg/Vorbis packet *************************************/ + +typedef struct { + unsigned char *packet; + long bytes; + long b_o_s; + long e_o_s; + + ogg_int64_t granulepos; + + ogg_int64_t packetno; /* sequence number for decode; the framing + knows where there's a hole in the data, + but we need coupling so that the codec + (which is in a separate abstraction + layer) also knows about the gap */ +} ogg_packet; + +typedef struct { + unsigned char *data; + int storage; + int fill; + int returned; + + int unsynced; + int headerbytes; + int bodybytes; +} ogg_sync_state; + +/* Ogg BITSTREAM PRIMITIVES: bitstream ************************/ + +extern void oggpack_writeinit(oggpack_buffer *b); +extern int oggpack_writecheck(oggpack_buffer *b); +extern void oggpack_writetrunc(oggpack_buffer *b,long bits); +extern void oggpack_writealign(oggpack_buffer *b); +extern void oggpack_writecopy(oggpack_buffer *b,void *source,long bits); +extern void oggpack_reset(oggpack_buffer *b); +extern void oggpack_writeclear(oggpack_buffer *b); +extern void oggpack_readinit(oggpack_buffer *b,unsigned char *buf,int bytes); +extern void oggpack_write(oggpack_buffer *b,unsigned long value,int bits); +extern long oggpack_look(oggpack_buffer *b,int bits); +extern long oggpack_look1(oggpack_buffer *b); +extern void oggpack_adv(oggpack_buffer *b,int bits); +extern void oggpack_adv1(oggpack_buffer *b); +extern long oggpack_read(oggpack_buffer *b,int bits); +extern long oggpack_read1(oggpack_buffer *b); +extern long oggpack_bytes(oggpack_buffer *b); +extern long oggpack_bits(oggpack_buffer *b); +extern unsigned char *oggpack_get_buffer(oggpack_buffer *b); + +extern void oggpackB_writeinit(oggpack_buffer *b); +extern int oggpackB_writecheck(oggpack_buffer *b); +extern void oggpackB_writetrunc(oggpack_buffer *b,long bits); +extern void oggpackB_writealign(oggpack_buffer *b); +extern void oggpackB_writecopy(oggpack_buffer *b,void *source,long bits); +extern void oggpackB_reset(oggpack_buffer *b); +extern void oggpackB_writeclear(oggpack_buffer *b); +extern void oggpackB_readinit(oggpack_buffer *b,unsigned char *buf,int bytes); +extern void oggpackB_write(oggpack_buffer *b,unsigned long value,int bits); +extern long oggpackB_look(oggpack_buffer *b,int bits); +extern long oggpackB_look1(oggpack_buffer *b); +extern void oggpackB_adv(oggpack_buffer *b,int bits); +extern void oggpackB_adv1(oggpack_buffer *b); +extern long oggpackB_read(oggpack_buffer *b,int bits); +extern long oggpackB_read1(oggpack_buffer *b); +extern long oggpackB_bytes(oggpack_buffer *b); +extern long oggpackB_bits(oggpack_buffer *b); +extern unsigned char *oggpackB_get_buffer(oggpack_buffer *b); + +/* Ogg BITSTREAM PRIMITIVES: encoding **************************/ + +extern int ogg_stream_packetin(ogg_stream_state *os, ogg_packet *op); +extern int ogg_stream_iovecin(ogg_stream_state *os, ogg_iovec_t *iov, + int count, long e_o_s, ogg_int64_t granulepos); +extern int ogg_stream_pageout(ogg_stream_state *os, ogg_page *og); +extern int ogg_stream_pageout_fill(ogg_stream_state *os, ogg_page *og, int nfill); +extern int ogg_stream_flush(ogg_stream_state *os, ogg_page *og); +extern int ogg_stream_flush_fill(ogg_stream_state *os, ogg_page *og, int nfill); + +/* Ogg BITSTREAM PRIMITIVES: decoding **************************/ + +extern int ogg_sync_init(ogg_sync_state *oy); +extern int ogg_sync_clear(ogg_sync_state *oy); +extern int ogg_sync_reset(ogg_sync_state *oy); +extern int ogg_sync_destroy(ogg_sync_state *oy); +extern int ogg_sync_check(ogg_sync_state *oy); + +extern char *ogg_sync_buffer(ogg_sync_state *oy, long size); +extern int ogg_sync_wrote(ogg_sync_state *oy, long bytes); +extern long ogg_sync_pageseek(ogg_sync_state *oy,ogg_page *og); +extern int ogg_sync_pageout(ogg_sync_state *oy, ogg_page *og); +extern int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og); +extern int ogg_stream_packetout(ogg_stream_state *os,ogg_packet *op); +extern int ogg_stream_packetpeek(ogg_stream_state *os,ogg_packet *op); + +/* Ogg BITSTREAM PRIMITIVES: general ***************************/ + +extern int ogg_stream_init(ogg_stream_state *os,int serialno); +extern int ogg_stream_clear(ogg_stream_state *os); +extern int ogg_stream_reset(ogg_stream_state *os); +extern int ogg_stream_reset_serialno(ogg_stream_state *os,int serialno); +extern int ogg_stream_destroy(ogg_stream_state *os); +extern int ogg_stream_check(ogg_stream_state *os); +extern int ogg_stream_eos(ogg_stream_state *os); + +extern void ogg_page_checksum_set(ogg_page *og); + +extern int ogg_page_version(const ogg_page *og); +extern int ogg_page_continued(const ogg_page *og); +extern int ogg_page_bos(const ogg_page *og); +extern int ogg_page_eos(const ogg_page *og); +extern ogg_int64_t ogg_page_granulepos(const ogg_page *og); +extern int ogg_page_serialno(const ogg_page *og); +extern long ogg_page_pageno(const ogg_page *og); +extern int ogg_page_packets(const ogg_page *og); + +extern void ogg_packet_clear(ogg_packet *op); + + +#ifdef __cplusplus +} +#endif + +#endif /* _OGG_H */ diff --git a/cs/3rd party/libogg/include/ogg/os_types.h b/cs/3rd party/libogg/include/ogg/os_types.h new file mode 100644 index 000000000..b8f56308b --- /dev/null +++ b/cs/3rd party/libogg/include/ogg/os_types.h @@ -0,0 +1,148 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE 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 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. + last mod: $Id$ + + ********************************************************************/ +#ifndef _OS_TYPES_H +#define _OS_TYPES_H + +/* make it easy on the folks that want to compile the libs with a + different malloc than stdlib */ +#define _ogg_malloc malloc +#define _ogg_calloc calloc +#define _ogg_realloc realloc +#define _ogg_free free + +#if defined(_WIN32) + +# if defined(__CYGWIN__) +# include + typedef int16_t ogg_int16_t; + typedef uint16_t ogg_uint16_t; + typedef int32_t ogg_int32_t; + typedef uint32_t ogg_uint32_t; + typedef int64_t ogg_int64_t; + typedef uint64_t ogg_uint64_t; +# elif defined(__MINGW32__) +# include + typedef short ogg_int16_t; + typedef unsigned short ogg_uint16_t; + typedef int ogg_int32_t; + typedef unsigned int ogg_uint32_t; + typedef long long ogg_int64_t; + typedef unsigned long long ogg_uint64_t; +# elif defined(__MWERKS__) + typedef long long ogg_int64_t; + typedef int ogg_int32_t; + typedef unsigned int ogg_uint32_t; + typedef short ogg_int16_t; + typedef unsigned short ogg_uint16_t; +# else +# if defined(_MSC_VER) && (_MSC_VER >= 1800) /* MSVC 2013 and newer */ +# include + typedef int16_t ogg_int16_t; + typedef uint16_t ogg_uint16_t; + typedef int32_t ogg_int32_t; + typedef uint32_t ogg_uint32_t; + typedef int64_t ogg_int64_t; + typedef uint64_t ogg_uint64_t; +# else + /* MSVC/Borland */ + typedef __int64 ogg_int64_t; + typedef __int32 ogg_int32_t; + typedef unsigned __int32 ogg_uint32_t; + typedef __int16 ogg_int16_t; + typedef unsigned __int16 ogg_uint16_t; +# endif +# endif + +#elif (defined(__APPLE__) && defined(__MACH__)) /* MacOS X Framework build */ + +# include + typedef int16_t ogg_int16_t; + typedef uint16_t ogg_uint16_t; + typedef int32_t ogg_int32_t; + typedef uint32_t ogg_uint32_t; + typedef int64_t ogg_int64_t; + +#elif defined(__HAIKU__) + + /* Haiku */ +# include + typedef short ogg_int16_t; + typedef unsigned short ogg_uint16_t; + typedef int ogg_int32_t; + typedef unsigned int ogg_uint32_t; + typedef long long ogg_int64_t; + +#elif defined(__BEOS__) + + /* Be */ +# include + typedef int16_t ogg_int16_t; + typedef uint16_t ogg_uint16_t; + typedef int32_t ogg_int32_t; + typedef uint32_t ogg_uint32_t; + typedef int64_t ogg_int64_t; + +#elif defined (__EMX__) + + /* OS/2 GCC */ + typedef short ogg_int16_t; + typedef unsigned short ogg_uint16_t; + typedef int ogg_int32_t; + typedef unsigned int ogg_uint32_t; + typedef long long ogg_int64_t; + +#elif defined (DJGPP) + + /* DJGPP */ + typedef short ogg_int16_t; + typedef int ogg_int32_t; + typedef unsigned int ogg_uint32_t; + typedef long long ogg_int64_t; + +#elif defined(R5900) + + /* PS2 EE */ + typedef long ogg_int64_t; + typedef int ogg_int32_t; + typedef unsigned ogg_uint32_t; + typedef short ogg_int16_t; + +#elif defined(__SYMBIAN32__) + + /* Symbian GCC */ + typedef signed short ogg_int16_t; + typedef unsigned short ogg_uint16_t; + typedef signed int ogg_int32_t; + typedef unsigned int ogg_uint32_t; + typedef long long int ogg_int64_t; + +#elif defined(__TMS320C6X__) + + /* TI C64x compiler */ + typedef signed short ogg_int16_t; + typedef unsigned short ogg_uint16_t; + typedef signed int ogg_int32_t; + typedef unsigned int ogg_uint32_t; + typedef long long int ogg_int64_t; + +#else + +# include + +#endif + +#endif /* _OS_TYPES_H */ diff --git a/cs/3rd party/libogg/libogg.spec.in b/cs/3rd party/libogg/libogg.spec.in new file mode 100644 index 000000000..41e930731 --- /dev/null +++ b/cs/3rd party/libogg/libogg.spec.in @@ -0,0 +1,109 @@ +Name: libogg +Version: @VERSION@ +Release: 0.xiph.1 +Summary: Ogg Bitstream Library. + +Group: System Environment/Libraries +License: BSD +URL: http://www.xiph.org/ +Vendor: Xiph.org Foundation +Source: http://www.vorbis.com/files/1.0.1/unix/%{name}-%{version}.tar.gz +BuildRoot: %{_tmppath}/%{name}-%{version}-root + +# We're forced to use an epoch since both Red Hat and Ximian use it in their +# rc packages +Epoch: 2 +# Dirty trick to tell rpm that this package actually provides what the +# last rc and beta was offering +Provides: %{name} = %{epoch}:1.0rc3-%{release} +Provides: %{name} = %{epoch}:1.0beta4-%{release} + +%description +Libogg is a library for manipulating ogg bitstreams. It handles +both making ogg bitstreams and getting packets from ogg bitstreams. + +%package devel +Summary: Ogg Bitstream Library Development +Group: Development/Libraries +Requires: libogg = %{version} +# Dirty trick to tell rpm that this package actually provides what the +# last rc and beta was offering +Provides: %{name}-devel = %{epoch}:1.0rc3-%{release} +Provides: %{name}-devel = %{epoch}:1.0beta4-%{release} + +%description devel +The libogg-devel package contains the header files, static libraries +and documentation needed to develop applications with libogg. + +%prep +%setup -q -n %{name}-%{version} + +%build +CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{_prefix} --enable-static +make + +%install +rm -rf $RPM_BUILD_ROOT + +make DESTDIR=$RPM_BUILD_ROOT install + +%clean +rm -rf $RPM_BUILD_ROOT + +%post -p /sbin/ldconfig + +%postun -p /sbin/ldconfig + +%files +%defattr(-,root,root) +%doc AUTHORS CHANGES COPYING README +%{_libdir}/libogg.so.* + +%files devel +%defattr(-,root,root) +%doc doc/index.html +%doc doc/framing.html +%doc doc/oggstream.html +%doc doc/white-ogg.png +%doc doc/white-xifish.png +%doc doc/stream.png +%doc doc/libogg/*.html +%doc doc/libogg/style.css +%dir %{_includedir}/ogg +%{_includedir}/ogg/ogg.h +%{_includedir}/ogg/os_types.h +%{_includedir}/ogg/config_types.h +%{_libdir}/libogg.a +%{_libdir}/libogg.la +%{_libdir}/libogg.so +%{_libdir}/pkgconfig/ogg.pc +%{_datadir}/aclocal/ogg.m4 + +%changelog +* Thu Nov 08 2007 Conrad Parker +- update doc dir (reported by thosmos on #vorbis) + +* Thu Jun 10 2004 Thomas Vander Stichele +- autogenerate from configure +- fix download location +- remove Prefix +- own include dir +- move ldconfig runs to -p scripts +- change Release tag to include xiph + +* Tue Oct 07 2003 Warren Dukes +- update for 1.1 release + +* Sun Jul 14 2002 Thomas Vander Stichele +- update for 1.0 release +- conform Group to Red Hat's idea of it +- take out case where configure doesn't exist; a tarball should have it + +* Tue Dec 18 2001 Jack Moffitt +- Update for RC3 release + +* Sun Oct 07 2001 Jack Moffitt +- add support for configurable prefixes + +* Sat Sep 02 2000 Jack Moffitt +- initial spec file created diff --git a/cs/3rd party/libogg/macosx/English.lproj/InfoPlist.strings b/cs/3rd party/libogg/macosx/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..b230fea4930f0172f7afde95bd251c7efb4da1ba GIT binary patch literal 136 zcmW-Z-3o$W5Jb + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + Ogg + CFBundleGetInfoString + Ogg framework 1.1.4, Copyright © 1994-2009 Xiph.Org Foundation + CFBundleIconFile + + CFBundleIdentifier + org.xiph.ogg + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.1.4 + CFBundleSignature + ???? + CFBundleVersion + 1.1.4 + NSHumanReadableCopyright + Ogg framework 1.1.4, Copyright © 1994-2009 Xiph.Org Foundation + CSResourcesFileMapped + + + diff --git a/cs/3rd party/libogg/macosx/Ogg.xcodeproj/project.pbxproj b/cs/3rd party/libogg/macosx/Ogg.xcodeproj/project.pbxproj new file mode 100644 index 000000000..596ccda37 --- /dev/null +++ b/cs/3rd party/libogg/macosx/Ogg.xcodeproj/project.pbxproj @@ -0,0 +1,363 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 42; + objects = { + +/* Begin PBXBuildFile section */ + 730F236309181A8D00AB638C /* bitwise.c in Sources */ = {isa = PBXBuildFile; fileRef = 730F236109181A8D00AB638C /* bitwise.c */; }; + 730F236409181A8D00AB638C /* framing.c in Sources */ = {isa = PBXBuildFile; fileRef = 730F236209181A8D00AB638C /* framing.c */; }; + 730F236709181ABE00AB638C /* ogg.h in Headers */ = {isa = PBXBuildFile; fileRef = 730F236509181ABE00AB638C /* ogg.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 730F236809181ABE00AB638C /* os_types.h in Headers */ = {isa = PBXBuildFile; fileRef = 730F236609181ABE00AB638C /* os_types.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 734FB2E70B18B36F00D561D7 /* bitwise.c in Sources */ = {isa = PBXBuildFile; fileRef = 730F236109181A8D00AB638C /* bitwise.c */; }; + 734FB2E80B18B36F00D561D7 /* framing.c in Sources */ = {isa = PBXBuildFile; fileRef = 730F236209181A8D00AB638C /* framing.c */; }; + 8D07F2BE0486CC7A007CD1D0 /* Ogg_Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = 32BAE0B70371A74B00C91783 /* Ogg_Prefix.pch */; }; + 8D07F2C00486CC7A007CD1D0 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C1666FE841158C02AAC07 /* InfoPlist.strings */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 089C1667FE841158C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; + 32BAE0B70371A74B00C91783 /* Ogg_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Ogg_Prefix.pch; sourceTree = ""; }; + 730F236109181A8D00AB638C /* bitwise.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = bitwise.c; path = ../src/bitwise.c; sourceTree = SOURCE_ROOT; }; + 730F236209181A8D00AB638C /* framing.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = framing.c; path = ../src/framing.c; sourceTree = SOURCE_ROOT; }; + 730F236509181ABE00AB638C /* ogg.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = ogg.h; path = ../include/ogg/ogg.h; sourceTree = SOURCE_ROOT; }; + 730F236609181ABE00AB638C /* os_types.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = os_types.h; path = ../include/ogg/os_types.h; sourceTree = SOURCE_ROOT; }; + 734FB2E50B18B33E00D561D7 /* libogg.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libogg.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 8D07F2C70486CC7A007CD1D0 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; + 8D07F2C80486CC7A007CD1D0 /* Ogg.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Ogg.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 734FB2E30B18B33E00D561D7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8D07F2C30486CC7A007CD1D0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 034768DDFF38A45A11DB9C8B /* Products */ = { + isa = PBXGroup; + children = ( + 8D07F2C80486CC7A007CD1D0 /* Ogg.framework */, + 734FB2E50B18B33E00D561D7 /* libogg.a */, + ); + name = Products; + sourceTree = ""; + }; + 0867D691FE84028FC02AAC07 /* Ogg */ = { + isa = PBXGroup; + children = ( + 730F235F09181A3E00AB638C /* Headers */, + 08FB77ACFE841707C02AAC07 /* Source */, + 089C1665FE841158C02AAC07 /* Resources */, + 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */, + 034768DDFF38A45A11DB9C8B /* Products */, + ); + name = Ogg; + sourceTree = ""; + }; + 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = { + isa = PBXGroup; + children = ( + ); + name = "External Frameworks and Libraries"; + sourceTree = ""; + }; + 089C1665FE841158C02AAC07 /* Resources */ = { + isa = PBXGroup; + children = ( + 8D07F2C70486CC7A007CD1D0 /* Info.plist */, + 089C1666FE841158C02AAC07 /* InfoPlist.strings */, + ); + name = Resources; + sourceTree = ""; + }; + 08FB77ACFE841707C02AAC07 /* Source */ = { + isa = PBXGroup; + children = ( + 730F236109181A8D00AB638C /* bitwise.c */, + 730F236209181A8D00AB638C /* framing.c */, + 32BAE0B70371A74B00C91783 /* Ogg_Prefix.pch */, + ); + name = Source; + sourceTree = ""; + }; + 730F235F09181A3E00AB638C /* Headers */ = { + isa = PBXGroup; + children = ( + 730F236509181ABE00AB638C /* ogg.h */, + 730F236609181ABE00AB638C /* os_types.h */, + ); + name = Headers; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 734FB2E10B18B33E00D561D7 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8D07F2BD0486CC7A007CD1D0 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 8D07F2BE0486CC7A007CD1D0 /* Ogg_Prefix.pch in Headers */, + 730F236709181ABE00AB638C /* ogg.h in Headers */, + 730F236809181ABE00AB638C /* os_types.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 734FB2E40B18B33E00D561D7 /* libogg (static) */ = { + isa = PBXNativeTarget; + buildConfigurationList = 734FB2ED0B18B3B900D561D7 /* Build configuration list for PBXNativeTarget "libogg (static)" */; + buildPhases = ( + 734FB2E10B18B33E00D561D7 /* Headers */, + 734FB2E20B18B33E00D561D7 /* Sources */, + 734FB2E30B18B33E00D561D7 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "libogg (static)"; + productName = ogg; + productReference = 734FB2E50B18B33E00D561D7 /* libogg.a */; + productType = "com.apple.product-type.library.static"; + }; + 8D07F2BC0486CC7A007CD1D0 /* Ogg */ = { + isa = PBXNativeTarget; + buildConfigurationList = 730F235409181A3A00AB638C /* Build configuration list for PBXNativeTarget "Ogg" */; + buildPhases = ( + 8D07F2BD0486CC7A007CD1D0 /* Headers */, + 8D07F2BF0486CC7A007CD1D0 /* Resources */, + 8D07F2C10486CC7A007CD1D0 /* Sources */, + 8D07F2C30486CC7A007CD1D0 /* Frameworks */, + 8D07F2C50486CC7A007CD1D0 /* Rez */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Ogg; + productInstallPath = "$(HOME)/Library/Frameworks"; + productName = Ogg; + productReference = 8D07F2C80486CC7A007CD1D0 /* Ogg.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 0867D690FE84028FC02AAC07 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 730F235809181A3A00AB638C /* Build configuration list for PBXProject "Ogg" */; + hasScannedForEncodings = 1; + mainGroup = 0867D691FE84028FC02AAC07 /* Ogg */; + productRefGroup = 034768DDFF38A45A11DB9C8B /* Products */; + projectDirPath = ""; + targets = ( + 8D07F2BC0486CC7A007CD1D0 /* Ogg */, + 734FB2E40B18B33E00D561D7 /* libogg (static) */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 8D07F2BF0486CC7A007CD1D0 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8D07F2C00486CC7A007CD1D0 /* InfoPlist.strings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXRezBuildPhase section */ + 8D07F2C50486CC7A007CD1D0 /* Rez */ = { + isa = PBXRezBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXRezBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 734FB2E20B18B33E00D561D7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 734FB2E70B18B36F00D561D7 /* bitwise.c in Sources */, + 734FB2E80B18B36F00D561D7 /* framing.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8D07F2C10486CC7A007CD1D0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 730F236309181A8D00AB638C /* bitwise.c in Sources */, + 730F236409181A8D00AB638C /* framing.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 089C1666FE841158C02AAC07 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 089C1667FE841158C02AAC07 /* English */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 730F235509181A3A00AB638C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = Ogg_Prefix.pch; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = /Library/Frameworks; + PRODUCT_NAME = Ogg; + WRAPPER_EXTENSION = framework; + ZERO_LINK = YES; + }; + name = Debug; + }; + 730F235609181A3A00AB638C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = Ogg_Prefix.pch; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = /Library/Frameworks; + PRODUCT_NAME = Ogg; + WRAPPER_EXTENSION = framework; + ZERO_LINK = NO; + }; + name = Release; + }; + 730F235909181A3A00AB638C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = __MACOSX__; + SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; + }; + name = Debug; + }; + 730F235A09181A3A00AB638C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = ( + ppc, + i386, + ); + GCC_OPTIMIZATION_LEVEL = 3; + GCC_PREPROCESSOR_DEFINITIONS = __MACOSX__; + OTHER_CFLAGS = ( + "$(OTHER_CFLAGS)", + "-ffast-math", + "-falign-loops=16", + ); + SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; + }; + name = Release; + }; + 734FB2EE0B18B3B900D561D7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + INSTALL_PATH = /usr/local/lib; + PREBINDING = NO; + PRODUCT_NAME = ogg; + ZERO_LINK = YES; + }; + name = Debug; + }; + 734FB2EF0B18B3B900D561D7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + INSTALL_PATH = /usr/local/lib; + PREBINDING = NO; + PRODUCT_NAME = ogg; + ZERO_LINK = NO; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 730F235409181A3A00AB638C /* Build configuration list for PBXNativeTarget "Ogg" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 730F235509181A3A00AB638C /* Debug */, + 730F235609181A3A00AB638C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 730F235809181A3A00AB638C /* Build configuration list for PBXProject "Ogg" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 730F235909181A3A00AB638C /* Debug */, + 730F235A09181A3A00AB638C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 734FB2ED0B18B3B900D561D7 /* Build configuration list for PBXNativeTarget "libogg (static)" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 734FB2EE0B18B3B900D561D7 /* Debug */, + 734FB2EF0B18B3B900D561D7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 0867D690FE84028FC02AAC07 /* Project object */; +} diff --git a/cs/3rd party/libogg/macosx/Ogg_Prefix.pch b/cs/3rd party/libogg/macosx/Ogg_Prefix.pch new file mode 100644 index 000000000..05e3af9e9 --- /dev/null +++ b/cs/3rd party/libogg/macosx/Ogg_Prefix.pch @@ -0,0 +1,5 @@ +// +// Prefix header for all source files of the 'Ogg' target in the 'Ogg' project. +// + +#include diff --git a/cs/3rd party/libogg/ogg-uninstalled.pc.in b/cs/3rd party/libogg/ogg-uninstalled.pc.in new file mode 100644 index 000000000..7872cc61b --- /dev/null +++ b/cs/3rd party/libogg/ogg-uninstalled.pc.in @@ -0,0 +1,14 @@ +# ogg uninstalled pkg-config file + +prefix= +exec_prefix= +libdir=${pcfiledir}/src +includedir=${pcfiledir}/include + +Name: ogg +Description: ogg is a library for manipulating ogg bitstreams (not installed) +Version: @VERSION@ +Requires: +Conflicts: +Libs: ${libdir}/.libs/libogg.a +Cflags: -I${includedir} diff --git a/cs/3rd party/libogg/ogg.m4 b/cs/3rd party/libogg/ogg.m4 new file mode 100644 index 000000000..77d663b35 --- /dev/null +++ b/cs/3rd party/libogg/ogg.m4 @@ -0,0 +1,116 @@ +# Configure paths for libogg +# Jack Moffitt 10-21-2000 +# Shamelessly stolen from Owen Taylor and Manish Singh + +dnl XIPH_PATH_OGG([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +dnl Test for libogg, and define OGG_CFLAGS and OGG_LIBS +dnl +AC_DEFUN([XIPH_PATH_OGG], +[dnl +dnl Get the cflags and libraries +dnl +AC_ARG_WITH(ogg,AC_HELP_STRING([--with-ogg=PFX],[Prefix where libogg is installed (optional)]), ogg_prefix="$withval", ogg_prefix="") +AC_ARG_WITH(ogg-libraries,AC_HELP_STRING([--with-ogg-libraries=DIR],[Directory where libogg library is installed (optional)]), ogg_libraries="$withval", ogg_libraries="") +AC_ARG_WITH(ogg-includes,AC_HELP_STRING([--with-ogg-includes=DIR],[Directory where libogg header files are installed (optional)]), ogg_includes="$withval", ogg_includes="") +AC_ARG_ENABLE(oggtest,AC_HELP_STRING([--disable-oggtest],[Do not try to compile and run a test Ogg program]),, enable_oggtest=yes) + + if test "x$ogg_libraries" != "x" ; then + OGG_LIBS="-L$ogg_libraries" + elif test "x$ogg_prefix" = "xno" || test "x$ogg_prefix" = "xyes" ; then + OGG_LIBS="" + elif test "x$ogg_prefix" != "x" ; then + OGG_LIBS="-L$ogg_prefix/lib" + elif test "x$prefix" != "xNONE" ; then + OGG_LIBS="-L$prefix/lib" + fi + + if test "x$ogg_prefix" != "xno" ; then + OGG_LIBS="$OGG_LIBS -logg" + fi + + if test "x$ogg_includes" != "x" ; then + OGG_CFLAGS="-I$ogg_includes" + elif test "x$ogg_prefix" = "xno" || test "x$ogg_prefix" = "xyes" ; then + OGG_CFLAGS="" + elif test "x$ogg_prefix" != "x" ; then + OGG_CFLAGS="-I$ogg_prefix/include" + elif test "x$prefix" != "xNONE"; then + OGG_CFLAGS="-I$prefix/include" + fi + + AC_MSG_CHECKING(for Ogg) + if test "x$ogg_prefix" = "xno" ; then + no_ogg="disabled" + enable_oggtest="no" + else + no_ogg="" + fi + + + if test "x$enable_oggtest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $OGG_CFLAGS" + LIBS="$LIBS $OGG_LIBS" +dnl +dnl Now check if the installed Ogg is sufficiently new. +dnl + rm -f conf.oggtest + AC_TRY_RUN([ +#include +#include +#include +#include + +int main () +{ + system("touch conf.oggtest"); + return 0; +} + +],, no_ogg=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + + if test "x$no_ogg" = "xdisabled" ; then + AC_MSG_RESULT(no) + ifelse([$2], , :, [$2]) + elif test "x$no_ogg" = "x" ; then + AC_MSG_RESULT(yes) + ifelse([$1], , :, [$1]) + else + AC_MSG_RESULT(no) + if test -f conf.oggtest ; then + : + else + echo "*** Could not run Ogg test program, checking why..." + CFLAGS="$CFLAGS $OGG_CFLAGS" + LIBS="$LIBS $OGG_LIBS" + AC_TRY_LINK([ +#include +#include +], [ return 0; ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding Ogg or finding the wrong" + echo "*** version of Ogg. If it is not finding Ogg, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means Ogg was incorrectly installed" + echo "*** or that you have moved Ogg since it was installed." ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + OGG_CFLAGS="" + OGG_LIBS="" + ifelse([$2], , :, [$2]) + fi + AC_SUBST(OGG_CFLAGS) + AC_SUBST(OGG_LIBS) + rm -f conf.oggtest +]) diff --git a/cs/3rd party/libogg/ogg.pc.in b/cs/3rd party/libogg/ogg.pc.in new file mode 100644 index 000000000..9e84375d9 --- /dev/null +++ b/cs/3rd party/libogg/ogg.pc.in @@ -0,0 +1,14 @@ +# ogg pkg-config file + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: ogg +Description: ogg is a library for manipulating ogg bitstreams +Version: @VERSION@ +Requires: +Conflicts: +Libs: -L${libdir} -logg +Cflags: -I${includedir} diff --git a/cs/3rd party/libogg/releases.sha2 b/cs/3rd party/libogg/releases.sha2 new file mode 100644 index 000000000..5cc3aeb7f --- /dev/null +++ b/cs/3rd party/libogg/releases.sha2 @@ -0,0 +1,34 @@ +c8a4157b0194962aa885e2088cf8561c65ce2eee36a77ca6325c6c36c842b2a9 libogg-1.0beta4.tar.gz +37bec40bf26ba6af8e98f2996051079cd2fbc4c401960fadb15c9e75383f3361 libogg-1.0rc1.tar.gz +c5f5924f25402a59a2586c3d037d3e79dae97de30531b8dd8b8b4abc20d5f036 libogg-1.0rc2.tar.gz +e907b7bc56de5a9dd0c5f062c7b0340a6295671cf2c6ad994d5f62919c9e1b0b libogg-1.0rc3.tar.gz +920fa2a0924d66884825d36a2e843de069cfdf1af01945d05da25999bbd6396c libogg-1.0.tar.gz +269f8f6b11b8ac737cbd8ed8cfa244cc51ca42b6da6683336ba1413d2a00ceb3 libogg-1.1.1.tar.gz +b72f4d716d8e1339469a874962aae5f055ba618772f00f43d3c6d0b543cdfadd libogg-1.1.1.zip +7934f3bf689c6ea0870bc73fcf40b00d5050044b03e558819a1ed333dc3cfadf libogg-1.1.2.tar.gz +01e97dd79336db38b31003ff956c7e29ebcfd8ceef8175cf17cf4f339a8c1a54 libogg-1.1.2.zip +bae29e79fbc50bbedf1235852094b71c8c910a1ef0cd42fe4163b7b545630b65 libogg-1.1.3.tar.gz +11c0202bc8f8e6fa361051a7d2dbc7ec95195b126c0407c5fc851d01c2a2ad6b libogg-1.1.3.zip +253d138b8c062db4d8446be1522162940dd89cad35c8332c3127d2e842850f31 libogg-1.1.4rc1.tar.gz +6bb65e5eafc75cc2ef7ccc37aea81749f1e72e503f7614e6748c06f532c42707 libogg-1.1.4rc1.zip +9354c183fd88417c2860778b60b7896c9487d8f6e58b9fec3fdbf971142ce103 libogg-1.1.4.tar.gz +0e9eb2370ba8d28ee6f6ccf27779c154fbfbd9c5e9d3a09e4419a85112a900ce libogg-1.1.4.zip +01453d561255b5fcb361997904752860e4f8c6b9742f290578a44615fcc94356 libogg-1.1.tar.gz +f30d983e238acd94e80ae551327ea2f83cdc330470b4188564bef28fec59eb69 libogg-1.2.0.tar.gz +6bf8650f0f3651fa4714ab9d03a5f781879e697d85d776f4dabc31877f42a0b2 libogg-1.2.0.zip +da222202be8be48149f0a0668f3d2445a166b1f9f40a25e27cd222bfa9c1d4d4 libogg-1.2.1.tar.bz2 +6858848617bca6eab01e7d8526bc0d2a417e95070a255cbf9c881881365e36c0 libogg-1.2.1.tar.gz +21e0a61e15e9dd294587bcd39d81fbe1998b27b1c525e15ecfaba94344f921b4 libogg-1.2.1.tar.xz +2d799a043865edc030ae56186a44624deb6365d59bcd8b3ae96384ccf613189d libogg-1.2.1.zip +ab000574bc26d5f01284f5b0f50e12dc761d035c429f2e9c70cb2a9487d8cfba libogg-1.2.2.tar.gz +559f1ea72a559520298e518865e488eb9a7185c6b9279f70602b01a87f7defed libogg-1.2.2.tar.xz +3f3bec05106d852da5ae3899ac2047dd14e2009bba872524eeade2d0bda42da0 libogg-1.2.2.zip +a8de807631014615549d2356fd36641833b8288221cea214f8a72750efe93780 libogg-1.3.0.tar.gz +231725029c843492914f24e74085e734bca6f1d6446ac72df39b0c3a9d4bc74b libogg-1.3.0.tar.xz +56db84601e7e855d1b9095ccba73d8ef98f063a2384f2239a7042070a3f1cde3 libogg-1.3.0.zip +4e343f07aa5a1de8e0fa1107042d472186b3470d846b20b115b964eba5bae554 libogg-1.3.1.tar.gz +3a5bad78d81afb78908326d11761c0fb1a0662ee7150b6ad587cc586838cdcfa libogg-1.3.1.tar.xz +131ae1f65f65e0ed70db03fbe3a9d9f2e8c24ac43754ae5e055fc55e6f750bc7 libogg-1.3.1.zip +e19ee34711d7af328cb26287f4137e70630e7261b17cbe3cd41011d73a654692 libogg-1.3.2.tar.gz +3f687ccdd5ac8b52d76328fbbfebc70c459a40ea891dbf3dccb74a210826e79b libogg-1.3.2.tar.xz +957b4168a03932e02853db340cfddd0fa89b6ca80073a54f7c827372c3606350 libogg-1.3.2.zip diff --git a/cs/3rd party/libogg/src/Makefile.am b/cs/3rd party/libogg/src/Makefile.am new file mode 100644 index 000000000..9472626c0 --- /dev/null +++ b/cs/3rd party/libogg/src/Makefile.am @@ -0,0 +1,28 @@ +## Process this file with automake to produce Makefile.in + +AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include + +lib_LTLIBRARIES = libogg.la + +libogg_la_SOURCES = framing.c bitwise.c +libogg_la_LDFLAGS = -no-undefined -version-info @LIB_CURRENT@:@LIB_REVISION@:@LIB_AGE@ + +# build and run the self tests on 'make check' + +noinst_PROGRAMS = test_bitwise test_framing + +test_bitwise_SOURCES = bitwise.c +test_bitwise_CFLAGS = -D_V_SELFTEST + +test_framing_SOURCES = framing.c +test_framing_CFLAGS = -D_V_SELFTEST + +check: $(noinst_PROGRAMS) + ./test_bitwise$(EXEEXT) + ./test_framing$(EXEEXT) + +debug: + $(MAKE) all CFLAGS="@DEBUG@" + +profile: + $(MAKE) all CFLAGS="@PROFILE@" diff --git a/cs/3rd party/libogg/src/bitwise.c b/cs/3rd party/libogg/src/bitwise.c new file mode 100644 index 000000000..fa2b57202 --- /dev/null +++ b/cs/3rd party/libogg/src/bitwise.c @@ -0,0 +1,1088 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE Ogg CONTAINER 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 SOURCE CODE IS (C) COPYRIGHT 1994-2014 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: packing variable sized words into an octet stream + last mod: $Id$ + + ********************************************************************/ + +/* We're 'LSb' endian; if we write a word but read individual bits, + then we'll read the lsb first */ + +#include +#include +#include +#include + +#define BUFFER_INCREMENT 256 + +static const unsigned long mask[]= +{0x00000000,0x00000001,0x00000003,0x00000007,0x0000000f, + 0x0000001f,0x0000003f,0x0000007f,0x000000ff,0x000001ff, + 0x000003ff,0x000007ff,0x00000fff,0x00001fff,0x00003fff, + 0x00007fff,0x0000ffff,0x0001ffff,0x0003ffff,0x0007ffff, + 0x000fffff,0x001fffff,0x003fffff,0x007fffff,0x00ffffff, + 0x01ffffff,0x03ffffff,0x07ffffff,0x0fffffff,0x1fffffff, + 0x3fffffff,0x7fffffff,0xffffffff }; + +static const unsigned int mask8B[]= +{0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff}; + +void oggpack_writeinit(oggpack_buffer *b){ + memset(b,0,sizeof(*b)); + b->ptr=b->buffer=_ogg_malloc(BUFFER_INCREMENT); + b->buffer[0]='\0'; + b->storage=BUFFER_INCREMENT; +} + +void oggpackB_writeinit(oggpack_buffer *b){ + oggpack_writeinit(b); +} + +int oggpack_writecheck(oggpack_buffer *b){ + if(!b->ptr || !b->storage)return -1; + return 0; +} + +int oggpackB_writecheck(oggpack_buffer *b){ + return oggpack_writecheck(b); +} + +void oggpack_writetrunc(oggpack_buffer *b,long bits){ + long bytes=bits>>3; + if(b->ptr){ + bits-=bytes*8; + b->ptr=b->buffer+bytes; + b->endbit=bits; + b->endbyte=bytes; + *b->ptr&=mask[bits]; + } +} + +void oggpackB_writetrunc(oggpack_buffer *b,long bits){ + long bytes=bits>>3; + if(b->ptr){ + bits-=bytes*8; + b->ptr=b->buffer+bytes; + b->endbit=bits; + b->endbyte=bytes; + *b->ptr&=mask8B[bits]; + } +} + +/* Takes only up to 32 bits. */ +void oggpack_write(oggpack_buffer *b,unsigned long value,int bits){ + if(bits<0 || bits>32) goto err; + if(b->endbyte>=b->storage-4){ + void *ret; + if(!b->ptr)return; + if(b->storage>LONG_MAX-BUFFER_INCREMENT) goto err; + ret=_ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT); + if(!ret) goto err; + b->buffer=ret; + b->storage+=BUFFER_INCREMENT; + b->ptr=b->buffer+b->endbyte; + } + + value&=mask[bits]; + bits+=b->endbit; + + b->ptr[0]|=value<endbit; + + if(bits>=8){ + b->ptr[1]=(unsigned char)(value>>(8-b->endbit)); + if(bits>=16){ + b->ptr[2]=(unsigned char)(value>>(16-b->endbit)); + if(bits>=24){ + b->ptr[3]=(unsigned char)(value>>(24-b->endbit)); + if(bits>=32){ + if(b->endbit) + b->ptr[4]=(unsigned char)(value>>(32-b->endbit)); + else + b->ptr[4]=0; + } + } + } + } + + b->endbyte+=bits/8; + b->ptr+=bits/8; + b->endbit=bits&7; + return; + err: + oggpack_writeclear(b); +} + +/* Takes only up to 32 bits. */ +void oggpackB_write(oggpack_buffer *b,unsigned long value,int bits){ + if(bits<0 || bits>32) goto err; + if(b->endbyte>=b->storage-4){ + void *ret; + if(!b->ptr)return; + if(b->storage>LONG_MAX-BUFFER_INCREMENT) goto err; + ret=_ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT); + if(!ret) goto err; + b->buffer=ret; + b->storage+=BUFFER_INCREMENT; + b->ptr=b->buffer+b->endbyte; + } + + value=(value&mask[bits])<<(32-bits); + bits+=b->endbit; + + b->ptr[0]|=value>>(24+b->endbit); + + if(bits>=8){ + b->ptr[1]=(unsigned char)(value>>(16+b->endbit)); + if(bits>=16){ + b->ptr[2]=(unsigned char)(value>>(8+b->endbit)); + if(bits>=24){ + b->ptr[3]=(unsigned char)(value>>(b->endbit)); + if(bits>=32){ + if(b->endbit) + b->ptr[4]=(unsigned char)(value<<(8-b->endbit)); + else + b->ptr[4]=0; + } + } + } + } + + b->endbyte+=bits/8; + b->ptr+=bits/8; + b->endbit=bits&7; + return; + err: + oggpack_writeclear(b); +} + +void oggpack_writealign(oggpack_buffer *b){ + int bits=8-b->endbit; + if(bits<8) + oggpack_write(b,0,bits); +} + +void oggpackB_writealign(oggpack_buffer *b){ + int bits=8-b->endbit; + if(bits<8) + oggpackB_write(b,0,bits); +} + +static void oggpack_writecopy_helper(oggpack_buffer *b, + void *source, + long bits, + void (*w)(oggpack_buffer *, + unsigned long, + int), + int msb){ + unsigned char *ptr=(unsigned char *)source; + + long bytes=bits/8; + long pbytes=(b->endbit+bits)/8; + bits-=bytes*8; + + /* expand storage up-front */ + if(b->endbyte+pbytes>=b->storage){ + void *ret; + if(!b->ptr) goto err; + if(b->storage>b->endbyte+pbytes+BUFFER_INCREMENT) goto err; + b->storage=b->endbyte+pbytes+BUFFER_INCREMENT; + ret=_ogg_realloc(b->buffer,b->storage); + if(!ret) goto err; + b->buffer=ret; + b->ptr=b->buffer+b->endbyte; + } + + /* copy whole octets */ + if(b->endbit){ + int i; + /* unaligned copy. Do it the hard way. */ + for(i=0;iptr,source,bytes); + b->ptr+=bytes; + b->endbyte+=bytes; + *b->ptr=0; + } + + /* copy trailing bits */ + if(bits){ + if(msb) + w(b,(unsigned long)(ptr[bytes]>>(8-bits)),bits); + else + w(b,(unsigned long)(ptr[bytes]),bits); + } + return; + err: + oggpack_writeclear(b); +} + +void oggpack_writecopy(oggpack_buffer *b,void *source,long bits){ + oggpack_writecopy_helper(b,source,bits,oggpack_write,0); +} + +void oggpackB_writecopy(oggpack_buffer *b,void *source,long bits){ + oggpack_writecopy_helper(b,source,bits,oggpackB_write,1); +} + +void oggpack_reset(oggpack_buffer *b){ + if(!b->ptr)return; + b->ptr=b->buffer; + b->buffer[0]=0; + b->endbit=b->endbyte=0; +} + +void oggpackB_reset(oggpack_buffer *b){ + oggpack_reset(b); +} + +void oggpack_writeclear(oggpack_buffer *b){ + if(b->buffer)_ogg_free(b->buffer); + memset(b,0,sizeof(*b)); +} + +void oggpackB_writeclear(oggpack_buffer *b){ + oggpack_writeclear(b); +} + +void oggpack_readinit(oggpack_buffer *b,unsigned char *buf,int bytes){ + memset(b,0,sizeof(*b)); + b->buffer=b->ptr=buf; + b->storage=bytes; +} + +void oggpackB_readinit(oggpack_buffer *b,unsigned char *buf,int bytes){ + oggpack_readinit(b,buf,bytes); +} + +/* Read in bits without advancing the bitptr; bits <= 32 */ +long oggpack_look(oggpack_buffer *b,int bits){ + unsigned long ret; + unsigned long m; + + if(bits<0 || bits>32) return -1; + m=mask[bits]; + bits+=b->endbit; + + if(b->endbyte >= b->storage-4){ + /* not the main path */ + if(b->endbyte > b->storage-((bits+7)>>3)) return -1; + /* special case to avoid reading b->ptr[0], which might be past the end of + the buffer; also skips some useless accounting */ + else if(!bits)return(0L); + } + + ret=b->ptr[0]>>b->endbit; + if(bits>8){ + ret|=b->ptr[1]<<(8-b->endbit); + if(bits>16){ + ret|=b->ptr[2]<<(16-b->endbit); + if(bits>24){ + ret|=b->ptr[3]<<(24-b->endbit); + if(bits>32 && b->endbit) + ret|=b->ptr[4]<<(32-b->endbit); + } + } + } + return(m&ret); +} + +/* Read in bits without advancing the bitptr; bits <= 32 */ +long oggpackB_look(oggpack_buffer *b,int bits){ + unsigned long ret; + int m=32-bits; + + if(m<0 || m>32) return -1; + bits+=b->endbit; + + if(b->endbyte >= b->storage-4){ + /* not the main path */ + if(b->endbyte > b->storage-((bits+7)>>3)) return -1; + /* special case to avoid reading b->ptr[0], which might be past the end of + the buffer; also skips some useless accounting */ + else if(!bits)return(0L); + } + + ret=b->ptr[0]<<(24+b->endbit); + if(bits>8){ + ret|=b->ptr[1]<<(16+b->endbit); + if(bits>16){ + ret|=b->ptr[2]<<(8+b->endbit); + if(bits>24){ + ret|=b->ptr[3]<<(b->endbit); + if(bits>32 && b->endbit) + ret|=b->ptr[4]>>(8-b->endbit); + } + } + } + return ((ret&0xffffffff)>>(m>>1))>>((m+1)>>1); +} + +long oggpack_look1(oggpack_buffer *b){ + if(b->endbyte>=b->storage)return(-1); + return((b->ptr[0]>>b->endbit)&1); +} + +long oggpackB_look1(oggpack_buffer *b){ + if(b->endbyte>=b->storage)return(-1); + return((b->ptr[0]>>(7-b->endbit))&1); +} + +void oggpack_adv(oggpack_buffer *b,int bits){ + bits+=b->endbit; + + if(b->endbyte > b->storage-((bits+7)>>3)) goto overflow; + + b->ptr+=bits/8; + b->endbyte+=bits/8; + b->endbit=bits&7; + return; + + overflow: + b->ptr=NULL; + b->endbyte=b->storage; + b->endbit=1; +} + +void oggpackB_adv(oggpack_buffer *b,int bits){ + oggpack_adv(b,bits); +} + +void oggpack_adv1(oggpack_buffer *b){ + if(++(b->endbit)>7){ + b->endbit=0; + b->ptr++; + b->endbyte++; + } +} + +void oggpackB_adv1(oggpack_buffer *b){ + oggpack_adv1(b); +} + +/* bits <= 32 */ +long oggpack_read(oggpack_buffer *b,int bits){ + long ret; + unsigned long m; + + if(bits<0 || bits>32) goto err; + m=mask[bits]; + bits+=b->endbit; + + if(b->endbyte >= b->storage-4){ + /* not the main path */ + if(b->endbyte > b->storage-((bits+7)>>3)) goto overflow; + /* special case to avoid reading b->ptr[0], which might be past the end of + the buffer; also skips some useless accounting */ + else if(!bits)return(0L); + } + + ret=b->ptr[0]>>b->endbit; + if(bits>8){ + ret|=b->ptr[1]<<(8-b->endbit); + if(bits>16){ + ret|=b->ptr[2]<<(16-b->endbit); + if(bits>24){ + ret|=b->ptr[3]<<(24-b->endbit); + if(bits>32 && b->endbit){ + ret|=b->ptr[4]<<(32-b->endbit); + } + } + } + } + ret&=m; + b->ptr+=bits/8; + b->endbyte+=bits/8; + b->endbit=bits&7; + return ret; + + overflow: + err: + b->ptr=NULL; + b->endbyte=b->storage; + b->endbit=1; + return -1L; +} + +/* bits <= 32 */ +long oggpackB_read(oggpack_buffer *b,int bits){ + long ret; + long m=32-bits; + + if(m<0 || m>32) goto err; + bits+=b->endbit; + + if(b->endbyte+4>=b->storage){ + /* not the main path */ + if(b->endbyte > b->storage-((bits+7)>>3)) goto overflow; + /* special case to avoid reading b->ptr[0], which might be past the end of + the buffer; also skips some useless accounting */ + else if(!bits)return(0L); + } + + ret=b->ptr[0]<<(24+b->endbit); + if(bits>8){ + ret|=b->ptr[1]<<(16+b->endbit); + if(bits>16){ + ret|=b->ptr[2]<<(8+b->endbit); + if(bits>24){ + ret|=b->ptr[3]<<(b->endbit); + if(bits>32 && b->endbit) + ret|=b->ptr[4]>>(8-b->endbit); + } + } + } + ret=((ret&0xffffffffUL)>>(m>>1))>>((m+1)>>1); + + b->ptr+=bits/8; + b->endbyte+=bits/8; + b->endbit=bits&7; + return ret; + + overflow: + err: + b->ptr=NULL; + b->endbyte=b->storage; + b->endbit=1; + return -1L; +} + +long oggpack_read1(oggpack_buffer *b){ + long ret; + + if(b->endbyte >= b->storage) goto overflow; + ret=(b->ptr[0]>>b->endbit)&1; + + b->endbit++; + if(b->endbit>7){ + b->endbit=0; + b->ptr++; + b->endbyte++; + } + return ret; + + overflow: + b->ptr=NULL; + b->endbyte=b->storage; + b->endbit=1; + return -1L; +} + +long oggpackB_read1(oggpack_buffer *b){ + long ret; + + if(b->endbyte >= b->storage) goto overflow; + ret=(b->ptr[0]>>(7-b->endbit))&1; + + b->endbit++; + if(b->endbit>7){ + b->endbit=0; + b->ptr++; + b->endbyte++; + } + return ret; + + overflow: + b->ptr=NULL; + b->endbyte=b->storage; + b->endbit=1; + return -1L; +} + +long oggpack_bytes(oggpack_buffer *b){ + return(b->endbyte+(b->endbit+7)/8); +} + +long oggpack_bits(oggpack_buffer *b){ + return(b->endbyte*8+b->endbit); +} + +long oggpackB_bytes(oggpack_buffer *b){ + return oggpack_bytes(b); +} + +long oggpackB_bits(oggpack_buffer *b){ + return oggpack_bits(b); +} + +unsigned char *oggpack_get_buffer(oggpack_buffer *b){ + return(b->buffer); +} + +unsigned char *oggpackB_get_buffer(oggpack_buffer *b){ + return oggpack_get_buffer(b); +} + +/* Self test of the bitwise routines; everything else is based on + them, so they damned well better be solid. */ + +#ifdef _V_SELFTEST +#include + +static int ilog(unsigned int v){ + int ret=0; + while(v){ + ret++; + v>>=1; + } + return(ret); +} + +oggpack_buffer o; +oggpack_buffer r; + +void report(char *in){ + fprintf(stderr,"%s",in); + exit(1); +} + +void cliptest(unsigned long *b,int vals,int bits,int *comp,int compsize){ + long bytes,i; + unsigned char *buffer; + + oggpack_reset(&o); + for(i=0;i +#include +#include +#include + +/* A complete description of Ogg framing exists in docs/framing.html */ + +int ogg_page_version(const ogg_page *og){ + return((int)(og->header[4])); +} + +int ogg_page_continued(const ogg_page *og){ + return((int)(og->header[5]&0x01)); +} + +int ogg_page_bos(const ogg_page *og){ + return((int)(og->header[5]&0x02)); +} + +int ogg_page_eos(const ogg_page *og){ + return((int)(og->header[5]&0x04)); +} + +ogg_int64_t ogg_page_granulepos(const ogg_page *og){ + unsigned char *page=og->header; + ogg_int64_t granulepos=page[13]&(0xff); + granulepos= (granulepos<<8)|(page[12]&0xff); + granulepos= (granulepos<<8)|(page[11]&0xff); + granulepos= (granulepos<<8)|(page[10]&0xff); + granulepos= (granulepos<<8)|(page[9]&0xff); + granulepos= (granulepos<<8)|(page[8]&0xff); + granulepos= (granulepos<<8)|(page[7]&0xff); + granulepos= (granulepos<<8)|(page[6]&0xff); + return(granulepos); +} + +int ogg_page_serialno(const ogg_page *og){ + return(og->header[14] | + (og->header[15]<<8) | + (og->header[16]<<16) | + (og->header[17]<<24)); +} + +long ogg_page_pageno(const ogg_page *og){ + return(og->header[18] | + (og->header[19]<<8) | + (og->header[20]<<16) | + (og->header[21]<<24)); +} + + + +/* returns the number of packets that are completed on this page (if + the leading packet is begun on a previous page, but ends on this + page, it's counted */ + +/* NOTE: + If a page consists of a packet begun on a previous page, and a new + packet begun (but not completed) on this page, the return will be: + ogg_page_packets(page) ==1, + ogg_page_continued(page) !=0 + + If a page happens to be a single packet that was begun on a + previous page, and spans to the next page (in the case of a three or + more page packet), the return will be: + ogg_page_packets(page) ==0, + ogg_page_continued(page) !=0 +*/ + +int ogg_page_packets(const ogg_page *og){ + int i,n=og->header[26],count=0; + for(i=0;iheader[27+i]<255)count++; + return(count); +} + + +#if 0 +/* helper to initialize lookup for direct-table CRC (illustrative; we + use the static init below) */ + +static ogg_uint32_t _ogg_crc_entry(unsigned long index){ + int i; + unsigned long r; + + r = index << 24; + for (i=0; i<8; i++) + if (r & 0x80000000UL) + r = (r << 1) ^ 0x04c11db7; /* The same as the ethernet generator + polynomial, although we use an + unreflected alg and an init/final + of 0, not 0xffffffff */ + else + r<<=1; + return (r & 0xffffffffUL); +} +#endif + +static const ogg_uint32_t crc_lookup[256]={ + 0x00000000,0x04c11db7,0x09823b6e,0x0d4326d9, + 0x130476dc,0x17c56b6b,0x1a864db2,0x1e475005, + 0x2608edb8,0x22c9f00f,0x2f8ad6d6,0x2b4bcb61, + 0x350c9b64,0x31cd86d3,0x3c8ea00a,0x384fbdbd, + 0x4c11db70,0x48d0c6c7,0x4593e01e,0x4152fda9, + 0x5f15adac,0x5bd4b01b,0x569796c2,0x52568b75, + 0x6a1936c8,0x6ed82b7f,0x639b0da6,0x675a1011, + 0x791d4014,0x7ddc5da3,0x709f7b7a,0x745e66cd, + 0x9823b6e0,0x9ce2ab57,0x91a18d8e,0x95609039, + 0x8b27c03c,0x8fe6dd8b,0x82a5fb52,0x8664e6e5, + 0xbe2b5b58,0xbaea46ef,0xb7a96036,0xb3687d81, + 0xad2f2d84,0xa9ee3033,0xa4ad16ea,0xa06c0b5d, + 0xd4326d90,0xd0f37027,0xddb056fe,0xd9714b49, + 0xc7361b4c,0xc3f706fb,0xceb42022,0xca753d95, + 0xf23a8028,0xf6fb9d9f,0xfbb8bb46,0xff79a6f1, + 0xe13ef6f4,0xe5ffeb43,0xe8bccd9a,0xec7dd02d, + 0x34867077,0x30476dc0,0x3d044b19,0x39c556ae, + 0x278206ab,0x23431b1c,0x2e003dc5,0x2ac12072, + 0x128e9dcf,0x164f8078,0x1b0ca6a1,0x1fcdbb16, + 0x018aeb13,0x054bf6a4,0x0808d07d,0x0cc9cdca, + 0x7897ab07,0x7c56b6b0,0x71159069,0x75d48dde, + 0x6b93dddb,0x6f52c06c,0x6211e6b5,0x66d0fb02, + 0x5e9f46bf,0x5a5e5b08,0x571d7dd1,0x53dc6066, + 0x4d9b3063,0x495a2dd4,0x44190b0d,0x40d816ba, + 0xaca5c697,0xa864db20,0xa527fdf9,0xa1e6e04e, + 0xbfa1b04b,0xbb60adfc,0xb6238b25,0xb2e29692, + 0x8aad2b2f,0x8e6c3698,0x832f1041,0x87ee0df6, + 0x99a95df3,0x9d684044,0x902b669d,0x94ea7b2a, + 0xe0b41de7,0xe4750050,0xe9362689,0xedf73b3e, + 0xf3b06b3b,0xf771768c,0xfa325055,0xfef34de2, + 0xc6bcf05f,0xc27dede8,0xcf3ecb31,0xcbffd686, + 0xd5b88683,0xd1799b34,0xdc3abded,0xd8fba05a, + 0x690ce0ee,0x6dcdfd59,0x608edb80,0x644fc637, + 0x7a089632,0x7ec98b85,0x738aad5c,0x774bb0eb, + 0x4f040d56,0x4bc510e1,0x46863638,0x42472b8f, + 0x5c007b8a,0x58c1663d,0x558240e4,0x51435d53, + 0x251d3b9e,0x21dc2629,0x2c9f00f0,0x285e1d47, + 0x36194d42,0x32d850f5,0x3f9b762c,0x3b5a6b9b, + 0x0315d626,0x07d4cb91,0x0a97ed48,0x0e56f0ff, + 0x1011a0fa,0x14d0bd4d,0x19939b94,0x1d528623, + 0xf12f560e,0xf5ee4bb9,0xf8ad6d60,0xfc6c70d7, + 0xe22b20d2,0xe6ea3d65,0xeba91bbc,0xef68060b, + 0xd727bbb6,0xd3e6a601,0xdea580d8,0xda649d6f, + 0xc423cd6a,0xc0e2d0dd,0xcda1f604,0xc960ebb3, + 0xbd3e8d7e,0xb9ff90c9,0xb4bcb610,0xb07daba7, + 0xae3afba2,0xaafbe615,0xa7b8c0cc,0xa379dd7b, + 0x9b3660c6,0x9ff77d71,0x92b45ba8,0x9675461f, + 0x8832161a,0x8cf30bad,0x81b02d74,0x857130c3, + 0x5d8a9099,0x594b8d2e,0x5408abf7,0x50c9b640, + 0x4e8ee645,0x4a4ffbf2,0x470cdd2b,0x43cdc09c, + 0x7b827d21,0x7f436096,0x7200464f,0x76c15bf8, + 0x68860bfd,0x6c47164a,0x61043093,0x65c52d24, + 0x119b4be9,0x155a565e,0x18197087,0x1cd86d30, + 0x029f3d35,0x065e2082,0x0b1d065b,0x0fdc1bec, + 0x3793a651,0x3352bbe6,0x3e119d3f,0x3ad08088, + 0x2497d08d,0x2056cd3a,0x2d15ebe3,0x29d4f654, + 0xc5a92679,0xc1683bce,0xcc2b1d17,0xc8ea00a0, + 0xd6ad50a5,0xd26c4d12,0xdf2f6bcb,0xdbee767c, + 0xe3a1cbc1,0xe760d676,0xea23f0af,0xeee2ed18, + 0xf0a5bd1d,0xf464a0aa,0xf9278673,0xfde69bc4, + 0x89b8fd09,0x8d79e0be,0x803ac667,0x84fbdbd0, + 0x9abc8bd5,0x9e7d9662,0x933eb0bb,0x97ffad0c, + 0xafb010b1,0xab710d06,0xa6322bdf,0xa2f33668, + 0xbcb4666d,0xb8757bda,0xb5365d03,0xb1f740b4}; + +/* init the encode/decode logical stream state */ + +int ogg_stream_init(ogg_stream_state *os,int serialno){ + if(os){ + memset(os,0,sizeof(*os)); + os->body_storage=16*1024; + os->lacing_storage=1024; + + os->body_data=_ogg_malloc(os->body_storage*sizeof(*os->body_data)); + os->lacing_vals=_ogg_malloc(os->lacing_storage*sizeof(*os->lacing_vals)); + os->granule_vals=_ogg_malloc(os->lacing_storage*sizeof(*os->granule_vals)); + + if(!os->body_data || !os->lacing_vals || !os->granule_vals){ + ogg_stream_clear(os); + return -1; + } + + os->serialno=serialno; + + return(0); + } + return(-1); +} + +/* async/delayed error detection for the ogg_stream_state */ +int ogg_stream_check(ogg_stream_state *os){ + if(!os || !os->body_data) return -1; + return 0; +} + +/* _clear does not free os, only the non-flat storage within */ +int ogg_stream_clear(ogg_stream_state *os){ + if(os){ + if(os->body_data)_ogg_free(os->body_data); + if(os->lacing_vals)_ogg_free(os->lacing_vals); + if(os->granule_vals)_ogg_free(os->granule_vals); + + memset(os,0,sizeof(*os)); + } + return(0); +} + +int ogg_stream_destroy(ogg_stream_state *os){ + if(os){ + ogg_stream_clear(os); + _ogg_free(os); + } + return(0); +} + +/* Helpers for ogg_stream_encode; this keeps the structure and + what's happening fairly clear */ + +static int _os_body_expand(ogg_stream_state *os,long needed){ + if(os->body_storage-needed<=os->body_fill){ + long body_storage; + void *ret; + if(os->body_storage>LONG_MAX-needed){ + ogg_stream_clear(os); + return -1; + } + body_storage=os->body_storage+needed; + if(body_storagebody_data,body_storage*sizeof(*os->body_data)); + if(!ret){ + ogg_stream_clear(os); + return -1; + } + os->body_storage=body_storage; + os->body_data=ret; + } + return 0; +} + +static int _os_lacing_expand(ogg_stream_state *os,long needed){ + if(os->lacing_storage-needed<=os->lacing_fill){ + long lacing_storage; + void *ret; + if(os->lacing_storage>LONG_MAX-needed){ + ogg_stream_clear(os); + return -1; + } + lacing_storage=os->lacing_storage+needed; + if(lacing_storagelacing_vals,lacing_storage*sizeof(*os->lacing_vals)); + if(!ret){ + ogg_stream_clear(os); + return -1; + } + os->lacing_vals=ret; + ret=_ogg_realloc(os->granule_vals,lacing_storage* + sizeof(*os->granule_vals)); + if(!ret){ + ogg_stream_clear(os); + return -1; + } + os->granule_vals=ret; + os->lacing_storage=lacing_storage; + } + return 0; +} + +/* checksum the page */ +/* Direct table CRC; note that this will be faster in the future if we + perform the checksum simultaneously with other copies */ + +void ogg_page_checksum_set(ogg_page *og){ + if(og){ + ogg_uint32_t crc_reg=0; + int i; + + /* safety; needed for API behavior, but not framing code */ + og->header[22]=0; + og->header[23]=0; + og->header[24]=0; + og->header[25]=0; + + for(i=0;iheader_len;i++) + crc_reg=(crc_reg<<8)^crc_lookup[((crc_reg >> 24)&0xff)^og->header[i]]; + for(i=0;ibody_len;i++) + crc_reg=(crc_reg<<8)^crc_lookup[((crc_reg >> 24)&0xff)^og->body[i]]; + + og->header[22]=(unsigned char)(crc_reg&0xff); + og->header[23]=(unsigned char)((crc_reg>>8)&0xff); + og->header[24]=(unsigned char)((crc_reg>>16)&0xff); + og->header[25]=(unsigned char)((crc_reg>>24)&0xff); + } +} + +/* submit data to the internal buffer of the framing engine */ +int ogg_stream_iovecin(ogg_stream_state *os, ogg_iovec_t *iov, int count, + long e_o_s, ogg_int64_t granulepos){ + + long bytes = 0, lacing_vals; + int i; + + if(ogg_stream_check(os)) return -1; + if(!iov) return 0; + + for (i = 0; i < count; ++i){ + if(iov[i].iov_len>LONG_MAX) return -1; + if(bytes>LONG_MAX-(long)iov[i].iov_len) return -1; + bytes += (long)iov[i].iov_len; + } + lacing_vals=bytes/255+1; + + if(os->body_returned){ + /* advance packet data according to the body_returned pointer. We + had to keep it around to return a pointer into the buffer last + call */ + + os->body_fill-=os->body_returned; + if(os->body_fill) + memmove(os->body_data,os->body_data+os->body_returned, + os->body_fill); + os->body_returned=0; + } + + /* make sure we have the buffer storage */ + if(_os_body_expand(os,bytes) || _os_lacing_expand(os,lacing_vals)) + return -1; + + /* Copy in the submitted packet. Yes, the copy is a waste; this is + the liability of overly clean abstraction for the time being. It + will actually be fairly easy to eliminate the extra copy in the + future */ + + for (i = 0; i < count; ++i) { + memcpy(os->body_data+os->body_fill, iov[i].iov_base, iov[i].iov_len); + os->body_fill += (int)iov[i].iov_len; + } + + /* Store lacing vals for this packet */ + for(i=0;ilacing_vals[os->lacing_fill+i]=255; + os->granule_vals[os->lacing_fill+i]=os->granulepos; + } + os->lacing_vals[os->lacing_fill+i]=bytes%255; + os->granulepos=os->granule_vals[os->lacing_fill+i]=granulepos; + + /* flag the first segment as the beginning of the packet */ + os->lacing_vals[os->lacing_fill]|= 0x100; + + os->lacing_fill+=lacing_vals; + + /* for the sake of completeness */ + os->packetno++; + + if(e_o_s)os->e_o_s=1; + + return(0); +} + +int ogg_stream_packetin(ogg_stream_state *os,ogg_packet *op){ + ogg_iovec_t iov; + iov.iov_base = op->packet; + iov.iov_len = op->bytes; + return ogg_stream_iovecin(os, &iov, 1, op->e_o_s, op->granulepos); +} + +/* Conditionally flush a page; force==0 will only flush nominal-size + pages, force==1 forces us to flush a page regardless of page size + so long as there's any data available at all. */ +static int ogg_stream_flush_i(ogg_stream_state *os,ogg_page *og, int force, int nfill){ + int i; + int vals=0; + int maxvals=(os->lacing_fill>255?255:os->lacing_fill); + int bytes=0; + long acc=0; + ogg_int64_t granule_pos=-1; + + if(ogg_stream_check(os)) return(0); + if(maxvals==0) return(0); + + /* construct a page */ + /* decide how many segments to include */ + + /* If this is the initial header case, the first page must only include + the initial header packet */ + if(os->b_o_s==0){ /* 'initial header page' case */ + granule_pos=0; + for(vals=0;valslacing_vals[vals]&0x0ff)<255){ + vals++; + break; + } + } + }else{ + + /* The extra packets_done, packet_just_done logic here attempts to do two things: + 1) Don't unneccessarily span pages. + 2) Unless necessary, don't flush pages if there are less than four packets on + them; this expands page size to reduce unneccessary overhead if incoming packets + are large. + These are not necessary behaviors, just 'always better than naive flushing' + without requiring an application to explicitly request a specific optimized + behavior. We'll want an explicit behavior setup pathway eventually as well. */ + + int packets_done=0; + int packet_just_done=0; + for(vals=0;valsnfill && packet_just_done>=4){ + force=1; + break; + } + acc+=os->lacing_vals[vals]&0x0ff; + if((os->lacing_vals[vals]&0xff)<255){ + granule_pos=os->granule_vals[vals]; + packet_just_done=++packets_done; + }else + packet_just_done=0; + } + if(vals==255)force=1; + } + + if(!force) return(0); + + /* construct the header in temp storage */ + memcpy(os->header,"OggS",4); + + /* stream structure version */ + os->header[4]=0x00; + + /* continued packet flag? */ + os->header[5]=0x00; + if((os->lacing_vals[0]&0x100)==0)os->header[5]|=0x01; + /* first page flag? */ + if(os->b_o_s==0)os->header[5]|=0x02; + /* last page flag? */ + if(os->e_o_s && os->lacing_fill==vals)os->header[5]|=0x04; + os->b_o_s=1; + + /* 64 bits of PCM position */ + for(i=6;i<14;i++){ + os->header[i]=(unsigned char)(granule_pos&0xff); + granule_pos>>=8; + } + + /* 32 bits of stream serial number */ + { + long serialno=os->serialno; + for(i=14;i<18;i++){ + os->header[i]=(unsigned char)(serialno&0xff); + serialno>>=8; + } + } + + /* 32 bits of page counter (we have both counter and page header + because this val can roll over) */ + if(os->pageno==-1)os->pageno=0; /* because someone called + stream_reset; this would be a + strange thing to do in an + encode stream, but it has + plausible uses */ + { + long pageno=os->pageno++; + for(i=18;i<22;i++){ + os->header[i]=(unsigned char)(pageno&0xff); + pageno>>=8; + } + } + + /* zero for computation; filled in later */ + os->header[22]=0; + os->header[23]=0; + os->header[24]=0; + os->header[25]=0; + + /* segment table */ + os->header[26]=(unsigned char)(vals&0xff); + for(i=0;iheader[i+27]=(unsigned char)(os->lacing_vals[i]&0xff); + + /* set pointers in the ogg_page struct */ + og->header=os->header; + og->header_len=os->header_fill=vals+27; + og->body=os->body_data+os->body_returned; + og->body_len=bytes; + + /* advance the lacing data and set the body_returned pointer */ + + os->lacing_fill-=vals; + memmove(os->lacing_vals,os->lacing_vals+vals,os->lacing_fill*sizeof(*os->lacing_vals)); + memmove(os->granule_vals,os->granule_vals+vals,os->lacing_fill*sizeof(*os->granule_vals)); + os->body_returned+=bytes; + + /* calculate the checksum */ + + ogg_page_checksum_set(og); + + /* done */ + return(1); +} + +/* This will flush remaining packets into a page (returning nonzero), + even if there is not enough data to trigger a flush normally + (undersized page). If there are no packets or partial packets to + flush, ogg_stream_flush returns 0. Note that ogg_stream_flush will + try to flush a normal sized page like ogg_stream_pageout; a call to + ogg_stream_flush does not guarantee that all packets have flushed. + Only a return value of 0 from ogg_stream_flush indicates all packet + data is flushed into pages. + + since ogg_stream_flush will flush the last page in a stream even if + it's undersized, you almost certainly want to use ogg_stream_pageout + (and *not* ogg_stream_flush) unless you specifically need to flush + a page regardless of size in the middle of a stream. */ + +int ogg_stream_flush(ogg_stream_state *os,ogg_page *og){ + return ogg_stream_flush_i(os,og,1,4096); +} + +/* Like the above, but an argument is provided to adjust the nominal + page size for applications which are smart enough to provide their + own delay based flushing */ + +int ogg_stream_flush_fill(ogg_stream_state *os,ogg_page *og, int nfill){ + return ogg_stream_flush_i(os,og,1,nfill); +} + +/* This constructs pages from buffered packet segments. The pointers +returned are to static buffers; do not free. The returned buffers are +good only until the next call (using the same ogg_stream_state) */ + +int ogg_stream_pageout(ogg_stream_state *os, ogg_page *og){ + int force=0; + if(ogg_stream_check(os)) return 0; + + if((os->e_o_s&&os->lacing_fill) || /* 'were done, now flush' case */ + (os->lacing_fill&&!os->b_o_s)) /* 'initial header page' case */ + force=1; + + return(ogg_stream_flush_i(os,og,force,4096)); +} + +/* Like the above, but an argument is provided to adjust the nominal +page size for applications which are smart enough to provide their +own delay based flushing */ + +int ogg_stream_pageout_fill(ogg_stream_state *os, ogg_page *og, int nfill){ + int force=0; + if(ogg_stream_check(os)) return 0; + + if((os->e_o_s&&os->lacing_fill) || /* 'were done, now flush' case */ + (os->lacing_fill&&!os->b_o_s)) /* 'initial header page' case */ + force=1; + + return(ogg_stream_flush_i(os,og,force,nfill)); +} + +int ogg_stream_eos(ogg_stream_state *os){ + if(ogg_stream_check(os)) return 1; + return os->e_o_s; +} + +/* DECODING PRIMITIVES: packet streaming layer **********************/ + +/* This has two layers to place more of the multi-serialno and paging + control in the application's hands. First, we expose a data buffer + using ogg_sync_buffer(). The app either copies into the + buffer, or passes it directly to read(), etc. We then call + ogg_sync_wrote() to tell how many bytes we just added. + + Pages are returned (pointers into the buffer in ogg_sync_state) + by ogg_sync_pageout(). The page is then submitted to + ogg_stream_pagein() along with the appropriate + ogg_stream_state* (ie, matching serialno). We then get raw + packets out calling ogg_stream_packetout() with a + ogg_stream_state. */ + +/* initialize the struct to a known state */ +int ogg_sync_init(ogg_sync_state *oy){ + if(oy){ + oy->storage = -1; /* used as a readiness flag */ + memset(oy,0,sizeof(*oy)); + } + return(0); +} + +/* clear non-flat storage within */ +int ogg_sync_clear(ogg_sync_state *oy){ + if(oy){ + if(oy->data)_ogg_free(oy->data); + memset(oy,0,sizeof(*oy)); + } + return(0); +} + +int ogg_sync_destroy(ogg_sync_state *oy){ + if(oy){ + ogg_sync_clear(oy); + _ogg_free(oy); + } + return(0); +} + +int ogg_sync_check(ogg_sync_state *oy){ + if(oy->storage<0) return -1; + return 0; +} + +char *ogg_sync_buffer(ogg_sync_state *oy, long size){ + if(ogg_sync_check(oy)) return NULL; + + /* first, clear out any space that has been previously returned */ + if(oy->returned){ + oy->fill-=oy->returned; + if(oy->fill>0) + memmove(oy->data,oy->data+oy->returned,oy->fill); + oy->returned=0; + } + + if(size>oy->storage-oy->fill){ + /* We need to extend the internal buffer */ + long newsize=size+oy->fill+4096; /* an extra page to be nice */ + void *ret; + + if(oy->data) + ret=_ogg_realloc(oy->data,newsize); + else + ret=_ogg_malloc(newsize); + if(!ret){ + ogg_sync_clear(oy); + return NULL; + } + oy->data=ret; + oy->storage=newsize; + } + + /* expose a segment at least as large as requested at the fill mark */ + return((char *)oy->data+oy->fill); +} + +int ogg_sync_wrote(ogg_sync_state *oy, long bytes){ + if(ogg_sync_check(oy))return -1; + if(oy->fill+bytes>oy->storage)return -1; + oy->fill+=bytes; + return(0); +} + +/* sync the stream. This is meant to be useful for finding page + boundaries. + + return values for this: + -n) skipped n bytes + 0) page not ready; more data (no bytes skipped) + n) page synced at current location; page length n bytes + +*/ + +long ogg_sync_pageseek(ogg_sync_state *oy,ogg_page *og){ + unsigned char *page=oy->data+oy->returned; + unsigned char *next; + long bytes=oy->fill-oy->returned; + + if(ogg_sync_check(oy))return 0; + + if(oy->headerbytes==0){ + int headerbytes,i; + if(bytes<27)return(0); /* not enough for a header */ + + /* verify capture pattern */ + if(memcmp(page,"OggS",4))goto sync_fail; + + headerbytes=page[26]+27; + if(bytesbodybytes+=page[27+i]; + oy->headerbytes=headerbytes; + } + + if(oy->bodybytes+oy->headerbytes>bytes)return(0); + + /* The whole test page is buffered. Verify the checksum */ + { + /* Grab the checksum bytes, set the header field to zero */ + char chksum[4]; + ogg_page log; + + memcpy(chksum,page+22,4); + memset(page+22,0,4); + + /* set up a temp page struct and recompute the checksum */ + log.header=page; + log.header_len=oy->headerbytes; + log.body=page+oy->headerbytes; + log.body_len=oy->bodybytes; + ogg_page_checksum_set(&log); + + /* Compare */ + if(memcmp(chksum,page+22,4)){ + /* D'oh. Mismatch! Corrupt page (or miscapture and not a page + at all) */ + /* replace the computed checksum with the one actually read in */ + memcpy(page+22,chksum,4); + + /* Bad checksum. Lose sync */ + goto sync_fail; + } + } + + /* yes, have a whole page all ready to go */ + { + unsigned char *page=oy->data+oy->returned; + long bytes; + + if(og){ + og->header=page; + og->header_len=oy->headerbytes; + og->body=page+oy->headerbytes; + og->body_len=oy->bodybytes; + } + + oy->unsynced=0; + oy->returned+=(bytes=oy->headerbytes+oy->bodybytes); + oy->headerbytes=0; + oy->bodybytes=0; + return(bytes); + } + + sync_fail: + + oy->headerbytes=0; + oy->bodybytes=0; + + /* search for possible capture */ + next=memchr(page+1,'O',bytes-1); + if(!next) + next=oy->data+oy->fill; + + oy->returned=(int)(next-oy->data); + return((long)-(next-page)); +} + +/* sync the stream and get a page. Keep trying until we find a page. + Suppress 'sync errors' after reporting the first. + + return values: + -1) recapture (hole in data) + 0) need more data + 1) page returned + + Returns pointers into buffered data; invalidated by next call to + _stream, _clear, _init, or _buffer */ + +int ogg_sync_pageout(ogg_sync_state *oy, ogg_page *og){ + + if(ogg_sync_check(oy))return 0; + + /* all we need to do is verify a page at the head of the stream + buffer. If it doesn't verify, we look for the next potential + frame */ + + for(;;){ + long ret=ogg_sync_pageseek(oy,og); + if(ret>0){ + /* have a page */ + return(1); + } + if(ret==0){ + /* need more data */ + return(0); + } + + /* head did not start a synced page... skipped some bytes */ + if(!oy->unsynced){ + oy->unsynced=1; + return(-1); + } + + /* loop. keep looking */ + + } +} + +/* add the incoming page to the stream state; we decompose the page + into packet segments here as well. */ + +int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og){ + unsigned char *header=og->header; + unsigned char *body=og->body; + long bodysize=og->body_len; + int segptr=0; + + int version=ogg_page_version(og); + int continued=ogg_page_continued(og); + int bos=ogg_page_bos(og); + int eos=ogg_page_eos(og); + ogg_int64_t granulepos=ogg_page_granulepos(og); + int serialno=ogg_page_serialno(og); + long pageno=ogg_page_pageno(og); + int segments=header[26]; + + if(ogg_stream_check(os)) return -1; + + /* clean up 'returned data' */ + { + long lr=os->lacing_returned; + long br=os->body_returned; + + /* body data */ + if(br){ + os->body_fill-=br; + if(os->body_fill) + memmove(os->body_data,os->body_data+br,os->body_fill); + os->body_returned=0; + } + + if(lr){ + /* segment table */ + if(os->lacing_fill-lr){ + memmove(os->lacing_vals,os->lacing_vals+lr, + (os->lacing_fill-lr)*sizeof(*os->lacing_vals)); + memmove(os->granule_vals,os->granule_vals+lr, + (os->lacing_fill-lr)*sizeof(*os->granule_vals)); + } + os->lacing_fill-=lr; + os->lacing_packet-=lr; + os->lacing_returned=0; + } + } + + /* check the serial number */ + if(serialno!=os->serialno)return(-1); + if(version>0)return(-1); + + if(_os_lacing_expand(os,segments+1)) return -1; + + /* are we in sequence? */ + if(pageno!=os->pageno){ + int i; + + /* unroll previous partial packet (if any) */ + for(i=os->lacing_packet;ilacing_fill;i++) + os->body_fill-=os->lacing_vals[i]&0xff; + os->lacing_fill=os->lacing_packet; + + /* make a note of dropped data in segment table */ + if(os->pageno!=-1){ + os->lacing_vals[os->lacing_fill++]=0x400; + os->lacing_packet++; + } + } + + /* are we a 'continued packet' page? If so, we may need to skip + some segments */ + if(continued){ + if(os->lacing_fill<1 || + os->lacing_vals[os->lacing_fill-1]==0x400){ + bos=0; + for(;segptrbody_data+os->body_fill,body,bodysize); + os->body_fill+=bodysize; + } + + { + int saved=-1; + while(segptrlacing_vals[os->lacing_fill]=val; + os->granule_vals[os->lacing_fill]=-1; + + if(bos){ + os->lacing_vals[os->lacing_fill]|=0x100; + bos=0; + } + + if(val<255)saved=os->lacing_fill; + + os->lacing_fill++; + segptr++; + + if(val<255)os->lacing_packet=os->lacing_fill; + } + + /* set the granulepos on the last granuleval of the last full packet */ + if(saved!=-1){ + os->granule_vals[saved]=granulepos; + } + + } + + if(eos){ + os->e_o_s=1; + if(os->lacing_fill>0) + os->lacing_vals[os->lacing_fill-1]|=0x200; + } + + os->pageno=pageno+1; + + return(0); +} + +/* clear things to an initial state. Good to call, eg, before seeking */ +int ogg_sync_reset(ogg_sync_state *oy){ + if(ogg_sync_check(oy))return -1; + + oy->fill=0; + oy->returned=0; + oy->unsynced=0; + oy->headerbytes=0; + oy->bodybytes=0; + return(0); +} + +int ogg_stream_reset(ogg_stream_state *os){ + if(ogg_stream_check(os)) return -1; + + os->body_fill=0; + os->body_returned=0; + + os->lacing_fill=0; + os->lacing_packet=0; + os->lacing_returned=0; + + os->header_fill=0; + + os->e_o_s=0; + os->b_o_s=0; + os->pageno=-1; + os->packetno=0; + os->granulepos=0; + + return(0); +} + +int ogg_stream_reset_serialno(ogg_stream_state *os,int serialno){ + if(ogg_stream_check(os)) return -1; + ogg_stream_reset(os); + os->serialno=serialno; + return(0); +} + +static int _packetout(ogg_stream_state *os,ogg_packet *op,int adv){ + + /* The last part of decode. We have the stream broken into packet + segments. Now we need to group them into packets (or return the + out of sync markers) */ + + int ptr=os->lacing_returned; + + if(os->lacing_packet<=ptr)return(0); + + if(os->lacing_vals[ptr]&0x400){ + /* we need to tell the codec there's a gap; it might need to + handle previous packet dependencies. */ + os->lacing_returned++; + os->packetno++; + return(-1); + } + + if(!op && !adv)return(1); /* just using peek as an inexpensive way + to ask if there's a whole packet + waiting */ + + /* Gather the whole packet. We'll have no holes or a partial packet */ + { + int size=os->lacing_vals[ptr]&0xff; + long bytes=size; + int eos=os->lacing_vals[ptr]&0x200; /* last packet of the stream? */ + int bos=os->lacing_vals[ptr]&0x100; /* first packet of the stream? */ + + while(size==255){ + int val=os->lacing_vals[++ptr]; + size=val&0xff; + if(val&0x200)eos=0x200; + bytes+=size; + } + + if(op){ + op->e_o_s=eos; + op->b_o_s=bos; + op->packet=os->body_data+os->body_returned; + op->packetno=os->packetno; + op->granulepos=os->granule_vals[ptr]; + op->bytes=bytes; + } + + if(adv){ + os->body_returned+=bytes; + os->lacing_returned=ptr+1; + os->packetno++; + } + } + return(1); +} + +int ogg_stream_packetout(ogg_stream_state *os,ogg_packet *op){ + if(ogg_stream_check(os)) return 0; + return _packetout(os,op,1); +} + +int ogg_stream_packetpeek(ogg_stream_state *os,ogg_packet *op){ + if(ogg_stream_check(os)) return 0; + return _packetout(os,op,0); +} + +void ogg_packet_clear(ogg_packet *op) { + _ogg_free(op->packet); + memset(op, 0, sizeof(*op)); +} + +#ifdef _V_SELFTEST +#include + +ogg_stream_state os_en, os_de; +ogg_sync_state oy; + +void checkpacket(ogg_packet *op,long len, int no, long pos){ + long j; + static int sequence=0; + static int lastno=0; + + if(op->bytes!=len){ + fprintf(stderr,"incorrect packet length (%ld != %ld)!\n",op->bytes,len); + exit(1); + } + if(op->granulepos!=pos){ + fprintf(stderr,"incorrect packet granpos (%ld != %ld)!\n",(long)op->granulepos,pos); + exit(1); + } + + /* packet number just follows sequence/gap; adjust the input number + for that */ + if(no==0){ + sequence=0; + }else{ + sequence++; + if(no>lastno+1) + sequence++; + } + lastno=no; + if(op->packetno!=sequence){ + fprintf(stderr,"incorrect packet sequence %ld != %d\n", + (long)(op->packetno),sequence); + exit(1); + } + + /* Test data */ + for(j=0;jbytes;j++) + if(op->packet[j]!=((j+no)&0xff)){ + fprintf(stderr,"body data mismatch (1) at pos %ld: %x!=%lx!\n\n", + j,op->packet[j],(j+no)&0xff); + exit(1); + } +} + +void check_page(unsigned char *data,const int *header,ogg_page *og){ + long j; + /* Test data */ + for(j=0;jbody_len;j++) + if(og->body[j]!=data[j]){ + fprintf(stderr,"body data mismatch (2) at pos %ld: %x!=%x!\n\n", + j,data[j],og->body[j]); + exit(1); + } + + /* Test header */ + for(j=0;jheader_len;j++){ + if(og->header[j]!=header[j]){ + fprintf(stderr,"header content mismatch at pos %ld:\n",j); + for(j=0;jheader[j]); + fprintf(stderr,"\n"); + exit(1); + } + } + if(og->header_len!=header[26]+27){ + fprintf(stderr,"header length incorrect! (%ld!=%d)\n", + og->header_len,header[26]+27); + exit(1); + } +} + +void print_header(ogg_page *og){ + int j; + fprintf(stderr,"\nHEADER:\n"); + fprintf(stderr," capture: %c %c %c %c version: %d flags: %x\n", + og->header[0],og->header[1],og->header[2],og->header[3], + (int)og->header[4],(int)og->header[5]); + + fprintf(stderr," granulepos: %d serialno: %d pageno: %ld\n", + (og->header[9]<<24)|(og->header[8]<<16)| + (og->header[7]<<8)|og->header[6], + (og->header[17]<<24)|(og->header[16]<<16)| + (og->header[15]<<8)|og->header[14], + ((long)(og->header[21])<<24)|(og->header[20]<<16)| + (og->header[19]<<8)|og->header[18]); + + fprintf(stderr," checksum: %02x:%02x:%02x:%02x\n segments: %d (", + (int)og->header[22],(int)og->header[23], + (int)og->header[24],(int)og->header[25], + (int)og->header[26]); + + for(j=27;jheader_len;j++) + fprintf(stderr,"%d ",(int)og->header[j]); + fprintf(stderr,")\n\n"); +} + +void copy_page(ogg_page *og){ + unsigned char *temp=_ogg_malloc(og->header_len); + memcpy(temp,og->header,og->header_len); + og->header=temp; + + temp=_ogg_malloc(og->body_len); + memcpy(temp,og->body,og->body_len); + og->body=temp; +} + +void free_page(ogg_page *og){ + _ogg_free (og->header); + _ogg_free (og->body); +} + +void error(void){ + fprintf(stderr,"error!\n"); + exit(1); +} + +/* 17 only */ +const int head1_0[] = {0x4f,0x67,0x67,0x53,0,0x06, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0x15,0xed,0xec,0x91, + 1, + 17}; + +/* 17, 254, 255, 256, 500, 510, 600 byte, pad */ +const int head1_1[] = {0x4f,0x67,0x67,0x53,0,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0x59,0x10,0x6c,0x2c, + 1, + 17}; +const int head2_1[] = {0x4f,0x67,0x67,0x53,0,0x04, + 0x07,0x18,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0x89,0x33,0x85,0xce, + 13, + 254,255,0,255,1,255,245,255,255,0, + 255,255,90}; + +/* nil packets; beginning,middle,end */ +const int head1_2[] = {0x4f,0x67,0x67,0x53,0,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0xff,0x7b,0x23,0x17, + 1, + 0}; +const int head2_2[] = {0x4f,0x67,0x67,0x53,0,0x04, + 0x07,0x28,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0x5c,0x3f,0x66,0xcb, + 17, + 17,254,255,0,0,255,1,0,255,245,255,255,0, + 255,255,90,0}; + +/* large initial packet */ +const int head1_3[] = {0x4f,0x67,0x67,0x53,0,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0x01,0x27,0x31,0xaa, + 18, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,10}; + +const int head2_3[] = {0x4f,0x67,0x67,0x53,0,0x04, + 0x07,0x08,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0x7f,0x4e,0x8a,0xd2, + 4, + 255,4,255,0}; + + +/* continuing packet test */ +const int head1_4[] = {0x4f,0x67,0x67,0x53,0,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0xff,0x7b,0x23,0x17, + 1, + 0}; + +const int head2_4[] = {0x4f,0x67,0x67,0x53,0,0x00, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0xf8,0x3c,0x19,0x79, + 255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255}; + +const int head3_4[] = {0x4f,0x67,0x67,0x53,0,0x05, + 0x07,0x0c,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,2,0,0,0, + 0x38,0xe6,0xb6,0x28, + 6, + 255,220,255,4,255,0}; + + +/* spill expansion test */ +const int head1_4b[] = {0x4f,0x67,0x67,0x53,0,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0xff,0x7b,0x23,0x17, + 1, + 0}; + +const int head2_4b[] = {0x4f,0x67,0x67,0x53,0,0x00, + 0x07,0x10,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0xce,0x8f,0x17,0x1a, + 23, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,10,255,4,255,0,0}; + + +const int head3_4b[] = {0x4f,0x67,0x67,0x53,0,0x04, + 0x07,0x14,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,2,0,0,0, + 0x9b,0xb2,0x50,0xa1, + 1, + 0}; + +/* page with the 255 segment limit */ +const int head1_5[] = {0x4f,0x67,0x67,0x53,0,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0xff,0x7b,0x23,0x17, + 1, + 0}; + +const int head2_5[] = {0x4f,0x67,0x67,0x53,0,0x00, + 0x07,0xfc,0x03,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0xed,0x2a,0x2e,0xa7, + 255, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10}; + +const int head3_5[] = {0x4f,0x67,0x67,0x53,0,0x04, + 0x07,0x00,0x04,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,2,0,0,0, + 0x6c,0x3b,0x82,0x3d, + 1, + 50}; + + +/* packet that overspans over an entire page */ +const int head1_6[] = {0x4f,0x67,0x67,0x53,0,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0xff,0x7b,0x23,0x17, + 1, + 0}; + +const int head2_6[] = {0x4f,0x67,0x67,0x53,0,0x00, + 0x07,0x04,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0x68,0x22,0x7c,0x3d, + 255, + 100, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255}; + +const int head3_6[] = {0x4f,0x67,0x67,0x53,0,0x01, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x01,0x02,0x03,0x04,2,0,0,0, + 0xf4,0x87,0xba,0xf3, + 255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255}; + +const int head4_6[] = {0x4f,0x67,0x67,0x53,0,0x05, + 0x07,0x10,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,3,0,0,0, + 0xf7,0x2f,0x6c,0x60, + 5, + 254,255,4,255,0}; + +/* packet that overspans over an entire page */ +const int head1_7[] = {0x4f,0x67,0x67,0x53,0,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0xff,0x7b,0x23,0x17, + 1, + 0}; + +const int head2_7[] = {0x4f,0x67,0x67,0x53,0,0x00, + 0x07,0x04,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0x68,0x22,0x7c,0x3d, + 255, + 100, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255}; + +const int head3_7[] = {0x4f,0x67,0x67,0x53,0,0x05, + 0x07,0x08,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,2,0,0,0, + 0xd4,0xe0,0x60,0xe5, + 1, + 0}; + +void test_pack(const int *pl, const int **headers, int byteskip, + int pageskip, int packetskip){ + unsigned char *data=_ogg_malloc(1024*1024); /* for scripted test cases only */ + long inptr=0; + long outptr=0; + long deptr=0; + long depacket=0; + long granule_pos=7,pageno=0; + int i,j,packets,pageout=pageskip; + int eosflag=0; + int bosflag=0; + + int byteskipcount=0; + + ogg_stream_reset(&os_en); + ogg_stream_reset(&os_de); + ogg_sync_reset(&oy); + + for(packets=0;packetsbyteskip){ + memcpy(next,og.header,byteskipcount-byteskip); + next+=byteskipcount-byteskip; + byteskipcount=byteskip; + } + + byteskipcount+=og.body_len; + if(byteskipcount>byteskip){ + memcpy(next,og.body,byteskipcount-byteskip); + next+=byteskipcount-byteskip; + byteskipcount=byteskip; + } + + ogg_sync_wrote(&oy,next-buf); + + while(1){ + int ret=ogg_sync_pageout(&oy,&og_de); + if(ret==0)break; + if(ret<0)continue; + /* got a page. Happy happy. Verify that it's good. */ + + fprintf(stderr,"(%d), ",pageout); + + check_page(data+deptr,headers[pageout],&og_de); + deptr+=og_de.body_len; + pageout++; + + /* submit it to deconstitution */ + ogg_stream_pagein(&os_de,&og_de); + + /* packets out? */ + while(ogg_stream_packetpeek(&os_de,&op_de2)>0){ + ogg_stream_packetpeek(&os_de,NULL); + ogg_stream_packetout(&os_de,&op_de); /* just catching them all */ + + /* verify peek and out match */ + if(memcmp(&op_de,&op_de2,sizeof(op_de))){ + fprintf(stderr,"packetout != packetpeek! pos=%ld\n", + depacket); + exit(1); + } + + /* verify the packet! */ + /* check data */ + if(memcmp(data+depacket,op_de.packet,op_de.bytes)){ + fprintf(stderr,"packet data mismatch in decode! pos=%ld\n", + depacket); + exit(1); + } + /* check bos flag */ + if(bosflag==0 && op_de.b_o_s==0){ + fprintf(stderr,"b_o_s flag not set on packet!\n"); + exit(1); + } + if(bosflag && op_de.b_o_s){ + fprintf(stderr,"b_o_s flag incorrectly set on packet!\n"); + exit(1); + } + bosflag=1; + depacket+=op_de.bytes; + + /* check eos flag */ + if(eosflag){ + fprintf(stderr,"Multiple decoded packets with eos flag!\n"); + exit(1); + } + + if(op_de.e_o_s)eosflag=1; + + /* check granulepos flag */ + if(op_de.granulepos!=-1){ + fprintf(stderr," granule:%ld ",(long)op_de.granulepos); + } + } + } + } + } + } + } + _ogg_free(data); + if(headers[pageno]!=NULL){ + fprintf(stderr,"did not write last page!\n"); + exit(1); + } + if(headers[pageout]!=NULL){ + fprintf(stderr,"did not decode last page!\n"); + exit(1); + } + if(inptr!=outptr){ + fprintf(stderr,"encoded page data incomplete!\n"); + exit(1); + } + if(inptr!=deptr){ + fprintf(stderr,"decoded page data incomplete!\n"); + exit(1); + } + if(inptr!=depacket){ + fprintf(stderr,"decoded packet data incomplete!\n"); + exit(1); + } + if(!eosflag){ + fprintf(stderr,"Never got a packet with EOS set!\n"); + exit(1); + } + fprintf(stderr,"ok.\n"); +} + +int main(void){ + + ogg_stream_init(&os_en,0x04030201); + ogg_stream_init(&os_de,0x04030201); + ogg_sync_init(&oy); + + /* Exercise each code path in the framing code. Also verify that + the checksums are working. */ + + { + /* 17 only */ + const int packets[]={17, -1}; + const int *headret[]={head1_0,NULL}; + + fprintf(stderr,"testing single page encoding... "); + test_pack(packets,headret,0,0,0); + } + + { + /* 17, 254, 255, 256, 500, 510, 600 byte, pad */ + const int packets[]={17, 254, 255, 256, 500, 510, 600, -1}; + const int *headret[]={head1_1,head2_1,NULL}; + + fprintf(stderr,"testing basic page encoding... "); + test_pack(packets,headret,0,0,0); + } + + { + /* nil packets; beginning,middle,end */ + const int packets[]={0,17, 254, 255, 0, 256, 0, 500, 510, 600, 0, -1}; + const int *headret[]={head1_2,head2_2,NULL}; + + fprintf(stderr,"testing basic nil packets... "); + test_pack(packets,headret,0,0,0); + } + + { + /* large initial packet */ + const int packets[]={4345,259,255,-1}; + const int *headret[]={head1_3,head2_3,NULL}; + + fprintf(stderr,"testing initial-packet lacing > 4k... "); + test_pack(packets,headret,0,0,0); + } + + { + /* continuing packet test; with page spill expansion, we have to + overflow the lacing table. */ + const int packets[]={0,65500,259,255,-1}; + const int *headret[]={head1_4,head2_4,head3_4,NULL}; + + fprintf(stderr,"testing single packet page span... "); + test_pack(packets,headret,0,0,0); + } + + { + /* spill expand packet test */ + const int packets[]={0,4345,259,255,0,0,-1}; + const int *headret[]={head1_4b,head2_4b,head3_4b,NULL}; + + fprintf(stderr,"testing page spill expansion... "); + test_pack(packets,headret,0,0,0); + } + + /* page with the 255 segment limit */ + { + + const int packets[]={0,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,50,-1}; + const int *headret[]={head1_5,head2_5,head3_5,NULL}; + + fprintf(stderr,"testing max packet segments... "); + test_pack(packets,headret,0,0,0); + } + + { + /* packet that overspans over an entire page */ + const int packets[]={0,100,130049,259,255,-1}; + const int *headret[]={head1_6,head2_6,head3_6,head4_6,NULL}; + + fprintf(stderr,"testing very large packets... "); + test_pack(packets,headret,0,0,0); + } + + { + /* test for the libogg 1.1.1 resync in large continuation bug + found by Josh Coalson) */ + const int packets[]={0,100,130049,259,255,-1}; + const int *headret[]={head1_6,head2_6,head3_6,head4_6,NULL}; + + fprintf(stderr,"testing continuation resync in very large packets... "); + test_pack(packets,headret,100,2,3); + } + + { + /* term only page. why not? */ + const int packets[]={0,100,64770,-1}; + const int *headret[]={head1_7,head2_7,head3_7,NULL}; + + fprintf(stderr,"testing zero data page (1 nil packet)... "); + test_pack(packets,headret,0,0,0); + } + + + + { + /* build a bunch of pages for testing */ + unsigned char *data=_ogg_malloc(1024*1024); + int pl[]={0, 1,1,98,4079, 1,1,2954,2057, 76,34,912,0,234,1000,1000, 1000,300,-1}; + int inptr=0,i,j; + ogg_page og[5]; + + ogg_stream_reset(&os_en); + + for(i=0;pl[i]!=-1;i++){ + ogg_packet op; + int len=pl[i]; + + op.packet=data+inptr; + op.bytes=len; + op.e_o_s=(pl[i+1]<0?1:0); + op.granulepos=(i+1)*1000; + + for(j=0;j0)error(); + + /* Test fractional page inputs: incomplete fixed header */ + memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header+3, + 20); + ogg_sync_wrote(&oy,20); + if(ogg_sync_pageout(&oy,&og_de)>0)error(); + + /* Test fractional page inputs: incomplete header */ + memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header+23, + 5); + ogg_sync_wrote(&oy,5); + if(ogg_sync_pageout(&oy,&og_de)>0)error(); + + /* Test fractional page inputs: incomplete body */ + + memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header+28, + og[1].header_len-28); + ogg_sync_wrote(&oy,og[1].header_len-28); + if(ogg_sync_pageout(&oy,&og_de)>0)error(); + + memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body,1000); + ogg_sync_wrote(&oy,1000); + if(ogg_sync_pageout(&oy,&og_de)>0)error(); + + memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body+1000, + og[1].body_len-1000); + ogg_sync_wrote(&oy,og[1].body_len-1000); + if(ogg_sync_pageout(&oy,&og_de)<=0)error(); + + fprintf(stderr,"ok.\n"); + } + + /* Test fractional page inputs: page + incomplete capture */ + { + ogg_page og_de; + fprintf(stderr,"Testing sync on 1+partial inputs... "); + ogg_sync_reset(&oy); + + memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, + og[1].header_len); + ogg_sync_wrote(&oy,og[1].header_len); + + memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, + og[1].body_len); + ogg_sync_wrote(&oy,og[1].body_len); + + memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, + 20); + ogg_sync_wrote(&oy,20); + if(ogg_sync_pageout(&oy,&og_de)<=0)error(); + if(ogg_sync_pageout(&oy,&og_de)>0)error(); + + memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header+20, + og[1].header_len-20); + ogg_sync_wrote(&oy,og[1].header_len-20); + memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, + og[1].body_len); + ogg_sync_wrote(&oy,og[1].body_len); + if(ogg_sync_pageout(&oy,&og_de)<=0)error(); + + fprintf(stderr,"ok.\n"); + } + + /* Test recapture: garbage + page */ + { + ogg_page og_de; + fprintf(stderr,"Testing search for capture... "); + ogg_sync_reset(&oy); + + /* 'garbage' */ + memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, + og[1].body_len); + ogg_sync_wrote(&oy,og[1].body_len); + + memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, + og[1].header_len); + ogg_sync_wrote(&oy,og[1].header_len); + + memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, + og[1].body_len); + ogg_sync_wrote(&oy,og[1].body_len); + + memcpy(ogg_sync_buffer(&oy,og[2].header_len),og[2].header, + 20); + ogg_sync_wrote(&oy,20); + if(ogg_sync_pageout(&oy,&og_de)>0)error(); + if(ogg_sync_pageout(&oy,&og_de)<=0)error(); + if(ogg_sync_pageout(&oy,&og_de)>0)error(); + + memcpy(ogg_sync_buffer(&oy,og[2].header_len),og[2].header+20, + og[2].header_len-20); + ogg_sync_wrote(&oy,og[2].header_len-20); + memcpy(ogg_sync_buffer(&oy,og[2].body_len),og[2].body, + og[2].body_len); + ogg_sync_wrote(&oy,og[2].body_len); + if(ogg_sync_pageout(&oy,&og_de)<=0)error(); + + fprintf(stderr,"ok.\n"); + } + + /* Test recapture: page + garbage + page */ + { + ogg_page og_de; + fprintf(stderr,"Testing recapture... "); + ogg_sync_reset(&oy); + + memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, + og[1].header_len); + ogg_sync_wrote(&oy,og[1].header_len); + + memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, + og[1].body_len); + ogg_sync_wrote(&oy,og[1].body_len); + + memcpy(ogg_sync_buffer(&oy,og[2].header_len),og[2].header, + og[2].header_len); + ogg_sync_wrote(&oy,og[2].header_len); + + memcpy(ogg_sync_buffer(&oy,og[2].header_len),og[2].header, + og[2].header_len); + ogg_sync_wrote(&oy,og[2].header_len); + + if(ogg_sync_pageout(&oy,&og_de)<=0)error(); + + memcpy(ogg_sync_buffer(&oy,og[2].body_len),og[2].body, + og[2].body_len-5); + ogg_sync_wrote(&oy,og[2].body_len-5); + + memcpy(ogg_sync_buffer(&oy,og[3].header_len),og[3].header, + og[3].header_len); + ogg_sync_wrote(&oy,og[3].header_len); + + memcpy(ogg_sync_buffer(&oy,og[3].body_len),og[3].body, + og[3].body_len); + ogg_sync_wrote(&oy,og[3].body_len); + + if(ogg_sync_pageout(&oy,&og_de)>0)error(); + if(ogg_sync_pageout(&oy,&og_de)<=0)error(); + + fprintf(stderr,"ok.\n"); + } + + /* Free page data that was previously copied */ + { + for(i=0;i<5;i++){ + free_page(&og[i]); + } + } + } + + return(0); +} + +#endif diff --git a/cs/3rd party/libogg/symbian/bld.inf b/cs/3rd party/libogg/symbian/bld.inf new file mode 100644 index 000000000..e924117b5 --- /dev/null +++ b/cs/3rd party/libogg/symbian/bld.inf @@ -0,0 +1,35 @@ +/* + Copyright (C) 2003 Commonwealth Scientific and Industrial Research + Organisation (CSIRO) Australia + + 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 CSIRO Australia 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 ORGANISATION 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. +*/ + +PRJ_MMPFILES + +ogg.mmp diff --git a/cs/3rd party/libogg/symbian/ogg.mmp b/cs/3rd party/libogg/symbian/ogg.mmp new file mode 100644 index 000000000..7c4e85b18 --- /dev/null +++ b/cs/3rd party/libogg/symbian/ogg.mmp @@ -0,0 +1,39 @@ +/* + Copyright (C) 2003 Commonwealth Scientific and Industrial Research + Organisation (CSIRO) Australia + + 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 CSIRO Australia 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 ORGANISATION 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. +*/ + +TARGET ogg.lib +TARGETTYPE lib +UID 0 +SOURCEPATH ..\src +SOURCE bitwise.c framing.c +USERINCLUDE . +SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\include . diff --git a/cs/3rd party/libogg/win32/.gitignore b/cs/3rd party/libogg/win32/.gitignore new file mode 100644 index 000000000..2655daf30 --- /dev/null +++ b/cs/3rd party/libogg/win32/.gitignore @@ -0,0 +1,21 @@ +# Visual Studio ignores +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +*.manifest +*.lastbuildstate +*.exe +*.log +*.idb +*.ipdb +*.ilk +*.iobj +*.obj +*.pdb +*.sdf +*.suo +*.tlog +*.vcxproj.user +*.vc.db +*.vc.opendb diff --git a/cs/3rd party/libogg/win32/VS2015/libogg_dynamic.sln b/cs/3rd party/libogg/win32/VS2015/libogg_dynamic.sln new file mode 100644 index 000000000..be96c403d --- /dev/null +++ b/cs/3rd party/libogg/win32/VS2015/libogg_dynamic.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libogg", "libogg_dynamic.vcxproj", "{15CBFEFF-7965-41F5-B4E2-21E8795C9159}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Debug|Win32.ActiveCfg = Debug|Win32 + {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Debug|Win32.Build.0 = Debug|Win32 + {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Debug|x64.ActiveCfg = Debug|x64 + {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Debug|x64.Build.0 = Debug|x64 + {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Release|Win32.ActiveCfg = Release|Win32 + {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Release|Win32.Build.0 = Release|Win32 + {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Release|x64.ActiveCfg = Release|x64 + {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/cs/3rd party/libogg/win32/VS2015/libogg_dynamic.vcxproj b/cs/3rd party/libogg/win32/VS2015/libogg_dynamic.vcxproj new file mode 100644 index 000000000..c620cd8f3 --- /dev/null +++ b/cs/3rd party/libogg/win32/VS2015/libogg_dynamic.vcxproj @@ -0,0 +1,187 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + libogg + {15CBFEFF-7965-41F5-B4E2-21E8795C9159} + libogg + Win32Proj + + + + DynamicLibrary + Unicode + true + v120 + + + DynamicLibrary + Unicode + v120 + + + DynamicLibrary + Unicode + true + v120 + + + DynamicLibrary + Unicode + v120 + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionName)\$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionName)\$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + + + + Disabled + ..\..\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBOGG_EXPORTS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + ProgramDatabase + CompileAsC + Cdecl + + + ..\ogg.def + + + + + X64 + + + Disabled + ..\..\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBOGG_EXPORTS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + ProgramDatabase + CompileAsC + Cdecl + + + ..\ogg.def + + + + + MaxSpeed + AnySuitable + true + Speed + ..\..\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBOGG_EXPORTS;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + + + Level4 + + + CompileAsC + 4244;%(DisableSpecificWarnings) + Cdecl + + + ..\ogg.def + + + + + X64 + + + MaxSpeed + AnySuitable + true + Speed + ..\..\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBOGG_EXPORTS;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + + + Level4 + + + CompileAsC + 4244;%(DisableSpecificWarnings) + Cdecl + + + ..\ogg.def + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cs/3rd party/libogg/win32/VS2015/libogg_static.sln b/cs/3rd party/libogg/win32/VS2015/libogg_static.sln new file mode 100644 index 000000000..f62ba927e --- /dev/null +++ b/cs/3rd party/libogg/win32/VS2015/libogg_static.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libogg_static", "libogg_static.vcxproj", "{15CBFEFF-7965-41F5-B4E2-21E8795C9159}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Debug|Win32.ActiveCfg = Debug|Win32 + {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Debug|Win32.Build.0 = Debug|Win32 + {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Debug|x64.ActiveCfg = Debug|x64 + {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Debug|x64.Build.0 = Debug|x64 + {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Release|Win32.ActiveCfg = Release|Win32 + {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Release|Win32.Build.0 = Release|Win32 + {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Release|x64.ActiveCfg = Release|x64 + {15CBFEFF-7965-41F5-B4E2-21E8795C9159}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/cs/3rd party/libogg/win32/VS2015/libogg_static.vcxproj b/cs/3rd party/libogg/win32/VS2015/libogg_static.vcxproj new file mode 100644 index 000000000..b2b99a886 --- /dev/null +++ b/cs/3rd party/libogg/win32/VS2015/libogg_static.vcxproj @@ -0,0 +1,174 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {15CBFEFF-7965-41F5-B4E2-21E8795C9159} + libogg + Win32Proj + + + + StaticLibrary + Unicode + true + v140 + + + StaticLibrary + Unicode + v140 + + + StaticLibrary + Unicode + true + v140 + + + StaticLibrary + Unicode + v140 + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionName)\$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(Configuration)\ + $(SolutionName)\$(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + + + + Disabled + ..\..\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBOGG_EXPORTS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebug + + + Level4 + EditAndContinue + CompileAsC + Cdecl + + + + + X64 + + + Disabled + ..\..\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBOGG_EXPORTS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebug + + + Level4 + ProgramDatabase + CompileAsC + Cdecl + + + + + MaxSpeed + AnySuitable + true + Speed + ..\..\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBOGG_EXPORTS;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + + + Level4 + + + CompileAsC + 4244;%(DisableSpecificWarnings) + Cdecl + + + + + X64 + + + MaxSpeed + AnySuitable + true + Speed + ..\..\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBOGG_EXPORTS;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + + + Level4 + + + CompileAsC + 4244;%(DisableSpecificWarnings) + Cdecl + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cs/3rd party/libogg/win32/ogg.def b/cs/3rd party/libogg/win32/ogg.def new file mode 100644 index 000000000..744d6bed6 --- /dev/null +++ b/cs/3rd party/libogg/win32/ogg.def @@ -0,0 +1,78 @@ +; $Id$ +; +; ogg.def +; +LIBRARY +EXPORTS +; +oggpack_writeinit +oggpack_writetrunc +oggpack_writealign +oggpack_writecopy +oggpack_reset +oggpack_writeclear +oggpack_readinit +oggpack_write +oggpack_look +oggpack_look1 +oggpack_adv +oggpack_adv1 +oggpack_read +oggpack_read1 +oggpack_bytes +oggpack_bits +oggpack_get_buffer +; +oggpackB_writeinit +oggpackB_writetrunc +oggpackB_writealign +oggpackB_writecopy +oggpackB_reset +oggpackB_writeclear +oggpackB_readinit +oggpackB_write +oggpackB_look +oggpackB_look1 +oggpackB_adv +oggpackB_adv1 +oggpackB_read +oggpackB_read1 +oggpackB_bytes +oggpackB_bits +oggpackB_get_buffer +; +ogg_stream_packetin +ogg_stream_pageout +ogg_stream_flush +; +ogg_sync_init +ogg_sync_clear +ogg_sync_reset +ogg_sync_destroy +ogg_sync_buffer +ogg_sync_wrote +ogg_sync_pageseek +ogg_sync_pageout +ogg_stream_pagein +ogg_stream_packetout +ogg_stream_packetpeek +; +ogg_stream_init +ogg_stream_clear +ogg_stream_reset +ogg_stream_reset_serialno +ogg_stream_destroy +ogg_stream_eos +; +ogg_page_checksum_set +ogg_page_version +ogg_page_continued +ogg_page_bos +ogg_page_eos +ogg_page_granulepos +ogg_page_serialno +ogg_page_pageno +ogg_page_packets +ogg_packet_clear + + diff --git a/cs/3rd party/libogg_static.vcxproj b/cs/3rd party/libogg_static.vcxproj new file mode 100644 index 000000000..016e5c13a --- /dev/null +++ b/cs/3rd party/libogg_static.vcxproj @@ -0,0 +1,156 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Mixed + Win32 + + + Mixed + x64 + + + Release + Win32 + + + Release + x64 + + + + {15CBFEFF-7965-41F5-B4E2-21E8795C9159} + libogg + Win32Proj + 8.1 + + + + StaticLibrary + MultiByte + true + v140 + + + StaticLibrary + MultiByte + v141 + + + StaticLibrary + MultiByte + v141 + + + StaticLibrary + MultiByte + true + v141 + + + StaticLibrary + MultiByte + v141 + + + StaticLibrary + MultiByte + v141 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + libogg\include;%(AdditionalIncludeDirectories) + _USRDLL;LIBOGG_EXPORTS;%(PreprocessorDefinitions) + NotUsing + StreamingSIMDExtensions2 + + + + + libogg\include;%(AdditionalIncludeDirectories) + _USRDLL;LIBOGG_EXPORTS;%(PreprocessorDefinitions) + NotUsing + + + + + libogg\include;%(AdditionalIncludeDirectories) + _USRDLL;LIBOGG_EXPORTS;%(PreprocessorDefinitions) + NotUsing + + + + + libogg\include;%(AdditionalIncludeDirectories) + _USRDLL;LIBOGG_EXPORTS;%(PreprocessorDefinitions) + NotUsing + + + + + libogg\include;%(AdditionalIncludeDirectories) + _USRDLL;LIBOGG_EXPORTS;%(PreprocessorDefinitions) + NotUsing + StreamingSIMDExtensions2 + Speed + + + + + libogg\include;%(AdditionalIncludeDirectories) + _USRDLL;LIBOGG_EXPORTS;%(PreprocessorDefinitions) + 4244;%(DisableSpecificWarnings) + NotUsing + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cs/3rd party/libtheora/.gitignore b/cs/3rd party/libtheora/.gitignore new file mode 100644 index 000000000..9f9459c43 --- /dev/null +++ b/cs/3rd party/libtheora/.gitignore @@ -0,0 +1,72 @@ +Makefile +Makefile.in +*.m4 +autom4te.cache +config.guess +config.h +config.h.in +config.log +config.status +config.sub +configure +depcomp +install-sh +ltmain.sh +missing +libtool +stamp-h1 +.deps +.libs +*.o +*.lo +*.la +*.sw* +*~ +*.pc + +compile +libtheora.spec +test-driver +lib/arm/armopts.s + +doc/Doxyfile +doc/doxygen-build.stamp +doc/libtheora/ +doc/spec/vp3huff +doc/spec/Theora.pdf +doc/spec/fdct.pdf +doc/spec/hilbert-block.pdf +doc/spec/hilbert-mb.pdf +doc/spec/idct.pdf +doc/spec/lflim.pdf +doc/spec/macroblock.pdf +doc/spec/pic-frame.pdf +doc/spec/pic_even.pdf +doc/spec/pic_even_odd.pdf +doc/spec/pic_odd.pdf +doc/spec/pic_odd_even.pdf +doc/spec/pixel420.pdf +doc/spec/pixel422.pdf +doc/spec/pixel444.pdf +doc/spec/raster-block.pdf +doc/spec/reference-frames.pdf +doc/spec/spec.aux +doc/spec/spec.bbl +doc/spec/spec.blg +doc/spec/spec.lof +doc/spec/spec.log +doc/spec/spec.lot +doc/spec/spec.out +doc/spec/spec.toc +doc/spec/superblock.pdf +doc/spec/vp3huff.aux +doc/spec/vp3huff.tex +doc/spec/xifish.pdf + +examples/dump_psnr +examples/dump_video +examples/libtheora_info +examples/encoder_example +examples/player_example +examples/png2theora +examples/tiff2theora diff --git a/cs/3rd party/libtheora/AUTHORS b/cs/3rd party/libtheora/AUTHORS new file mode 100644 index 000000000..8a4e529b5 --- /dev/null +++ b/cs/3rd party/libtheora/AUTHORS @@ -0,0 +1,56 @@ +Monty + - Original VP3 port + +Timothy B. Terriberry +Gregory Maxwell +Ralph Giles +Monty + - Ongoing development + +Dan B. Miller + - Pre alpha3 development + +Rudolf Marek +Wim Tayman +Dan Lenski +Nils Pipenbrinck +Monty + - MMX optimized functions + +David Schleef + - C64x port + +Aaron Colwell +Thomas Vander Stichele +Jan Gerber +Conrad Parker +Cristian Adam +Sebastian Pippin +Simon Hosie +Brad Smith + - Bug fixes, enhancements, build systems. + +Mauricio Piacentini + - Original win32 projects and example ports + - VP3->Theora transcoder + +Silvia Pfeiffer + - Figures for the spec + +Michael Smith +Andre Pang +calc +Chris Cheney +Brendan Cully +Edward Hervey +Adam Moss +Colin Ward +Jeremy C. Reed +Arc Riley +Rodolphe Ortalo + - Bug fixes + +Robin Watts + - ARM code optimisations + +and other Xiph.org contributors diff --git a/cs/3rd party/libtheora/CHANGES b/cs/3rd party/libtheora/CHANGES new file mode 100644 index 000000000..fb09793a3 --- /dev/null +++ b/cs/3rd party/libtheora/CHANGES @@ -0,0 +1,255 @@ +libteora 1.2.0alpha1 (2010 September 23) + +- New 'ptalarbvorm' encoder with better rate/distortion optimization +- New th_encode_ctl option for copying configuration from an existing + setup header, useful for splicing streams. +- Returns TH_DUPFRAME in more cases. +- Add ARM optimizations +- Add TI C64x+ DSP optimizations +- Other performance improvements +- Rename speedlevel 2 to 3 and provide a new speedlevel 2 +- Various minor bug fixes + +libtheora 1.1.2 (unreleased snapshot) + + - Fix Huffman table decoding with OC_HUFF_SLUSH is set to 0 + - Fix a frame size bug in player_example + - Add support for passing a buffer the size of the picture + region, rather than a full padded frame to th_encode_ycbcr_in() + as was possible with the legacy pre-1.0 API. + - 4:4:4 support in player_example using software yuv->rgb + - Better rgb->yuv conversion in png2theora + - Clean up warnings and local variables + - Build and documentation fixes + +libtheora 1.1.1 (2009 October 1) + + - Fix problems with MSVC inline assembly + - Add the missing encoder_disabled.c to the distribution + - build updates: autogen.sh should work better after switching systems + and the MSVC project now defaults to the dynamic runtime library + - Namespace some variables to avoid conflicts on wince. + +libtheora 1.1.0 (2009 September 24) + + - Fix various small issues with the example and telemetry code + - Fix handing a zero-byte packet as the first frame + - Documentation cleanup + - Two minor build fixes + +libtheora 1.1beta3 (2009 August 22) + + - Rate control fixes to smooth quality + - MSVC build now exports all of the 1.0 api + - Assorted small bug fixes + +libtheora 1.1beta2 (2009 August 12) + + - Fix a rate control problem with difficult input + - Build fixes for OpenBSD and Apple Xcode + - Examples now all use the 1.0 api + - TH_ENCCTL_SET_SPLEVEL works again + - Various bug fixes and source tree rearrangement + +libtheora 1.1beta1 (2009 August 5) + + - Support for two-pass encoding + - Performance optimization of both encoder and decoder + - Encoder supports dynamic adjustment of quality and + bitrate targets + - Encoder is generally more configurable, and all + rate control modes perform better + - Encoder now accepts 4:2:2 and 4:4:4 chroma sampling + - Decoder telemetry output shows quantization choice + and a breakdown of bitrate usage in the frame + - MSVC assembly optimizations up to date and functional + +libtheora 1.1alpha2 (2009 May 26) + + - Reduce lambda for small quantizers. + - New encoder fDCT does better on smooth gradients + - Use SATD for mode decisions (1-2% bitrate reduction) + - Assembly rewrite for new features and general speed up + - Share code between the encoder and decoder for performance + - Fix 4:2:2 decoding and telemetry + - MSVC project files updated, but assembly is disabled. + - New configure option --disable-spec to work around toolchain + detection failures. + - Limit symbol exports on MacOS X. + - Port remaining unit tests from the 1.0 release. + +libtheora 1.1alpha1 (2009 March 27) + + - Encoder rewrite with much improved vbr quality/bitrate and + better tracking of the target rate in cbr mode. + - MSVC project files do not work in this release. + +libtheora 1.0 (2008 November 3) + + - Merge x86 assembly for forward DCT from Thusnelda branch. + - Update 32 bit MMX with loop filter fix. + - Check for an uninitialized state before dereferencing in propagating + decode calls. + - Remove all TH_DEBUG statements. + - Rename the bitpacker source files copied from libogg to avoid + confusing simple build systems using both libraries. + - Declare bitfield entries to be explicitly signed for Solaris cc. + - Set quantization parameters to default values when an empty buffer is + passed with TH_ENCCTL_SET_QUANT_PARAMS. + - Split encoder and decoder tests depending on configure settings. + - Return lstylex.sty to the distribution. + - Disable inline assembly on gcc versions prior to 3.1. + - Remove extern references for OC_*_QUANT_MIN. + - Make various data tables static const so they can be read-only. + - Remove ENCCTL codes from the old encoder API. + - Implement TH_ENCCTL_SET_KEYFRAME_FREQUENCY_FORCE ctl. + - Fix segfault when exactly one of the width or height is not a multiple + of 16, but the other is. + - Compute the correct vertical offset for chroma. + - cpuid assembly fix for MSVC. + - Add VS2008 project files. + - Build updates for 64-bit platforms, Mingw32, VS and XCode. + - Do not clobber the cropping rectangle. + - Declare ourselves 1.0final to pkg-config to sort after beta releases. + - Fix the scons build to include asm in libtheoradec/enc. + +libtheora 1.0beta3 (2008 April 16) + + - Build new libtheoradec and libtheoraenc libraries + supporting the new API from theora-exp. This API should + not be considered stable yet. + - Change granule_frame() to return an index as documented. + This is a change of behaviour from 1.0beta1. + - Document that granule_time() returns the end of the + presentation interval. + - Use a custom copy of the libogg bitpacker in the decoder + to avoid function call overhead. + - MMX code improved and ported to MSVC. + - Fix a problem with the MMX code on SELinux. + - Fix a problem with decoder quantizer initialization. + - Fix a page queue problem with png2theora. + - Improved robustness. + - Updated VS2005 project files. + - Dropped build support for Microsoft VS2003. + - Dropped build support for the unreleased libogg2. + - Added the specification to the autotools build. + - Specification corrections. + +libtheora 1.0beta2 (2007 October 12) + + - Fix a crash bug on char-is-unsigned architectures (PowerPC) + - Fix a buffer sizing issue that caused rare encoder crashes + - Fix a buffer alignment issue + - Build fixes for MingW32, MSVC + - Improved format documentation. + +libtheora 1.0beta1 (2007 September 22) + + - Granulepos scheme modified to match other codecs. This bumps + the bitstream revision to 3.2.1. Bitstreams marked 3.2.0 are + handled correctly by this decoder. Older decoders will show + a one frame sync error in the less noticeable direction. + +libtheora 1.0alpha8 (2007 September 18) + + - Switch to new spec compliant decoder from theora-exp branch. + Written by Dr. Timothy Terriberry. + - Add support to the encoder for using quantization settings + provided by the application. + - more assembly optimizations + +libtheora 1.0alpha7 (2006 June 20) + + - Enable mmx assembly by default + - Avoid some relocations that caused problems on SELinux + - Other build fixes + - time testing mode (-f) for the dump_video example + +libtheora 1.0alpha6 (2006 May 30) + + * Merge theora-mmx simd acceleration (x86_32 and x86_64) + * Major RTP payload specification update + * Minor format specification updates + * Fix some spurious calls to free() instead of _ogg_free() + * Fix invalid array indexing in PixelLineSearch() + * Improve robustness against invalid input + * General warning cleanup + * The offset_y member now means what every application thought it meant + (offset from the top). This will mean some old files (those with a + non-centered image created with a buggy encoder) will display differently. + +libtheora 1.0alpha5 (2005 August 20) + + * Fixed bitrate management bugs that caused popping and encode + errors + * Fixed a crash problem with the theora_state internals not + being intialized properly. + * new utility function: + - theora_granule_shift() + * dump_video example now makes YUV4MPEG files by default, so + the results can be fed back to encoder_example and similar + tools. The old behavior is restored through the '-r' switch. + * ./configure now prints a summary + * simple unit test of the comment api under 'make check' + * misc code cleanup, warning and leak fixes + +libtheora 1.0alpha4 (2004 December 15) + + * first draft of the Theora I Format Specification + * API documentation generated from theora.h with Doxygen + * fix a double-update bug in the motion analysis + * apply the loop filter before filling motion vector border + in the reference frame + * new utility functions: + - theora_packet_isheader(), + - theora_packet_iskeyframe() + - theora_granule_frame() + * optional support for building without floating point + * optional support for building without encode support + * various build and packaging fixes + * pkg-config support + * SymbianOS build support + +libtheora 1.0alpha3 (2004 March 20) + + UPDATE: on 2004 July 1 the Theora I bitstream format was frozen. Files + produced by the libtheora 1.0alpha3 reference encoder will always be + decodable by the Theora I spec. + + * Bitstream info header FORMAT CHANGES: + - move the granulepos shift field to maintain byte alignment longer. + - reserve 5 additional bits for subsampling and interlace flags. + * Bitstream setup header FORMAT CHANGES: + - support for a range of interpolated quant matricies. + - include the in-loop block filter coeff. + * Bitsteam data packet FORMAT CHANGES: + - Reserve a bit for per-block Q index selection. + - Flip the coded image orientation for compatibility with VP3. + This allows lossless transcoding of VP3 content, but files + encoded with earlier theora releases would play upside down. + * example VP3 lossless transcoder + * optional support for libogg2 + * timing improvements in the example player + * packaging and build system updates and fixes + +libtheora 1.0alpha2 (2003 June 9) + + * bitstream FORMAT CHANGES: + - store the quant tables in a third setup header for + future encoder flexibility + - store the huffman tables in the third setup header + - add a field for marking the colorspace to the info header + - add crop parameters for non-multiple-of-16 frame sizes + - add a second vorbiscomment-style metadata header + * API changes to handle multiple headers with a single + theora_decode_header() call, like libvorbis + * code cleanup and minor fixes + * new dump_video code example/utility + * experimental win32 code examples + +libtheora 1.0alpha1 (2002 September 25) + + * First release of the theora reference implementation + * Port of the newly opened VP3 code to the Ogg container + * Rewrite of the code for portability and to use the libogg bitpacker + diff --git a/cs/3rd party/libtheora/COPYING b/cs/3rd party/libtheora/COPYING new file mode 100644 index 000000000..c8ccce4ff --- /dev/null +++ b/cs/3rd party/libtheora/COPYING @@ -0,0 +1,28 @@ +Copyright (C) 2002-2009 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/cs/3rd party/libtheora/LICENSE b/cs/3rd party/libtheora/LICENSE new file mode 100644 index 000000000..97e843179 --- /dev/null +++ b/cs/3rd party/libtheora/LICENSE @@ -0,0 +1,18 @@ +Please see the file COPYING for the copyright license for this software. + +In addition to and irrespective of the copyright license associated +with this software, On2 Technologies, Inc. makes the following statement +regarding technology used in this software: + + On2 represents and warrants that it shall not assert any rights + relating to infringement of On2's registered patents, nor initiate + any litigation asserting such rights, against any person who, or + entity which utilizes the On2 VP3 Codec Software, including any + use, distribution, and sale of said Software; which make changes, + modifications, and improvements in said Software; and to use, + distribute, and sell said changes as well as applications for other + fields of use. + +This reference implementation is originally derived from the On2 VP3 +Codec Software, and the Theora video format is essentially compatible +with the VP3 video format, consisting of a backward-compatible superset. diff --git a/cs/3rd party/libtheora/Makefile.am b/cs/3rd party/libtheora/Makefile.am new file mode 100644 index 000000000..17838573e --- /dev/null +++ b/cs/3rd party/libtheora/Makefile.am @@ -0,0 +1,35 @@ +## Process this file with automake to produce Makefile.in + +#Old options: these should still work if you don't have automake 1.11 yet. +#AUTOMAKE_OPTIONS = foreign 1.7 dist-zip dist-bzip2 +AUTOMAKE_OPTIONS = foreign 1.11 dist-zip dist-xz + +ACLOCAL_AMFLAGS=-I m4 + +if THEORA_ENABLE_EXAMPLES +EXAMPLES_DIR = examples +else +EXAMPLES_DIR = +endif + +SUBDIRS = lib include doc tests m4 $(EXAMPLES_DIR) + + +EXTRA_DIST = \ + README CHANGES COPYING LICENSE \ + autogen.sh win32 macosx symbian SConstruct \ + libtheora.spec libtheora.spec.in \ + theora-uninstalled.pc.in + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = theora.pc theoradec.pc theoraenc.pc + +# Remove the .svn folders included in the tarball +dist-hook: + find $(distdir) -type d -name '.svn' | xargs rm -rf + +debug: + $(MAKE) all CFLAGS="@DEBUG@" + +profile: + $(MAKE) all CFLAGS="@PROFILE@" diff --git a/cs/3rd party/libtheora/README b/cs/3rd party/libtheora/README new file mode 100644 index 000000000..3e0d5bd27 --- /dev/null +++ b/cs/3rd party/libtheora/README @@ -0,0 +1,156 @@ +------------------------------------------------------------------------- + The Xiph.org Foundation's libtheora 1.2 +------------------------------------------------------------------------- + +*** What is Theora? + +Theora is Xiph.Org's first publicly released video codec, intended +for use within the Foundation's Ogg multimedia streaming system. +Theora is derived directly from On2's VP3 codec, adds new features +while allow it a longer useful lifetime as an competitive codec. + +The 1.0 release decoder supported all the new features, but the +encoder is nearly identical to the VP3 code. + +The 1.1 release featured a completely rewritten encoder, offering +better performance and compression, and making more complete use +of the format's feature set. + +The 1.2 release features significant additional improvements in +compression and performance. Files produced by newer encoders can +be decoded by earlier releases. + +*** Where is Theora? + +Theora's main site is www.theora.org. Theora and related libraries +can be gotten from www.theora.org or the main Xiph.Org site at +www.xiph.org. Development source is kept in an open subversion +repository, see http://theora.org/svn/ for instructions. + +------------------------------------------------------------------------- +Getting started with the code +------------------------------------------------------------------------- + +*** What do I need to build the source? + +Requirements summary: + + For libtheora: + + libogg 1.1 or newer. + + For example encoder: + + as above, + + libvorbis and libvorbisenc 1.0.1 or newer. + (libvorbis 1.3.1 or newer for 5.1 audio) + + For creating a source distribution package: + + as above, + + Doxygen to build the API documentation, + pdflatex and fig2dev to build the format specification + (transfig package in Ubuntu). + + For the player only: + + as above, + + SDL (Simple Direct media Layer) libraries and headers, + OSS audio driver and development headers. + +The provided build system is the GNU automake/autoconf system, and +the main library, libtheora, should already build smoothly on any +system. Failure of libtheora to build on a GNU-enabled system is +considered a bug; please report problems to theora-dev@xiph.org. + +Windows build support is included in the win32 directory. + +Project files for Apple XCode are included in the macosx directory. + +There is also a more limited scons build. + +*** How do I use the sample encoder? + +The sample encoder takes raw video in YUV4MPEG2 format, as used by +lavtools, mjpeg-tools and other packages. The encoder expects audio, +if any, in a separate wave WAV file. Try 'encoder_example -h' for a +complete list of options. + +An easy way to get raw video and audio files is to use MPlayer as an +export utility. The options " -ao pcm -vo yuv4mpeg " will export a +wav file named audiodump.wav and a YUV video file in the correct +format for encoder_example as stream.yuv. Be careful when exporting +video alone; MPlayer may drop frames to 'keep up' with the audio +timer. The example encoder can't properly synchronize input audio and +video file that aren't in sync to begin with. + +The encoder will also take video or audio on stdin if '-' is specified +as the input file name. + +There is also a 'png2theora' example which accepts a set of image +files in that format. + +*** How do I use the sample player? + +The sample player takes an Ogg file on standard in; the file may be +audio alone, video alone or video with audio. + +*** What other tools are available? + +The programs in the examples directory are intended as tutorial source +for developers using the library. As such they sacrifice features and +robustness in the interests of comprehension and should not be +considered serious applications. + +If you're wanting to just use theora, consider the programs linked +from http://www.theora.org/. There is playback support in a number +of common free players, and plugins for major media frameworks. +Jan Gerber's ffmpeg2theora is an excellent encoding front end. + +------------------------------------------------------------------------- +Troubleshooting the build process +------------------------------------------------------------------------- + +*** Compile error, such as: + +encoder_internal.h:664: parse error before `ogg_uint16_t' + +This means you have version of libogg prior to 1.1. A *complete* new Ogg +install, libs and headers is needed. + +Also be sure that there aren't multiple copies of Ogg installed in +/usr and /usr/local; an older one might be first on the search path +for libs and headers. + +*** Link error, such as: + +undefined reference to `oggpackB_stream' + +See above; you need libogg 1.1 or later. + +*** Link error, such as: + +undefined reference to `vorbis_granule_time' + +You need libvorbis and libvorbisenc from the 1.0.1 release or later. + +*** Link error, such as: + +/usr/lib/libSDL.a(SDL_esdaudio.lo): In function `ESD_OpenAudio': +SDL_esdaudio.lo(.text+0x25d): undefined reference to `esd_play_stream' + +Be sure to use an SDL that's built to work with OSS. If you use an +SDL that is also built with ESD and/or ALSA support, it will try to +suck in all those extra libraries at link time too. That will only +work if the extra libraries are also installed. + +*** Link warning, such as: + +libtool: link: warning: library `/usr/lib/libogg.la' was moved. +libtool: link: warning: library `/usr/lib/libogg.la' was moved. + +Re-run theora/autogen.sh after an Ogg or Vorbis rebuild/reinstall + diff --git a/cs/3rd party/libtheora/SConstruct b/cs/3rd party/libtheora/SConstruct new file mode 100644 index 000000000..a22e557a7 --- /dev/null +++ b/cs/3rd party/libtheora/SConstruct @@ -0,0 +1,262 @@ +# see http://www.scons.org if you do not have this tool +from os.path import join +import SCons + +# TODO: should use lamda and map to work on python 1.5 +def path(prefix, list): return [join(prefix, x) for x in list] + +encoder_sources = """ + apiwrapper.c + fragment.c + idct.c + internal.c + state.c + quant.c + analyze.c + encfrag.c + encapiwrapper.c + encinfo.c + encode.c + enquant.c + fdct.c + huffenc.c + mathops.c + mcenc.c + rate.c + tokenize.c +""" + +decoder_sources = """ + apiwrapper.c + bitpack.c + decapiwrapper.c + decinfo.c + decode.c + dequant.c + fragment.c + huffdec.c + idct.c + info.c + internal.c + quant.c + state.c +""" + +env = Environment() +if env['CC'] == 'gcc': + env.Append(CCFLAGS=["-g", "-O2", "-Wall", "-Wno-parentheses"]) + +# pass collect_metrics=1 on the scons command line +# to enable metrics collection for mode training. +collect_metrics = ARGUMENTS.get('collect_metrics', 0) +if int(collect_metrics): + env.Append(CPPDEFINES=['OC_COLLECT_METRICS']) + env.Append(LIBS=['m']) + +def CheckPKGConfig(context, version): + context.Message( 'Checking for pkg-config... ' ) + ret = context.TryAction('pkg-config --atleast-pkgconfig-version=%s' % version)[0] + context.Result( ret ) + return ret + +def CheckPKG(context, name): + context.Message( 'Checking for %s... ' % name ) + ret = context.TryAction('pkg-config --exists %s' % name)[0] + context.Result( ret ) + return ret + +def CheckSDL(context): + name = "sdl-config" + context.Message( 'Checking for %s... ' % name ) + ret = SCons.Util.WhereIs('sdl-config') + context.Result( ret ) + return ret + +# check for appropriate inline asm support +host_x86_32_test = """ + int main(int argc, char **argv) { +#if !defined(__i386__) + #error not an x86 host: preprocessor macro __i386__ not defined +#endif + return 0; + } + """ +def CheckHost_x86_32(context): + context.Message('Checking for an x86 host...') + result = context.TryCompile(host_x86_32_test, '.c') + context.Result(result) + return result + +host_x86_64_test = """ + int main(int argc, char **argv) { +#if !defined(__x86_64__) + #error not an x86_64 host: preprocessor macro __x86_64__ not defined +#endif + return 0; + } + """ +def CheckHost_x86_64(context): + context.Message('Checking for an x86_64 host...') + result = context.TryCompile(host_x86_64_test, '.c') + context.Result(result) + return result + +conf = Configure(env, custom_tests = { + 'CheckPKGConfig' : CheckPKGConfig, + 'CheckPKG' : CheckPKG, + 'CheckSDL' : CheckSDL, + 'CheckHost_x86_32' : CheckHost_x86_32, + 'CheckHost_x86_64' : CheckHost_x86_64, + }) + +if not conf.CheckPKGConfig('0.15.0'): + print 'pkg-config >= 0.15.0 not found.' + Exit(1) + +if not conf.CheckPKG('ogg'): + print 'libogg not found.' + Exit(1) + +if conf.CheckPKG('vorbis vorbisenc'): + have_vorbis=True +else: + have_vorbis=False + +if conf.CheckPKG('libpng'): + have_libpng=True +else: + have_libpng=False + +build_player_example=True +if not conf.CheckHeader('sys/soundcard.h'): + build_player_example=False +if build_player_example and not conf.CheckSDL(): + build_player_example=False + +if conf.CheckHost_x86_32(): + env.Append(CPPDEFINES='OC_X86_ASM') + decoder_sources += """ + x86/x86cpu.c + x86/mmxidct.c + x86/mmxfrag.c + x86/mmxstate.c + x86/sse2idct.c + x86/x86state.c + """ + encoder_sources += """ + x86/x86cpu.c + x86/mmxencfrag.c + x86/mmxfdct.c + x86/x86enc.c + x86/x86enquant.c + x86/sse2encfrag.c + x86/mmxfrag.c + x86/mmxidct.c + x86/mmxstate.c + x86/x86state.c + """ +elif conf.CheckHost_x86_64(): + env.Append(CPPDEFINES=['OC_X86_ASM', 'OC_X86_64_ASM']) + decoder_sources += """ + x86/x86cpu.c + x86/mmxidct.c + x86/mmxfrag.c + x86/mmxstate.c + x86/sse2idct.c + x86/x86state.c + """ + encoder_sources += """ + x86/x86cpu.c + x86/mmxencfrag.c + x86/mmxfdct.c + x86/x86enc.c + x86/x86enquant.c + x86/sse2fdct.c + x86/mmxfrag.c + x86/mmxidct.c + x86/mmxstate.c + x86/x86state.c + x86/sse2encfrag.c + """ + +env = conf.Finish() + +env.Append(CPPPATH=['include']) +env.ParseConfig('pkg-config --cflags --libs ogg') + +libtheoradec_Sources = Split(decoder_sources) +libtheoraenc_Sources = Split(encoder_sources) + +libtheoradec_a = env.Library('lib/theoradec', + path('lib', libtheoradec_Sources)) +libtheoradec_so = env.SharedLibrary('lib/theoradec', + path('lib', libtheoradec_Sources)) + +libtheoraenc_a = env.Library('lib/theoraenc', + path('lib', libtheoraenc_Sources)) +libtheoraenc_so = env.SharedLibrary('lib/theoraenc', + path('lib', libtheoraenc_Sources) + [libtheoradec_so]) + +#installing +prefix='/usr' +lib_dir = prefix + '/lib' +env.Alias('install', prefix) +env.Install(lib_dir, [libtheoradec_a, libtheoradec_so]) +env.Install(lib_dir, [libtheoraenc_a, libtheoraenc_so]) + +# example programs +dump_video = env.Clone() +dump_video_Sources = Split("""dump_video.c ../lib/libtheoradec.a""") +dump_video.Program('examples/dump_video', path('examples', dump_video_Sources)) + +dump_psnr = env.Clone() +dump_psnr.Append(LIBS='m') +dump_psnr_Sources = Split("""dump_psnr.c ../lib/libtheoradec.a""") +dump_psnr.Program('examples/dump_psnr', path('examples', dump_psnr_Sources)) + +libtheora_info = env.Clone() +libtheora_info_Sources = Split(""" + libtheora_info.c + ../lib/libtheoraenc.a + ../lib/libtheoradec.a + """) +libtheora_info.Program('examples/libtheora_info', + path('examples', libtheora_info_Sources)) + +if have_vorbis: + encex = dump_video.Clone() + encex.ParseConfig('pkg-config --cflags --libs vorbisenc vorbis') + encex.Append(LIBS=['m']) + encex_Sources = Split(""" + encoder_example.c + ../lib/libtheoraenc.a + ../lib/libtheoradec.a + """) + encex.Program('examples/encoder_example', path('examples', encex_Sources)) + + if build_player_example: + plyex = encex.Clone() + plyex_Sources = Split(""" + player_example.c + ../lib/libtheoradec.a + """) + plyex.ParseConfig('sdl-config --cflags --libs') + plyex.Append(LIBS=['m']) + plyex.Program('examples/player_example', path('examples', plyex_Sources)) + +png2theora = env.Clone() +png2theora_Sources = Split("""png2theora.c + ../lib/libtheoraenc.a + ../lib/libtheoradec.a +""") +png2theora.ParseConfig('pkg-config --cflags --libs libpng') +png2theora.Append(LIBS=['m']) +png2theora.Program('examples/png2theora', path('examples', png2theora_Sources)) + +tiff2theora = env.Clone() +tiff2theora_Sources = Split("""tiff2theora.c + ../lib/libtheoraenc.a + ../lib/libtheoradec.a +""") +tiff2theora.Append(LIBS=['tiff', 'm']) +tiff2theora.Program('examples/tiff2theora', path('examples', tiff2theora_Sources)) diff --git a/cs/3rd party/libtheora/autogen.sh b/cs/3rd party/libtheora/autogen.sh new file mode 100644 index 000000000..a26be1b1f --- /dev/null +++ b/cs/3rd party/libtheora/autogen.sh @@ -0,0 +1,130 @@ +#!/bin/sh +# Run this to set up the build system: configure, makefiles, etc. +# (based on the version in enlightenment's cvs) + +package="theora" + +ACLOCAL_FLAGS="-I m4" + +olddir=`pwd` +srcdir=`dirname $0` +test -z "$srcdir" && srcdir=. + +cd "$srcdir" +DIE=0 + +/bin/echo "checking for autoconf... " +(autoconf --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "You must have autoconf installed to compile $package." + echo "Download the appropriate package for your distribution," + echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" + DIE=1 +} + +VERSIONGREP="sed -e s/.*[^0-9\.]\([0-9][0-9]*\.[0-9][0-9]*\).*/\1/" +VERSIONMKMAJ="sed -e s/\([0-9][0-9]*\)[^0-9].*/\\1/" +VERSIONMKMIN="sed -e s/.*[0-9][0-9]*\.//" + +# do we need automake? +if test -r Makefile.am; then + AM_OPTIONS=`fgrep AUTOMAKE_OPTIONS Makefile.am` + AM_NEEDED=`echo $AM_OPTIONS | $VERSIONGREP` + if test x"$AM_NEEDED" = "x$AM_OPTIONS"; then + AM_NEEDED="" + fi + if test -z $AM_NEEDED; then + /bin/echo -n "checking for automake... " + AUTOMAKE=automake + ACLOCAL=aclocal + if ($AUTOMAKE --version < /dev/null > /dev/null 2>&1); then + /bin/echo "yes" + else + /bin/echo "no" + AUTOMAKE= + fi + else + /bin/echo -n "checking for automake $AM_NEEDED or later... " + majneeded=`echo $AM_NEEDED | $VERSIONMKMAJ` + minneeded=`echo $AM_NEEDED | $VERSIONMKMIN` + for am in automake-$AM_NEEDED automake$AM_NEEDED \ + automake automake-1.7 automake-1.8 automake-1.9 \ + automake-1.10 automake-1.11; do + ($am --version < /dev/null > /dev/null 2>&1) || continue + ver=`$am --version < /dev/null | head -n 1 | $VERSIONGREP` + maj=`echo $ver | $VERSIONMKMAJ` + min=`echo $ver | $VERSIONMKMIN` + if test $maj -eq $majneeded -a $min -ge $minneeded; then + AUTOMAKE=$am + /bin/echo $AUTOMAKE + break + fi + done + test -z $AUTOMAKE && /bin/echo "no" + /bin/echo -n "checking for aclocal $AM_NEEDED or later... " + for ac in aclocal-$AM_NEEDED aclocal$AM_NEEDED \ + aclocal aclocal-1.7 aclocal-1.8 aclocal-1.9 aclocal-1.10 aclocal-1.11; do + ($ac --version < /dev/null > /dev/null 2>&1) || continue + ver=`$ac --version < /dev/null | head -n 1 | $VERSIONGREP` + maj=`echo $ver | $VERSIONMKMAJ` + min=`echo $ver | $VERSIONMKMIN` + if test $maj -eq $majneeded -a $min -ge $minneeded; then + ACLOCAL=$ac + /bin/echo $ACLOCAL + break + fi + done + test -z $ACLOCAL && /bin/echo "no" + fi + test -z $AUTOMAKE || test -z $ACLOCAL && { + echo + echo "You must have automake installed to compile $package." + echo "Download the appropriate package for your distribution," + echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" + exit 1 + } +fi + +/bin/echo -n "checking for libtool... " +for LIBTOOLIZE in libtoolize glibtoolize nope; do + ($LIBTOOLIZE --version) < /dev/null > /dev/null 2>&1 && break +done +if test x$LIBTOOLIZE = xnope; then + /bin/echo "nope." + LIBTOOLIZE=libtoolize +else + /bin/echo $LIBTOOLIZE +fi +($LIBTOOLIZE --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "You must have libtool installed to compile $package." + echo "Download the appropriate package for your system," + echo "or get the source from one of the GNU ftp sites" + echo "listed in http://www.gnu.org/order/ftp.html" + DIE=1 +} + +if test "$DIE" -eq 1; then + exit 1 +fi + +if test -z "$*"; then + echo "I am going to run ./configure with no arguments - if you wish " + echo "to pass any to it, please specify them on the $0 command line." +fi + +/bin/echo "Generating configuration files for $package, please wait...." + +/bin/echo " $ACLOCAL $ACLOCAL_FLAGS" +$ACLOCAL $ACLOCAL_FLAGS || exit 1 +/bin/echo " $LIBTOOLIZE --automake --force" +$LIBTOOLIZE --automake --force || exit 1 +/bin/echo " autoheader" +autoheader || exit 1 +/bin/echo " $AUTOMAKE --add-missing $AUTOMAKE_FLAGS" +$AUTOMAKE --add-missing $AUTOMAKE_FLAGS || exit 1 +/bin/echo " autoconf" +autoconf || exit 1 + +cd $olddir +$srcdir/configure "$@" && /bin/echo diff --git a/cs/3rd party/libtheora/configure.ac b/cs/3rd party/libtheora/configure.ac new file mode 100644 index 000000000..cce4a325f --- /dev/null +++ b/cs/3rd party/libtheora/configure.ac @@ -0,0 +1,646 @@ +dnl Process this file with autoconf to produce a configure script + +dnl ------------------------------------------------ +dnl Initialization and Versioning +dnl ------------------------------------------------ + +AC_INIT([libtheora],[1.2.0alpha1+svn],[theora-dev@xiph.org]) + +AC_CANONICAL_HOST + +AC_CONFIG_SRCDIR([lib/fdct.c]) +AM_INIT_AUTOMAKE +AM_MAINTAINER_MODE([enable]) + +dnl we use doc_DATA in doc/Makefile.am which requires autoconf >= 2.60 +dnl to define docdir for us. +AC_PREREQ(2.60) + +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) + +dnl Library versioning +dnl CURRENT, REVISION, AGE +dnl - library source changed -> increment REVISION +dnl - interfaces added/removed/changed -> increment CURRENT, REVISION = 0 +dnl - interfaces added -> increment AGE +dnl - interfaces removed -> AGE = 0 + +TH_LIB_CURRENT=4 +TH_LIB_REVISION=0 +TH_LIB_AGE=4 +AC_SUBST(TH_LIB_CURRENT) +AC_SUBST(TH_LIB_REVISION) +AC_SUBST(TH_LIB_AGE) + +THDEC_LIB_CURRENT=2 +THDEC_LIB_REVISION=5 +THDEC_LIB_AGE=1 +AC_SUBST(THDEC_LIB_CURRENT) +AC_SUBST(THDEC_LIB_REVISION) +AC_SUBST(THDEC_LIB_AGE) + +THENC_LIB_CURRENT=3 +THENC_LIB_REVISION=0 +THENC_LIB_AGE=2 +AC_SUBST(THENC_LIB_CURRENT) +AC_SUBST(THENC_LIB_REVISION) +AC_SUBST(THENC_LIB_AGE) + +dnl Extra linker options (for version script) +THEORA_LDFLAGS="" + +dnl -------------------------------------------------- +dnl Check for programs +dnl -------------------------------------------------- + +AM_PROG_AS + +dnl save $CFLAGS since AC_PROG_CC likes to insert "-g -O2" +dnl if $CFLAGS is blank +cflags_save="$CFLAGS" +AC_PROG_CC +AC_PROG_CPP +CFLAGS="$cflags_save" + +AM_PROG_CC_C_O +AC_LIBTOOL_WIN32_DLL +LT_INIT + +dnl Add parameters for aclocal +AC_CONFIG_MACRO_DIR([m4]) + +dnl Check for doxygen +AC_ARG_ENABLE([doc], + AS_HELP_STRING([--disable-doc], [Do not build API documentation]), + [ac_enable_doc=$enableval], [ac_enable_doc=auto]) + +if test "x$ac_enable_doc" != "xno"; then + AC_CHECK_PROG(HAVE_DOXYGEN, doxygen, true, false) + + if test "x$HAVE_DOXYGEN" = "xfalse" -a "x$ac_enable_doc" = "xyes"; then + AC_MSG_ERROR([*** API documentation explicitly requested but Doxygen not found]) + fi +else + HAVE_DOXYGEN=false +fi +AM_CONDITIONAL(HAVE_DOXYGEN,$HAVE_DOXYGEN) +if test $HAVE_DOXYGEN = "false"; then + AC_MSG_WARN([*** doxygen not found, API documentation will not be built]) +fi + +dnl Check for tools used to build the format specification +BUILD_SPEC="false" +ac_build_spec=yes +AC_ARG_ENABLE(spec, + AS_HELP_STRING([--disable-spec], [Do not build the specification]), + [ + if test "x$enableval" = "xno"; then + ac_build_spec=$enableval + fi + ], [ + ac_build_spec=yes + ] ) +if test "x$ac_build_spec" = "xyes"; then + AC_CHECK_PROG(HAVE_PDFLATEX, pdflatex, yes) + AC_CHECK_PROG(HAVE_BIBTEX, bibtex, yes) + AC_CHECK_PROG(HAVE_TRANSFIG, fig2dev, yes) + if test -r doc/spec/spec.tex; then + if test "x$HAVE_PDFLATEX" = "xyes"; then + if test "x$HAVE_BIBTEX" = "xyes"; then + if test "x$HAVE_TRANSFIG" = "xyes"; then + tex_pkg_list=`fgrep usepackage doc/spec/spec.tex | grep \{ | grep -v ltablex` + tex_pkg_ok="yes" + for pkg_line in $tex_pkg_list; do + pkg_name=`echo $pkg_line | sed -e 's/.*{\(.*\)}.*/\1/'` + AC_MSG_CHECKING([for Tex package $pkg_name]) + cat >conftest.tex <<_ACEOF +\\documentclass{book} +$pkg_line +\\begin{document} +Hello World. +\\end{document} +_ACEOF + if pdflatex -interaction batchmode -halt-on-error conftest < /dev/null > /dev/null 2>&1; then + AC_MSG_RESULT([ok]) + else + tex_pkg_ok="no" + AC_MSG_RESULT([no]) + fi + done + if test -w conftest.tex; then rm conftest.tex; fi + if test -w conftest.tex; then rm conftest.aux; fi + if test -w conftest.pdf; then rm conftest.pdf; fi + if test "x$tex_pkg_ok" = "xyes"; then + BUILD_SPEC="true" + fi + fi + fi + fi + fi +fi +AM_CONDITIONAL(BUILD_SPEC, $BUILD_SPEC) +if test $BUILD_SPEC = "false"; then + AC_MSG_WARN([*** Format Specification will not built.]) +fi + +dnl Check for valgrind +VALGRIND_ENVIRONMENT="" +ac_enable_valgrind=no +AC_ARG_ENABLE(valgrind-testing, + AS_HELP_STRING([--enable-valgrind-testing], [Enable running of tests inside Valgrind]), + [ ac_enable_valgrind=$enableval ], [ ac_enable_valgrind=no] ) + +if test "x${ac_enable_valgrind}" = xyes ; then + if test "x${enable_shared}" = xyes ; then + VALGRIND_ENVIRONMENT="libtool --mode=execute " + fi + + AC_CHECK_PROG(HAVE_VALGRIND, valgrind, yes, no) + if test "x$HAVE_VALGRIND" = xyes ; then + VALGRIND_ENVIRONMENT="$VALGRIND_ENVIRONMENT valgrind -q --leak-check=yes --show-reachable=yes --num-callers=100" + AC_SUBST(VALGRIND_ENVIRONMENT) + TESTS_INFO="Type 'make check' to run test suite. Tests will be run under: + ${VALGRIND_ENVIRONMENT}" + else + TESTS_INFO="Type 'make check' to run test suite (Valgrind not found)" + fi +else + TESTS_INFO="Type 'make check' to run test suite (Valgrind testing not enabled)" +fi + +dnl -------------------------------------------------- +dnl Set build flags based on environment +dnl -------------------------------------------------- + +dnl Set some host options + +cflags_save="$CFLAGS" +if test -z "$GCC"; then + case $host in + *) + DEBUG="-g -DDEBUG" + CFLAGS="-O" + PROFILE="-g -p -DDEBUG" ;; + esac +else + + case $host in + *) + DEBUG="-g -Wall -Wno-parentheses -DDEBUG -D__NO_MATH_INLINES" + CFLAGS="-Wall -Wno-parentheses -O3 -fomit-frame-pointer -finline-functions -funroll-loops" + PROFILE="-Wall -Wno-parentheses -pg -g -O3 -fno-inline-functions -DDEBUG";; + esac +fi +CFLAGS="$CFLAGS $cflags_save" + +cpu_x86_64=no +cpu_x86_32=no +cpu_arm=no +cpu_c64x=no +AC_ARG_ENABLE(asm, + AS_HELP_STRING([--disable-asm], [Disable assembly optimizations]), + [ ac_enable_asm=$enableval ], [ ac_enable_asm=yes] ) + +if test "x${ac_enable_asm}" = xyes; then + cpu_optimization="no optimization for your platform, please send a patch" + case $host_cpu in + i[[3456]]86) + cpu_x86_32=yes + cpu_optimization="32 bit x86" + AC_DEFINE([OC_X86_ASM], [], [make use of x86 asm optimization]) + if test "x$host_vendor" = "xapple"; then + THEORA_LDFLAGS="$THEORA_LDFLAGS -Wl,-read_only_relocs,suppress" + fi + ;; + x86_64) + cpu_x86_64=yes + cpu_optimization="64 bit x86" + AC_DEFINE([OC_X86_ASM], [], [make use of x86 asm optimization]) + AC_DEFINE([OC_X86_64_ASM], [], [make use of x86_64 asm optimization]) + ;; + arm*) + cpu_arm=yes + cpu_optimization="ARM" + AC_DEFINE([OC_ARM_ASM], [], [make use of arm asm optimization]) + AC_ARG_ENABLE(asflag-probe, + AS_HELP_STRING([--disable-asflag-probe], [Disable instructions not supported by the default ASFLAGS (ARM only).]), + [ ac_enable_asflag_probe=$enableval ], [ ac_enable_asflag_probe=yes] ) + + dnl our ARM assembly requires perl to run the arm2gnu reformatter + AC_CHECK_PROG([HAVE_PERL], perl, yes, no) + if test "x$HAVE_PERL" = "xno"; then + AC_MSG_WARN([*** ARM assembly requires perl -- disabling optimizations]) + cpu_arm=no + cpu_optimization="(missing perl dependency for ARM)" + fi + + dnl AC_TRY_ASSEMBLE uses CFLAGS instead of CCASFLAGS + save_CFLAGS="$CFLAGS" + ARM_CCASFLAGS= + dnl Test for instruction set support with the default CCASFLAGS. + AS_ASM_ARM_NEON([HAVE_ARM_ASM_NEON=1],[HAVE_ARM_ASM_NEON=0]) + AS_ASM_ARM_MEDIA([HAVE_ARM_ASM_MEDIA=1],[HAVE_ARM_ASM_MEDIA=0]) + AS_ASM_ARM_EDSP([HAVE_ARM_ASM_EDSP=1],[HAVE_ARM_ASM_EDSP=0]) + dnl gas will not assemble instructions unless the architecture explicitly + dnl supports it (unlike on x86). + dnl Try to speculatively add ASFLAGS to enable usage of these instructions + dnl at assembly time (actual support is detected at runtime). + dnl If the user has already specified -march or -mcpu flags, this may give + dnl some spurious warnings (use --disable-asflag-probe to avoid this if + dnl you don't want run-time support for instructions not available on the + dnl architecture you specified). + dnl Order here is important. + if test "x${ac_enable_asflag_probe}" = xyes; then + if test x$HAVE_ARM_ASM_NEON != x1 ; then + dnl Try to set some flags to enable NEON instructions. + AC_MSG_NOTICE([trying custom CCASFLAGS to enable NEON instructions...]) + ARM_CCASFLAGS="-mfpu=neon -march=armv7-a" + CFLAGS="$save_CFLAGS $ARM_CCASFLAGS" + AS_ASM_ARM_NEON([HAVE_ARM_ASM_NEON=1],[HAVE_ARM_ASM_NEON=0]) + if test x$HAVE_ARM_ASM_NEON != x1 ; then + ARM_CCASFLAGS= + CFLAGS="$save_CFLAGS" + fi + fi + if test x$HAVE_ARM_ASM_MEDIA != x1 ; then + dnl Try to set some flags to enable ARMv6 media instructions. + AC_MSG_NOTICE([trying custom CCASFLAGS to enable ARMv6 media instructions...]) + ARM_CCASFLAGS="-march=armv6j" + CFLAGS="$save_CFLAGS $ARM_CCASFLAGS" + AS_ASM_ARM_MEDIA([HAVE_ARM_ASM_MEDIA=1],[HAVE_ARM_ASM_MEDIA=0]) + if test x$HAVE_ARM_ASM_MEDIA != x1 ; then + ARM_CCASFLAGS= + CFLAGS="$save_CFLAGS" + fi + fi + if test x$HAVE_ARM_ASM_EDSP != x1 ; then + dnl Try to set some flags to enable EDSP instructions. + AC_MSG_NOTICE([trying custom CCASFLAGS to enable EDSP compilation...]) + ARM_CCASFLAGS="-march=armv5e" + CFLAGS="$save_CFLAGS $ARM_CCASFLAGS" + AS_ASM_ARM_EDSP([HAVE_ARM_ASM_EDSP=1],[HAVE_ARM_ASM_EDSP=0]) + if test x$HAVE_ARM_ASM_MEDIA != x1 ; then + ARM_CCASFLAGS= + CFLAGS="$save_CFLAGS" + fi + fi + fi + + dnl Only enable if we passed the perl test above + if test x$cpu_arm = xyes; then + if test x$HAVE_ARM_ASM_EDSP = x1 ; then + AC_DEFINE(OC_ARM_ASM_EDSP, 1, + [Define if assembler supports EDSP instructions]) + cpu_optimization="$cpu_optimization (EDSP)" + fi + AC_SUBST(HAVE_ARM_ASM_EDSP) + if test x$HAVE_ARM_ASM_MEDIA = x1 ; then + AC_DEFINE(OC_ARM_ASM_MEDIA, 1, + [Define if assembler supports ARMv6 media instructions]) + cpu_optimization="$cpu_optimization (Media)" + fi + AC_SUBST(HAVE_ARM_ASM_MEDIA) + if test x$HAVE_ARM_ASM_NEON = x1 ; then + AC_DEFINE(OC_ARM_ASM_NEON, 1, + [Define if compiler supports NEON instructions]) + cpu_optimization="$cpu_optimization (NEON)" + fi + AC_SUBST(HAVE_ARM_ASM_NEON) + fi + + CFLAGS="$save_CFLAGS" + CCASFLAGS="$CCASFLAGS $ARM_CCASFLAGS" + ;; + tic6x) + cpu_c64x=yes + cpu_optimization="TI C64x+" + AC_DEFINE([OC_C64X_ASM], [], [make use of c64x+ asm optimization]) + ;; + esac +else + cpu_optimization="disabled" +fi +AM_CONDITIONAL([CPU_x86_64], [test x$cpu_x86_64 = xyes]) +AM_CONDITIONAL([CPU_x86_32], [test x$cpu_x86_32 = xyes]) +AM_CONDITIONAL([CPU_arm], [test x$cpu_arm = xyes]) +AM_CONDITIONAL([CPU_c64x], [test x$cpu_c64x = xyes]) + +# Test whenever ld supports -version-script +AC_PROG_LD +AC_PROG_LD_GNU +AC_MSG_CHECKING([how to control symbol export]) + +THDEC_VERSION_ARG="" +THENC_VERSION_ARG="" +TH_VERSION_ARG="" +if test "x$lt_cv_prog_gnu_ld" = "xyes"; then + case "$host_os" in + *mingw*) + THEORA_LDFLAGS="$THEORA_LDFLAGS -no-undefined" + THDEC_VERSION_ARG="-export-symbols \$(top_srcdir)/win32/xmingw32/libtheoradec-all.def" + THENC_VERSION_ARG="-export-symbols \$(top_srcdir)/win32/xmingw32/libtheoraenc-all.def" + THENC_VERSION_ARG="$THENC_VERSION_ARG -ltheoradec" + THC_VERSION_ARG="-export-symbols \$(top_srcdir)/win32/libtheora.def" + AC_MSG_RESULT([-export-symbols]) + ;; + linux* | solaris* | gnu* | k*bsd*-gnu) + THDEC_VERSION_ARG='-Wl,--version-script=$(srcdir)/Version_script-dec' + THENC_VERSION_ARG='-Wl,--version-script=$(srcdir)/Version_script-enc' + TH_VERSION_ARG='-Wl,--version-script=$(srcdir)/Version_script' + AC_MSG_RESULT([--version-script]) + ;; + *) + # build without versioning + AC_MSG_RESULT([no]) + ;; + esac +else + case "$host_os" in + darwin*) + THDEC_VERSION_ARG='-Wl,-exported_symbols_list,$(srcdir)/theoradec.exp' + THENC_VERSION_ARG='-Wl,-exported_symbols_list,$(srcdir)/theoraenc.exp' + TH_VERSION_ARG='-Wl,-exported_symbols_list,$(srcdir)/theora.exp' + AC_MSG_RESULT([-exported_symbols_list]) + ;; + *) + # build without versioning + AC_MSG_RESULT([no]) + ;; + esac +fi + +THEORADEC_LDFLAGS="$THEORA_LDFLAGS $THDEC_VERSION_ARG" +THEORAENC_LDFLAGS="$THEORA_LDFLAGS $THENC_VERSION_ARG" +THEORA_LDFLAGS="$THEORA_LDFLAGS $TH_VERSION_ARG" +AC_SUBST(THEORADEC_LDFLAGS) +AC_SUBST(THEORAENC_LDFLAGS) +AC_SUBST(THEORA_LDFLAGS) + +dnl -------------------------------------------------- +dnl Checks for support libraries and headers +dnl -------------------------------------------------- + +dnl check for Ogg +HAVE_OGG=no + +dnl first check through pkg-config since it's more flexible + +dnl check for pkg-config itself so we don't try the m4 macro without pkg-config +AC_CHECK_PROG(HAVE_PKG_CONFIG, pkg-config, yes) +if test "x$HAVE_PKG_CONFIG" = "xyes" +then + PKG_CHECK_MODULES(OGG, ogg >= 1.1, HAVE_OGG=yes, HAVE_OGG=no) +fi +if test "x$HAVE_OGG" = "xno" +then + dnl fall back to the old school test + XIPH_PATH_OGG(, AC_MSG_ERROR([ + libogg is required to build this package! + please see http://www.xiph.org/ for how to + obtain a copy. + ])) + cflags_save=$CFLAGS + libs_save=$LIBS + CFLAGS="$CFLAGS $OGG_CFLAGS" + LIBS="$LIBS $OGG_LIBS" + AC_CHECK_FUNC(oggpackB_read, , [ + AC_MSG_ERROR([newer libogg version (1.1 or later) required]) + ]) + CFLAGS=$cflags_save + LIBS=$libs_save +fi + + +dnl check for Vorbis +HAVE_VORBIS=no + +dnl first check through pkg-config since it's more flexible + +if test "x$HAVE_PKG_CONFIG" = "xyes" +then + PKG_CHECK_MODULES(VORBIS, vorbis >= 1.0.1, HAVE_VORBIS=yes, HAVE_VORBIS=no) + dnl also set VORBISENC_LIBS since an examples needs it + dnl the old .m4 sets this to a value to use on top of VORBIS_LIBS, + dnl so we do the same here. + VORBISENC_LIBS="-lvorbisenc" + AC_SUBST(VORBISENC_LIBS) +fi +if test "x$HAVE_VORBIS" = "xno" +then + dnl fall back to the old school test + XIPH_PATH_VORBIS(HAVE_VORBIS=yes, HAVE_VORBIS=no) +fi + +dnl check for SDL +HAVE_SDL=no +if test "x$HAVE_PKG_CONFIG" = "xyes" +then + PKG_CHECK_MODULES(SDL, sdl, HAVE_SDL=yes, [ + HAVE_SDL=no + AC_MSG_WARN([*** Unable to find SDL -- Not compiling example players ***])]) +fi + +dnl check for OSS +HAVE_OSS=no +AC_CHECK_HEADERS([sys/soundcard.h soundcard.h machine/soundcard.h],[ + HAVE_OSS=yes + break +]) +if test x$HAVE_OSS != xyes; then + AC_MSG_WARN([OSS audio support not found -- not compiling player_example]) +fi + +dnl OpenBSD needs -lossaudio to use the oss interface +OSS_LIBS= +case "$host_os" in + openbsd*) + OSS_LIBS='-lossaudio' + ;; +esac +AC_SUBST(OSS_LIBS) + +dnl check for libpng +HAVE_PNG=no +if test "x$HAVE_PKG_CONFIG" = "xyes" +then + PKG_CHECK_MODULES(PNG, libpng, HAVE_PNG=yes, HAVE_PNG=no) +fi +AC_SUBST(PNG_CFLAGS) +AC_SUBST(PNG_LIBS) + +dnl check for libtiff +HAVE_TIFF=no +TIFF_CFLAGS='' +TIFF_LIBS='' +AC_CHECK_LIB([tiff], [TIFFReadRGBAImage], [ + TIFF_LIBS='-ltiff' + AC_CHECK_HEADER([tiffio.h], [ + HAVE_TIFF=yes + ]) +]) +AC_SUBST(HAVE_TIFF) +AC_SUBST(TIFF_CFLAGS) +AC_SUBST(TIFF_LIBS) + +dnl check for libcairo +HAVE_CAIRO=no +AC_ARG_ENABLE(telemetry, + AS_HELP_STRING([--enable-telemetry], [Enable debugging output controls]), + [ ac_enable_telemetry=$enableval ], [ ac_enable_telemetry=no] ) + +if test "x${ac_enable_telemetry}" = xyes; then + if test "x$HAVE_PKG_CONFIG" = "xyes" + then + PKG_CHECK_MODULES(CAIRO, cairo, HAVE_CAIRO=yes, HAVE_CAIRO=no) + AC_DEFINE([HAVE_CAIRO], [], [libcairo is available for visual debugging output]) + fi + if test x$HAVE_CAIRO != xyes; then + AC_MSG_WARN([libcairo not found -- not compiling telemetry output support ]) + fi + AC_SUBST(CAIRO_CFLAGS) + AC_SUBST(CAIRO_LIBS) +fi + +dnl -------------------------------------------------- +dnl Overall build configuration options +dnl -------------------------------------------------- + +dnl Configuration option for building of encoding support. + +ac_enable_encode=yes +AC_ARG_ENABLE(encode, + AS_HELP_STRING([--disable-encode], [Disable encoding support]), + [ ac_enable_encode=$enableval ], [ ac_enable_encode=yes] ) + +if test "x${ac_enable_encode}" != xyes ; then + AC_DEFINE([THEORA_DISABLE_ENCODE], [], + [Define to exclude encode support from the build]) +else + if test x$HAVE_VORBIS = xyes; then + BUILDABLE_EXAMPLES="$BUILDABLE_EXAMPLES encoder_example\$(EXEEXT)" + else + AC_MSG_NOTICE([Vorbis missing, cannot build example encoder]) + fi +fi +AM_CONDITIONAL(THEORA_DISABLE_ENCODE, [test "x${ac_enable_encode}" != xyes]) + +dnl Configuration option for examples + +ac_enable_examples=yes +AC_ARG_ENABLE(examples, + AS_HELP_STRING([--disable-examples], [Disable examples]), + [ ac_enable_examples=$enableval ], [ ac_enable_examples=yes] ) +AM_CONDITIONAL(THEORA_ENABLE_EXAMPLES, [test "x${ac_enable_examples}" != xno]) + +dnl -------------------------------------------------- +dnl Check for headers +dnl -------------------------------------------------- + +dnl none here + +dnl -------------------------------------------------- +dnl Check for typedefs, structures, etc +dnl -------------------------------------------------- + +dnl none + +dnl -------------------------------------------------- +dnl Check for library functions +dnl -------------------------------------------------- + +dnl OpenBSD needs -lcompat for ftime() used by dump_video.c +AC_CHECK_LIB([compat], [ftime], [COMPAT_LIBS='-lcompat']) +AC_SUBST(COMPAT_LIBS) + +dnl substitute the included getopt if the system doesn't support long options +AC_CHECK_FUNC(getopt_long, + [GETOPT_OBJS=''], + [GETOPT_OBJS='getopt.$(OBJEXT) getopt1.$(OBJEXT)']) +AC_SUBST(GETOPT_OBJS) + +if test x$HAVE_SDL = xyes -a x$HAVE_OSS = xyes -a x$HAVE_VORBIS = xyes; then + BUILDABLE_EXAMPLES="$BUILDABLE_EXAMPLES player_example\$(EXEEXT)" +fi +if test x$HAVE_PNG = xyes; then + BUILDABLE_EXAMPLES="$BUILDABLE_EXAMPLES png2theora\$(EXEEXT)" +fi +if test x$HAVE_TIFF = xyes; then + BUILDABLE_EXAMPLES="$BUILDABLE_EXAMPLES tiff2theora\$(EXEEXT)" +fi +AC_SUBST(BUILDABLE_EXAMPLES) + +dnl -------------------------------------------------- +dnl Do substitutions +dnl -------------------------------------------------- + +AC_SUBST(DEBUG) +AC_SUBST(PROFILE) + +AC_CONFIG_FILES([ + Makefile + lib/Makefile + lib/arm/armopts.s + include/Makefile include/theora/Makefile + examples/Makefile + doc/Makefile doc/Doxyfile doc/spec/Makefile + tests/Makefile + m4/Makefile + libtheora.spec + theora.pc + theora-uninstalled.pc + theoradec.pc + theoradec-uninstalled.pc + theoraenc.pc + theoraenc-uninstalled.pc +]) +AC_CONFIG_HEADERS([config.h]) + +AC_OUTPUT + +AS_AC_EXPAND(LIBDIR, ${libdir}) +AS_AC_EXPAND(INCLUDEDIR, ${includedir}) +AS_AC_EXPAND(BINDIR, ${bindir}) +AS_AC_EXPAND(DOCDIR, ${docdir}) + +if test $HAVE_DOXYGEN = "false"; then + doc_build="no" +else + doc_build="yes" +fi +if test $BUILD_SPEC = "false"; then + spec_build="no" +else + spec_build="yes" +fi + +AC_MSG_RESULT([ +------------------------------------------------------------------------ + $PACKAGE $VERSION: Automatic configuration OK. + + General configuration: + + Encoding support: ........... ${ac_enable_encode} + Assembly optimization: ...... ${cpu_optimization} + Debugging telemetry: ........ ${ac_enable_telemetry} + Build example code: ......... ${ac_enable_examples} + API Documentation: .......... ${doc_build} + Format Documentation: ....... ${spec_build} + + Installation paths: + + libtheora: ................... ${LIBDIR} + C header files: .............. ${INCLUDEDIR}/theora + Documentation: ............... ${DOCDIR} + + Building: + + Type 'make' to compile $PACKAGE. + + Type 'make install' to install $PACKAGE. + + ${TESTS_INFO} + + Example programs will be built but not installed. +------------------------------------------------------------------------ +]) + diff --git a/cs/3rd party/libtheora/doc/Doxyfile.in b/cs/3rd party/libtheora/doc/Doxyfile.in new file mode 100644 index 000000000..ffb358152 --- /dev/null +++ b/cs/3rd party/libtheora/doc/Doxyfile.in @@ -0,0 +1,1630 @@ +# Doxyfile 1.7.1 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = @PACKAGE@ + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = @VERSION@ + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = libtheora + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = YES + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this +# tag. The format is ext=language, where ext is a file extension, and language +# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, +# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make +# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C +# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions +# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen to replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penality. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will rougly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols + +SYMBOL_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespace are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. +# This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. The create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. + +LAYOUT_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = @top_srcdir@/include/theora + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. +# If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. +# Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. +# The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. +# Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = NO + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# If the HTML_TIMESTAMP tag is set to YES then the generated HTML +# documentation will contain the date when the page was generated. +# Setting this to NO can help when comparing the output of multiple runs. + +HTML_TIMESTAMP = YES + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the stylesheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = NO + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Xiph.org API docs (Doxygen)" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.xiph.@PACKAGE@ + +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.xiph.Doxygen + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Xiph.Org + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = org.xiph.@PACKAGE@ + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's +# filter section matches. +# +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. + +ECLIPSE_DOC_ID = org.xiph.@PACKAGE@ + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, +# and Class Hierarchy pages using a tree view instead of an ordered list. + +USE_INLINE_TREES = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. + +SEARCHENGINE = NO + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a PHP enabled web server instead of at the web client +# using Javascript. Doxygen will generate the search PHP script and index +# file to put on the web server. The advantage of the server +# based approach is that it scales better to large projects and allows +# full text search. The disadvances is that it is more difficult to setup +# and does not have live searching capabilities. + +SERVER_BASED_SEARCH = NO + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = YES + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = YES + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. +# This is useful +# if you want to understand what is going on. +# On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse +# the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will write a font called FreeSans.ttf to the output +# directory and reference it in all dot files that doxygen generates. This +# font does not include all possible unicode characters however, so when you need +# these (or just want a differently looking font) you can specify the font name +# using DOT_FONTNAME. You need need to make sure dot is able to find the font, +# which can be done by putting it in a standard location or by setting the +# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory +# containing the font. + +DOT_FONTNAME = FreeSans.ttf + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the output directory to look for the +# FreeSans.ttf font (which doxygen will put there itself). If you specify a +# different font using DOT_FONTNAME you can set the path where dot +# can find it using this tag. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES diff --git a/cs/3rd party/libtheora/doc/Makefile.am b/cs/3rd party/libtheora/doc/Makefile.am new file mode 100644 index 000000000..5aeda7d22 --- /dev/null +++ b/cs/3rd party/libtheora/doc/Makefile.am @@ -0,0 +1,72 @@ +## Process this file with automake to produce Makefile.in + +SUBDIRS = spec + +static_docs = vp3-format.txt color.html \ + draft-ietf-avt-rtp-theora-00.xml \ + draft-ietf-avt-rtp-theora-00.txt + +doc_DATA = $(static_docs) doxygen-build.stamp + +EXTRA_DIST = $(static_docs) Doxyfile.in + +if HAVE_DOXYGEN +doxygen-build.stamp: Doxyfile $(top_srcdir)/include/theora/*.h + doxygen + touch doxygen-build.stamp +else +doxygen-build.stamp: + echo "*** Warning: Doxygen not found; documentation will not be built." + touch doxygen-build.stamp +endif + +dist_docdir = $(distdir)/libtheora + +dist-hook: + if test -d libtheora; then \ + mkdir $(dist_docdir); \ + echo -n "copying built documenation..."; \ + for dir in libtheora/*; do \ + b=`basename $$dir`; \ + if test $$b != ".svn"; then \ + if test -d $$dir; then \ + mkdir $(dist_docdir)/$$b; \ + for f in $$dir/*; do \ + cp -p $$f $(dist_docdir)/$$b; \ + done; \ + fi; \ + fi; \ + done; \ + echo "OK"; \ + fi + for item in $(EXTRA_DIST); do \ + if test -d $$item; then \ + echo -n "cleaning $$item dir for distribution..."; \ + rm -rf `find $(distdir)/$$item -name .svn`; \ + echo "OK"; \ + fi; \ + done + + + +install-data-local: doxygen-build.stamp + $(mkinstalldirs) $(DESTDIR)$(docdir) + if test -d libtheora; then \ + for dir in libtheora/*; do \ + if test -d $$dir; then \ + b=`basename $$dir`; \ + $(mkinstalldirs) $(DESTDIR)$(docdir)/$$b; \ + for f in $$dir/*; do \ + $(INSTALL_DATA) $$f $(DESTDIR)$(docdir)/$$b; \ + done \ + fi \ + done \ + fi + +uninstall-local: + rm -rf $(DESTDIR)$(docdir) + +clean-local: + if test -d libtheora; then rm -rf libtheora; fi + if test -f doxygen-build.stamp; then rm -f doxygen-build.stamp; fi + diff --git a/cs/3rd party/libtheora/doc/color.html b/cs/3rd party/libtheora/doc/color.html new file mode 100644 index 000000000..9bc2450f8 --- /dev/null +++ b/cs/3rd party/libtheora/doc/color.html @@ -0,0 +1,602 @@ + +xiph.org: Ogg Theora documentation + +

    +Ogg Theora I specification: color space conventions +

    +

    Overview

    +

    +There are a large number of different color standards used in digital video. +Since Theora is a lossy codec, it restricts itself to only a few of them to + simplify playback. +Unlike the alternate method of describing all the parameters of the color + model, this allows a few dedicated routines for color conversion to be written + and heavily optimized in a decoder. +More flexible conversion functions should instead be specified in an encoder, + where additional computational complexity is more easily tolerated. +The color spaces were selected to give a fair representation of color standards + in use around the world today. +Most of the standards that do not exactly match one of these can be converted + to one fairly easily. +

    +

    +The Theora codec identification header contains an 8-bit value that describes + the color space. +This merely selects one of the color spaces available from an enumerated list. +Currently, only two color spaces are defined, with a third possibility that + indicates the color space is "unknown". +All of them are Y'CbCr color spaces with one luma channel + and two chroma channels. +Each channel contains 8-bit discrete values in the range 0-255, which represent + non-linear gamma pre-corrected signals. +

    +

    color space parameters

    +

    +The parameters which describe each color space are listed below. +These are the parameters needed to map colors from the encoded + Y'CbCr representation to the device-independent color + space CIE XYZ (1931). +

    +
    +
    Y'CbCr to Y'PbPr
    +
    +

    +This conversion takes 8-bit discrete values in the range 0-255 and maps them to + real values in the range [0,1] for Y and [-1/2,1/2] for Pb + and Pr. +Because some values may fall outside the offset and excursion defined for each + channel in the Y'CbCr space, the results may fall + outside these ranges in Y'PbPr space. +No clamping should be done at this stage. +

    +

    +Parameters: OffsetY,Cb,Cr, + ExcursionY,Cb,Cr, +

    + + + + + + + + + + + + + + + + +
    Y'out= +(Y'in-OffsetY)/ + ExcursionY +
    Pb= +(Cb-OffsetCb)/ + ExcursionCb +
    Pr= +(Cr-OffsetCr)/ + ExcursionCr +
    +
    +
    Y'PbPr to R'G'B'
    +
    +

    +This conversion takes the one luma and two chroma channel representation and + maps it to the non-linear R'G'B' space used to drive actual output devices. +Values should be clamped into the range [0,1] after this stage. +

    +Parameters: Kb, Kr +

    + + + + + + + + + + + + + + + + +
    R'=Y' + 2(1-Kr)Pr
    G'= +Y' + + 2((Kb-1)Kb/ + (1-Kb-Kr))Pb + + 2((Kr-1)Kr/ + (1-Kb-Kr))Pr +
    B'=Y' + 2(1-Kb)Pb
    +
    +
    R'G'B' to RGB (Output device gamma correction)
    +
    +

    +This conversion takes the non-linear R'G'B' voltage levels and maps it to the + linear light levels produced by the actual output device. +Note that this conversion is only that of the output device, and its inverse is + not that used by the input device. +Because a dim viewing environment is assumed in most television standards, the + overall gamma between the input and output devices is usually around 1.1 to + 1.2, and not a strict 1.0. +

    +

    +For calibration with actual output devices, the model + + + + + + +
    L=(E'+Δ)γ
    +should be used, with Δ the free parameter and γ held + fixed to the value specified in this document. +The conversion function presented here is an idealized version with Δ=0. +

    +

    +Parameters: γ +

    + + + + + + + + + + + + + + + + +
    R=R'γ
    G=G'γ
    B=B'γ
    +
    +
    RGB to R'G'B' (Input device gamma correction)
    +
    +

    +This conversion takes linear light levels and maps them to the non-linear + voltage levels used to drive the actual output device. +This information is merely informative. +It is not required for building a decoder or for converting between the various + formats and the actual output capabilities of a particular device. +

    +

    +A linear segment is introduced on the low end to reduce noise in dark areas of + the image. +The rest of the scale is adjusted so that the power segment of the curve + intersects the linear segment with the proper slope, and so that it still maps + 0 to 0 and 1 to 1. +

    +

    +Parameters: β, α, δ, + ε +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    R'= +(1+ε)Rβ-ε +for δ ≤ R ≤ 1
    R'=αRfor 0 ≤ R < δ
    G'= +(1+ε)Gβ-ε +for δ ≤ G ≤ 1
    G'=αGfor 0 ≤ G < δ
    B'= +(1+ε)Bβ-ε +for δ ≤ B ≤ 1
    B'=αBfor 0 ≤ B < δ
    +
    +
    RGB to CIE XYZ (1931)
    +
    +

    +This conversion maps a device-dependent linear RGB space to the + device-independent linear CIE XYZ space. +The parameters are the CIE chromaticity coordinates of the three primaries, + red, green, and blue, as well as the chromaticity coordinates of the white + point of the device. +This is how hardware manufacturers and standards typically describe a + particular RGB space. +The math required to convert these parameters into a useful transformation + matrix is reproduced below. +

    +

    +Parameters: xr,g,b,w, yr,g,b,w +

    + + + + + + + + + + + + + + + + +
    F= + + +) +
    ( + + + + + + + + + + + + + + + +
    xr/yrxg/ygxb/yb
    111
    +(1-xr-yr)/yr + +(1-xg-yg)/yg + +(1-xb-yb)/yb +
    + + + +
    ( + + + +
    sr
    sg
    sb
    )
    = + + + +
    F-1( + + + +
    xw/yw
    1
    +(1-xw-yw)/yw +
    )
    + + + +
    ( + + + +
    X
    Y
    Z
    )
    = + + + +
    F( + + + +
    srR
    sgG
    sbB
    )
    +
    +
    +

    available color spaces

    +

    +These are the color spaces currently defined for use by Ogg Theora video. +Each one has a short name, with which it is referred to in this document, and + a more detailed specification of the standards from which its parameters are + derived. +Some standards do not specify all the parameters necessary. +For these unspecified parameters, this document serves as the definition of + what should be used when encoding or decoding Ogg Theora video. +

    Rec 470M (Rec. ITU-R BT.470-6 System M/NTSC with Rec. ITU-R BT.601-5)

    +

    +This color space is used by broadcast television and DVDs in much of the + Americas, Japan, Korea, and the Union of Myanmar + [Rec470]. +This color space may also be used for System M/PAL (Brazil), with an + appropriate conversion supplied by the encoder to compensate for the + different gamma value. +See the Rec 470BG section for an appropriate gamma value to assume for M/PAL + input. +

    +

    +In the US, studio monitors are adjusted to a D65 white point + (xw,yw=0.313,0.329). +In Japan, studio monitors are adjusted to a D white of 9300K + (xw,yw=0.285,0.293). +

    +

    +Rec 470 does not specify a digital encoding of the color signals. +For Ogg Theora, Rec. ITU-R BT.601-5 is used, starting from the R'G'B' signals + specified by Rec 470 [Rec601]. +

    +

    +

    +Rec 470 does not specify an input gamma function. +For Ogg Theora, the Rec 709 input function is used. +This is the same as that specified by SMPTE 170M, which claims to reflect + modern practice in the creation of NTSC signals (c. 1994) + [SMPTE170M]. +

    +

    parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OffsetY,Cb,Cr=(16,128,128)
    +ExcursionY,Cb,Cr +=(219,224,224)
    Kb=0.114
    Kr=0.299
    γ=2.2
    β=0.45
    α=4.5
    δ=0.018
    ε=0.099
    xr,yr=0.67,0.33
    xg,yg=0.21,0.71
    xb,yb=0.14,0.08
    +(Illuminant C) xw,yw +=0.310,0.316
    +

    +Rec 470BG (Rec. ITU-R BT.470-6 Systems B and G with Rec. ITU-R BT.601-5) +

    +

    +This color space is used by the PAL and SECAM systems in much of the rest of + the world [Rec470]. +This can be used directly by systems (B, B1, D, D1, G, H, I, K, N)/PAL and (B, + D, G, H, K, K1, L)/SECAM. +

    +

    +Note that the Rec 470BG chromaticity values are different from those specified + in Rec 470M. +When PAL and SECAM systems were first designed, they were based upon the same + primaries as NTSC. +However, as methods of making color picture tubes have changed, the primaries + used have changed as well. +The US recommends using correction circuitry to approximate the existing, + standard NTSC primaries. +Current PAL and SECAM systems have standardized on primaries in accord with + more recent technology. +

    +

    +Rec 470 provisionally permits the use of the NTSC chromaticity values (given + above) with legacy PAL and SECAM equipment. +In Ogg Theora, material must be decoded assuming the new PAL and SECAM + primaries. +Material intended for display on old legacy devices should be converted by the + decoder. +

    +

    +The official Rec 470BG specifies a gamma value of γ=2.8. +However, in practice this value is unrealistically high + [Poy97]. +Rec 470BG states that the overall system gamma should be approximately + γ/β=1.2. +However, most cameras pre-correct with a gamma value of β=0.45, + which suggests an output device gamma of approximately γ=2.67. +This is the value recommended for use with PAL systems in Ogg Theora. +

    +

    +Rec 470 does not specify a digital encoding of the color signals. +For Ogg Theora, Rec. ITU-R BT.601-5 is used, starting from the R'G'B' signals + specified by Rec 470 [Rec601]. +

    +

    +Rec 470 does not specify an input gamma function. +For Ogg Theora, the Rec 709 input function is used. +

    +

    parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OffsetY,Cb,Cr=(16,128,128)
    +ExcursionY,Cb,Cr +=(219,224,224)
    Kb=0.114
    Kr=0.299
    γ=2.67
    β=0.45
    α=4.5
    δ=0.018
    ε=0.099
    xr,yr=0.64,0.33
    xg,yg=0.29,0.60
    xb,yb=0.15,0.06
    +(D65) xw,yw +=0.313,0.329
    +

    references

    +
    +
    [Poy97]
    +
    +Poynton, Charles, Frequently-Asked Questions about Gamma. + http://www.poynton.com/GammaFAQ/html, + Feb. 1997. +
    +
    [Rec470]
    +
    +Recommendation ITU-R BT.470-6, Conventional Television Systems + (1970, revised 1998). International Telecommunications Union, 1211 Geneva 20, + Switzerland. +
    +
    [Rec601]
    +
    +Recommendation ITU-R BT.601-5, Studio Encoding Parameters of + Digital Television for Standard 4:3 and Wide-Screen 16:9 Aspect Ratios + (1982, revised 1995). International Telecommunications Union, 1211 Geneva 20, + Switzerland. +
    +
    [Rec709]
    +
    +Recommendation ITU-R BT.709-5, Parameter values for the + HDTV standards for production and international programme exchange + (1990, revised 2002). International Telecommunications Union, 1211 Geneva 20, + Switzerland. +
    +
    [SMPTE170M]
    +
    +Society of Motion Picture and Television Engineers, Television — + Composite Analog Video Signal — NTSC for Studio Applications. + SMPTE-170M, 1994 +
    +
    [SMPTE240M]
    +
    +Society of Motion Picture and Television Engineers, Television — + Signal Parameters — 1125-Line High-Definition Production. + SMPTE-240M, 1999. +
    +
    + + diff --git a/cs/3rd party/libtheora/doc/draft-ietf-avt-rtp-theora-00.txt b/cs/3rd party/libtheora/doc/draft-ietf-avt-rtp-theora-00.txt new file mode 100644 index 000000000..f759aef6b --- /dev/null +++ b/cs/3rd party/libtheora/doc/draft-ietf-avt-rtp-theora-00.txt @@ -0,0 +1,1400 @@ + + + +AVT Working Group L. Barbato +Internet-Draft Xiph.Org +Expires: January 22, 2007 July 21, 2006 + + + draft-ietf-avt-rtp-theora-00 + RTP Payload Format for Theora Encoded Video + +Status of this Memo + + By submitting this Internet-Draft, each author represents that any + applicable patent or other IPR claims of which he or she is aware + have been or will be disclosed, and any of which he or she becomes + aware will be disclosed, in accordance with Section 6 of BCP 79. + + Internet-Drafts are working documents of the Internet Engineering + Task Force (IETF), its areas, and its working groups. Note that + other groups may also distribute working documents as Internet- + Drafts. + + Internet-Drafts are draft documents valid for a maximum of six months + and may be updated, replaced, or obsoleted by other documents at any + time. It is inappropriate to use Internet-Drafts as reference + material or to cite them other than as "work in progress." + + The list of current Internet-Drafts can be accessed at + http://www.ietf.org/ietf/1id-abstracts.txt. + + The list of Internet-Draft Shadow Directories can be accessed at + http://www.ietf.org/shadow.html. + + This Internet-Draft will expire on January 22, 2007. + +Copyright Notice + + Copyright (C) The Internet Society (2006). + +Abstract + + This document describes a RTP payload format for transporting Theora + encoded video. It details the RTP encapsulation mechanism for raw + Theora data and configuration headers necessary to configure the + decoder. + + Also included within the document are the necessary details for the + use of Theora with MIME and Session Description Protocol (SDP). + +Editors Note + + + +Barbato Expires January 22, 2007 [Page 1] + +Internet-Draft draft-ietf-avt-rtp-theora-00 July 2006 + + + All references to RFC XXXX are to be replaced by references to the + RFC number of this memo, when published. + + +Table of Contents + + 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3 + 1.1. Terminology . . . . . . . . . . . . . . . . . . . . . . . 4 + 2. Payload Format . . . . . . . . . . . . . . . . . . . . . . . . 4 + 2.1. RTP Header . . . . . . . . . . . . . . . . . . . . . . . . 4 + 2.2. Payload Header . . . . . . . . . . . . . . . . . . . . . . 5 + 2.3. Payload Data . . . . . . . . . . . . . . . . . . . . . . . 6 + 2.4. Example RTP Packet . . . . . . . . . . . . . . . . . . . . 7 + 3. Configuration Headers . . . . . . . . . . . . . . . . . . . . 8 + 3.1. In-band Header Transmission . . . . . . . . . . . . . . . 9 + 3.1.1. Packed Configuration . . . . . . . . . . . . . . . . . 9 + 3.2. Out of Band Transmission . . . . . . . . . . . . . . . . . 10 + 3.2.1. Packed Headers . . . . . . . . . . . . . . . . . . . . 11 + 3.3. Loss of Configuration Headers . . . . . . . . . . . . . . 13 + 4. Comment Headers . . . . . . . . . . . . . . . . . . . . . . . 13 + 5. Frame Packetizing . . . . . . . . . . . . . . . . . . . . . . 14 + 5.1. Example Fragmented Theora Packet . . . . . . . . . . . . . 15 + 5.2. Packet Loss . . . . . . . . . . . . . . . . . . . . . . . 17 + 6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 18 + 6.1. Mapping MIME Parameters into SDP . . . . . . . . . . . . . 19 + 6.1.1. SDP Example . . . . . . . . . . . . . . . . . . . . . 20 + 6.2. Usage with the SDP Offer/Answer Model . . . . . . . . . . 20 + 7. Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 + 7.1. Stream Video . . . . . . . . . . . . . . . . . . . . . . . 21 + 8. Security Considerations . . . . . . . . . . . . . . . . . . . 21 + 9. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 22 + 10. References . . . . . . . . . . . . . . . . . . . . . . . . . . 22 + 10.1. Normative References . . . . . . . . . . . . . . . . . . . 22 + 10.2. Informative References . . . . . . . . . . . . . . . . . . 23 + Author's Address . . . . . . . . . . . . . . . . . . . . . . . . . 24 + Intellectual Property and Copyright Statements . . . . . . . . . . 25 + + + + + + + + + + + + + + + +Barbato Expires January 22, 2007 [Page 2] + +Internet-Draft draft-ietf-avt-rtp-theora-00 July 2006 + + +1. Introduction + + Theora is a general purpose, lossy video codec. It is based on the + VP3 video codec produced by On2 Technologies and has been donated to + the Xiph.org Foundation. + + Theora I is a block-based lossy transform codec that utilizes an 8 x + 8 Type-II Discrete Cosine Transform and block-based motion + compensation. This places it in the same class of codecs as MPEG-1, + MPEG-2, MPEG-4, and H.263. The details of how individual blocks are + organized and how DCT coefficients are stored in the bitstream differ + substantially from these codecs, however. Theora supports only intra + frames (I frames in MPEG) and inter frames (P frames in MPEG). + + Theora provides none of its own framing, synchronization, or + protection against transmission errors. Instead, the codec expects + to receive a discrete sequence of data packets. Theora is a free- + form variable bit rate (VBR) codec, and these packets have no minimum + size, maximum size, or fixed/expected size. Theora packets are thus + intended to be used with a transport mechanism that provides free- + form framing, synchronization, positioning, and error correction in + accordance with these design assumptions, such as Ogg [1] or RTP/AVP + [3]. + + Theora I currently supports progressive video data of arbitrary + dimensions at a constant frame rate in one of several Y'CbCr color + spaces. Three different chroma subsampling formats are supported: + 4:2:0, 4:2:2, and 4:4:4. The Theora I format does not support + interlaced material, variable frame rates, bit-depths larger than 8 + bits per component, nor alternate color spaces such as RGB or + arbitrary multi-channel spaces. Black and white content can be + efficiently encoded, however, because the uniform chroma planes + compress well. For performance reason, arbitrary frame sizes will be + encoded rounding both dimensions to the upper multiple of 16. The + original width and height will be encoded in the header and the + decoder will use this information to clip the decoded frame to the + right dimensions. + + Theora is similar to the Vorbis audio [10] in that the decoder reads + the probability model for the entropy coder and all quantization + parameters from special "header" packets at the start of the + compressed data. It is therefore impossible to decode any video data + without having previously fetched the codec info and codec setup + headers, although Theora can begin to decode at an arbitrary intra- + frame packet so long as the codec has been initialized with the + associated headers. + + + + + +Barbato Expires January 22, 2007 [Page 3] + +Internet-Draft draft-ietf-avt-rtp-theora-00 July 2006 + + +1.1. Terminology + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + document are to be interpreted as described in RFC 2119 [2]. + + +2. Payload Format + + For RTP based transportation of Theora encoded video the standard RTP + header is followed by a 4 octets payload header, then the payload + data. The payload headers are used to associate the Theora data with + its associated decoding codebooks as well as indicating if the + following packet contains fragmented Theora data and/or the number of + whole Theora data frames. The payload data contains the raw Theora + bitstream information. + + For RTP based transport of Theora encoded video the standard RTP + header is followed by a 4 octets payload header, then the payload + data. + +2.1. RTP Header + + The format of the RTP header is specified in [3] and shown in Figure + 1. This payload format uses the fields of the header in a manner + consistent with that specification. + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |V=2|P|X| CC |M| PT | sequence number | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | timestamp | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | synchronization source (SSRC) identifier | + +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ + | contributing source (CSRC) identifiers | + | ... | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 1: RTP Header + + The RTP header begins with an octet of fields (V, P, X, and CC) to + support specialized RTP uses (see [3] and [4] for details). For + Theora RTP, the following values are used. + + Version (V): 2 bits + + + + +Barbato Expires January 22, 2007 [Page 4] + +Internet-Draft draft-ietf-avt-rtp-theora-00 July 2006 + + + This field identifies the version of RTP. The version used by this + specification is two (2). + + Padding (P): 1 bit + + Padding MAY be used with this payload format according to section 5.1 + of [3]. + + Extension (X): 1 bit + + The Extension bit is used in accordance with [3]. + + CSRC count (CC): 4 bits + + The CSRC count is used in accordance with [3]. + + Marker (M): 1 bit + + The Marker bit is used in accordance with [3]. + + Payload Type (PT): 7 bits + + An RTP profile for a class of applications is expected to assign a + payload type for this format, or a dynamically allocated payload type + SHOULD be chosen which designates the payload as Theora. + + Sequence number: 16 bits + + The sequence number increments by one for each RTP data packet sent, + and may be used by the receiver to detect packet loss and to restore + packet sequence. This field is detailed further in [3]. + + Timestamp: 32 bits + + A timestamp representing the presentation time of the first sample of + the first Theora packet in the RTP packet. The clock frequency MUST + be set to 90kHz. + + SSRC/CSRC identifiers: + + These two fields, 32 bits each with one SSRC field and a maximum of + 16 CSRC fields, are as defined in [3]. + +2.2. Payload Header + + The 4 octets following the RTP Header section represent the Payload + Header. This header is split into a number of bitfields detailing + the format of the following Payload Datagrams. + + + +Barbato Expires January 22, 2007 [Page 5] + +Internet-Draft draft-ietf-avt-rtp-theora-00 July 2006 + + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Configuration Ident | F |TDT|# pkts.| + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + +-+-+-+-+-+-+-+-+ + + Figure 2: Payload Header + + Configuration Ident: 24 bits + + This 24 bit field is used to associate the Theora data to a decoding + Packed Configuration. + + Fragment type (F): 2 bit + + This field is set according to the following list + + 0 = Not Fragmented + 1 = Start Fragment + 2 = Continuation Fragment + 3 = End Fragment + + This field must be zero if the number of packets field is non-zero. + + Theora Data Type (TDT): 2 bits + + This field sets the packet payload type for the Theora data. There + are currently three Theora payload types currently used and one + reserved for future use. + + 0 = Raw Theora payload + 1 = Theora Packed Configuration payload + 2 = Legacy Theora Comment payload + 3 = Reserved + + The packets with a TDT of value 3 MUST be ignored + + The last 4 bits represent the number of complete packets in this + payload. This provides a maximum number of 15 Theora packets in the + payload. If the packet contains fragmented data the number of + packets MUST be set to 0. + +2.3. Payload Data + + Each Theora payload section starts with a two octets length header + that is used to represent the size of the following data payload, + + + +Barbato Expires January 22, 2007 [Page 6] + +Internet-Draft draft-ietf-avt-rtp-theora-00 July 2006 + + + followed by the raw Theora packet data. + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Payload Length | Theora Data .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 3: Payload Data + + The Theora codec uses relatively unstructured raw packets containing + binary integer fields of arbitrary width that often do not fall on an + octet boundary. When a Theora encoder produces packets, unused space + in the last byte of a packet is always zeroed during the encoding + process. Thus, should this unused space be read, it will return + binary zeros. + + For payloads which consist of multiple Theora packets the payload + data consists of the payload length field followed by the first + Theora packet's data, then the payload length followed by the second + Theora packet, and so on for each of the Theora packets in the + payload. + +2.4. Example RTP Packet + + Here is an example RTP packet containing two Theora packets. + + RTP Packet Header: + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | 2 |0|0| 0 |0| PT | sequence number | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | timestamp | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | synchronisation source (SSRC) identifier | + +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ + | contributing source (CSRC) identifiers | + | ... | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 4: Example RTP Packet + + Payload Data: + + + + + + +Barbato Expires January 22, 2007 [Page 7] + +Internet-Draft draft-ietf-avt-rtp-theora-00 July 2006 + + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Configuration Ident | 0 | 0 | 2 pks | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Payload Length | .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + .. Theora data .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + .. data | Payload Length | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + .. Theora data | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 5: Example Theora Payload Packet + + The payload portion of the packet begins with the 24 bit + Configuration ident field followed by 8 bits describing the payload. + The Fragment type field is set to 0, indicating that this packet + contains whole Theora frame data. The Data type field is set to 0 + (theora raw data). The number of whole Theora data packets is set to + 2. + + Each of the payload blocks starts with the two octets length field + followed by the variable length Theora packet data. + + +3. Configuration Headers + + To decode a Theora stream three configuration header packets are + needed. The first (Identification Header) indicates frame + dimensions, quality, blocks used and Theora encoder version. The + second (Comment Header) contains stream metadata and the third (Setup + Header) contains details of the dequantization and Huffman tables. + + Since this information must be transmitted reliably, and as the RTP + stream may change certain configuration data mid-session, there are + different methods for delivering this configuration data to a client, + both in-band and out-of-band, which are detailed below. SDP delivery + is used to set up an initial state for the client application. The + changes may be due to different dequantization and Huffman tables as + well as different bitrates of the stream. + + The delivery vectors in use are specified by an SDP attribute that + indicates the method and the optional URI where the Theora Packed + Configuration (Section 3.1.1) Packets could be fetched. Different + delivery methods MAY be advertised for the same session. The in-band + codebook delivery SHOULD be considered as baseline, out-of-band + + + +Barbato Expires January 22, 2007 [Page 8] + +Internet-Draft draft-ietf-avt-rtp-theora-00 July 2006 + + + delivery methods that don't use RTP will not be described in this + document. For non chained streams, the RECOMMENDED Configuration + delivery method is inline the Packed Configuration (Section 3.1.1) in + the SDP as explained in the IANA considerations (Section 6.1) + + The 24 bit Ident field is used to map which Configuration will be + used to decode a packet. When the Ident field changes, it indicates + that a change in the stream has taken place. The client application + MUST have in advance the correct configuration and if the client + detects a change in the Ident value and does not have this + information it MUST NOT decode the raw data associated until it has + fetched the correct Configuration. + +3.1. In-band Header Transmission + + The Packed Configuration (Section 3.1.1) Payload is sent in-band with + the packet type bits set to match the payload type. Clients MUST be + capable of dealing with periodic re-transmission of the configuration + headers. + +3.1.1. Packed Configuration + + A Theora Packed Configuration is identified by a payload type field + of 1. Of the three headers, defined in the Theora I specification + [16], the identification and the setup will be packed together, while + the comment header will be completely suppressed. It is up to the + client to provide a minimal size comment header to the decoder if + required by the implementation. + + + + + + + + + + + + + + + + + + + + + + + +Barbato Expires January 22, 2007 [Page 9] + +Internet-Draft draft-ietf-avt-rtp-theora-00 July 2006 + + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |V=2|P|X| CC |M| PT | xxxx | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | xxxxx | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | synchronization source (SSRC) identifier | + +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ + | contributing source (CSRC) identifiers | + | ... | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Configuration Ident | 0 | 1 | 1| + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | length | Identification .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + .. Identification .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + .. Identification .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + .. Identification | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + .. | Setup .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + .. Setup .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + .. Setup | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 6: Packed Configuration Figure + + The Ident field is set with the value that will be used by the Raw + Payload Packets to address this Configuration. The Fragment type is + set to 0 since the packet bears full Packed configuration, the number + of packet is set to 1. In practice, Packed Headers usually need to + be fragmented to fit the path MTU. + +3.2. Out of Band Transmission + + This section, as stated above, does not cover all the possible out- + of-band delivery methods since they rely on different protocols and + are linked to specific applications. The following packet definition + SHOULD be used in out-of-band delivery and MUST be used when + Configuration is inlined in the SDP. + + + + + + +Barbato Expires January 22, 2007 [Page 10] + +Internet-Draft draft-ietf-avt-rtp-theora-00 July 2006 + + +3.2.1. Packed Headers + + As mentioned above, the recommended delivery vector for Theora + configuration data is via a retrieval method that can be performed + using a reliable transport protocol. As the RTP headers are not + required for this method of delivery the structure of the + configuration data is slightly different. The packed header starts + with a 32 bit count field which details the number of packed headers + that are contained in the bundle. Next is the Packed header payload + for each setup id. + + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Number of packed headers | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Packed header | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Packed header | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 7: Packed Headers Overview + + Since the Configuration Ident and the Identification Header are fixed + length there is only a 16bit Length tag to define the length of the + packed headers. + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Configuration Ident | .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + .. Length | Identification Header .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + .. Identification Header | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Setup Header .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + .. Setup Header | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 8: Packed Headers Detail + + The key difference from the in-band format is that there is no need + for the payload header octet. + + + + + + +Barbato Expires January 22, 2007 [Page 11] + +Internet-Draft draft-ietf-avt-rtp-theora-00 July 2006 + + +3.2.1.1. Packed Headers IANA Considerations + + The following IANA considerations MUST only be applied to the packed + headers. + + MIME media type name: audio + + MIME subtype: theora-config + + Required Parameters: + + None + + Optional Parameters: + + None + + Encoding considerations: + + This media type contains binary data. + + Security Considerations: + + See Section 6 of RFC XXXX. + + Interoperability considerations: + + None + + Published specification: + + RFC XXXX [RFC Editor: please replace by the RFC number of this + memo, when published] + + Applications which use this media type: + + Theora encoded video, configuration data. + + Additional information: + + None + + Person & email address to contact for further information: + + Luca Barbato: + IETF Audio/Video Transport Working Group + + + + + +Barbato Expires January 22, 2007 [Page 12] + +Internet-Draft draft-ietf-avt-rtp-theora-00 July 2006 + + + Intended usage: COMMON + + Restriction on usage: + + This media type does not depend on the transport. + + Author: + + Luca Barbato + + Change controller: + + IETF AVT Working Group + +3.3. Loss of Configuration Headers + + Unlike the loss of raw Theora payload data, the loss of a + configuration header can lead to a situation where it will not be + possible to successfully decode the stream. + + A loss of a Configuration Packet causes the stream decoder to halt + and SHOULD be reported to the client as well as a loss report sent + via RTCP. + + +4. Comment Headers + + When the payload type is set to 2, the packet contains comment + metadata such as artist name, track title and so on. These metadata + messages are not intended to be fully descriptive but to offer basic + title information. Clients MAY choose to completely ignore them. + The details on the comments format can be found in the Theora + documentation [16]. + + + + + + + + + + + + + + + + + + +Barbato Expires January 22, 2007 [Page 13] + +Internet-Draft draft-ietf-avt-rtp-theora-00 July 2006 + + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |V=2|P|X| CC |M| PT | xxxx | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | xxxxx | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | synchronization source (SSRC) identifier | + +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ + | contributing source (CSRC) identifiers | + | ... | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Configuration Ident | 0 | 2 | 1| + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | length | Comment .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + .. Comment .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + .. Comment | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 9: Comment Packet + + The 2 byte length field is necessary since this Theora packet could + be fragmented. + + +5. Frame Packetizing + + Each RTP packet contains either one complete Theora packet, one + Theora packet fragment, or an integer number of complete Theora + packets (up to a maximum of 15 packets, since the number of packets + is defined by a 4 bit value). + + Any Theora data packet that is less than path MTU SHOULD be bundled + in the RTP packet with as many Theora packets as will fit, up to a + maximum of 15. Path MTU is detailed in [7] and [8]. + + A fragmented packet has a zero in the last four bits of the payload + header. The RTP packet containing the first fragment will set the + Fragment type to 1. Each RTP packet after the first will set the + Fragment type to 2 in the payload header. The RTP packet containing + the last fragment of the Theora packet will have the Fragment type + set to 3. If the fragmented Theora packet spans only two RTP + packets, the first will set the Fragment type field to 1 and the + second will set it to 2. To maintain the correct sequence for + fragmented packet reception the timestamp field of fragmented packets + + + +Barbato Expires January 22, 2007 [Page 14] + +Internet-Draft draft-ietf-avt-rtp-theora-00 July 2006 + + + MUST be the same as the first packet sent, with the sequence number + incremented as normal for the subsequent RTP packets. + +5.1. Example Fragmented Theora Packet + + Here is an example fragmented Theora packet split over three RTP + packets. Each packet contains the standard RTP headers as well as + the 4 octets Theora headers. + + Packet 1: + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |V=2|P|X| CC |M| PT | 1000 | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | xxxxx | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | synchronization source (SSRC) identifier | + +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ + | contributing source (CSRC) identifiers | + | ... | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Configuration Ident | 1 | 0 | 0| + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Payload Length | Theora data .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + .. Theora data .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 10: Example Fragmented Packet (Packet 1) + + In this packet the initial sequence number is 1000 and the timestamp + is xxxxx. The Fragment type field is set to one, indicating it is + the start packet of a serie of fragments. The number of packets + field is set to 0, and as the payload is raw Theora data the Theora + payload type field is set to 0. + + + + + + + + + + + + + +Barbato Expires January 22, 2007 [Page 15] + +Internet-Draft draft-ietf-avt-rtp-theora-00 July 2006 + + + Packet 2: + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |V=2|P|X| CC |M| PT | 1001 | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | xxxxx | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | synchronization source (SSRC) identifier | + +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ + | contributing source (CSRC) identifiers | + | ... | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Configuration Ident | 2 | 0 | 0| + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Payload Length | .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + .. Theora data .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 11: Example Fragmented Packet (Packet 2) + + The Fragment type field is set to 2 and the number of packets field + is set to 0. For large Theora fragments there can be several of + these type of payload packets. The maximum RTP packet size SHOULD be + no greater than the path MTU, including all RTP and payload headers. + The sequence number has been incremented by one but the timestamp + field remains the same as the initial packet. + + + + + + + + + + + + + + + + + + + + + +Barbato Expires January 22, 2007 [Page 16] + +Internet-Draft draft-ietf-avt-rtp-theora-00 July 2006 + + + Packet 3: + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |V=2|P|X| CC |M| PT | 1002 | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | xxxxx | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | synchronization source (SSRC) identifier | + +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ + | contributing source (CSRC) identifiers | + | ... | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Configuration Ident | 3 | 0 | 0| + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Payload Length | .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + .. Theora data .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 12: Example Fragmented Packet (Packet 3) + + This is the last Theora fragment packet. The Fragment type filed is + set to 3 and the packet count remains set to 0. As in the previous + packets the timestamp remains set to the first packet in the sequence + and the sequence number has been incremented. + +5.2. Packet Loss + + As there is no error correction within the Theora stream, packet loss + will result in a loss of signal. Packet loss is more of an issue for + fragmented Theora packets as the client will have to cope with the + handling of the Fragment type field. If we use the fragmented Theora + packet example above and the first packet is lost the client MUST + detect that the next packet has the packet count field set to 0 and + the Fragment type is set to 2 and MUST drop it. The next packet, + which is the final fragmented packet, MUST be dropped in the same + manner. Feedback reports on lost and dropped packets MUST be sent + back via RTCP.[note: reordering] + + If a particular multicast session has a large number of participants + care must be taken to prevent an RTCP feedback implosion, [9], in the + event of packet loss from a large number of participants. + + Loss of any of the Configuration fragment will result in the loss of + the full Configuration packet as detailed in the Loss of + + + +Barbato Expires January 22, 2007 [Page 17] + +Internet-Draft draft-ietf-avt-rtp-theora-00 July 2006 + + + Configuration Headers (Section 3.3) section. + + +6. IANA Considerations + + MIME media type name: video + + MIME subtype: theora + + Required Parameters: + + sampling: Determines the chroma subsampling format. + + width: Determines the number of pixels per line. This is an + integer between 1 and 1048561 and MUST be in multiples of 16. + + height: Determines the number of lines per frame encoded. This is + an integer between 1 and 1048561 and MUST be in multiples of + 16. + + delivery-method: indicates the delivery methods in use, the + possible values are: inline, in_band, out_band/specific_name + Where "specific_name" is the name of the out of band delivery + method. + + configuration: the base16 [11] (hexadecimal) representation of the + Packed Headers (Section 3.2.1). + + Optional Parameters: + + configuration-uri: the URI of the configuration headers in case of + out of band transmission. In the form of + "protocol://path/to/resource/". Depending on the specific + method the single ident packets could be retrived by their + number or aggregated in a single stream, aggregates MAY be + compressed using gzip [12] or bzip2 [14] and an sha1 [13] + checksum MAY be provided in the form of + "protocol://path/to/resource/aggregated.bz2!sha1hash" + + Encoding considerations: + + This media type is framed and contains binary data. + + Security Considerations: + + See Section 6 of RFC XXXX. + + + + + +Barbato Expires January 22, 2007 [Page 18] + +Internet-Draft draft-ietf-avt-rtp-theora-00 July 2006 + + + Interoperability considerations: + + None + + Published specification: + + RFC XXXX [RFC Editor: please replace by the RFC number of this + memo, when published] + + Ogg Theora I specification: Codec setup and packet decode. + Available from the Xiph website, http://www.xiph.org + + Applications which use this media type: + + Audio streaming and conferencing tools + + Additional information: + + None + + Person & email address to contact for further information: + + Luca Barbato: + IETF Audio/Video Transport Working Group + + Intended usage: + + COMMON + + Restriction on usage: + + This media type depends on RTP framing, and hence is only defined + for transfer via RTP [3] + + Author: + + Luca Barbato + + Change controller: + + IETF AVT Working Group + + +6.1. Mapping MIME Parameters into SDP + + The information carried in the MIME media type specification has a + specific mapping to fields in the Session Description Protocol (SDP) + [6], which is commonly used to describe RTP sessions. When SDP is + + + +Barbato Expires January 22, 2007 [Page 19] + +Internet-Draft draft-ietf-avt-rtp-theora-00 July 2006 + + + used to specify sessions the mapping are as follows: + + o The MIME type ("video") goes in SDP "m=" as the media name. + + o The MIME subtype ("theora") goes in SDP "a=rtpmap" as the encoding + name. + + o The clock rate in the "a=rtpmap" line MUST be 90000 + + o The mandated parameters "delivery-method" and "configuration" MUST + be included in the SDP "a=fmpt" attribute. + + o The optional parameter "configuration-uri", when present, MUST be + included in the SDP "a=fmpt" attribute and MUST follow the + delivery-method that applies. + + If the stream uses multiple decoder setup configurations and all of + them are known in advance, the Configuration Packet for each file + SHOULD be packaged together and passed to the client using the + configuration attribute. + + The URI specified in the configuration-uri attribute MUST point to a + location where all of the Configuration Packets needed for the life + of the session reside. + +6.1.1. SDP Example + + The following example shows a basic SDP for a single stream. The + first configuration packet is inlined in the sdp, other + configurations could be fetched at any time from the first provided + uri using or all the known configuration could be downloaded using + the second uri. The inline base16 [11] configuration string is + omitted because of the lenght. + c=IN IP4 192.0.0.1 + m=video RTP/AVP 98 + a=rtpmap:98 theora/90000 + a=fmtp:98 sampling=YCbCr-4:2:2; width=1280; height=720; delivery- + method=inline; configuration=base16string1; delivery- + method=out_band/rtsp; delivery-method=out_band/rtsp; + configuration-uri=rtsp://path/to/resource/; delivery- + method=out_band/http; configuration-uri=http://another/path/to/ + resource/aggregate.bz2!sha1hash; + +6.2. Usage with the SDP Offer/Answer Model + + The offer, as described in An Offer/Answer Model Session Description + Protocol [5], may contain a large number of delivery methods per + single fmtp attribute, the answerer MUST remove every delivery-method + + + +Barbato Expires January 22, 2007 [Page 20] + +Internet-Draft draft-ietf-avt-rtp-theora-00 July 2006 + + + and configuration-uri not supported. All the parameters MUST not be + altered on answer otherwise. + + +7. Examples + + The following examples are common usage patterns that MAY be applied + in such situations, the main scope of this section is to explain + better usage of the transmission vectors. + +7.1. Stream Video + + This is one of the most common situation: one single server streaming + content in multicast, the clients may start a session at random time. + The content itself could be a mix of live stream, as the wj's voice + or studio scenes, and stored streams, as the music she plays. + + In this situation we don't know in advance how many codebooks we will + use. The clients can join anytime and users expect to start the + fruition of the content in a short time. + + On join the client will receive the current Configuration necessary + to decode the current streams inlined in the SDP so that the decoding + will start immediately after. + + When the streamed content changes the new Configuration is sent in- + band before the actual stream, and the Configuration that has to be + sent inline in the SDP updated. Since the inline method is + unreliable, an out of band fallback is provided. + + The client could choose to fetch the Configuration from the alternate + source as soon it discovers a Configuration packet got lost inline or + use selective retransmission [17], if the server supports the + feature. + + A serverside optimization would be to keep an hash list of the + Configurations per session to avoid packing all of them and send the + same Configuration with different Ident tags + + A clientside optimization would be to keep a tag list of the + Configurations per session and don't process configuration packets + already known. + + +8. Security Considerations + + RTP packets using this payload format are subject to the security + considerations discussed in the RTP specification [3]. This implies + + + +Barbato Expires January 22, 2007 [Page 21] + +Internet-Draft draft-ietf-avt-rtp-theora-00 July 2006 + + + that the confidentiality of the media stream is achieved by using + encryption. Because the data compression used with this payload + format is applied end-to-end, encryption may be performed on the + compressed data. Where the size of a data block is set care MUST be + taken to prevent buffer overflows in the client applications. + + +9. Acknowledgments + + This document is a continuation of draft-kerr-avt-theora-rtp-00.txt + + Thanks to the AVT, Ogg Theora Communities / Xiph.org, Fluendo, Ralph + Giles, Mike Smith, Phil Kerr, Timothy Terriberry, Stefan Ehmann, + Alessandro Salvatori, Politecnico di Torino (LS)^3/IMG Group in + particular Federico Ridolfo, Francesco Varano, Giampaolo Mancini, + Juan Carlos De Martin. + + +10. References + +10.1. Normative References + + [1] Pfeiffer, S., "The Ogg Encapsulation Format Version 0", + RFC 3533. + + [2] Bradner, S., "Key words for use in RFCs to Indicate Requirement + Levels", RFC 2119. + + [3] Schulzrinne, H., Casner, S., Frederick, R., and V. Jacobson, + "RTP: A Transport Protocol for real-time applications", + RFC 3550. + + [4] Schulzrinne, H. and S. Casner, "RTP Profile for video and Video + Conferences with Minimal Control.", RFC 3551. + + [5] Rosenberg, J. and H. Schulzrinne, "An Offer/Answer Model with + Session Description Protocol (SDP)", RFC 3264. + + [6] Handley, M. and V. Jacobson, "SDP: Session Description + Protocol", RFC 2327. + + [7] Mogul et al., J., "Path MTU Discovery", RFC 1063. + + [8] McCann et al., J., "Path MTU Discovery for IP version 6", + RFC 1981. + + [9] Ott, J., Wenger, S., Sato, N., Burmeister, C., and J. Rey, + "Extended RTP Profile for RTCP-based Feedback (RTP/AVPF)", + + + +Barbato Expires January 22, 2007 [Page 22] + +Internet-Draft draft-ietf-avt-rtp-theora-00 July 2006 + + + Internet Draft (draft-ietf-avt-rtcp-feedback-11: Work in + progress). + + [10] Barbato, L., "RTP Payload Format for Vorbis Encoded Audio - + draft-ietf-avt-vorbis-rtp-00", Internet Draft (Work in + progress). + + [11] Josefsson, S., "The Base16, Base32, and Base64 Data Encodings", + RFC 3548. + + [12] Deutsch, P., "GZIP file format specification version 4.3", + RFC 1952. + + [13] National Institute of Standards and Technology, "Secure Hash + Standard", May 1993. + + [14] Seward, J., "libbz2 and bzip2". + +10.2. Informative References + + [15] "libTheora: Available from the Xiph website, + http://www.xiph.org". + + [16] "Theora I specification: Codec setup and packet decode. + http://www.xiph.org/theora/doc/Theora_I_spec.pdf". + + [17] Friedman, T., Caceres, R., and A. Clark, "RTP Control Protocol + Extended Reports (RTCP XR)", RFC 3611, November 2003. + + [18] "ITU-T Recommendation V.42, 1994, Rev. 1. Error-correcting + Procedures for DCEs Using Asynchronous-to-Synchronous + Conversion. International Telecommunications Union. Available + from the ITU website, http://www.itu.int". + + [19] "ISO 3309, October 1984, 3rd Edition. Information Processing + Systems--Data Communication High-Level Data Link Control + Procedure--Frame Structure. International Organization for + Standardization.". + + + + + + + + + + + + + +Barbato Expires January 22, 2007 [Page 23] + +Internet-Draft draft-ietf-avt-rtp-theora-00 July 2006 + + +Author's Address + + Luca Barbato + Xiph.Org + + Email: lu_zero@gentoo.org + URI: http://www.xiph.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Barbato Expires January 22, 2007 [Page 24] + +Internet-Draft draft-ietf-avt-rtp-theora-00 July 2006 + + +Intellectual Property Statement + + The IETF takes no position regarding the validity or scope of any + Intellectual Property Rights or other rights that might be claimed to + pertain to the implementation or use of the technology described in + this document or the extent to which any license under such rights + might or might not be available; nor does it represent that it has + made any independent effort to identify any such rights. Information + on the procedures with respect to rights in RFC documents can be + found in BCP 78 and BCP 79. + + Copies of IPR disclosures made to the IETF Secretariat and any + assurances of licenses to be made available, or the result of an + attempt made to obtain a general license or permission for the use of + such proprietary rights by implementers or users of this + specification can be obtained from the IETF on-line IPR repository at + http://www.ietf.org/ipr. + + The IETF invites any interested party to bring to its attention any + copyrights, patents or patent applications, or other proprietary + rights that may cover technology that may be required to implement + this standard. Please address the information to the IETF at + ietf-ipr@ietf.org. + + +Disclaimer of Validity + + This document and the information contained herein are provided on an + "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS + OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET + ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE + INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED + WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + + +Copyright Statement + + Copyright (C) The Internet Society (2006). This document is subject + to the rights, licenses and restrictions contained in BCP 78, and + except as set forth therein, the authors retain all their rights. + + +Acknowledgment + + Funding for the RFC Editor function is currently provided by the + Internet Society. + + + + +Barbato Expires January 22, 2007 [Page 25] + diff --git a/cs/3rd party/libtheora/doc/draft-ietf-avt-rtp-theora-00.xml b/cs/3rd party/libtheora/doc/draft-ietf-avt-rtp-theora-00.xml new file mode 100644 index 000000000..3c59e104b --- /dev/null +++ b/cs/3rd party/libtheora/doc/draft-ietf-avt-rtp-theora-00.xml @@ -0,0 +1,1146 @@ + + + + + + + + +draft-ietf-avt-rtp-theora-00 + + +Xiph.Org +
    +lu_zero@gentoo.org +http://www.xiph.org/ +
    +
    + + +General +AVT Working Group +I-D + +Internet-Draft +Theora +RTP + + + +This document describes a RTP payload format for transporting Theora encoded video. It details the RTP encapsulation mechanism for raw Theora data and configuration headers necessary to configure the decoder. + + + +Also included within the document are the necessary details for the use of Theora with MIME and Session Description Protocol (SDP). + + + + + + +All references to RFC XXXX are to be replaced by references to the RFC number of this memo, when published. + + + +
    + + + +
    + +Theora is a general purpose, lossy video codec. It is based on the VP3 video codec produced by On2 Technologies and has been donated to the Xiph.org Foundation. + + +Theora I is a block-based lossy transform codec that utilizes an 8 x 8 Type-II Discrete Cosine Transform and block-based motion compensation. This places it in the same class of codecs as MPEG-1, MPEG-2, MPEG-4, and H.263. The details of how individual blocks are organized and how DCT coefficients are stored in the bitstream differ substantially from these codecs, however. Theora supports only intra frames (I frames in MPEG) and inter frames (P frames in MPEG). + + + +Theora provides none of its own framing, synchronization, or protection against transmission errors. Instead, the codec expects to receive a discrete sequence of data packets. Theora is a free-form variable bit rate (VBR) codec, and these packets have no minimum size, maximum size, or fixed/expected size. Theora packets are thus intended to be used with a transport mechanism that provides free-form framing, synchronization, positioning, and error correction in accordance with these design assumptions, such as Ogg or RTP/AVP . + + + +Theora I currently supports progressive video data of arbitrary dimensions at a constant frame rate in one of several Y'CbCr color spaces. +Three different chroma subsampling formats are supported: 4:2:0, 4:2:2, and 4:4:4. The Theora I format does not support interlaced material, variable frame rates, bit-depths larger than 8 bits per component, nor alternate color spaces such as RGB or arbitrary multi-channel spaces. Black and white content can be efficiently encoded, however, because the uniform chroma planes compress well. For performance reason, arbitrary frame sizes will be encoded rounding both dimensions to the upper multiple of 16. The original width and height will be encoded in the header and the decoder will use this information to clip the decoded frame to the right dimensions. + + + +Theora is similar to the Vorbis audio in that the decoder reads the probability model for the entropy coder and all quantization parameters from special "header" packets at the start of the compressed data. It is therefore impossible to decode any video data without having previously fetched the codec info and codec setup headers, although Theora can begin to decode at an arbitrary intra-frame packet so long as the codec has been initialized with the associated headers. + + +
    + + +The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", +and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 . + + +
    +
    + +
    + + +For RTP based transportation of Theora encoded video the standard RTP header is followed by a 4 octets payload header, then the payload data. The payload headers are used to associate the Theora data with its associated decoding codebooks as well as indicating if the following packet contains fragmented Theora data and/or the number of whole Theora data frames. The payload data contains the raw Theora bitstream information. + + + +For RTP based transport of Theora encoded video the standard RTP header is followed by a 4 octets payload header, then the payload data. + + +
    + + +The format of the RTP header is specified in and shown in Figure 1. This payload format uses the fields of the header in a manner consistent with that specification. + + +
    + +
    + + +The RTP header begins with an octet of fields (V, P, X, and CC) to support specialized RTP uses (see and for details). For Theora RTP, the following values are used. + + + +Version (V): 2 bits +This field identifies the version of RTP. The version used by this specification is two (2). + + + +Padding (P): 1 bit +Padding MAY be used with this payload format according to section 5.1 of . + + + +Extension (X): 1 bit +The Extension bit is used in accordance with . + + + +CSRC count (CC): 4 bits +The CSRC count is used in accordance with . + + + +Marker (M): 1 bit +The Marker bit is used in accordance with . + + + +Payload Type (PT): 7 bits +An RTP profile for a class of applications is expected to assign a payload type for this format, or a dynamically allocated payload type SHOULD be chosen which designates the payload as Theora. + + + +Sequence number: 16 bits +The sequence number increments by one for each RTP data packet sent, and may be used by the receiver to detect packet loss and to restore packet sequence. This field is detailed further in . + + + +Timestamp: 32 bits +A timestamp representing the presentation time of the first sample of the first Theora packet in the RTP packet. The clock frequency MUST be set to 90kHz. + + + +SSRC/CSRC identifiers: +These two fields, 32 bits each with one SSRC field and a maximum of 16 CSRC fields, are as defined in . + + +
    + +
    + + +The 4 octets following the RTP Header section represent the Payload Header. This header is split into a number of bitfields detailing the format of the following Payload Datagrams. + + +
    + +
    + + +Configuration Ident: 24 bits + +This 24 bit field is used to associate the Theora data to a decoding Packed Configuration. + + + +Fragment type (F): 2 bit + +This field is set according to the following list + + + + 0 = Not Fragmented + 1 = Start Fragment + 2 = Continuation Fragment + 3 = End Fragment + + +This field must be zero if the number of packets field is non-zero. + + +Theora Data Type (TDT): 2 bits + +This field sets the packet payload type for the Theora data. There are currently three Theora payload types currently used and one reserved for future use. + + + + + 0 = Raw Theora payload + 1 = Theora Packed Configuration payload + 2 = Legacy Theora Comment payload + 3 = Reserved + + + The packets with a TDT of value 3 MUST be ignored + + +The last 4 bits represent the number of complete packets in this payload. This provides a maximum number of 15 Theora packets in the payload. If the packet contains fragmented data the number of packets MUST be set to 0. + + +
    + +
    + + +Each Theora payload section starts with a two octets length header that is used to represent the size of the following data payload, followed by the raw Theora packet data. + + +
    + +
    + + +The Theora codec uses relatively unstructured raw packets containing binary integer fields of arbitrary width that often do not fall on an octet boundary. When a Theora encoder produces packets, unused space in the last byte of a packet is always zeroed during the encoding process. Thus, should this unused space be read, it will return binary zeros. + + + +For payloads which consist of multiple Theora packets the payload data consists of the payload length field followed by the first Theora packet's data, then the payload length followed by the second Theora packet, and so on for each of the Theora packets in the payload. + + +
    + +
    + + +Here is an example RTP packet containing two Theora packets. + + +RTP Packet Header: + + +
    + +
    + + + +Payload Data: + + +
    + +
    + + +The payload portion of the packet begins with the 24 bit Configuration ident field followed by 8 bits describing the payload. The Fragment type field is set to 0, indicating that this packet contains whole Theora frame data. The Data type field is set to 0 (theora raw data). The number of whole Theora data packets is set to 2. + + + +Each of the payload blocks starts with the two octets length field followed +by the variable length Theora packet data. + + +
    +
    + +
    + + +To decode a Theora stream three configuration header packets are needed. The first (Identification Header) indicates frame dimensions, quality, blocks used and Theora encoder version. The second (Comment Header) contains stream metadata and the third (Setup Header) contains details of the dequantization and Huffman tables. + + + +Since this information must be transmitted reliably, and as the RTP stream may change certain configuration data mid-session, there are different methods for delivering this configuration data to a client, both in-band and out-of-band, which are detailed below. SDP delivery is used to set up an initial state for the client application. The changes may be due to different dequantization and Huffman tables as well as different bitrates of the stream. + + + +The delivery vectors in use are specified by an SDP attribute that indicates the method and the optional URI where the Theora Packed Configuration Packets could be fetched. Different delivery methods MAY be advertised for the same session. The in-band codebook delivery SHOULD be considered as baseline, out-of-band delivery methods that don't use RTP will not be described in this document. For non chained streams, the RECOMMENDED Configuration delivery method is inline the Packed Configuration in the SDP as explained in the IANA considerations + + + +The 24 bit Ident field is used to map which Configuration will be used to decode a packet. When the Ident field changes, it indicates that a change in the stream has taken place. The client application MUST have in advance the correct configuration and if the client detects a change in the Ident value and does not have this information it MUST NOT decode the raw data associated until it has fetched the correct Configuration. + + + +
    + + +The Packed Configuration Payload is sent in-band with the packet type bits set to match the payload type. Clients MUST be capable of dealing with periodic re-transmission of the configuration headers. + + +
    + + +A Theora Packed Configuration is identified by a payload type field of 1. Of the three headers, defined in the Theora I specification, the identification and the setup will be packed together, while the comment header will be completely suppressed. It is up to the client to provide a minimal size comment header to the decoder if required by the implementation. + + +
    + +
    +The Ident field is set with the value that will be used by the Raw Payload Packets to address this Configuration. The Fragment type is set to 0 since the packet bears full Packed configuration, the number of packet is set to 1. In practice, Packed Headers usually need to be fragmented to fit the path MTU. + + +
    + +
    + +
    + + +This section, as stated above, does not cover all the possible out-of-band delivery methods since they rely on different protocols and are linked to specific applications. The following packet definition SHOULD be used in out-of-band delivery and MUST be used when Configuration is inlined in the SDP. + + +
    + + +As mentioned above, the recommended delivery vector for Theora configuration data is via a retrieval method that can be performed using a reliable transport protocol. As the RTP headers are not required for this method of delivery the structure of the configuration data is slightly different. The packed header starts with a 32 bit count field which details the number of packed headers that are contained in the bundle. Next is the Packed header payload for each setup id. + + +
    + +
    + + +Since the Configuration Ident and the Identification Header are fixed length there is only a 16bit Length tag to define the length of the packed headers. + + +
    +
    + +The key difference from the in-band format is that there is no need for the payload header octet. + + +
    + + +The following IANA considerations MUST only be applied to the packed headers. + + + + + + video + + + + theora-config + + + + + +None + + + + + + +None + + + + + + +This media type contains binary data. + + + + + + +See Section 6 of RFC XXXX. + + + + + + +None + + + + + + +RFC XXXX [RFC Editor: please replace by the RFC number of this memo, + when published] + + + + + + +Theora encoded video, configuration data. + + + + + + +None + + + + + + +Luca Barbato: <lu_zero@gentoo.org> + +IETF Audio/Video Transport Working Group + + + + + +COMMON + + + + + + +This media type does not depend on the transport. + + + + + + +Luca Barbato + + + + + +IETF AVT Working Group + + +
    +
    + +
    + +
    + + +Unlike the loss of raw Theora payload data, the loss of a configuration header can lead to a situation where it will not be possible to successfully decode the stream. + + + +A loss of a Configuration Packet causes the stream decoder to halt and SHOULD be reported to the client as well as a loss report sent via RTCP. + + +
    + +
    + +
    + + +When the payload type is set to 2, the packet contains comment metadata such as artist name, track title and so on. These metadata messages are not intended to be fully descriptive but to offer basic title information. Clients MAY choose to completely ignore them. The details on the comments format can be found in the Theora documentation. + + +
    + +
    + +The 2 byte length field is necessary since this Theora packet could be fragmented. + +
    + +
    + + +Each RTP packet contains either one complete Theora packet, one Theora packet fragment, or an integer number of complete Theora packets (up to a maximum of 15 packets, since the number of packets is defined by a 4 bit value). + + + +Any Theora data packet that is less than path MTU SHOULD be bundled in the RTP packet with as many Theora packets as will fit, up to a maximum of 15. Path MTU is detailed in and . + + + +A fragmented packet has a zero in the last four bits of the payload header. The RTP packet containing the first fragment will set the Fragment type to 1. Each RTP packet after the first will set the Fragment type to 2 in the payload header. The RTP packet containing the last fragment of the Theora packet will have the Fragment type set to 3. If the fragmented Theora packet spans only two RTP packets, the first will set the Fragment type field to 1 and the second will set it to 2. To maintain the correct sequence for fragmented packet reception the timestamp field of fragmented packets MUST be the same as the first packet sent, with the sequence number incremented as normal for the subsequent RTP packets. + +
    + + +Here is an example fragmented Theora packet split over three RTP packets. Each packet contains the standard RTP headers as well as the 4 octets Theora headers. + + +
    + +
    + + +In this packet the initial sequence number is 1000 and the timestamp is xxxxx. The Fragment type field is set to one, indicating it is the start packet of a serie of fragments. The number of packets field is set to 0, and as the payload is raw Theora data the Theora payload type field is set to 0. + + +
    + +
    + + +The Fragment type field is set to 2 and the number of packets field is set to 0. For large Theora fragments there can be several of these type of payload packets. The maximum RTP packet size SHOULD be no greater than the path MTU, including all RTP and payload headers. The sequence number has been incremented by one but the timestamp field remains the same as the initial packet. + + +
    + +
    + + +This is the last Theora fragment packet. The Fragment type filed is set to 3 and the packet count remains set to 0. As in the previous packets the timestamp remains set to the first packet in the sequence and the sequence number has been incremented. + + +
    + +
    + + +As there is no error correction within the Theora stream, packet loss will result in a loss of signal. Packet loss is more of an issue for fragmented Theora packets as the client will have to cope with the handling of the Fragment type field. If we use the fragmented Theora packet example above and the first packet is lost the client MUST detect that the next packet has the packet count field set to 0 and the Fragment type is set to 2 and MUST drop it. The next packet, which is the final fragmented packet, MUST be dropped in the same manner. Feedback reports on lost and dropped packets MUST be sent back via RTCP.[note: reordering] + + + +If a particular multicast session has a large number of participants care must be taken to prevent an RTCP feedback implosion, , in the event of packet loss from a large number of participants. + + + +Loss of any of the Configuration fragment will result in the loss of the full Configuration packet as detailed in the Loss of Configuration Headers section. + + +
    +
    + +
    + + + + + video + + + + theora + + + + + + + + + + Determines the chroma subsampling format. + + + + + Determines the number of pixels per line. This is an integer between 1 and 1048561 and MUST be in multiples of 16. + + + + +Determines the number of lines per frame encoded. This is an integer between 1 and 1048561 and MUST be in multiples of 16. + + + + + indicates the delivery methods in use, the possible values are: inline, in_band, out_band/specific_name +Where "specific_name" is the name of the out of band delivery method. + + + + + the base16 (hexadecimal) representation of the Packed Headers. + + + + + + + + + + + + the URI of the configuration headers in case of out of band transmission. In the form of "protocol://path/to/resource/". Depending on the specific method the single ident packets could be retrived by their number or aggregated in a single stream, aggregates MAY be compressed using gzip or bzip2 and an sha1 checksum MAY be provided in the form of "protocol://path/to/resource/aggregated.bz2!sha1hash" + + + + + + + +This media type is framed and contains binary data. + + + + + + +See Section 6 of RFC XXXX. + + + + + +None + + + + + + + + RFC XXXX [RFC Editor: please replace by the RFC number of this memo, when published] + +Ogg Theora I specification: Codec setup and packet decode. Available from the Xiph website, http://www.xiph.org + + + + + + + +Video streaming and conferencing tools + + + + + +None + + + + + + + +Luca Barbato: <lu_zero@gentoo.org> +IETF Audio/Video Transport Working Group + + + + + + + +COMMON + + + + + +This media type depends on RTP framing, and hence is only defined for transfer via RTP + + + + +Luca Barbato + + + + IETF AVT Working Group + + + + + +
    + + +The information carried in the MIME media type specification has a specific mapping to fields in the Session Description Protocol (SDP) , which is commonly used to describe RTP sessions. When SDP is used to specify sessions the mapping are as follows: + + + + + +The MIME type ("video") goes in SDP "m=" as the media name. + + +The MIME subtype ("theora") goes in SDP "a=rtpmap" as the encoding name. + + +The clock rate in the "a=rtpmap" line MUST be 90000 + + +The mandated parameters "delivery-method" and "configuration" MUST be included in the SDP "a=fmpt" attribute. + + +The optional parameter "configuration-uri", when present, MUST be included in the SDP "a=fmpt" attribute and MUST follow the delivery-method that applies. + + + + +If the stream uses multiple decoder setup configurations and all of them are known in advance, the Configuration Packet for each file SHOULD be packaged together and passed to the client using the configuration attribute. + + + +The URI specified in the configuration-uri attribute MUST point to a location where all of the Configuration Packets needed for the life of the session reside. + + +
    +The following example shows a basic SDP for a single stream. The first configuration packet is inlined in the sdp, other configurations could be fetched at any time from the first provided uri using or all the known configuration could be downloaded using the second uri. The inline base16 configuration string is omitted because of the lenght. + + +c=IN IP4 192.0.0.1 +m=video RTP/AVP 98 +a=rtpmap:98 theora/90000 +a=fmtp:98 sampling=YCbCr-4:2:2; width=1280; height=720; delivery-method=inline; configuration=base16string1; delivery-method=out_band/rtsp; delivery-method=out_band/rtsp; configuration-uri=rtsp://path/to/resource/; delivery-method=out_band/http; configuration-uri=http://another/path/to/resource/aggregate.bz2!sha1hash; + +
    + +
    + +
    + + +The offer, as described in An Offer/Answer Model Session Description Protocol, may contain a large number of delivery methods per single fmtp attribute, the answerer MUST remove every delivery-method and configuration-uri not supported. All the parameters MUST not be altered on answer otherwise. + + +
    + +
    + +
    + + +The following examples are common usage patterns that MAY be applied in such situations, the main scope of this section is to explain better usage of the transmission vectors. + + +
    + +This is one of the most common situation: one single server streaming content in multicast, the clients may start a session at random time. The content itself could be a mix of live stream, as the wj's voice or studio scenes, and stored streams, as the music she plays. + +In this situation we don't know in advance how many codebooks we will use. The clients can join anytime and users expect to start the fruition of the content in a short time. + +On join the client will receive the current Configuration necessary to decode the current streams inlined in the SDP so that the decoding will start immediately after. + +When the streamed content changes the new Configuration is sent in-band before the actual stream, and the Configuration that has to be sent inline in the SDP updated. Since the inline method is unreliable, an out of band fallback is provided. + +The client could choose to fetch the Configuration from the alternate source as soon it discovers a Configuration packet got lost inline or use selective retransmission, if the server supports the feature. + +A serverside optimization would be to keep an hash list of the Configurations per session to avoid packing all of them and send the same Configuration with different Ident tags + +A clientside optimization would be to keep a tag list of the Configurations per session and don't process configuration packets already known. + +
    + +
    + +
    + +RTP packets using this payload format are subject to the security considerations discussed in the RTP specification . This implies that the confidentiality of the media stream is achieved by using encryption. Because the data compression used with this payload format is applied end-to-end, encryption may be performed on the compressed data. Where the size of a data block is set care MUST be taken to prevent buffer overflows in the client applications. + + +
    + +
    + +This document is a continuation of draft-kerr-avt-theora-rtp-00.txt + + +Thanks to the AVT, Ogg Theora Communities / Xiph.org, Fluendo, Ralph Giles, Mike Smith, Phil Kerr, Timothy Terriberry, Stefan Ehmann, Alessandro Salvatori, Politecnico di Torino (LS)³/IMG Group in particular Federico Ridolfo, Francesco Varano, Giampaolo Mancini, Juan Carlos De Martin. + + +
    + +
    + + + + + + + +The Ogg Encapsulation Format Version 0 + + + + + + + +Key words for use in RFCs to Indicate Requirement Levels + + + + + + + +RTP: A Transport Protocol for real-time applications + + + + + + + + + + +RTP Profile for video and Video Conferences with Minimal Control. + + + + + + + + + +An Offer/Answer Model with Session Description Protocol (SDP) + + + + + + + + +SDP: Session Description Protocol + + + + + + + + +Path MTU Discovery + + + + + + + +Path MTU Discovery for IP version 6 + + + + + + + +Extended RTP Profile for RTCP-based Feedback (RTP/AVPF) + + + + + + + + + + + +RTP Payload Format for Vorbis Encoded Audio - draft-ietf-avt-vorbis-rtp-00 + + + + + + + +The Base16, Base32, and Base64 Data Encodings + + + + + + + +GZIP file format specification version 4.3 + + + + + + + +Secure Hash Standard + +National Institute of Standards and Technology + + + + + + + +libbz2 and bzip2 + + + + + + + + + +libTheora: Available from the Xiph website, http://www.xiph.org + + + + + +Theora I specification: Codec setup and packet decode. http://www.xiph.org/theora/doc/Theora_I_spec.pdf + + + + + + +RTP Control Protocol Extended Reports (RTCP XR) + + + + + + + + + + + + + + +ITU-T Recommendation V.42, 1994, Rev. 1. Error-correcting Procedures for DCEs Using Asynchronous-to-Synchronous Conversion. International Telecommunications Union. Available from the ITU website, http://www.itu.int + + + + + + +ISO 3309, October 1984, 3rd Edition. Information Processing Systems--Data Communication High-Level Data Link Control Procedure--Frame Structure. International Organization for Standardization. + + + + + +
    diff --git a/cs/3rd party/libtheora/doc/draft-kerr-avt-theora-rtp-00.txt b/cs/3rd party/libtheora/doc/draft-kerr-avt-theora-rtp-00.txt new file mode 100644 index 000000000..512615217 --- /dev/null +++ b/cs/3rd party/libtheora/doc/draft-kerr-avt-theora-rtp-00.txt @@ -0,0 +1,1512 @@ + + +AVT Working Group P. Kerr +Internet-Draft Xiph.Org +Expires: August 1, 2005 January 31, 2005 + + + draft-kerr-avt-theora-rtp-00 + RTP Payload Format for Theora Encoded Video + +Status of this Memo + + This document is an Internet-Draft and is subject to all provisions + of section 3 of RFC 3667. By submitting this Internet-Draft, each + author represents that any applicable patent or other IPR claims of + which he or she is aware have been or will be disclosed, and any of + which he or she become aware will be disclosed, in accordance with + RFC 3668. + + Internet-Drafts are working documents of the Internet Engineering + Task Force (IETF), its areas, and its working groups. Note that + other groups may also distribute working documents as + Internet-Drafts. + + Internet-Drafts are draft documents valid for a maximum of six months + and may be updated, replaced, or obsoleted by other documents at any + time. It is inappropriate to use Internet-Drafts as reference + material or to cite them other than as "work in progress." + + The list of current Internet-Drafts can be accessed at + http://www.ietf.org/ietf/1id-abstracts.txt. + + The list of Internet-Draft Shadow Directories can be accessed at + http://www.ietf.org/shadow.html. + + This Internet-Draft will expire on August 1, 2005. + +Copyright Notice + + Copyright (C) The Internet Society (2005). + +Abstract + + This document describes a RTP payload format for transporting Theora + encoded video. It details the RTP encapsulation mechanism for raw + Theora data and configuration headers consisting of the quantization + matrices and the Huffman codebooks for the DCT coefficients, and a + table of limit values for the deblocking filter. + + Also included within the document are the necessary details for the + use of Theora with MIME and Session Description Protocol (SDP). + + + +Kerr Expires August 1, 2005 [Page 1] + +Internet-Draft draft-kerr-avt-theora-rtp-00 January 2005 + + +Editors Note + + All references to RFC XXXX are to be replaced by references to the + RFC number of this memo, when published. + +Table of Contents + + 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3 + 1.1 Terminology . . . . . . . . . . . . . . . . . . . . . . . 3 + 2. Payload Format . . . . . . . . . . . . . . . . . . . . . . . . 4 + 2.1 RTP Header . . . . . . . . . . . . . . . . . . . . . . . . 4 + 2.2 Payload Header . . . . . . . . . . . . . . . . . . . . . . 5 + 2.3 Payload Data . . . . . . . . . . . . . . . . . . . . . . . 6 + 2.4 Example RTP Packet . . . . . . . . . . . . . . . . . . . . 7 + 3. Frame Packetizing . . . . . . . . . . . . . . . . . . . . . . 8 + 3.1 Example Fragmented Theora Packet . . . . . . . . . . . . . 9 + 4. Packet Loss . . . . . . . . . . . . . . . . . . . . . . . . . 12 + 5. Configuration Headers . . . . . . . . . . . . . . . . . . . . 13 + 5.1 In-band Header Transmission . . . . . . . . . . . . . . . 13 + 5.1.1 Identification Header . . . . . . . . . . . . . . . . 13 + 5.1.2 Comment Header . . . . . . . . . . . . . . . . . . . . 15 + 5.1.3 Setup Header . . . . . . . . . . . . . . . . . . . . . 16 + 5.2 Packed Headers Delivery . . . . . . . . . . . . . . . . . 18 + 5.2.1 Packed Headers IANA Considerations . . . . . . . . . . 21 + 5.3 Setup Header Caching . . . . . . . . . . . . . . . . . . . 22 + 5.4 Loss of Configuration Headers . . . . . . . . . . . . . . 22 + 6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 23 + 6.1 Mapping MIME Parameters into SDP . . . . . . . . . . . . . 24 + 7. Security Considerations . . . . . . . . . . . . . . . . . . . 25 + 8. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 25 + 9. References . . . . . . . . . . . . . . . . . . . . . . . . . . 25 + 9.1 Normative References . . . . . . . . . . . . . . . . . . . . 25 + 9.2 Informative References . . . . . . . . . . . . . . . . . . . 26 + Author's Address . . . . . . . . . . . . . . . . . . . . . . . 26 + Intellectual Property and Copyright Statements . . . . . . . . 27 + + + + + + + + + + + + + + + + +Kerr Expires August 1, 2005 [Page 2] + +Internet-Draft draft-kerr-avt-theora-rtp-00 January 2005 + + +1. Introduction + + Theora is a general purpose, lossy video codec. It is based on the + VP3.1 video codec produced by On2 Technologies and has been donated + to the Xiph.org Foundation. + + Theora I is a block-based lossy transform codec that utilizes an 8 x + 8 Type-II Discrete Cosine Transform and block-based motion + compensation. This places it in the same class of codecs as MPEG-1, + MPEG-2, MPEG-4, and H.263. The details of how individual blocks are + organized and how DCT coefficients are stored in the bitstream differ + substantially from these codecs, however. Theora supports only intra + frames (I frames in MPEG) and inter frames (P frames in MPEG). + + Theora provides none of its own framing, synchronization, or + protection against transmission errors. Theora is a free-form + variable bit rate (VBR) codec, and packets have no minimum size, + maximum size, or fixed/expected size. Theora packets are thus + intended to be used with a transport mechanism that provides + free-form framing, synchronization, positioning, and error correction + in accordance with these design assumptions, such as Ogg [1]. or + RTP/AVP [3]. + + Theora I currently supports progressive video data of arbitrary + dimensions at a constant frame rate in one of several YCbCr color + spaces. Three different chroma subsampling formats are supported: + 4:2:0, 4:2:2, and 4:4:4. The Theora I format does not support + interlaced material, variable frame rates, bit-depths larger than 8 + bits per component, nor alternate color spaces such as RGB or + arbitrary multi-channel spaces. Black and white content can be + efficiently encoded, however, because the uniform chroma planes + compress well. + + Theora is similar to Vorbis audio [9] in that it requires the + inclusion of the entire probability model for the DCT coefficients + and all the quantization parameters in the bitstream headers to be + sent ahead of the video data. It is therefore impossible to decode + any frame in the stream without having previously fetched the codec + info and codec setup headers, although Theora can initiate decode at + an arbitrary intra-frame packet within a bitstream so long as the + codec has been initialized with the setup headers. + +1.1 Terminology + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + document are to be interpreted as described in RFC 2119 [2]. + + + + +Kerr Expires August 1, 2005 [Page 3] + +Internet-Draft draft-kerr-avt-theora-rtp-00 January 2005 + + +2. Payload Format + + Each frame of digital video is packetized into one or more RTP + packets. If the data for a complete frame exceeds the network MTU, + it SHOULD be fragmented into multiple RTP packets, each smaller than + the MTU. A single RTP packet MAY contain data for more than one + Theora frame. + + For RTP based transportation of Theora encoded video the standard RTP + header is followed by a 5 octet payload header, then the payload + data. + +2.1 RTP Header + + The format of the RTP header is specified in [3] and shown in Figure + 1. This payload format uses the fields of the header in a manner + consistent with that specification. + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |V=2|P|X| CC |M| PT | sequence number | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | timestamp | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | synchronization source (SSRC) identifier | + +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ + | contributing source (CSRC) identifiers | + | ... | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 1: RTP Header + + The RTP header begins with an octet of fields (V, P, X, and CC) to + support specialized RTP uses (see [3] and [4] for details). For + Theora RTP, the following values are used. + + Version (V): 2 bits + + This field identifies the version of RTP. The version used by this + specification is two (2). + + Padding (P): 1 bit + + Padding MAY be used with this payload format according to section 5.1 + of [3]. + + Extension (X): 1 bit + + + +Kerr Expires August 1, 2005 [Page 4] + +Internet-Draft draft-kerr-avt-theora-rtp-00 January 2005 + + + The Extension bit is used in accordance with [3]. + + CSRC count (CC): 4 bits + + The CSRC count is used in accordance with [3]. + + Marker (M): 1 bit + + The Marker bit is used in accordance with [3]. + + Payload Type (PT): 7 bits + + An RTP profile for a class of applications is expected to assign a + payload type for this format, or a dynamically allocated payload type + SHOULD be chosen which designates the payload as Theora. + + Sequence number: 16 bits + + The sequence number increments by one for each RTP data packet sent, + and may be used by the receiver to detect packet loss and to restore + packet sequence. This field is detailed further in [3]. + + Timestamp: 32 bits + + A timestamp representing the sampling time of the first sample of the + first Theora packet in the RTP packet. The clock frequency MUST be + set to the sample rate of the encoded video data and is conveyed + out-of-band as an SDP attribute. + + SSRC/CSRC identifiers: + + These two fields, 32 bits each with one SSRC field and a maximum of + 16 CSRC fields, are as defined in [3]. + +2.2 Payload Header + + After the RTP Header section the following five octets are the + Payload Header. This header is split into a number of bitfields + detailing the format of the following Payload Data packets. + + + + + + + + + + + + +Kerr Expires August 1, 2005 [Page 5] + +Internet-Draft draft-kerr-avt-theora-rtp-00 January 2005 + + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Setup Header Ident | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |C|F|0|0|# pkts.| + +-+-+-+-+-+-+-+-+ + + Figure 2: Payload Header + + Setup Header Ident: 32 bits + + This 32 bit field is used to associate the Theora data to a decoding + Setup Header. It is created by making a CRC32 checksum of the Setup + Header required to decode the particular Theora video stream. + + Continuation (C): 1 bit + + Set to one if this is a continuation of a fragmented packet. + + Fragmented (F): 1 bit + + Set to one if the payload contains complete packets or if it contains + the last fragment of a fragmented packet. + + The next two bits are currently reserved and MUST be set to 0. + + The last 4 bits are the number of complete packets in this payload. + This provides for a maximum number of 15 Theora packets in the + payload. If the packet contains fragmented data the number of + packets MUST be set to 0. + +2.3 Payload Data + + Each Theora payload section starts with a three octet header. The + first octet is used to denote what kind of Theora data follows. Then + a two octet length header is used to represent the size of the + following data payload, followed by the raw Theora data. + + + + + + + + + + + + + +Kerr Expires August 1, 2005 [Page 6] + +Internet-Draft draft-kerr-avt-theora-rtp-00 January 2005 + + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Data type | Payload Length | Theora Data .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 3: Payload Data + + The data type octet is used to signify the payload data type. If the + first bit is set to 0, this indicates the payload is Theora video + data. + + The following values for the Theora payload type are valid: + + 0 = Raw Theora data + 0x80 = Theora Identification header + 0x81 = Theora Comment header + 0x82 = Theora Setup header + + + The Theora packet length header is the length of the Theora data + block only and does not count the length octets and payload data type + octet. + + The Theora codec uses relatively unstructured raw packets containing + binary integer fields of arbitrary width that often do not fall on an + octet boundary. When this happens the bitstream is packed to an + octet boundary. When a Theora encoder produces packets unused space + in the last byte of a packet is always zeroed during the encoding + process. Thus, should this unused space be read, it will return + binary zeros. + + For payloads which consist of multiple Theora packets the payload + data consists of the data type field, the payload length field + followed by the payload data for each of the Theora packets in the + payload. + +2.4 Example RTP Packet + + Here is an example RTP packet containing two Theora packets. + + RTP Packet Header: + + + + + + + + + +Kerr Expires August 1, 2005 [Page 7] + +Internet-Draft draft-kerr-avt-theora-rtp-00 January 2005 + + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | 2 |0|0| 0 |0| PT | sequence number | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | timestamp (in sample rate units) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | synchronisation source (SSRC) identifier | + +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ + | contributing source (CSRC) identifiers | + | ... | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 4: Example RTP Packet + + Payload Data: + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Setup Header Ident | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |0|1|0|0| 2 pks | 0x80 | Payload Length | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Theora data .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + .. data | 0 | Payload Length .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + .. Theora data | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 5: Example Theora Payload Packet + + The payload portion of the packet starts with the 32 bit Setup Header + ident field followed by the 8 bit fragment/count fields. The F bit + is set to 1, indicating that this packet contains whole Theora frame + data. The number of whole Theora data packets is set to 2. + + Each of the payload blocks starts with a Data type field, for the + first payload this is set to 0x80 indicating it is an Identification + header and the second payload is set to 0 indicating it is raw Theora + data. Then the two octet length field is followed by the variable + length Theora data. + +3. Frame Packetizing + + Each RTP packet contains either one complete Theora packet, one + Theora packet fragment, or an integer number of complete Theora + + + +Kerr Expires August 1, 2005 [Page 8] + +Internet-Draft draft-kerr-avt-theora-rtp-00 January 2005 + + + packets (up to a max of 15 packets, since the number of packets is + defined by a 4 bit value). + + Any Theora data packet that is less than path MTU SHOULD be bundled + in the RTP packet with as many Theora packets as will fit, up to a + maximum of 15. Path MTU is detailed in [6] and [7]. + + If a Theora packet is larger than 65535 octets it MUST be fragmented. + A fragmented packet has a zero in the last four bits of the payload + header. Each fragment after the first will also set the Continued + (C) bit to one in the payload header. The RTP packet containing the + last fragment of the Theora packet will have the Fragmented (F) bit + set to one. To maintain the correct sequence for fragmented packet + reception the timestamp field of fragmented packets MUST be the same + as the first packet sent, with the sequence number incremented as + normal for the subsequent RTP packets. + +3.1 Example Fragmented Theora Packet + + Here is an example fragmented Theora packet split over three RTP + packets. Each packet contains the standard RTP headers as well as + the 5 octet Theora headers. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Kerr Expires August 1, 2005 [Page 9] + +Internet-Draft draft-kerr-avt-theora-rtp-00 January 2005 + + + Packet 1: + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |V=2|P|X| CC |M| PT | 1000 | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | xxxxx | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | synchronization source (SSRC) identifier | + +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ + | contributing source (CSRC) identifiers | + | ... | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Setup Header Ident | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |0|0|0|0| 0| 0 | Payload Length | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Theora data .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 6: Example Fragmented Packet (Packet 1) + + In this packet the initial sequence number is 1000 and the timestamp + is xxxxx. The Continuation (C) bit is set to one, indicating it is + not the continuation of a fragmented bit, and the Fragmentation (F) + is set to 0 indicating it is a fragmented packet. The number of + packets field is set to 0, and as the payload is raw Theora data the + Theora payload type field is set to 0. + + + + + + + + + + + + + + + + + + + + + +Kerr Expires August 1, 2005 [Page 10] + +Internet-Draft draft-kerr-avt-theora-rtp-00 January 2005 + + + Packet 2: + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |V=2|P|X| CC |M| PT | 1001 | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | xxxxx | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | synchronization source (SSRC) identifier | + +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ + | contributing source (CSRC) identifiers | + | ... | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Setup Header Ident | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |1|0|0|0| 0| 0 | Payload Length | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Theora data .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 7: Example Fragmented Packet (Packet 2) + + The C bit is set to 1 and the number of packets field is set to 0. + For large Theora fragments there can be several of these type of + payload packets. The maximum packet size SHOULD be no greater than + the path MTU, including all RTP and payload headers. The sequence + number has been incremented by one but the timestamp field remains + the same as the initial packet. + + + + + + + + + + + + + + + + + + + + + +Kerr Expires August 1, 2005 [Page 11] + +Internet-Draft draft-kerr-avt-theora-rtp-00 January 2005 + + + Packet 3: + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |V=2|P|X| CC |M| PT | 1002 | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | xxxxx | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | synchronization source (SSRC) identifier | + +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ + | contributing source (CSRC) identifiers | + | ... | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Setup Header Ident | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |1|1|0|0| 0| 0 | Payload Length | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Theora data .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 8: Example Fragmented Packet (Packet 3) + + This is the last Theora fragment packet. The C and F bits are set + and the packet count remains set to 0. As in the previous packets + the timestamp remains set to the first packet in the sequence and the + sequence number has been incremented. + +4. Packet Loss + + As there is no error correction within the Theora stream, packet loss + will result in a loss of signal. Packet loss is more of an issue for + fragmented Theora packets as the client will have to cope with the + handling of the C and F flags. If we use the fragmented Theora + packet example above and the first packet is lost the client SHOULD + detect that the next packet has the packet count field set to 0 and + the C bit is set and MUST drop it. The next packet, which is the + final fragmented packet, SHOULD be dropped in the same manner, or + buffered. Feedback reports on lost and dropped packets MUST be sent + back via RTCP. + + If a particular multicast session has a large number of participants + care must be taken to prevent an RTCP feedback implosion, [8], in the + event of packet loss from a large number of participants. + + + + + + +Kerr Expires August 1, 2005 [Page 12] + +Internet-Draft draft-kerr-avt-theora-rtp-00 January 2005 + + +5. Configuration Headers + + To decode a Theora stream three configuration header blocks are + needed. The first header, the Identification Header, indicates the + frame dimensions, quality, blocks used and the version of the Theora + encoder used. The second header, the Comment Header, contains stream + metadata and the third header, the Setup Header, details which + contains dequantization and Huffman tables. + + As the RTP stream may change certain configuration data mid-session + there are two different methods for delivering this configuration + data to a client, in-band and SDP which is detailed below. SDP + delivery is used to set-up an initial state for the client + application and in-band is used to change state during the session. + The changes may be due to different metadata or Setup Header as well + as different bitrates of the stream. + + Out of the two delivery vectors the use of an SDP attribute to + indicate an URI where the configuration and Setup Header data can be + obtained is preferred as they can be fetched reliably using TCP. The + in-band Setup Header delivery SHOULD only be used in situations where + the link between the client is unidirectional or if the SDP-based + information is not available. + + Synchronizing the configuration and Setup Header to the RTP stream is + critical. The 32 bit Setup Header Ident field is used to indicate + when a change in the stream has taken place. The client application + MUST have in advance the correct configuration and Setup Headers and + if the client detects a change in the Ident value and does not have + this information it MUST NOT decode the raw Theora data. + +5.1 In-band Header Transmission + + The three header data blocks are sent in-band with the packet type + bits set to match the payload type. Normally the Setup Header and + Identification Header are sent once per session if the stream is an + encoding of live video, as typically the encoder state will not + change, but the encoder state can change at the boundary of chained + Theora video files. Metadata can be sent at the start as well as any + time during the life of the session. Clients MUST be capable of + dealing with periodic re-transmission of the configuration headers. + +5.1.1 Identification Header + + The Identification Header is a short header with only a few fields + used to declare the stream definitively as Theora and provide + detailed information about the format of the fully decoded video + data. + + + +Kerr Expires August 1, 2005 [Page 13] + +Internet-Draft draft-kerr-avt-theora-rtp-00 January 2005 + + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |V=2|P|X| CC |M| PT | xxxx | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | xxxxx | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | synchronization source (SSRC) identifier | + +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ + | contributing source (CSRC) identifiers | + | ... | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Setup Header Ident | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |0|1|0|0| 1| 0x80 | Payload Length | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | VMAJ | VMIN | VREV | FMBW | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | FMBW | FMBH | NSBS | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | NSBS | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | NBS | NMBS | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | NMBS | PICW | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | PICW | PICH | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | PICH | PICX | PICY | FRN | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | FRN | FRD | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | FRD | PARN | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | PARN | PARD | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | PARD | CS |PF | NOMBR | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | NOMBR | QUAL | KFGSHIFT| + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 9: Identification Header + + The fields listed above have the following meanings: + + + + + + +Kerr Expires August 1, 2005 [Page 14] + +Internet-Draft draft-kerr-avt-theora-rtp-00 January 2005 + + + VMAJ = The major version number. 8 bits. + VMIN = The minor version number. 8 bits. + VREV = The version revision number. 8 bits. + FMBW = The width of the frame in macro blocks. 16 bits. + FMBH = The height of the frame in macro blocks. 16 bits. + NSBS = The total number of super blocks in a frame. 32 bits. + NBS = The total number of blocks in a frame. 36 bits. + NMBS = The total number of macro blocks in a frame. 32 bits. + PICW = The width of the picture region in pixels. 20 bits. + PICH = The height of the picture region in pixels. 20 bits. + PICX = The X offset of the picture region in pixels. 8 bits. + PICY = The Y offset of the picture region in pixels. 8 bits. + FRN = The frame-rate numerator. 32 bits. + FRD = The frame-rate denominator. 32 bits. + PARN = The pixel aspect-ratio numerator. 24 bits. + PARD = The pixel aspect-ratio denominator. 24 bits. + CS = The color space. 8 bits. + PF = The pixel format. 2 bits. + NOMBR = The nominal bitrate of the stream, in bits per second. + 24 bits. + QUAL = The quality hint. 6 bits. + KFGSHIFT = The amount to shift the key frame number by in the + granule position. 5 bits. + + +5.1.2 Comment Header + + The Theora Comment Header is the second of three header packets that + begin a Theora stream. It is meant for short text comments, not + arbitrary metadata; arbitrary metadata belongs in a separate logical + stream that provides greater structure and machine parseability. The + comment field is meant to be used much like someone jotting a quick + note on the label of a video. It should be a little information to + remember the disc or tape by and explain it to others; a short, + to-the-point text note that can be more than a couple words, but + isn't going to be more than a short paragraph. + + + + + + + + + + + + + + + +Kerr Expires August 1, 2005 [Page 15] + +Internet-Draft draft-kerr-avt-theora-rtp-00 January 2005 + + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |V=2|P|X| CC |M| PT | xxxx | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | xxxxx | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | synchronization source (SSRC) identifier | + +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ + | contributing source (CSRC) identifiers | + | ... | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Setup Header Ident | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |0|1|0|0| 1| 0x81 | Payload Length | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | User comments list length | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | User comment length | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | User comment .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + .. User comment | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + + Figure 10: Comment Header + + The format for the data takes the form of a 32 bit field denoting the + number of user comments. Each of the user comments is prefixed by a + 32 bit length field followed by the comment text encoded in UTF-8. + +5.1.3 Setup Header + + The Theora setup header contains the limit values used to drive the + loop filter, the base matrices and scale values used to build the + dequantization tables, and the Huffman tables used to unpack the DCT + tokens. Because the contents of this header are specific to Theora, + no concessions have been made to keep the fields octet-aligned for + easy parsing. + + + + + + + + + +Kerr Expires August 1, 2005 [Page 16] + +Internet-Draft draft-kerr-avt-theora-rtp-00 January 2005 + + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |V=2|P|X| CC |M| PT | xxxx | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | xxxxx | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | synchronization source (SSRC) identifier | + +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ + | contributing source (CSRC) identifiers | + | ... | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Setup Header Ident | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |0|1|0|0| 1| 0x82 | Payload Length | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Setup Header Length | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Setup Header .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + .. Setup Header | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 11: Setup Header + + +5.1.3.1 Setup Header CRC32 Generation + + In order for different implementations of Theora RTP clients and + servers to interoperate with each other a common format for the + production of the CRC32 hash is required. The polynomial is + X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0. + + The following C code function SHOULD be used by implementations, if + not then the code responsible for generating the CRC32 value MUST use + the polynomial function above. + + unsigned int crc32 (int length, unsigned char *crcdata) + { + int index, loop; + unsigned int byte, crc, mask; + + index = 0; + crc = 0xFFFFFFFF; + + while (index < length) { + byte = crcdata [index]; + + + +Kerr Expires August 1, 2005 [Page 17] + +Internet-Draft draft-kerr-avt-theora-rtp-00 January 2005 + + + crc = crc ^ byte; + + for (loop = 7; loop >= 0; loop--) { + mask = -(crc & 1); + crc = (crc >> 1) ^ (0xEDB88320 & mask); + } + index++; + } + return ~crc; + } + + +5.2 Packed Headers Delivery + + As mentioned above the RECOMMENDED delivery vector for Theora + configuration data is via an SDP attribute as this retrieval method + can be performed using a reliable transport protocol. + + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Number of packed headers | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Packed header | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Packed header | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 12: Packed Headers Overview + + As the RTP headers are not required for this method of delivery the + structure of the configuration data is slightly different. The + packed header starts with a 32 bit count field which details the + number of packed headers that are contained in the bundle. Next is + the packed header payload for each chained Theora file. + + + + + + + + + + + + + + + + +Kerr Expires August 1, 2005 [Page 18] + +Internet-Draft draft-kerr-avt-theora-rtp-00 January 2005 + + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Header Length | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Setup Header Ident | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Identification Header .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + .. Identification Header | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Comment Header .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + .. Comment Header | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Setup Header .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + .. Setup Header | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 13: Packed Headers Detail + + The key difference between the in-band format is there is no need for + the payload header octet and Setup Header Ident field. Below are + examples of the packed headers format. + + + + + + + + + + + + + + + + + + + + + + + + + + +Kerr Expires August 1, 2005 [Page 19] + +Internet-Draft draft-kerr-avt-theora-rtp-00 January 2005 + + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | VMAJ | VMIN | VREV | FMBW | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | FMBW | FMBH | NSBS | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | NSBS | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | NBS | NMBS | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | NMBS | PICW | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | PICW | PICH | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | PICH | PICX | PICY | FRN | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | FRN | FRD | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | FRD | PARN | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | PARN | PARD | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | PARD | CS |PF | NOMBR | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | NOMBR | QUAL | KFGSHIFT| + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 14: Packed Identification Header + + The alignment of the packed Identification Header is slightly + different from the RTP payload type as the payload header is not + used. + + + + + + + + + + + + + + + + + + +Kerr Expires August 1, 2005 [Page 20] + +Internet-Draft draft-kerr-avt-theora-rtp-00 January 2005 + + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | User comments list length | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | User comment length | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | User comment .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + .. User comment | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 15: Packed Comment Header + + The packed Comment Header also as a slightly different structure to + that of the RTP payload type with the payload header not being used. + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Setup Header Length | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Setup Header .. + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + .. Setup Header | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 16: Packed Setup Header + + The packed Setup Header also has a slightly different structure to + that of the RTP payload type. The Setup Header Ident field that is + normally part of this structure is moved to the second field of the + overall packed structure. + +5.2.1 Packed Headers IANA Considerations + + The following IANA considerations MUST only be applied to the packed + headers. + + MIME media type name: video + + MIME subtype: theora-config + + Required Parameters: + + None. + + + + +Kerr Expires August 1, 2005 [Page 21] + +Internet-Draft draft-kerr-avt-theora-rtp-00 January 2005 + + + Optional Parameters: + + None. + + Encoding considerations: + + This type is only defined for transfer via HTTP as specified in RFC + XXXX. + + Security Considerations: + + See Section 6 of RFC 3047. + + Interoperability considerations: none + + Published specification: + + See RFC XXXX for details. + + Applications which use this media type: + + Theora encoded video, configuration data. + + Additional information: none + + Person & email address to contact for further information: + + Phil Kerr: + + Intended usage: COMMON + + Author/Change controller: + + Author: Phil Kerr + + Change controller: IETF AVT Working Group + +5.3 Setup Header Caching + + Setup Header caching allows clients that have previously connected to + a stream to re-use the associated Setup Header and configuration + data. When a client receives a Setup Header it may store it locally + and can compare the CRC32 key with that of the new stream and begin + decoding before it has received any of the headers. + +5.4 Loss of Configuration Headers + + Unlike the loss of raw Theora payload data, loss of a configuration + + + +Kerr Expires August 1, 2005 [Page 22] + +Internet-Draft draft-kerr-avt-theora-rtp-00 January 2005 + + + header can lead to a situation where it will not be possible to + successfully decode the stream. + + Out of the three headers, loss of either the Setup Header or + Identification Headers MUST result in the halting of stream decoding. + Loss of the Comment header SHOULD NOT be regarded as fatal for + decoding. Loss of any of the headers SHOULD be reported to the + client as well as a loss report sent via RTCP. + +6. IANA Considerations + + MIME media type name: video + + MIME subtype: theora + + Required Parameters: + + sampling: Determines the chroma subsampling format. + + width: Determines the number of pixels per line. This is an integer + between 1 and 1048561 and MUST be in multiples of 16. + + height: Determines the number of lines per frame. This is an integer + between 1 and 1048561 and MUST be in multiples of 16. + + header: Indicates the URI of the decoding configuration headers. + + Optional Parameters: + + None. + + Encoding considerations: + + This type is only defined for transfer via RTP as specified in RFC + XXXX. + + Security Considerations: + + See Section 6 of RFC 3047. + + Interoperability considerations: none + + Published specification: + + See the Theora documentation [11] for details. + + Applications which use this media type: + + + + +Kerr Expires August 1, 2005 [Page 23] + +Internet-Draft draft-kerr-avt-theora-rtp-00 January 2005 + + + Video streaming and conferencing tools + + Additional information: none + + Person & email address to contact for further information: + + Phil Kerr: + + Intended usage: COMMON + + Author/Change controller: + + Author: Phil Kerr + + Change controller: IETF AVT Working Group + +6.1 Mapping MIME Parameters into SDP + + The information carried in the MIME media type specification has a + specific mapping to fields in the Session Description Protocol (SDP) + [5], which is commonly used to describe RTP sessions. When SDP is + used to specify sessions the mapping are as follows: + + o The MIME type ("video") goes in SDP "m=" as the media name. + + o The MIME subtype ("THEORA") goes in SDP "a=rtpmap" as the encoding + name. + + o The parameter "rate" also goes in "a=rtpmap" as clock rate. + + o The parameter "channels" also goes in "a=rtpmap" as channel count. + + o The parameter "header" goes in the SDP "a=fmpt" attribute. + + If the stream comprises chained Theora files the configuration and + Setup Headers for each file SHOULD be packaged together and passed to + the client using the headers attribute if all the files to be played + are known in advance. + + Example: + + c=IN IP4/6 + m=video RTP/AVP 98 + a=rtpmap:98 theora/90000 + a=fmtp:98 sampling=YCbCr-4:2:2; width=1280; height=720; + header= + + + + + +Kerr Expires August 1, 2005 [Page 24] + +Internet-Draft draft-kerr-avt-theora-rtp-00 January 2005 + + +7. Security Considerations + + RTP packets using this payload format are subject to the security + considerations discussed in the RTP specification [3]. This implies + that the confidentiality of the media stream is achieved by using + encryption. Because the data compression used with this payload + format is applied end-to-end, encryption may be performed on the + compressed data. Where the size of a data block is set care MUST be + taken to prevent buffer overflows in the client applications. + +8. Acknowledgments + + Thanks to the AVT, Ogg Theora Communities / Xiph.org, Fluendo, Ralph + Giles. + +9. References + +9.1 Normative References + + [1] Pfeiffer, S., "The Ogg Encapsulation Format Version 0", RFC + 3533. + + [2] Bradner, S., "Key words for use in RFCs to Indicate Requirement + Levels", RFC 2119. + + [3] Schulzrinne, H., Casner, S., Frederick, R. and V. Jacobson, + "RTP: A Transport Protocol for real-time applications", RFC + 3550. + + [4] Schulzrinne, H. and S. Casner, "RTP Profile for video and Video + Conferences with Minimal Control.", RFC 3551. + + [5] Handley, M. and V. Jacobson, "SDP: Session Description + Protocol", RFC 2327. + + [6] Mogul et al., J., "Path MTU Discovery", RFC 1063. + + [7] McCann et al., J., "Path MTU Discovery for IP version 6", RFC + 1981. + + [8] Ott, J., Wenger, S., Sato, N., Burmeister, C. and J. Rey, + "Extended RTP Profile for RTCP-based Feedback (RTP/AVPF)", + Internet Draft (draft-ietf-avt-rtcp-feedback-11: Work in + progress). + + [9] Kerr, P., "RTP Payload Format for Vorbis Encoded Audio - + draft-ietf-avt-vorbis-rtp-00", Internet Draft (Work in + progress). + + + +Kerr Expires August 1, 2005 [Page 25] + +Internet-Draft draft-kerr-avt-theora-rtp-00 January 2005 + + +9.2 Informative References + + [10] "libTheora: Available from the Xiph website, + http://www.xiph.org". + + [11] "Ogg Theora I spec: Codec setup and packet decode. + http://www.xiph.org/ogg/Theora/doc/Theora-spec-ref.html". + + +Author's Address + + Phil Kerr + Xiph.Org + + EMail: phil@plus24.com + URI: http://www.xiph.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Kerr Expires August 1, 2005 [Page 26] + +Internet-Draft draft-kerr-avt-theora-rtp-00 January 2005 + + +Intellectual Property Statement + + The IETF takes no position regarding the validity or scope of any + Intellectual Property Rights or other rights that might be claimed to + pertain to the implementation or use of the technology described in + this document or the extent to which any license under such rights + might or might not be available; nor does it represent that it has + made any independent effort to identify any such rights. Information + on the procedures with respect to rights in RFC documents can be + found in BCP 78 and BCP 79. + + Copies of IPR disclosures made to the IETF Secretariat and any + assurances of licenses to be made available, or the result of an + attempt made to obtain a general license or permission for the use of + such proprietary rights by implementers or users of this + specification can be obtained from the IETF on-line IPR repository at + http://www.ietf.org/ipr. + + The IETF invites any interested party to bring to its attention any + copyrights, patents or patent applications, or other proprietary + rights that may cover technology that may be required to implement + this standard. Please address the information to the IETF at + ietf-ipr@ietf.org. + + +Disclaimer of Validity + + This document and the information contained herein are provided on an + "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS + OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET + ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE + INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED + WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + + +Copyright Statement + + Copyright (C) The Internet Society (2005). This document is subject + to the rights, licenses and restrictions contained in BCP 78, and + except as set forth therein, the authors retain all their rights. + + +Acknowledgment + + Funding for the RFC Editor function is currently provided by the + Internet Society. + + + + +Kerr Expires August 1, 2005 [Page 27] + diff --git a/cs/3rd party/libtheora/doc/draft-kerr-avt-theora-rtp-00.xml b/cs/3rd party/libtheora/doc/draft-kerr-avt-theora-rtp-00.xml new file mode 100644 index 000000000..dff7a2657 --- /dev/null +++ b/cs/3rd party/libtheora/doc/draft-kerr-avt-theora-rtp-00.xml @@ -0,0 +1,1277 @@ + + + + + + + + +draft-kerr-avt-theora-rtp-00 + + +Xiph.Org +
    +phil@plus24.com +http://www.xiph.org/ +
    +
    + + + +General +AVT Working Group +I-D + +Internet-Draft +Theora +RTP + + + +This document describes a RTP payload format for transporting Theora encoded video. It details the RTP encapsulation mechanism +for raw Theora data and configuration headers consisting of the quantization matrices and the Huffman codebooks for the DCT +coefficients, and a table of limit values for the deblocking filter. + + + +Also included within the document are the necessary details for the use of Theora with MIME and Session Description Protocol +(SDP). + + + + + + +All references to RFC XXXX are to be replaced by references to the RFC number of this memo, when published. + + + +
    + + + +
    + +Theora is a general purpose, lossy video codec. It is based on the VP3.1 video codec produced by On2 Technologies and has been donated to the Xiph.org Foundation. + + + +Theora I is a block-based lossy transform codec that utilizes an 8 x 8 Type-II Discrete Cosine Transform and block-based motion +compensation. This places it in the same class of codecs as MPEG-1, MPEG-2, MPEG-4, and H.263. The details of how individual +blocks are organized and how DCT coefficients are stored in the bitstream differ substantially from these codecs, however. Theora +supports only intra frames (I frames in MPEG) and inter frames (P frames in MPEG). + + + +Theora provides none of its own framing, synchronization, or protection against transmission errors. Theora is a free-form +variable bit rate (VBR) codec, and packets have no minimum size, maximum size, or fixed/expected size. Theora packets are thus +intended to be used with a transport mechanism that provides free-form framing, synchronization, positioning, and error correction +in accordance with these design assumptions, such as Ogg . or RTP/AVP . + + + +Theora I currently supports progressive video data of arbitrary dimensions at a constant frame rate in one of several YCbCr color +spaces. +Three different chroma subsampling formats are supported: 4:2:0, 4:2:2, and 4:4:4. The Theora I format does not support interlaced +material, variable frame rates, bit-depths larger than 8 bits per component, nor alternate color spaces such as RGB or arbitrary +multi-channel spaces. Black and white content can be efficiently encoded, however, because the uniform chroma planes compress well. + + + +Theora is similar to Vorbis audio in that it requires the inclusion of the entire probability +model for the DCT coefficients and all the quantization parameters in the bitstream headers to be sent ahead of the video data. It +is therefore impossible to decode any frame in the stream without having previously fetched the codec info and codec setup headers, +although Theora can initiate decode at an arbitrary intra-frame packet within a bitstream so long as the codec has been initialized +with the setup headers. + + +
    + + +The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", +and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 . + + +
    +
    + +
    + + +Each frame of digital video is packetized into one or more RTP packets. If the data for a complete frame exceeds the network +MTU, it SHOULD be fragmented into multiple RTP packets, each smaller than the MTU. A single RTP packet MAY contain +data for more than one Theora frame. + + + +For RTP based transportation of Theora encoded video the standard RTP header is followed by a 5 octet payload header, then the +payload data. + + +
    + + +The format of the RTP header is specified in and shown in Figure 1. This payload format uses +the fields of the header in a manner consistent with that specification. + + +
    + +
    + + +The RTP header begins with an octet of fields (V, P, X, and CC) to support specialized RTP uses (see + and for details). For Theora RTP, the following values are used. + + + +Version (V): 2 bits +This field identifies the version of RTP. The version used by this specification is two (2). + + + +Padding (P): 1 bit +Padding MAY be used with this payload format according to section 5.1 of . + + + +Extension (X): 1 bit +The Extension bit is used in accordance with . + + + +CSRC count (CC): 4 bits +The CSRC count is used in accordance with . + + + +Marker (M): 1 bit +The Marker bit is used in accordance with . + + + +Payload Type (PT): 7 bits +An RTP profile for a class of applications is expected to assign a payload type for this format, or a dynamically allocated +payload type SHOULD be chosen which designates the payload as Theora. + + + +Sequence number: 16 bits +The sequence number increments by one for each RTP data packet sent, and may be used by the receiver to detect packet loss and +to restore packet sequence. This field is detailed further in . + + + +Timestamp: 32 bits +A timestamp representing the sampling time of the first sample of the first Theora packet in the RTP packet. The clock frequency +MUST be set to the sample rate of the encoded video data and is conveyed out-of-band as an SDP attribute. + + + +SSRC/CSRC identifiers: +These two fields, 32 bits each with one SSRC field and a maximum of 16 CSRC fields, are as defined in +. + + +
    + +
    + + +After the RTP Header section the following five octets are the Payload Header. +This header is split into a number of bitfields detailing the format of the following Payload Data packets. + + +
    + +
    + + +Setup Header Ident: 32 bits + +This 32 bit field is used to associate the Theora data to a decoding Setup Header. It is created by making a CRC32 checksum +of the Setup Header required to decode the particular Theora video stream. + + + +Continuation (C): 1 bit + +Set to one if this is a continuation of a fragmented packet. + + + +Fragmented (F): 1 bit + +Set to one if the payload contains complete packets or if it contains the last fragment of a fragmented packet. + + + +The next two bits are currently reserved and MUST be set to 0. + + + +The last 4 bits are the number of complete packets in this payload. This provides for a maximum number of 15 Theora +packets in the payload. If the packet contains fragmented data the number of packets MUST be set to 0. + + +
    + +
    + + +Each Theora payload section starts with a three octet header. The first octet is used to denote what kind of Theora data follows. +Then a two octet length header is used to represent the size of the following data payload, followed by the raw Theora data. + + +
    + +
    + + +The data type octet is used to signify the payload data type. If the first bit is set to 0, this indicates the payload is +Theora video data. + + + +The following values for the Theora payload type are valid: + + + + 0 = Raw Theora data + 0x80 = Theora Identification header + 0x81 = Theora Comment header + 0x82 = Theora Setup header + + + + +The Theora packet length header is the length of the Theora data block only and does not count the length octets and payload +data type octet. + + + +The Theora codec uses relatively unstructured raw packets containing binary integer fields of arbitrary width that often do not fall on an octet boundary. When this happens the bitstream is packed to an octet boundary. When a Theora encoder produces packets unused space in the last byte of a packet is always zeroed during the encoding process. Thus, should this unused space be read, it will return binary zeros. + + + +For payloads which consist of multiple Theora packets the payload data consists of the data type field, the payload length field +followed by the payload data for each of the Theora packets in the payload. + + +
    + +
    + + +Here is an example RTP packet containing two Theora packets. + + +RTP Packet Header: + + +
    + +
    + + + +Payload Data: + + +
    + +
    + + +The payload portion of the packet starts with the 32 bit Setup Header ident field followed by the 8 bit fragment/count fields. The F +bit is set to 1, indicating that this packet contains whole Theora frame data. The number of whole Theora data packets is set to +2. + + + +Each of the payload blocks starts with a Data type field, for the first payload this is set to 0x80 indicating it is an +Identification header and the second payload is set to 0 indicating it is raw Theora data. Then the two octet length field is +followed by the variable length Theora data. + + +
    +
    + + +
    + + +Each RTP packet contains either one complete Theora packet, one Theora packet fragment, or an integer number of complete Theora +packets (up to a max of 15 packets, since the number of packets is defined by a 4 bit value). + + + +Any Theora data packet that is less than path MTU SHOULD be bundled in the RTP packet with as many Theora packets as will +fit, up to a maximum of 15. Path MTU is detailed in and . + + + +If a Theora packet is larger than 65535 octets it MUST be fragmented. A fragmented packet has a zero in the last four bits +of the payload header. Each fragment after the first will also set the Continued (C) bit to one in the payload header. The +RTP packet containing the last fragment of the Theora packet will have the Fragmented (F) bit set to one. To maintain the +correct sequence for fragmented packet reception the timestamp field of fragmented packets MUST be the same as the first +packet sent, with the sequence number incremented as normal for the subsequent RTP packets. + + +
    + + +Here is an example fragmented Theora packet split over three RTP packets. Each packet contains the standard RTP headers as +well as the 5 octet Theora headers. + + +
    + +
    + + +In this packet the initial sequence number is 1000 and the timestamp is xxxxx. The Continuation (C) bit is set to one, +indicating it is not the continuation of a fragmented bit, and the Fragmentation (F) is set to 0 indicating it is a fragmented +packet. The number of packets field is set to 0, and as the payload is raw Theora data the Theora payload type field is set to 0. + + +
    + +
    + + +The C bit is set to 1 and the number of packets field is set to 0. For large Theora fragments there can be several of these type +of payload packets. The maximum packet size SHOULD be no greater than the path MTU, including all RTP and payload headers. The +sequence number has been incremented by one but the timestamp field remains the same as the initial packet. + + +
    + +
    + + +This is the last Theora fragment packet. The C and F bits are set and the packet count remains set to 0. As in the previous +packets the timestamp remains set to the first packet in the sequence and the sequence number has been incremented. + + +
    +
    + + +
    + + +As there is no error correction within the Theora stream, packet loss will result in a loss of signal. Packet loss is more of an +issue for fragmented Theora packets as the client will have to cope with the handling of the C and F flags. If we use the +fragmented Theora packet example above and the first packet is lost the client SHOULD detect that the next packet has the packet +count field set to 0 and the C bit is set and MUST drop it. The next packet, which is the final fragmented packet, SHOULD +be dropped in the same manner, or buffered. Feedback reports on lost and dropped packets MUST be sent back via RTCP. + + + +If a particular multicast session has a large number of participants care must be taken to prevent an RTCP feedback implosion, +, in the event of packet loss from a large number of participants. + + +
    + +
    + + +To decode a Theora stream three configuration header blocks are needed. The first header, the Identification Header, indicates +the frame dimensions, quality, blocks used and the version of the Theora encoder used. The second header, the Comment Header, contains stream metadata and the third header, the Setup Header, details which contains dequantization and Huffman tables. + + + +As the RTP stream may change certain configuration data mid-session there are two different methods for delivering this +configuration data to a client, in-band and SDP which is detailed below. SDP delivery is used to set-up an initial +state for the client application and in-band is used to change state during the session. The changes may be due to +different metadata or Setup Header as well as different bitrates of the stream. + + + +Out of the two delivery vectors the use of an SDP attribute to indicate an URI where the configuration and Setup Header data +can be obtained is preferred as they can be fetched reliably using TCP. The in-band Setup Header delivery SHOULD +only be used in situations where the link between the client is unidirectional or if the SDP-based information is not available. + + + +Synchronizing the configuration and Setup Header to the RTP stream is critical. The 32 bit Setup Header Ident field is used +to indicate when a change in the stream has taken place. The client application MUST have in advance the correct configuration +and Setup Headers and if the client detects a change in the Ident value and does not have this information it MUST NOT +decode the raw Theora data. + + +
    + + +The three header data blocks are sent in-band with the packet type bits set to match the payload type. Normally the Setup Header +and Identification Header are sent once per session if the stream is an encoding of live video, as typically +the encoder state will not change, but the encoder state can change at the boundary of chained Theora video files. Metadata +can be sent at the start as well as any time during the life of the session. Clients MUST be capable of dealing with periodic +re-transmission of the configuration headers. + + +
    + + +The Identification Header is a short header with only a few fields used to declare the stream definitively as Theora and provide detailed information about the format of the fully decoded video data. + +
    + +
    + + +The fields listed above have the following meanings: + + + + + + VMAJ = The major version number. 8 bits. + VMIN = The minor version number. 8 bits. + VREV = The version revision number. 8 bits. + FMBW = The width of the frame in macro blocks. 16 bits. + FMBH = The height of the frame in macro blocks. 16 bits. + NSBS = The total number of super blocks in a frame. 32 bits. + NBS = The total number of blocks in a frame. 36 bits. + NMBS = The total number of macro blocks in a frame. 32 bits. + PICW = The width of the picture region in pixels. 20 bits. + PICH = The height of the picture region in pixels. 20 bits. + PICX = The X offset of the picture region in pixels. 8 bits. + PICY = The Y offset of the picture region in pixels. 8 bits. + FRN = The frame-rate numerator. 32 bits. + FRD = The frame-rate denominator. 32 bits. + PARN = The pixel aspect-ratio numerator. 24 bits. + PARD = The pixel aspect-ratio denominator. 24 bits. + CS = The color space. 8 bits. + PF = The pixel format. 2 bits. + NOMBR = The nominal bitrate of the stream, in bits per second. 24 bits. + QUAL = The quality hint. 6 bits. + KFGSHIFT = The amount to shift the key frame number by in the granule position. 5 bits. + + + +
    + +
    + + +The Theora Comment Header is the second of three header packets that begin a Theora stream. It is meant for short text comments, +not arbitrary metadata; arbitrary metadata belongs in a separate logical stream that provides greater structure and machine +parseability. The comment field is meant to be used much like someone jotting a quick note on the label of a video. It should be a +little information to remember the disc or tape by and explain it to others; a short, to-the-point text note that can be more than +a couple words, but isn't going to be more than a short paragraph. + + +
    + +
    + + +The format for the data takes the form of a 32 bit field denoting the number of user comments. Each of the user comments is prefixed by a 32 bit length field followed by the comment text encoded in UTF-8. + + +
    + +
    + + +The Theora setup header contains the limit values used to drive the loop filter, the base matrices and scale values used to build the dequantization tables, and the Huffman tables used to unpack the DCT tokens. Because the contents of this header are specific to Theora, no concessions have been made to keep the fields octet-aligned for easy parsing. + + +
    + +
    + + +
    + + +In order for different implementations of Theora RTP clients and servers to interoperate with each other a common format +for the production of the CRC32 hash is required. The polynomial is X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0. + + + +The following C code function SHOULD be used by implementations, if not then the code responsible for generating the CRC32 +value MUST use the polynomial function above. + + += 0; loop--) { + mask = -(crc & 1); + crc = (crc >> 1) ^ (0xEDB88320 & mask); + } + index++; + } + return ~crc; +} +]]> + + +
    + +
    +
    + +
    + + +As mentioned above the RECOMMENDED delivery vector for Theora configuration data is via an SDP attribute as this retrieval method +can be performed using a reliable transport protocol. + + +
    + +
    + + +As the RTP headers are not required for this method of delivery the +structure of the configuration data is slightly different. The packed header starts with a 32 bit count field which details the number of packed headers that are contained in the bundle. Next is the packed header payload for each chained Theora file. + + +
    + +
    + +The key difference between the in-band format is there is no need for the payload header octet and Setup Header Ident field. +Below are examples of the packed headers format. + + +
    + +
    + + +The alignment of the packed Identification Header is slightly different from the RTP payload type as the payload header is not +used. + + +
    + +
    + + +The packed Comment Header also as a slightly different structure to that of the RTP payload type with the payload header not being +used. + + + +
    + +
    + + +The packed Setup Header also has a slightly different structure to that of the RTP payload type. The Setup Header Ident field +that is normally part of this structure is moved to the second field of the overall packed structure. + + +
    + + +The following IANA considerations MUST only be applied to the packed headers. + + + +MIME media type name: video + + +MIME subtype: theora-config + + + +Required Parameters: +None. + + + +Optional Parameters: +None. + + + +Encoding considerations: +This type is only defined for transfer via HTTP as specified in RFC XXXX. + + + +Security Considerations: +See Section 6 of RFC 3047. + + + +Interoperability considerations: none + + + +Published specification: +See RFC XXXX for details. + + +Applications which use this media type: +Theora encoded video, configuration data. + + + +Additional information: none + + + +Person & email address to contact for further information: +Phil Kerr: <phil@plus24.com> + + + +Intended usage: COMMON + + +Author/Change controller: +Author: Phil Kerr +Change controller: IETF AVT Working Group + + +
    +
    + +
    + + +Setup Header caching allows clients that have previously connected to a stream to re-use the associated Setup Header and +configuration data. When a client receives a Setup Header it may store it locally and can compare the CRC32 key with that of the +new stream and begin decoding before it has received any of the headers. + + +
    + +
    + + +Unlike the loss of raw Theora payload data, loss of a configuration header can lead to a situation where it will not be possible +to successfully decode the stream. + + + +Out of the three headers, loss of either the Setup Header or Identification Headers MUST result in the halting of stream +decoding. Loss of the Comment header SHOULD NOT be regarded as fatal for decoding. Loss of any of the headers SHOULD be reported +to the client as well as a loss report sent via RTCP. + + +
    +
    + + +
    + +MIME media type name: video + +MIME subtype: theora + +Required Parameters: + + +sampling: Determines the chroma subsampling format. + + +width: Determines the number of pixels per line. This is an integer between 1 and 1048561 and MUST be in multiples of 16. + + +height: Determines the number of lines per frame. This is an integer between 1 and 1048561 and MUST be in multiples of 16. + + +header: Indicates the URI of the decoding configuration headers. + + + +Optional Parameters: +None. + + + +Encoding considerations: +This type is only defined for transfer via RTP as specified in RFC XXXX. + + + +Security Considerations: +See Section 6 of RFC 3047. + + + +Interoperability considerations: none + + + +Published specification: +See the Theora documentation for details. + + +Applications which use this media type: +Video streaming and conferencing tools + + + +Additional information: none + + + +Person & email address to contact for further information: +Phil Kerr: <phil@plus24.com> + + + +Intended usage: COMMON + + +Author/Change controller: +Author: Phil Kerr +Change controller: IETF AVT Working Group + +
    + + +The information carried in the MIME media type specification has a specific mapping to fields in the Session Description +Protocol (SDP) , which is commonly used to describe RTP sessions. When SDP is used to specify +sessions the mapping are as follows: + + + + + +The MIME type ("video") goes in SDP "m=" as the media name. + + +The MIME subtype ("THEORA") goes in SDP "a=rtpmap" as the encoding name. + + +The parameter "rate" also goes in "a=rtpmap" as clock rate. + + +The parameter "channels" also goes in "a=rtpmap" as channel count. + + +The parameter "header" goes in the SDP "a=fmpt" attribute. + + + + +If the stream comprises chained Theora files the configuration and Setup Headers for each file SHOULD be packaged together +and passed to the client using the headers attribute if all the files to be played are known in advance. + + + +Example: + + + + +c=IN IP4/6 +m=video RTP/AVP 98 +a=rtpmap:98 theora/90000 +a=fmtp:98 sampling=YCbCr-4:2:2; width=1280; height=720; header=<URI of configuration header> + + +
    +
    + + + + +
    + +RTP packets using this payload format are subject to the security considerations discussed in the RTP specification +. This implies that the confidentiality of the media stream is achieved by using +encryption. Because the data compression used with this payload format is applied end-to-end, encryption may be performed on the +compressed data. Where the size of a data block is set care MUST be taken to prevent buffer overflows in the client applications. + + +
    + +
    + + +Thanks to the AVT, Ogg Theora Communities / Xiph.org, Fluendo, Ralph Giles. + + +
    + +
    + + + + + + + +The Ogg Encapsulation Format Version 0 + + + + + + + +Key words for use in RFCs to Indicate Requirement Levels + + + + + + + +RTP: A Transport Protocol for real-time applications + + + + + + + + + + +RTP Profile for video and Video Conferences with Minimal Control. + + + + + + + + + +SDP: Session Description Protocol + + + + + + + + +Path MTU Discovery + + + + + + + +Path MTU Discovery for IP version 6 + + + + + + + +Extended RTP Profile for RTCP-based Feedback (RTP/AVPF) + + + + + + + + + + + +RTP Payload Format for Vorbis Encoded Audio - draft-ietf-avt-vorbis-rtp-00 + + + + + + + + + + + +libTheora: Available from the Xiph website, http://www.xiph.org + + + + + +Ogg Theora I spec: Codec setup and packet decode. http://www.xiph.org/ogg/Theora/doc/Theora-spec-ref.html + + + + + + +
    diff --git a/cs/3rd party/libtheora/doc/spec/Makefile.am b/cs/3rd party/libtheora/doc/spec/Makefile.am new file mode 100644 index 000000000..ee1fb9022 --- /dev/null +++ b/cs/3rd party/libtheora/doc/spec/Makefile.am @@ -0,0 +1,81 @@ +## Process this file with automake to produce Makefile.in + +# makefile to generate the spec document from sources +# requires transfig and pdflatex + +built_docs = Theora.pdf + +if BUILD_SPEC +doc_DATA = $(built_docs) +endif + +SPEC_SRCS = spec.tex spec.bib + +FIG_SRCS = pic-frame.fig hilbert-mb.fig hilbert-block.fig xifish.fig \ + superblock.fig macroblock.fig raster-block.fig reference-frames.fig \ + pixel444.fig pixel422.fig pixel420.fig idct.fig fdct.fig \ + pic_even.fig pic_even_odd.fig pic_odd.fig pic_odd_even.fig \ + lflim.fig + +FIG_TEXS = $(FIG_SRCS:.fig=.tex) +FIG_AUXS = $(FIG_SRCS:.fig=.aux) +FIG_PDFS = $(FIG_SRCS:.fig=.pdf) + +# add any native-pdf figures here +FIG_OBJS = $(FIG_PDFS) + +EXTRA_DIST = $(built_docs) $(SPEC_SRCS) $(FIG_SRCS) ltablex.sty + +if BUILD_SPEC +# latex three times is the charm with references +# long tables require the .aux file to start from scratch +Theora.pdf : $(SPEC_SRCS) $(FIG_OBJS) vp3huff.tex + -$(RM) spec.aux + pdflatex -interaction nonstopmode spec.tex + bibtex spec.aux + pdflatex -interaction nonstopmode spec.tex + pdflatex -interaction nonstopmode spec.tex + mv spec.pdf $@ +else +Theora.pdf : + echo "*** Warning: Missing tools; $@ will not be built." +endif + +vp3huff.tex : vp3huff + ./vp3huff > $@ + +noinst_PROGRAMS = vp3huff +vp3huff_SOURCES = vp3huff.c + +figures : $(FIG_OBJS) + +# rules to generate latex and pdf versions of the xfig figures +.fig.tex: + fig2dev -L latex $< $@ + +.fig.pdf: + fig2dev -L pdf -p 0 $< $@ + +SUFFIXES = .fig .tex .pdf + +# clean targets +clean-local: + -$(RM) $(FIG_TEXS) + -$(RM) $(FIG_AUXS) + -$(RM) $(FIG_PDFS) + -$(RM) vp3huff + -$(RM) vp3huff.tex + -$(RM) vp3huff.aux + -$(RM) spec.aux + -$(RM) spec.log + -$(RM) spec.lof + -$(RM) spec.lot + -$(RM) spec.out + -$(RM) spec.bbl + -$(RM) spec.blg + -$(RM) spec.toc + +maintainer-clean-local: + -$(RM) $(built_docs) + +maintainerclean: maintainer-clean diff --git a/cs/3rd party/libtheora/doc/spec/fdct.fig b/cs/3rd party/libtheora/doc/spec/fdct.fig new file mode 100644 index 000000000..e35c758c4 --- /dev/null +++ b/cs/3rd party/libtheora/doc/spec/fdct.fig @@ -0,0 +1,371 @@ +#FIG 3.2 +Landscape +Center +Inches +Letter +100.00 +Single +-2 +1200 2 +6 1350 4650 1650 4950 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 1500 4800 75 75 1500 4800 1500 4725 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 1450 4800 1550 4800 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 1500 4850 1500 4750 +-6 +6 1350 450 1650 750 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 1500 600 75 75 1500 600 1500 525 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 1450 600 1550 600 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 1500 650 1500 550 +-6 +6 1950 1050 2250 1350 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 2100 1200 75 75 2100 1200 2100 1125 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 2050 1200 2150 1200 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 2100 1250 2100 1150 +-6 +6 3150 2850 3450 3150 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 3300 3000 75 75 3300 3000 3300 2925 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 3250 3000 3350 3000 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 3300 3050 3300 2950 +-6 +6 3150 2250 3450 2550 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 3300 2400 75 75 3300 2400 3300 2325 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 3250 2400 3350 2400 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 3300 2450 3300 2350 +-6 +6 2550 3450 2850 3750 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 2700 3600 75 75 2700 3600 2700 3525 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 2650 3600 2750 3600 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 2700 3650 2700 3550 +-6 +6 2550 1650 2850 1950 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 2700 1800 75 75 2700 1800 2700 1725 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 2650 1800 2750 1800 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 2700 1850 2700 1750 +-6 +6 1950 4050 2250 4350 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 2100 4200 75 75 2100 4200 2100 4125 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 2050 4200 2150 4200 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 2100 4250 2100 4150 +-6 +6 2250 3600 2550 3900 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 2400 3750 75 75 2400 3750 2400 3675 +4 1 0 40 -1 0 12 0.0000 4 15 60 2400 3800 -\001 +-6 +6 1650 4200 1950 4500 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 1800 4350 75 75 1800 4350 1800 4275 +4 1 0 40 -1 0 12 0.0000 4 15 60 1800 4400 -\001 +-6 +6 1050 4800 1350 5100 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 1200 4950 75 75 1200 4950 1200 4875 +4 1 0 40 -1 0 12 0.0000 4 15 60 1200 5000 -\001 +-6 +6 2850 3000 3150 3300 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 3000 3150 75 75 3000 3150 3000 3075 +4 1 0 40 -1 0 12 0.0000 4 15 60 3000 3200 -\001 +-6 +6 4350 4050 4650 4350 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 4500 4200 75 75 4500 4200 4500 4125 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 4450 4200 4550 4200 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 4500 4250 4500 4150 +-6 +6 4350 3450 4650 3750 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 4500 3600 75 75 4500 3600 4500 3525 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 4450 3600 4550 3600 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 4500 3650 4500 3550 +-6 +6 4050 3300 4350 3600 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 4200 3450 75 75 4200 3450 4200 3375 +4 1 0 40 -1 0 12 0.0000 4 15 60 4200 3500 -\001 +-6 +6 4350 2250 4650 2550 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 4500 2400 75 75 4500 2400 4500 2325 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 4450 2400 4550 2400 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 4500 2450 4500 2350 +-6 +6 4350 450 4650 750 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 4500 600 75 75 4500 600 4500 525 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 4450 600 4550 600 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 4500 650 4500 550 +-6 +6 4050 2400 4350 2700 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 4200 2550 75 75 4200 2550 4200 2475 +4 1 0 40 -1 0 12 0.0000 4 15 60 4200 2600 -\001 +-6 +6 4950 1050 5250 1350 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 5100 1200 75 75 5100 1200 5100 1125 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 5050 1200 5150 1200 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 5100 1250 5100 1150 +-6 +6 4950 1650 5250 1950 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 5100 1800 75 75 5100 1800 5100 1725 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 5050 1800 5150 1800 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 5100 1850 5100 1750 +-6 +6 4650 1800 4950 2100 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 4800 1950 75 75 4800 1950 4800 1875 +4 1 0 40 -1 0 12 0.0000 4 15 60 4800 2000 -\001 +-6 +6 4725 3525 4875 4275 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 4800 4200 25 25 4800 4200 4800 4175 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 4800 3600 25 25 4800 3600 4800 3575 +-6 +6 6150 4650 6450 4950 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 6300 4800 75 75 6300 4800 6300 4725 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 6250 4800 6350 4800 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 6300 4850 6300 4750 +-6 +6 6150 4050 6450 4350 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 6300 4200 75 75 6300 4200 6300 4125 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 6250 4200 6350 4200 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 6300 4250 6300 4150 +-6 +6 5850 3900 6150 4200 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 6000 4050 75 75 6000 4050 6000 3975 +4 1 0 40 -1 0 12 0.0000 4 15 60 6000 4100 -\001 +-6 +6 6150 2850 6450 3150 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 6300 3000 75 75 6300 3000 6300 2925 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 6250 3000 6350 3000 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 6300 3050 6300 2950 +-6 +6 6150 3450 6450 3750 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 6300 3600 75 75 6300 3600 6300 3525 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 6250 3600 6350 3600 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 6300 3650 6300 3550 +-6 +6 5850 3600 6150 3900 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 6000 3750 75 75 6000 3750 6000 3675 +4 1 0 40 -1 0 12 0.0000 4 15 60 6000 3800 -\001 +-6 +6 6150 1050 6450 1350 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 6300 1200 75 75 6300 1200 6300 1125 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 6250 1200 6350 1200 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 6300 1250 6300 1150 +-6 +6 6150 450 6450 750 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 6300 600 75 75 6300 600 6300 525 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 6250 600 6350 600 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 6300 650 6300 550 +-6 +6 6150 2250 6450 2550 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 6300 2400 75 75 6300 2400 6300 2325 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 6250 2400 6350 2400 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 6300 2450 6300 2350 +-6 +6 6150 1650 6450 1950 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 6300 1800 75 75 6300 1800 6300 1725 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 6250 1800 6350 1800 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 6300 1850 6300 1750 +-6 +6 5850 1200 6150 1500 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 6000 1350 75 75 6000 1350 6000 1275 +4 1 0 40 -1 0 12 0.0000 4 15 60 6000 1400 -\001 +-6 +6 7350 4650 7650 4950 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 7500 4800 75 75 7500 4800 7500 4725 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 7450 4800 7550 4800 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 7500 4850 7500 4750 +-6 +6 7350 2850 7650 3150 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 7500 3000 75 75 7500 3000 7500 2925 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 7450 3000 7550 3000 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 7500 3050 7500 2950 +-6 +6 7950 4050 8250 4350 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 8100 4200 75 75 8100 4200 8100 4125 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 8050 4200 8150 4200 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 8100 4250 8100 4150 +-6 +6 7950 3450 8250 3750 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 8100 3600 75 75 8100 3600 8100 3525 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 8050 3600 8150 3600 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 8100 3650 8100 3550 +-6 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 900 4800 25 25 900 4800 900 4775 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 900 600 25 25 900 600 900 575 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 1500 1200 25 25 1500 1200 1500 1175 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 2700 3000 25 25 2700 3000 2700 2975 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 2700 2400 25 25 2700 2400 2700 2375 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 2100 3600 25 25 2100 3600 2100 3575 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 1500 4200 25 25 1500 4200 1500 4175 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 3900 4200 25 25 3900 4200 3900 4175 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 3900 3600 25 25 3900 3600 3900 3575 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 3900 2400 25 25 3900 2400 3900 2375 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 3900 600 25 25 3900 600 3900 575 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 4500 1200 25 25 4500 1200 4500 1175 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 4500 1800 25 25 4500 1800 4500 1775 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 5700 4800 25 25 5700 4800 5700 4775 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 5700 4200 25 25 5700 4200 5700 4175 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 5700 3600 25 25 5700 3600 5700 3575 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 5700 3000 25 25 5700 3000 5700 2975 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 5700 1200 25 25 5700 1200 5700 1175 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 5700 600 25 25 5700 600 5700 575 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 5700 2400 25 25 5700 2400 5700 2375 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 5725 1800 25 25 5725 1800 5725 1775 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 6900 4800 25 25 6900 4800 6900 4775 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 6900 3000 25 25 6900 3000 6900 2975 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 7500 4200 25 25 7500 4200 7500 4175 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 7500 3600 25 25 7500 3600 7500 3575 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 7500 1200 25 25 7500 1200 7500 1175 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 7500 600 25 25 7500 600 7500 575 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 2100 1800 25 25 2100 1800 2100 1775 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 600 600 8400 600 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 600 2400 8400 2400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 600 3000 8400 3000 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 600 4800 8400 4800 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 600 1200 8400 1200 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 600 3600 8400 3600 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 600 1800 8400 1800 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 600 4200 8400 4200 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 900 4800 1500 600 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 900 600 1500 4800 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 1500 1200 2100 4275 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 1500 4200 2100 1200 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 2100 3600 2700 1800 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 2700 2400 3300 3000 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 2100 1800 2700 3600 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 2700 3000 3300 2400 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 3900 3600 4500 4200 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 3900 4200 4500 3600 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 3900 600 4500 2400 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 3900 2400 4500 600 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 4500 1800 5100 1200 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 4500 1200 5100 1800 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 5700 4200 6300 4800 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 5700 3600 6300 3000 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 5700 3000 6300 3600 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 5700 4800 6300 4200 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5700 1200 6300 600 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5700 600 6300 1200 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5700 1800 6300 2400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5700 2400 6300 1800 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 6900 3000 7500 4800 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 6900 4800 7500 3000 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 7500 4200 8100 3600 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 7500 3600 8100 4200 +4 1 0 40 -1 0 12 0.0000 4 135 210 4800 4125 C4\001 +4 1 0 40 -1 0 12 0.0000 4 135 210 4800 3525 C4\001 +4 1 0 40 -1 0 12 0.0000 4 135 210 6000 2350 C6\001 +4 1 0 40 -1 0 12 0.0000 4 135 255 6300 2275 -S6\001 +4 1 0 40 -1 0 12 0.0000 4 135 210 6000 1750 C6\001 +4 1 0 40 -1 0 12 0.0000 4 135 195 6300 2050 S6\001 +4 1 0 40 -1 0 12 0.0000 4 135 210 7200 2950 C7\001 +4 1 0 40 -1 0 12 0.0000 4 135 195 7500 3375 S7\001 +4 1 0 40 -1 0 12 0.0000 4 135 210 7200 4750 C7\001 +4 1 0 40 -1 0 12 0.0000 4 135 255 7500 4575 -S7\001 +4 1 0 40 -1 0 12 0.0000 4 135 210 7800 4150 C3\001 +4 1 0 40 -1 0 12 0.0000 4 135 255 8100 4075 -S3\001 +4 1 0 40 -1 0 12 0.0000 4 135 210 7800 3550 C3\001 +4 1 0 40 -1 0 12 0.0000 4 135 195 8100 3850 S3\001 +4 1 0 40 -1 0 12 0.0000 4 135 210 7500 1125 C4\001 +4 1 0 40 -1 0 12 0.0000 4 135 210 7500 525 C4\001 +4 1 0 40 -1 0 12 0.0000 4 135 90 8700 675 0\001 +4 1 0 40 -1 0 12 0.0000 4 135 90 8700 1275 4\001 +4 1 0 40 -1 0 12 0.0000 4 135 90 8700 1875 2\001 +4 1 0 40 -1 0 12 0.0000 4 135 90 8700 2475 6\001 +4 1 0 40 -1 0 12 0.0000 4 135 90 8700 3675 5\001 +4 1 0 40 -1 0 12 0.0000 4 135 90 8700 4275 3\001 +4 1 0 40 -1 0 12 0.0000 4 135 90 8700 4875 7\001 +4 1 0 40 -1 0 12 0.0000 4 135 90 8700 3075 1\001 +4 1 0 40 -1 0 12 0.0000 4 135 90 300 675 0\001 +4 1 0 40 -1 0 12 0.0000 4 135 90 300 1275 1\001 +4 1 0 40 -1 0 12 0.0000 4 135 90 300 1875 2\001 +4 1 0 40 -1 0 12 0.0000 4 135 90 300 2475 3\001 +4 1 0 40 -1 0 12 0.0000 4 135 90 300 3075 4\001 +4 1 0 40 -1 0 12 0.0000 4 135 90 300 3675 5\001 +4 1 0 40 -1 0 12 0.0000 4 135 90 300 4275 6\001 +4 1 0 40 -1 0 12 0.0000 4 135 90 300 4875 7\001 diff --git a/cs/3rd party/libtheora/doc/spec/hilbert-block.fig b/cs/3rd party/libtheora/doc/spec/hilbert-block.fig new file mode 100644 index 000000000..8316c5d18 --- /dev/null +++ b/cs/3rd party/libtheora/doc/spec/hilbert-block.fig @@ -0,0 +1,104 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha4 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +6 675 645 3825 3795 +4 1 0 50 0 1 12 0.0000 0 150 105 900 3660 0\001 +4 1 0 50 0 1 12 0.0000 0 150 105 1800 3660 1\001 +4 1 0 50 0 1 12 0.0000 0 150 105 1800 2760 2\001 +4 1 0 50 0 1 12 0.0000 0 150 105 900 2760 3\001 +4 1 0 50 0 1 12 0.0000 0 150 105 900 1860 4\001 +4 1 0 50 0 1 12 0.0000 0 150 105 900 960 5\001 +4 1 0 50 0 1 12 0.0000 0 150 105 1800 960 6\001 +4 1 0 50 0 1 12 0.0000 0 150 105 1800 1860 7\001 +4 1 0 50 0 1 12 0.0000 0 150 105 2700 1860 8\001 +4 1 0 50 0 1 12 0.0000 0 150 105 2700 960 9\001 +4 1 0 50 0 1 12 0.0000 0 150 210 3600 960 10\001 +4 1 0 50 0 1 12 0.0000 0 150 210 3600 1860 11\001 +4 1 0 50 0 1 12 0.0000 0 150 210 3600 2760 12\001 +4 1 0 50 0 1 12 0.0000 0 150 210 2700 2760 13\001 +4 1 0 50 0 1 12 0.0000 0 150 210 2700 3660 14\001 +4 1 0 50 0 1 12 0.0000 0 150 210 3600 3660 15\001 +-6 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 1125 3600 1575 3600 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 1800 3375 1800 2925 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 1575 2700 1125 2700 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 900 2475 900 2025 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 900 1575 900 1125 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 1125 900 1575 900 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 1800 1125 1800 1575 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 2025 1800 2475 1800 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 2700 1575 2700 1125 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 2925 900 3375 900 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 3600 1125 3600 1575 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 3600 2025 3600 2475 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 3375 2700 2925 2700 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 2700 2925 2700 3375 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 2925 3600 3375 3600 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 450 450 1350 450 1350 1350 450 1350 450 450 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1350 450 2250 450 2250 1350 1350 1350 1350 450 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2250 450 3150 450 3150 1350 2250 1350 2250 450 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3150 450 4050 450 4050 1350 3150 1350 3150 450 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 450 1350 1350 1350 1350 2250 450 2250 450 1350 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1350 1350 2250 1350 2250 2250 1350 2250 1350 1350 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2250 1350 3150 1350 3150 2250 2250 2250 2250 1350 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3150 1350 4050 1350 4050 2250 3150 2250 3150 1350 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 450 2250 1350 2250 1350 3150 450 3150 450 2250 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1350 2250 2250 2250 2250 3150 1350 3150 1350 2250 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2250 2250 3150 2250 3150 3150 2250 3150 2250 2250 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3150 2250 4050 2250 4050 3150 3150 3150 3150 2250 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 450 3150 1350 3150 1350 4050 450 4050 450 3150 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1350 3150 2250 3150 2250 4050 1350 4050 1350 3150 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2250 3150 3150 3150 3150 4050 2250 4050 2250 3150 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3150 3150 4050 3150 4050 4050 3150 4050 3150 3150 diff --git a/cs/3rd party/libtheora/doc/spec/hilbert-mb.fig b/cs/3rd party/libtheora/doc/spec/hilbert-mb.fig new file mode 100644 index 000000000..0ed12a76b --- /dev/null +++ b/cs/3rd party/libtheora/doc/spec/hilbert-mb.fig @@ -0,0 +1,32 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha4 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +6 810 810 1890 1890 +4 1 0 50 0 1 12 0.0000 0 150 105 900 1860 0\001 +4 1 0 50 0 1 12 0.0000 0 150 105 900 960 1\001 +4 1 0 50 0 1 12 0.0000 0 150 105 1800 960 2\001 +4 1 0 50 0 1 12 0.0000 0 150 105 1800 1860 3\001 +-6 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 900 1575 900 1125 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 1125 900 1575 900 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 1800 1125 1800 1575 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 450 450 1350 450 1350 1350 450 1350 450 450 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1350 450 2250 450 2250 1350 1350 1350 1350 450 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 450 1350 1350 1350 1350 2250 450 2250 450 1350 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1350 1350 2250 1350 2250 2250 1350 2250 1350 1350 diff --git a/cs/3rd party/libtheora/doc/spec/idct.fig b/cs/3rd party/libtheora/doc/spec/idct.fig new file mode 100644 index 000000000..2d4388c43 --- /dev/null +++ b/cs/3rd party/libtheora/doc/spec/idct.fig @@ -0,0 +1,369 @@ +#FIG 3.2 +Landscape +Center +Inches +Letter +100.00 +Single +-2 +1200 2 +6 3150 4650 3450 4950 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 3300 4800 75 75 3300 4800 3300 4725 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 3250 4800 3350 4800 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 3300 4850 3300 4750 +-6 +6 3150 4050 3450 4350 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 3300 4200 75 75 3300 4200 3300 4125 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 3250 4200 3350 4200 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 3300 4250 3300 4150 +-6 +6 2850 3900 3150 4200 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 3000 4050 75 75 3000 4050 3000 3975 +4 1 0 40 -1 0 12 0.0000 4 15 60 3000 4100 -\001 +-6 +6 3150 2850 3450 3150 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 3300 3000 75 75 3300 3000 3300 2925 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 3250 3000 3350 3000 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 3300 3050 3300 2950 +-6 +6 3150 3450 3450 3750 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 3300 3600 75 75 3300 3600 3300 3525 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 3250 3600 3350 3600 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 3300 3650 3300 3550 +-6 +6 2850 3600 3150 3900 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 3000 3750 75 75 3000 3750 3000 3675 +4 1 0 40 -1 0 12 0.0000 4 15 60 3000 3800 -\001 +-6 +6 1950 1050 2250 1350 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 2100 1200 75 75 2100 1200 2100 1125 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 2050 1200 2150 1200 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 2100 1250 2100 1150 +-6 +6 1950 450 2250 750 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 2100 600 75 75 2100 600 2100 525 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 2050 600 2150 600 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 2100 650 2100 550 +-6 +6 1950 2250 2250 2550 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 2100 2400 75 75 2100 2400 2100 2325 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 2050 2400 2150 2400 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 2100 2450 2100 2350 +-6 +6 1950 1650 2250 1950 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 2100 1800 75 75 2100 1800 2100 1725 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 2050 1800 2150 1800 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 2100 1850 2100 1750 +-6 +6 1650 1200 1950 1500 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 1800 1350 75 75 1800 1350 1800 1275 +4 1 0 40 -1 0 12 0.0000 4 15 60 1800 1400 -\001 +-6 +6 6150 4650 6450 4950 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 6300 4800 75 75 6300 4800 6300 4725 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 6250 4800 6350 4800 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 6300 4850 6300 4750 +-6 +6 6150 450 6450 750 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 6300 600 75 75 6300 600 6300 525 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 6250 600 6350 600 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 6300 650 6300 550 +-6 +6 6750 1050 7050 1350 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 6900 1200 75 75 6900 1200 6900 1125 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 6850 1200 6950 1200 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 6900 1250 6900 1150 +-6 +6 7950 2850 8250 3150 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 8100 3000 75 75 8100 3000 8100 2925 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 8050 3000 8150 3000 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 8100 3050 8100 2950 +-6 +6 7950 2250 8250 2550 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 8100 2400 75 75 8100 2400 8100 2325 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 8050 2400 8150 2400 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 8100 2450 8100 2350 +-6 +6 7350 3450 7650 3750 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 7500 3600 75 75 7500 3600 7500 3525 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 7450 3600 7550 3600 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 7500 3650 7500 3550 +-6 +6 7350 1650 7650 1950 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 7500 1800 75 75 7500 1800 7500 1725 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 7450 1800 7550 1800 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 7500 1850 7500 1750 +-6 +6 6750 4050 7050 4350 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 6900 4200 75 75 6900 4200 6900 4125 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 6850 4200 6950 4200 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 6900 4250 6900 4150 +-6 +6 7050 3600 7350 3900 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 7200 3750 75 75 7200 3750 7200 3675 +4 1 0 40 -1 0 12 0.0000 4 15 60 7200 3800 -\001 +-6 +6 6450 4200 6750 4500 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 6600 4350 75 75 6600 4350 6600 4275 +4 1 0 40 -1 0 12 0.0000 4 15 60 6600 4400 -\001 +-6 +6 5850 4800 6150 5100 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 6000 4950 75 75 6000 4950 6000 4875 +4 1 0 40 -1 0 12 0.0000 4 15 60 6000 5000 -\001 +-6 +6 7650 3000 7950 3300 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 7800 3150 75 75 7800 3150 7800 3075 +4 1 0 40 -1 0 12 0.0000 4 15 60 7800 3200 -\001 +-6 +6 4950 4050 5250 4350 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 5100 4200 75 75 5100 4200 5100 4125 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 5050 4200 5150 4200 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 5100 4250 5100 4150 +-6 +6 4950 3450 5250 3750 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 5100 3600 75 75 5100 3600 5100 3525 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 5050 3600 5150 3600 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 5100 3650 5100 3550 +-6 +6 4650 3300 4950 3600 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 4800 3450 75 75 4800 3450 4800 3375 +4 1 0 40 -1 0 12 0.0000 4 15 60 4800 3500 -\001 +-6 +6 4350 2250 4650 2550 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 4500 2400 75 75 4500 2400 4500 2325 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 4450 2400 4550 2400 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 4500 2450 4500 2350 +-6 +6 4350 450 4650 750 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 4500 600 75 75 4500 600 4500 525 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 4450 600 4550 600 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 4500 650 4500 550 +-6 +6 4050 2400 4350 2700 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 4200 2550 75 75 4200 2550 4200 2475 +4 1 0 40 -1 0 12 0.0000 4 15 60 4200 2600 -\001 +-6 +6 4950 1050 5250 1350 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 5100 1200 75 75 5100 1200 5100 1125 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 5050 1200 5150 1200 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 5100 1250 5100 1150 +-6 +6 4950 1650 5250 1950 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 5100 1800 75 75 5100 1800 5100 1725 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 5050 1800 5150 1800 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 5100 1850 5100 1750 +-6 +6 1950 4050 2250 4350 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 2100 4200 75 75 2100 4200 2100 4125 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 2050 4200 2150 4200 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 2100 4250 2100 4150 +-6 +6 1950 3450 2250 3750 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 2100 3600 75 75 2100 3600 2100 3525 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 2050 3600 2150 3600 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 2100 3650 2100 3550 +-6 +6 1350 4650 1650 4950 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 1500 4800 75 75 1500 4800 1500 4725 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 1450 4800 1550 4800 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 1500 4850 1500 4750 +-6 +6 1350 2850 1650 3150 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 1500 3000 75 75 1500 3000 1500 2925 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 1450 3000 1550 3000 +2 1 0 1 0 7 40 -1 20 4.000 0 0 7 0 0 2 + 1500 3050 1500 2950 +-6 +6 4650 1800 4950 2100 +1 3 0 1 0 7 40 -1 20 4.000 1 0.0000 4800 1950 75 75 4800 1950 4800 1875 +4 1 0 40 -1 0 12 0.0000 4 15 60 4800 2000 -\001 +-6 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 2700 4800 25 25 2700 4800 2700 4775 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 2700 4200 25 25 2700 4200 2700 4175 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 2700 3600 25 25 2700 3600 2700 3575 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 2700 3000 25 25 2700 3000 2700 2975 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 1500 1200 25 25 1500 1200 1500 1175 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 1500 600 25 25 1500 600 1500 575 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 1500 2400 25 25 1500 2400 1500 2375 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 1525 1800 25 25 1525 1800 1525 1775 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 3000 1200 25 25 3000 1200 3000 1175 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 3000 600 25 25 3000 600 3000 575 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 5700 4800 25 25 5700 4800 5700 4775 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 5700 600 25 25 5700 600 5700 575 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 6300 1200 25 25 6300 1200 6300 1175 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 7500 3000 25 25 7500 3000 7500 2975 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 7500 2400 25 25 7500 2400 7500 2375 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 6900 3600 25 25 6900 3600 6900 3575 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 6300 4200 25 25 6300 4200 6300 4175 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 4500 4200 25 25 4500 4200 4500 4175 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 4500 3600 25 25 4500 3600 4500 3575 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 4200 4200 25 25 4200 4200 4200 4175 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 4200 3600 25 25 4200 3600 4200 3575 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 6900 1800 25 25 6900 1800 6900 1775 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 3900 2400 25 25 3900 2400 3900 2375 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 3900 600 25 25 3900 600 3900 575 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 1500 4200 25 25 1500 4200 1500 4175 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 1500 3600 25 25 1500 3600 1500 3575 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 900 4800 25 25 900 4800 900 4775 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 900 3000 25 25 900 3000 900 2975 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 4500 1800 25 25 4500 1800 4500 1775 +1 3 0 1 0 0 40 -1 20 4.000 1 0.0000 4500 1200 25 25 4500 1200 4500 1175 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 600 600 8400 600 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 600 2400 8400 2400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 600 3000 8400 3000 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 600 4800 8400 4800 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 600 1200 8400 1200 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 2700 4200 3300 4800 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 2700 3600 3300 3000 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 2700 3000 3300 3600 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 600 3600 8400 3600 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 2700 4800 3300 4200 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 600 1800 8400 1800 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 600 4200 8400 4200 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1500 1200 2100 600 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1500 600 2100 1200 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1500 1800 2100 2400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1500 2400 2100 1800 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 5700 4800 6300 600 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 5700 600 6300 4800 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 6300 1200 6900 4275 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 6300 4200 6900 1200 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 6900 3600 7500 1800 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 7500 2400 8100 3000 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 6900 1800 7500 3600 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 7500 3000 8100 2400 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 4500 3600 5100 4200 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 4500 4200 5100 3600 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 3900 2400 4500 600 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 3900 600 4500 2400 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 4500 1800 5100 1200 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 4500 1200 5100 1800 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 1500 4200 2100 3600 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 1500 3600 2100 4200 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 900 4800 1500 3000 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 900 3000 1500 4800 +4 1 0 40 -1 0 12 0.0000 4 135 90 300 675 0\001 +4 1 0 40 -1 0 12 0.0000 4 135 90 300 1275 4\001 +4 1 0 40 -1 0 12 0.0000 4 135 90 300 1875 2\001 +4 1 0 40 -1 0 12 0.0000 4 135 90 300 2475 6\001 +4 1 0 40 -1 0 12 0.0000 4 135 90 300 3675 5\001 +4 1 0 40 -1 0 12 0.0000 4 135 90 300 4275 3\001 +4 1 0 40 -1 0 12 0.0000 4 135 90 300 4875 7\001 +4 1 0 40 -1 0 12 0.0000 4 135 90 300 3075 1\001 +4 1 0 40 -1 0 12 0.0000 4 135 210 1800 2350 C6\001 +4 1 0 40 -1 0 12 0.0000 4 135 195 2100 2275 S6\001 +4 1 0 40 -1 0 12 0.0000 4 135 210 1800 1750 C6\001 +4 1 0 40 -1 0 12 0.0000 4 135 255 2100 2050 -S6\001 +4 1 0 40 -1 0 12 0.0000 4 135 210 3000 1125 C4\001 +4 1 0 40 -1 0 12 0.0000 4 135 210 3000 525 C4\001 +4 1 0 40 -1 0 12 0.0000 4 135 90 8700 675 0\001 +4 1 0 40 -1 0 12 0.0000 4 135 90 8700 1275 1\001 +4 1 0 40 -1 0 12 0.0000 4 135 90 8700 1875 2\001 +4 1 0 40 -1 0 12 0.0000 4 135 90 8700 2475 3\001 +4 1 0 40 -1 0 12 0.0000 4 135 90 8700 3075 4\001 +4 1 0 40 -1 0 12 0.0000 4 135 90 8700 3675 5\001 +4 1 0 40 -1 0 12 0.0000 4 135 90 8700 4275 6\001 +4 1 0 40 -1 0 12 0.0000 4 135 90 8700 4875 7\001 +4 1 0 40 -1 0 12 0.0000 4 135 210 4200 4125 C4\001 +4 1 0 40 -1 0 12 0.0000 4 135 210 4200 3525 C4\001 +4 1 0 40 -1 0 12 0.0000 4 135 210 1800 4150 C3\001 +4 1 0 40 -1 0 12 0.0000 4 135 195 2100 4075 S3\001 +4 1 0 40 -1 0 12 0.0000 4 135 210 1800 3550 C3\001 +4 1 0 40 -1 0 12 0.0000 4 135 255 2100 3850 -S3\001 +4 1 0 40 -1 0 12 0.0000 4 135 210 1200 2950 C7\001 +4 1 0 40 -1 0 12 0.0000 4 135 255 1500 3375 -S7\001 +4 1 0 40 -1 0 12 0.0000 4 135 210 1200 4750 C7\001 +4 1 0 40 -1 0 12 0.0000 4 135 195 1500 4575 S7\001 diff --git a/cs/3rd party/libtheora/doc/spec/lflim.fig b/cs/3rd party/libtheora/doc/spec/lflim.fig new file mode 100644 index 000000000..c71dc7fe7 --- /dev/null +++ b/cs/3rd party/libtheora/doc/spec/lflim.fig @@ -0,0 +1,23 @@ +#FIG 3.2 Produced by xfig version 3.2.5 +Landscape +Center +Inches +Letter +100.00 +Single +-2 +1200 2 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 600 2400 5400 2400 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 3000 4200 3000 600 +2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 6 + 600 2400 1200 2400 2100 3300 3900 1500 4800 2400 5400 2400 +4 1 0 50 -1 1 12 0.0000 0 195 615 1200 2325 (-2L,0)\001 +4 1 0 50 -1 1 12 0.0000 0 195 600 2100 3525 (-L,-L)\001 +4 0 0 50 -1 1 12 0.0000 0 150 360 3075 825 lflim\001 +4 1 0 50 -1 1 12 0.0000 0 195 480 3900 1425 (L,L)\001 +4 1 0 50 -1 1 12 0.0000 0 195 555 4800 2625 (2L,0)\001 +4 0 0 50 -1 1 12 0.0000 0 150 135 5250 2625 R\001 diff --git a/cs/3rd party/libtheora/doc/spec/ltablex.sty b/cs/3rd party/libtheora/doc/spec/ltablex.sty new file mode 100644 index 000000000..31a084790 --- /dev/null +++ b/cs/3rd party/libtheora/doc/spec/ltablex.sty @@ -0,0 +1,237 @@ +%% +%% This is file ltablex.sty (v1.0, November 1995) +%% +%% +%% Author: Anil K. Goel (akgoel@uwaterloo.ca) +%% +%% +%% Copyright (C) QNX Software Systems Ltd. 1995 +%% All rights reserved. +%% Please send any comments/suggetions to: latex@qnx.com +%% +%% This system is distributed in the hope that it will be useful +%% to others, but WITHOUT ANY WARRANTY; without even the implied +%% warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +%% +%% +%% The file modifies the tabularx environment to +%% combine the features of the tabularx package +%% (auto-sized columns in a fixed width table) +%% with those of the longtable package +%% (multi-page tables). +%% +%% The tables are typeset using the tabularx environment +%% and the longtable environment is used internally to +%% handle multi-page tables. The \setlongtables feature +%% is used, and, therefore, the document should be +%% run through latex twice. +%% +%% Another feature that has been added is to treat the X +%% columns like 'l' columns if the table contents would allow +%% that to happen without exceeding the specified width of +%% the table. In other words, the specified width is +%% treated as the maximum allowed and not the exact width +%% of the table. This feature is the default but can be +%% disabled (or enabled) with \keepXColumns (or \convertXColumns). +%% +%% Caveats: +%% . The document needs to be latexed a couple times in general. +%% . In general, it is necessary to remove the .aux file before +%% the first latex run on the document. +%% . The table should not be larger than TeX's memory capacity +%% +%% +%% Here is a a simple usage example: +%% +%% +%% \documentclass{article} +%% +%% \usepackage{ltablex} +%% +%% \textheight=4in +%% +%% \begin{document} +%% +%% % we want a table that is \textwidth long, has 4 columns, columns 1 +%% % and 3 are auto sized with the 3rd columns being 3 times wider than +%% % the first column. +%% % +%% +%% +%% \begin{tabularx}{\linewidth}% +%% {|>{\setlength{\hsize}{.5\hsize}\raggedright\arraybackslash}X| % col 1; auto-sized ragged right +%% c| % col 2; default centered +%% >{\setlength{\hsize}{1.5\hsize}\raggedleft\arraybackslash}X|% col 3; auto-sized ragged left +%% l|} % col 4; default left-justified +%% +%% \caption*{The Table Caption}\\ +%% \hline +%% F-Head1 & F-Head2 & F-Head3 & F-Head4\\ +%% \hline +%% \hline +%% \endfirsthead +%% \hline +%% Head1 & Head2 & Head3 & Head4\\ +%% \hline +%% \hline +%% \endhead +%% +%% \hline +%% \hline +%% Foot1 & Foot2 & Foot3 & Foot4\\ +%% \hline +%% \endfoot +%% +%% +%% \hline +%% \hline +%% L-Foot1 & L-Foot2 & L-Foot3 & L-Foot4\\ +%% \hline +%% \endlastfoot +%% +%% This is a very long sentence not likely to fit& +%% not too long& +%% This is another very long sentence not likely to fit& +%% not long\\ +%% +%% \hline +%% filler & filler & filler & filler\\ +%% +%% \hline +%% This is a very long sentence not likely to fit& +%% not too long& +%% This is another very long sentence not likely to fit& +%% not long\\ +%% +%% \hline +%% This is a very long sentence not likely to fit& +%% not too long& +%% This is another very long sentence not likely to fit& +%% not long\\ +%% +%% \hline +%% This is a very long sentence not likely to fit& +%% not too long& +%% This is another very long sentence not likely to fit& +%% not long\\ +%% +%% \end{tabularx} +%% +%% \begin{tabularx}{\linewidth}{|c|X|c|} +%% \hline +%% a &convert X to l & b\\ +%% \hline +%% \end{tabularx} +%% +%% \keepXColumns +%% \begin{tabularx}{\linewidth}{|c|X|c|} +%% \hline +%% a &retain X & b\\ +%% \hline +%% \end{tabularx} +%% +%% \convertXColumns +%% \begin{tabularx}{\linewidth}{|c|X|c|} +%% \hline +%% a &convert X to l & b\\ +%% \hline +%% \end{tabularx} +%% +%% +%% \end{document} + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{ltablex}[1995/11/06 v1.0 Modified tabularx] + +\RequirePackage{longtable}[1994/12/08] +\RequirePackage{tabularx}[1994/02/03] + +\newif\ifTX@convertX@ +\TX@convertX@true + +\newcommand\keepXColumns{ + \TX@convertX@false +} + +\newcommand\convertXColumns{ + \TX@convertX@true +} + +\renewcommand\TX@endtabularx{% + \expandafter\TX@newcol\expandafter{\tabularxcolumn{\TX@col@width}}% + \let\verb\TX@verb + \def\@elt##1{\global\value{##1}\the\value{##1}\relax}% + \edef\TX@ckpt{\cl@@ckpt}% + \let\@elt\relax + \TX@old@table=\maxdimen + \TX@col@width=\TX@target + \global\TX@cols=\@ne + \TX@typeout@ + {\@spaces Table Width\@spaces Column Width\@spaces X Columns}% + + % + % define \endhead, etc. to be \\ so that in this part + % of the process they are just rows + % + \let\savecaption\caption + \def\caption{\\} + \let\saveendhead\endhead + \def\endhead{\\} + \let\saveendfirsthead\endfirsthead + \def\endfirsthead{\\} + \let\saveendfoot\endfoot + \def\endfoot{\\} + \let\saveendlastfoot\endlastfoot + \def\endlastfoot{\\} + % + % + \ifTX@convertX@ + \TX@trial{\def\NC@rewrite@X{\NC@find l}} + \ifdim\wd\@tempboxa<\TX@target + \TX@newcol{l} + \else + \TX@convertX@false + \fi + \fi + + \ifTX@convertX@ + \relax + \else + \TX@trial{\def\NC@rewrite@X{% + \global\advance\TX@cols\@ne\NC@find p{\TX@col@width}}}% + \loop + \TX@arith + \ifTX@ + \TX@trial{}% + \repeat + \fi + {\let\@footnotetext\TX@ftntext\let\@xfootnotenext\TX@xftntext + % we may as well set \LTchunksize to be \maxdimen as the whole + % thing is already in memory anyway so we may as well do it in one + % chunk. if it is too big for one chunk we are already dead.. + \LTchunksize\maxdimen + % + % restore \endhead, etc. + % + \let\caption\savecaption + \let\endhead\saveendhead + \let\endfirsthead\saveendfirsthead + \let\endfoot\saveendfoot + \let\endlastfoot\saveendlastfoot + % + \expandafter\longtable + \the\toks@ + \endlongtable + }% + \global\TX@ftn\expandafter{\expandafter}\the\TX@ftn + \ifnum0=`{\fi}% + \end{tabularx} +} + + +% +% activate column width reading from the .aux file +% + + +\setlongtables diff --git a/cs/3rd party/libtheora/doc/spec/macroblock.fig b/cs/3rd party/libtheora/doc/spec/macroblock.fig new file mode 100644 index 000000000..3e20d9323 --- /dev/null +++ b/cs/3rd party/libtheora/doc/spec/macroblock.fig @@ -0,0 +1,37 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha4 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 + 702 1540 4867 1540 4867 4828 702 4828 702 1540 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 710 4828 928 4828 928 4610 710 4610 710 4828 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 914 4610 1133 4610 1133 4391 914 4391 914 4610 +2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 723 4385 1133 4385 1133 4828 723 4828 723 4385 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 710 4610 928 4610 928 4391 710 4391 710 4610 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 914 4828 1133 4828 1133 4610 914 4610 914 4828 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 + 2068 857 6233 857 6233 4145 2068 4145 2068 857 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 + 1385 1198 5550 1198 5550 4487 1385 4487 1385 1198 +2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2089 3702 2499 3702 2499 4145 2089 4145 2089 3702 +2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1406 4043 1816 4043 1816 4487 1406 4487 1406 4043 +4 0 0 50 -1 0 5 0.0000 4 79 182 613 4943 (0,0)\001 +4 0 0 50 -1 0 5 0.0000 4 80 785 2055 833 Frame: chroma plane\001 +4 0 0 50 -1 0 5 0.0000 4 57 467 894 4009 Macroblock\001 +4 0 0 50 -1 0 5 0.0000 4 57 228 450 4521 Block\001 +4 0 0 50 -1 0 5 0.0000 4 57 228 450 4760 Block\001 +4 0 0 50 -1 0 5 0.0000 4 57 148 450 4863 8x8\001 +4 0 0 50 -1 0 5 0.0000 4 80 785 1235 1175 Frame: chroma plane\001 +4 0 0 50 -1 0 5 0.0000 4 80 694 621 1516 Frame: luma plane\001 diff --git a/cs/3rd party/libtheora/doc/spec/pic-frame.fig b/cs/3rd party/libtheora/doc/spec/pic-frame.fig new file mode 100644 index 000000000..d99ec7e15 --- /dev/null +++ b/cs/3rd party/libtheora/doc/spec/pic-frame.fig @@ -0,0 +1,75 @@ +#FIG 3.2 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 32 #7f7f7f +6 250 236 5737 4724 +6 659 4520 1068 4724 +4 1 0 50 0 0 7 0.0000 0 75 450 864 4724 X Offset\001 +4 1 0 50 0 0 7 0.0000 0 90 375 864 4596 Picture\001 +-6 +6 250 3880 454 4290 +4 1 0 50 0 0 7 1.5708 0 90 375 327 4086 Picture\001 +4 1 0 50 0 0 7 1.5708 0 75 450 454 4086 Y Offset\001 +-6 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 + 608 301 608 454 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 + 5466 301 5466 454 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 1 2 + 1 1 1.00 34.09 68.18 + 1 1 1.00 34.09 68.18 + 608 378 5466 378 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 + 608 4392 608 4546 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 + 1119 4392 1119 4546 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 1 2 + 1 1 1.00 34.09 68.18 + 1 1 1.00 34.09 68.18 + 608 4468 1119 4468 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 1 2 + 1 1 1.00 34.09 68.18 + 1 1 1.00 34.09 68.18 + 1119 4468 5211 4468 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 + 5211 4392 5211 4546 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 + 404 4340 557 4340 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 + 404 3830 557 3830 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 + 404 761 557 761 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 1 2 + 1 1 1.00 34.09 68.18 + 1 1 1.00 34.09 68.18 + 480 3830 480 761 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 + 5517 4340 5671 4340 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 + 5517 506 5671 506 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 1 2 + 1 1 1.00 34.09 68.18 + 1 1 1.00 34.09 68.18 + 5594 4340 5594 506 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 1 2 + 1 1 1.00 34.09 68.18 + 1 1 1.00 34.09 68.18 + 480 4340 480 3830 +2 2 0 1 0 7 50 0 -1 0.000 0 0 7 0 0 5 + 608 506 5466 506 5466 4340 608 4340 608 506 +2 2 0 1 0 7 50 0 -1 0.000 0 0 7 0 0 5 + 1119 761 5211 761 5211 3830 1119 3830 1119 761 +4 1 0 50 0 0 7 0.0000 0 90 720 3165 4596 Picture Width\001 +4 1 0 50 0 0 7 1.5708 0 105 690 5722 1912 Frame Height\001 +4 1 0 50 0 0 7 0.0000 0 90 660 2782 326 Frame Width\001 +4 1 0 50 0 0 7 1.5708 0 105 750 454 2295 Picture Height\001 +4 1 0 50 0 0 7 0.0000 0 75 315 2782 685 Frame\001 +4 1 0 50 0 0 7 0.0000 0 90 375 3165 2295 Picture\001 +4 0 0 50 0 0 7 0.0000 0 105 240 659 4290 (0,0)\001 +-6 diff --git a/cs/3rd party/libtheora/doc/spec/pic_even.fig b/cs/3rd party/libtheora/doc/spec/pic_even.fig new file mode 100644 index 000000000..041a43a1a --- /dev/null +++ b/cs/3rd party/libtheora/doc/spec/pic_even.fig @@ -0,0 +1,102 @@ +#FIG 3.2 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +6 724 2025 945 2475 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 732 2244 945 2244 945 2025 732 2025 732 2244 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 732 2475 945 2475 945 2256 732 2256 732 2475 +-6 +6 1665 2070 1888 2475 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1673 2267 1888 2267 1888 2070 1673 2070 1673 2267 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1673 2475 1888 2475 1888 2278 1673 2278 1673 2475 +-6 +6 724 900 945 1350 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 732 1119 945 1119 945 900 732 900 732 1119 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 732 1350 945 1350 945 1131 732 1131 732 1350 +-6 +6 6300 2070 6795 2520 +6 6300 2070 6570 2295 +6 6300 2070 6570 2295 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 6335 2295 6553 2295 6553 2076 6335 2076 6335 2295 +-6 +-6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 6335 2520 6553 2520 6553 2301 6335 2301 6335 2520 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 6560 2295 6778 2295 6778 2076 6560 2076 6560 2295 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 6560 2520 6778 2520 6778 2301 6560 2301 6560 2520 +-6 +6 4455 2070 4950 2520 +6 4455 2070 4725 2295 +6 4455 2070 4725 2295 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4490 2295 4708 2295 4708 2076 4490 2076 4490 2295 +-6 +-6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4490 2520 4708 2520 4708 2301 4490 2301 4490 2520 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4715 2295 4933 2295 4933 2076 4715 2076 4715 2295 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4715 2520 4933 2520 4933 2301 4715 2301 4715 2520 +-6 +6 4455 945 4950 1395 +6 4455 945 4725 1170 +6 4455 945 4725 1170 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4490 1170 4708 1170 4708 951 4490 951 4490 1170 +-6 +-6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4490 1395 4708 1395 4708 1176 4490 1176 4490 1395 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4715 1170 4933 1170 4933 951 4715 951 4715 1170 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4715 1395 4933 1395 4933 1176 4715 1176 4715 1395 +-6 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 + 2249 1800 3736 1800 3736 2947 2249 2947 2249 1800 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2385 1935 3600 1935 3600 2745 2385 2745 2385 1935 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2397 2745 2610 2745 2610 2526 2397 2526 2397 2745 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3375 2745 3590 2745 3590 2548 3375 2548 3375 2745 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 724 900 1888 900 1888 2475 724 2475 724 900 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 + 473 675 2003 675 2003 2925 473 2925 473 675 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2397 2154 2610 2154 2610 1935 2397 1935 2397 2154 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4500 945 6795 945 6795 2520 4500 2520 4500 945 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4500 945 6795 945 6795 2520 4500 2520 4500 945 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 + 4005 720 7020 720 7020 2970 4005 2970 4005 720 +4 0 0 50 -1 0 24 0.0000 4 30 270 2835 2655 ...\001 +4 0 0 50 -1 0 24 0.0000 4 30 270 1080 2295 ...\001 +4 0 0 50 -1 0 24 0.0000 4 30 270 765 1665 ...\001 +4 0 0 50 -1 0 24 0.0000 4 30 270 2430 2385 ...\001 +4 0 0 50 -1 0 7 0.0000 4 90 210 450 3060 (0,0)\001 +4 0 0 50 -1 0 7 0.0000 4 90 210 2205 3060 (0,0)\001 +4 0 0 50 -1 0 7 0.0000 4 90 210 3943 3098 (0,0)\001 +4 0 0 50 -1 0 7 0.0000 4 75 285 4545 2655 Pixels\001 +4 0 0 50 -1 0 24 0.0000 4 30 270 5220 2295 ...\001 +4 0 0 50 -1 0 24 0.0000 4 30 270 4680 1755 ...\001 +4 0 0 50 -1 0 9 0.0000 4 105 1335 2205 1665 Frame: chroma (4:2:0 case)\001 +4 0 0 50 -1 0 9 0.0000 4 105 1335 450 585 Frame: chroma (4:2:2 case)\001 +4 0 0 50 -1 0 9 0.0000 4 75 615 4005 630 Frame: luma\001 diff --git a/cs/3rd party/libtheora/doc/spec/pic_even_odd.fig b/cs/3rd party/libtheora/doc/spec/pic_even_odd.fig new file mode 100644 index 000000000..4b513b7f9 --- /dev/null +++ b/cs/3rd party/libtheora/doc/spec/pic_even_odd.fig @@ -0,0 +1,88 @@ +#FIG 3.2 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +6 724 2025 945 2475 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 732 2244 945 2244 945 2025 732 2025 732 2244 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 732 2475 945 2475 945 2256 732 2256 732 2475 +-6 +6 1665 2070 1888 2475 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1673 2267 1888 2267 1888 2070 1673 2070 1673 2267 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1673 2475 1888 2475 1888 2278 1673 2278 1673 2475 +-6 +6 4455 2070 4950 2520 +6 4455 2070 4725 2295 +6 4455 2070 4725 2295 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4490 2295 4708 2295 4708 2076 4490 2076 4490 2295 +-6 +-6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4490 2520 4708 2520 4708 2301 4490 2301 4490 2520 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4715 2295 4933 2295 4933 2076 4715 2076 4715 2295 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4715 2520 4933 2520 4933 2301 4715 2301 4715 2520 +-6 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 + 2249 1800 3736 1800 3736 2947 2249 2947 2249 1800 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2385 1935 3600 1935 3600 2745 2385 2745 2385 1935 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2397 2745 2610 2745 2610 2526 2397 2526 2397 2745 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3375 2745 3590 2745 3590 2548 3375 2548 3375 2745 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 724 900 1888 900 1888 2475 724 2475 724 900 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 + 473 675 2003 675 2003 2925 473 2925 473 675 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2397 2154 2610 2154 2610 1935 2397 1935 2397 2154 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4500 945 6795 945 6795 2520 4500 2520 4500 945 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 + 4005 720 7020 720 7020 2970 4005 2970 4005 720 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4500 945 6795 945 6795 2520 4500 2520 4500 945 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4490 1170 4708 1170 4708 951 4490 951 4490 1170 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4715 1170 4933 1170 4933 951 4715 951 4715 1170 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 6560 2520 6778 2520 6778 2301 6560 2301 6560 2520 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 6560 2295 6778 2295 6778 2076 6560 2076 6560 2295 +2 2 0 1 0 11 50 -1 43 0.000 0 0 -1 0 0 5 + 4715 945 4933 945 4933 726 4715 726 4715 945 +2 2 0 1 0 11 50 -1 43 0.000 0 0 -1 0 0 5 + 4490 945 4708 945 4708 726 4490 726 4490 945 +2 2 0 1 0 11 50 -1 43 0.000 0 0 -1 0 0 5 + 6785 2295 7003 2295 7003 2076 6785 2076 6785 2295 +2 2 0 1 0 11 50 -1 43 0.000 0 0 -1 0 0 5 + 6785 2520 7003 2520 7003 2301 6785 2301 6785 2520 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 732 1125 945 1125 945 906 732 906 732 1125 +2 2 0 1 0 11 50 -1 43 0.000 0 0 -1 0 0 5 + 732 894 945 894 945 675 732 675 732 894 +4 0 0 50 -1 0 24 0.0000 4 30 270 2835 2655 ...\001 +4 0 0 50 -1 0 24 0.0000 4 30 270 1080 2295 ...\001 +4 0 0 50 -1 0 24 0.0000 4 30 270 765 1665 ...\001 +4 0 0 50 -1 0 24 0.0000 4 30 270 2430 2385 ...\001 +4 0 0 50 -1 0 7 0.0000 4 90 210 450 3060 (0,0)\001 +4 0 0 50 -1 0 7 0.0000 4 90 210 2205 3060 (0,0)\001 +4 0 0 50 -1 0 7 0.0000 4 90 210 3943 3098 (0,0)\001 +4 0 0 50 -1 0 7 0.0000 4 75 285 4545 2655 Pixels\001 +4 0 0 50 -1 0 24 0.0000 4 30 270 5220 2295 ...\001 +4 0 0 50 -1 0 24 0.0000 4 30 270 4680 1755 ...\001 +4 0 0 50 -1 0 9 0.0000 4 105 1335 2205 1665 Frame: chroma (4:2:0 case)\001 +4 0 0 50 -1 0 9 0.0000 4 105 1335 450 585 Frame: chroma (4:2:2 case)\001 +4 0 0 50 -1 0 9 0.0000 4 75 615 4005 630 Frame: luma\001 diff --git a/cs/3rd party/libtheora/doc/spec/pic_odd.fig b/cs/3rd party/libtheora/doc/spec/pic_odd.fig new file mode 100644 index 000000000..da126010f --- /dev/null +++ b/cs/3rd party/libtheora/doc/spec/pic_odd.fig @@ -0,0 +1,90 @@ +#FIG 3.2 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +6 724 2025 945 2475 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 732 2244 945 2244 945 2025 732 2025 732 2244 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 732 2475 945 2475 945 2256 732 2256 732 2475 +-6 +6 1665 2070 1888 2475 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1673 2267 1888 2267 1888 2070 1673 2070 1673 2267 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1673 2475 1888 2475 1888 2278 1673 2278 1673 2475 +-6 +6 724 900 945 1350 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 732 1119 945 1119 945 900 732 900 732 1119 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 732 1350 945 1350 945 1131 732 1131 732 1350 +-6 +6 6300 2070 6795 2520 +6 6300 2070 6570 2295 +6 6300 2070 6570 2295 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 6335 2295 6553 2295 6553 2076 6335 2076 6335 2295 +-6 +-6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 6335 2520 6553 2520 6553 2301 6335 2301 6335 2520 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 6560 2295 6778 2295 6778 2076 6560 2076 6560 2295 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 6560 2520 6778 2520 6778 2301 6560 2301 6560 2520 +-6 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 + 2249 1800 3736 1800 3736 2947 2249 2947 2249 1800 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2385 1935 3600 1935 3600 2745 2385 2745 2385 1935 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2397 2745 2610 2745 2610 2526 2397 2526 2397 2745 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3375 2745 3590 2745 3590 2548 3375 2548 3375 2745 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 724 900 1888 900 1888 2475 724 2475 724 900 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 + 473 675 2003 675 2003 2925 473 2925 473 675 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2397 2154 2610 2154 2610 1935 2397 1935 2397 2154 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4500 945 6795 945 6795 2520 4500 2520 4500 945 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4500 945 6795 945 6795 2520 4500 2520 4500 945 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 + 4005 720 7020 720 7020 2970 4005 2970 4005 720 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4490 2295 4708 2295 4708 2076 4490 2076 4490 2295 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4490 2520 4708 2520 4708 2301 4490 2301 4490 2520 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4490 1170 4708 1170 4708 951 4490 951 4490 1170 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4490 1395 4708 1395 4708 1176 4490 1176 4490 1395 +2 2 0 1 0 11 50 -1 43 0.000 0 0 -1 0 0 5 + 4265 1170 4483 1170 4483 951 4265 951 4265 1170 +2 2 0 1 0 11 50 -1 43 0.000 0 0 -1 0 0 5 + 4265 1395 4483 1395 4483 1176 4265 1176 4265 1395 +2 2 0 1 0 11 50 -1 43 0.000 0 0 -1 0 0 5 + 4265 2295 4483 2295 4483 2076 4265 2076 4265 2295 +2 2 0 1 0 11 50 -1 43 0.000 0 0 -1 0 0 5 + 4265 2520 4483 2520 4483 2301 4265 2301 4265 2520 +4 0 0 50 -1 0 24 0.0000 4 30 270 2835 2655 ...\001 +4 0 0 50 -1 0 24 0.0000 4 30 270 1080 2295 ...\001 +4 0 0 50 -1 0 24 0.0000 4 30 270 765 1665 ...\001 +4 0 0 50 -1 0 24 0.0000 4 30 270 2430 2385 ...\001 +4 0 0 50 -1 0 7 0.0000 4 90 210 450 3060 (0,0)\001 +4 0 0 50 -1 0 7 0.0000 4 90 210 2205 3060 (0,0)\001 +4 0 0 50 -1 0 7 0.0000 4 90 210 3943 3098 (0,0)\001 +4 0 0 50 -1 0 7 0.0000 4 75 285 4545 2655 Pixels\001 +4 0 0 50 -1 0 24 0.0000 4 30 270 5220 2295 ...\001 +4 0 0 50 -1 0 24 0.0000 4 30 270 4680 1755 ...\001 +4 0 0 50 -1 0 9 0.0000 4 105 1335 2205 1665 Frame: chroma (4:2:0 case)\001 +4 0 0 50 -1 0 9 0.0000 4 105 1335 450 585 Frame: chroma (4:2:2 case)\001 +4 0 0 50 -1 0 9 0.0000 4 75 615 4005 630 Frame: luma\001 diff --git a/cs/3rd party/libtheora/doc/spec/pic_odd_even.fig b/cs/3rd party/libtheora/doc/spec/pic_odd_even.fig new file mode 100644 index 000000000..f1312952b --- /dev/null +++ b/cs/3rd party/libtheora/doc/spec/pic_odd_even.fig @@ -0,0 +1,84 @@ +#FIG 3.2 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +6 724 2025 945 2475 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 732 2244 945 2244 945 2025 732 2025 732 2244 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 732 2475 945 2475 945 2256 732 2256 732 2475 +-6 +6 1665 2070 1888 2475 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1673 2267 1888 2267 1888 2070 1673 2070 1673 2267 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1673 2475 1888 2475 1888 2278 1673 2278 1673 2475 +-6 +6 724 900 945 1350 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 732 1119 945 1119 945 900 732 900 732 1119 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 732 1350 945 1350 945 1131 732 1131 732 1350 +-6 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 + 2249 1800 3736 1800 3736 2947 2249 2947 2249 1800 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2385 1935 3600 1935 3600 2745 2385 2745 2385 1935 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2397 2745 2610 2745 2610 2526 2397 2526 2397 2745 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3375 2745 3590 2745 3590 2548 3375 2548 3375 2745 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 724 900 1888 900 1888 2475 724 2475 724 900 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 + 473 675 2003 675 2003 2925 473 2925 473 675 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2397 2154 2610 2154 2610 1935 2397 1935 2397 2154 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4500 945 6795 945 6795 2520 4500 2520 4500 945 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 + 4005 720 7020 720 7020 2970 4005 2970 4005 720 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4490 2295 4708 2295 4708 2076 4490 2076 4490 2295 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4490 2520 4708 2520 4708 2301 4490 2301 4490 2520 +2 2 0 1 0 11 50 -1 43 0.000 0 0 -1 0 0 5 + 4265 2295 4483 2295 4483 2076 4265 2076 4265 2295 +2 2 0 1 0 11 50 -1 43 0.000 0 0 -1 0 0 5 + 4265 2520 4483 2520 4483 2301 4265 2301 4265 2520 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4500 945 6795 945 6795 2520 4500 2520 4500 945 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 6560 2520 6778 2520 6778 2301 6560 2301 6560 2520 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 6560 2295 6778 2295 6778 2076 6560 2076 6560 2295 +2 2 0 1 0 11 50 -1 43 0.000 0 0 -1 0 0 5 + 6785 2295 7003 2295 7003 2076 6785 2076 6785 2295 +2 2 0 1 0 11 50 -1 43 0.000 0 0 -1 0 0 5 + 6785 2520 7003 2520 7003 2301 6785 2301 6785 2520 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4490 1170 4708 1170 4708 951 4490 951 4490 1170 +2 2 0 1 0 11 50 -1 43 0.000 0 0 -1 0 0 5 + 4265 945 4483 945 4483 726 4265 726 4265 945 +2 2 0 1 0 11 50 -1 43 0.000 0 0 -1 0 0 5 + 4265 1170 4483 1170 4483 951 4265 951 4265 1170 +2 2 0 1 0 11 50 -1 43 0.000 0 0 -1 0 0 5 + 4490 945 4708 945 4708 726 4490 726 4490 945 +4 0 0 50 -1 0 24 0.0000 4 30 270 2835 2655 ...\001 +4 0 0 50 -1 0 24 0.0000 4 30 270 1080 2295 ...\001 +4 0 0 50 -1 0 24 0.0000 4 30 270 765 1665 ...\001 +4 0 0 50 -1 0 24 0.0000 4 30 270 2430 2385 ...\001 +4 0 0 50 -1 0 7 0.0000 4 90 210 450 3060 (0,0)\001 +4 0 0 50 -1 0 7 0.0000 4 90 210 2205 3060 (0,0)\001 +4 0 0 50 -1 0 7 0.0000 4 90 210 3943 3098 (0,0)\001 +4 0 0 50 -1 0 7 0.0000 4 75 285 4545 2655 Pixels\001 +4 0 0 50 -1 0 24 0.0000 4 30 270 5220 2295 ...\001 +4 0 0 50 -1 0 24 0.0000 4 30 270 4680 1755 ...\001 +4 0 0 50 -1 0 9 0.0000 4 105 1335 2205 1665 Frame: chroma (4:2:0 case)\001 +4 0 0 50 -1 0 9 0.0000 4 105 1335 450 585 Frame: chroma (4:2:2 case)\001 +4 0 0 50 -1 0 9 0.0000 4 75 615 4005 630 Frame: luma\001 diff --git a/cs/3rd party/libtheora/doc/spec/pixel420.fig b/cs/3rd party/libtheora/doc/spec/pixel420.fig new file mode 100644 index 000000000..56e919124 --- /dev/null +++ b/cs/3rd party/libtheora/doc/spec/pixel420.fig @@ -0,0 +1,56 @@ +#FIG 3.2 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +6 675 4365 1170 4815 +6 675 4365 945 4590 +6 675 4365 945 4590 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 710 4590 928 4590 928 4371 710 4371 710 4590 +-6 +-6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 710 4815 928 4815 928 4596 710 4596 710 4815 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 935 4590 1153 4590 1153 4371 935 4371 935 4590 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 935 4815 1153 4815 1153 4596 935 4596 935 4815 +-6 +6 1125 4365 1646 4815 +6 1125 4365 1420 4590 +6 1125 4365 1420 4590 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1163 4590 1401 4590 1401 4371 1163 4371 1163 4590 +-6 +-6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1163 4815 1401 4815 1401 4596 1163 4596 1163 4815 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1409 4590 1646 4590 1646 4371 1409 4371 1409 4590 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1409 4815 1646 4815 1646 4596 1409 4596 1409 4815 +-6 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 + 1665 1350 4788 1350 4788 4153 1665 4153 1665 1350 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 + 2700 900 5823 900 5823 3703 2700 3703 2700 900 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 + 702 2025 3825 2025 3825 4828 702 4828 702 2025 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 4005 2018 4005 2018 3786 1800 3786 1800 4005 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2160 4005 2378 4005 2378 3786 2160 3786 2160 4005 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2835 3555 3053 3555 3053 3336 2835 3336 2835 3555 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3195 3555 3413 3555 3413 3336 3195 3336 3195 3555 +4 0 0 50 -1 0 8 0.0000 4 105 1215 1485 1305 Frame: chroma plane Cb\001 +4 0 0 50 -1 0 8 0.0000 4 105 1200 2565 855 Frame: chroma plane Cr\001 +4 0 0 50 -1 0 8 0.0000 4 105 1035 540 1980 Frame: luma planeY'\001 +4 0 0 50 -1 0 7 0.0000 4 75 285 765 4320 Pixels\001 +4 0 0 50 -1 0 7 0.0000 4 90 210 613 4943 (0,0)\001 diff --git a/cs/3rd party/libtheora/doc/spec/pixel422.fig b/cs/3rd party/libtheora/doc/spec/pixel422.fig new file mode 100644 index 000000000..dbe008a32 --- /dev/null +++ b/cs/3rd party/libtheora/doc/spec/pixel422.fig @@ -0,0 +1,70 @@ +#FIG 3.2 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +6 675 4365 1170 4815 +6 675 4365 945 4590 +6 675 4365 945 4590 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 710 4590 928 4590 928 4371 710 4371 710 4590 +-6 +-6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 710 4815 928 4815 928 4596 710 4596 710 4815 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 935 4590 1153 4590 1153 4371 935 4371 935 4590 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 935 4815 1153 4815 1153 4596 935 4596 935 4815 +-6 +6 1125 4365 1646 4815 +6 1125 4365 1420 4590 +6 1125 4365 1420 4590 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1163 4590 1401 4590 1401 4371 1163 4371 1163 4590 +-6 +-6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1163 4815 1401 4815 1401 4596 1163 4596 1163 4815 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1409 4590 1646 4590 1646 4371 1409 4371 1409 4590 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1409 4815 1646 4815 1646 4596 1409 4596 1409 4815 +-6 +6 1800 3690 2025 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1807 3909 2025 3909 2025 3690 1807 3690 1807 3909 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1807 4140 2025 4140 2025 3921 1807 3921 1807 4140 +-6 +6 2160 3690 2385 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2167 3909 2385 3909 2385 3690 2167 3690 2167 3909 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2167 4140 2385 4140 2385 3921 2167 3921 2167 4140 +-6 +6 3195 3240 3420 3690 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3202 3459 3420 3459 3420 3240 3202 3240 3202 3459 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3202 3690 3420 3690 3420 3471 3202 3471 3202 3690 +-6 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 + 1665 1350 4788 1350 4788 4153 1665 4153 1665 1350 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2842 3459 3060 3459 3060 3240 2842 3240 2842 3459 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 + 2700 900 5823 900 5823 3703 2700 3703 2700 900 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2842 3690 3060 3690 3060 3471 2842 3471 2842 3690 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 + 702 2025 3825 2025 3825 4828 702 4828 702 2025 +4 0 0 50 -1 0 8 0.0000 4 105 1215 1485 1305 Frame: chroma plane Cb\001 +4 0 0 50 -1 0 8 0.0000 4 105 1200 2565 855 Frame: chroma plane Cr\001 +4 0 0 50 -1 0 8 0.0000 4 105 1035 540 1980 Frame: luma planeY'\001 +4 0 0 50 -1 0 7 0.0000 4 75 285 765 4320 Pixels\001 +4 0 0 50 -1 0 7 0.0000 4 90 210 613 4943 (0,0)\001 diff --git a/cs/3rd party/libtheora/doc/spec/pixel444.fig b/cs/3rd party/libtheora/doc/spec/pixel444.fig new file mode 100644 index 000000000..75655e8a8 --- /dev/null +++ b/cs/3rd party/libtheora/doc/spec/pixel444.fig @@ -0,0 +1,44 @@ +#FIG 3.2 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 + 702 2025 3825 2025 3825 4828 702 4828 702 2025 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 + 1665 1350 4788 1350 4788 4153 1665 4153 1665 1350 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 + 2700 900 5823 900 5823 3703 2700 3703 2700 900 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 710 4590 928 4590 928 4371 710 4371 710 4590 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 935 4590 1153 4590 1153 4371 935 4371 935 4590 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 935 4815 1153 4815 1153 4596 935 4596 935 4815 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 710 4815 928 4815 928 4596 710 4596 710 4815 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1700 3915 1918 3915 1918 3696 1700 3696 1700 3915 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1925 3915 2143 3915 2143 3696 1925 3696 1925 3915 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1925 4140 2143 4140 2143 3921 1925 3921 1925 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1700 4140 1918 4140 1918 3921 1700 3921 1700 4140 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2735 3465 2953 3465 2953 3246 2735 3246 2735 3465 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2960 3465 3178 3465 3178 3246 2960 3246 2960 3465 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2960 3690 3178 3690 3178 3471 2960 3471 2960 3690 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2735 3690 2953 3690 2953 3471 2735 3471 2735 3690 +4 0 0 50 -1 0 8 0.0000 4 105 1215 1485 1305 Frame: chroma plane Cb\001 +4 0 0 50 -1 0 8 0.0000 4 105 1200 2565 855 Frame: chroma plane Cr\001 +4 0 0 50 -1 0 8 0.0000 4 105 1035 540 1980 Frame: luma planeY'\001 +4 0 0 50 -1 0 7 0.0000 4 75 285 765 4320 Pixels\001 +4 0 0 50 -1 0 7 0.0000 4 90 210 613 4943 (0,0)\001 diff --git a/cs/3rd party/libtheora/doc/spec/raster-block.fig b/cs/3rd party/libtheora/doc/spec/raster-block.fig new file mode 100644 index 000000000..cebaf02b6 --- /dev/null +++ b/cs/3rd party/libtheora/doc/spec/raster-block.fig @@ -0,0 +1,91 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha4 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 1125 900 1575 900 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 450 450 1350 450 1350 1350 450 1350 450 450 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1350 450 2250 450 2250 1350 1350 1350 1350 450 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2250 450 3150 450 3150 1350 2250 1350 2250 450 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3150 450 4050 450 4050 1350 3150 1350 3150 450 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 450 1350 1350 1350 1350 2250 450 2250 450 1350 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1350 1350 2250 1350 2250 2250 1350 2250 1350 1350 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2250 1350 3150 1350 3150 2250 2250 2250 2250 1350 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3150 1350 4050 1350 4050 2250 3150 2250 3150 1350 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 450 2250 1350 2250 1350 3150 450 3150 450 2250 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1350 2250 2250 2250 2250 3150 1350 3150 1350 2250 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2250 2250 3150 2250 3150 3150 2250 3150 2250 2250 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3150 2250 4050 2250 4050 3150 3150 3150 3150 2250 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 450 3150 1350 3150 1350 4050 450 4050 450 3150 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1350 3150 2250 3150 2250 4050 1350 4050 1350 3150 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2250 3150 3150 3150 3150 4050 2250 4050 2250 3150 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3150 3150 4050 3150 4050 4050 3150 4050 3150 3150 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4050 450 4950 450 4950 1350 4050 1350 4050 450 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4050 1350 4950 1350 4950 2250 4050 2250 4050 1350 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4050 2250 4950 2250 4950 3150 4050 3150 4050 2250 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4050 3150 4950 3150 4950 4050 4050 4050 4050 3150 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4950 3150 5850 3150 5850 4050 4950 4050 4950 3150 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4950 2250 5850 2250 5850 3150 4950 3150 4950 2250 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4950 1350 5850 1350 5850 2250 4950 2250 4950 1350 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4950 450 5850 450 5850 1350 4950 1350 4950 450 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 1125 3600 1575 3600 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 2925 3600 3375 3600 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 2025 3600 2475 3600 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 1125 2655 1575 2655 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 4770 3600 5220 3600 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 5445 3510 900 2880 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 5400 1800 855 1170 +4 1 0 50 0 1 12 0.0000 0 150 105 900 3660 0\001 +4 1 0 50 0 1 12 0.0000 0 150 105 1800 3660 1\001 +4 1 0 50 0 1 12 0.0000 0 150 105 2700 3660 2\001 +4 0 0 50 -1 0 20 0.0000 4 30 225 3555 3645 ...\001 +4 0 0 50 -1 0 20 0.0000 4 30 225 945 1845 ...\001 +4 0 0 50 -1 0 12 0.0000 4 150 330 5310 3645 m-1\001 +4 0 0 50 -1 0 12 0.0000 4 150 435 5175 2655 2m-1\001 +4 1 0 50 0 1 12 0.0000 0 105 165 900 2760 m\001 +4 1 0 50 0 1 12 0.0000 0 195 690 855 1035 (n-1)*m\001 +4 0 0 50 -1 0 12 0.0000 4 150 540 5085 900 n*m-1\001 diff --git a/cs/3rd party/libtheora/doc/spec/reference-frames.fig b/cs/3rd party/libtheora/doc/spec/reference-frames.fig new file mode 100644 index 000000000..8026e56e5 --- /dev/null +++ b/cs/3rd party/libtheora/doc/spec/reference-frames.fig @@ -0,0 +1,46 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha4 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +2 2 1 2 0 7 50 -1 -1 4.000 0 0 -1 0 0 5 + 1980 450 2430 450 2430 900 1980 900 1980 450 +2 2 1 2 0 7 50 -1 -1 4.000 0 0 -1 0 0 5 + 2520 450 2970 450 2970 900 2520 900 2520 450 +2 2 1 2 0 7 50 -1 -1 4.000 0 0 -1 0 0 5 + 4140 450 4590 450 4590 900 4140 900 4140 450 +2 2 1 2 0 7 50 -1 -1 4.000 0 0 -1 0 0 5 + 1440 450 1890 450 1890 900 1440 900 1440 450 +2 2 1 2 0 7 50 -1 15 4.000 0 0 -1 0 0 5 + 3600 450 4050 450 4050 900 3600 900 3600 450 +2 2 1 2 0 7 50 -1 41 4.000 0 0 -1 0 0 5 + 3060 450 3510 450 3510 900 3060 900 3060 450 +2 2 0 2 0 7 50 -1 41 0.000 0 0 -1 0 0 5 + 900 450 1350 450 1350 900 900 900 900 450 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 + 0 0 1.00 60.00 120.00 + 3780 990 3780 1395 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 + 0 0 1.00 60.00 120.00 + 3240 990 3240 1395 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2 + 0 0 1.00 60.00 120.00 + 1125 990 1125 1395 +4 0 0 50 -1 0 20 0.0000 4 30 225 4770 675 ...\001 +4 0 0 50 -1 0 12 0.0000 4 150 420 900 405 Intra\001 +4 0 0 50 -1 0 12 0.0000 4 150 420 1440 405 Inter\001 +4 0 0 50 -1 0 12 0.0000 4 150 420 1980 405 Inter\001 +4 0 0 50 -1 0 12 0.0000 4 150 420 2520 405 Inter\001 +4 0 0 50 -1 0 12 0.0000 4 150 420 3060 405 Inter\001 +4 0 0 50 -1 0 12 0.0000 4 150 420 3600 405 Inter\001 +4 0 0 50 -1 0 12 0.0000 4 150 420 4140 405 Inter\001 +4 0 0 50 -1 0 12 0.0000 4 120 630 3690 1575 current\001 +4 0 0 50 -1 0 12 0.0000 4 150 840 2745 1575 reference\001 +4 0 0 50 -1 0 12 0.0000 4 150 510 2925 1755 frame\001 +4 0 0 50 -1 0 12 0.0000 4 150 510 3690 1755 frame\001 +4 0 0 50 -1 0 12 0.0000 4 195 570 855 1575 golden\001 +4 0 0 50 -1 0 12 0.0000 4 150 510 900 1800 frame\001 diff --git a/cs/3rd party/libtheora/doc/spec/spec.bib b/cs/3rd party/libtheora/doc/spec/spec.bib new file mode 100644 index 000000000..cf62cebf7 --- /dev/null +++ b/cs/3rd party/libtheora/doc/spec/spec.bib @@ -0,0 +1,120 @@ +@MANUAL{rfc2044, + author="Francois Yergeau", + title="{RFC} 2044: {UTF}-8, a transformation format of Unicode and {ISO} + 10646", + month=oct, + year=1996, + note="\url{http://www.ietf.org/rfc/rfc2044.txt}" +} + +@ARTICLE{CSF77, + author="Wen-Hsiung Chen and C. Harrison Smith and S. C. Fralick", + title="A Fast Computational Algorithm for the Discrete Cosine Transform", + journal="{IEEE} Transactions on Communications", + volume="COM-25", + number=9, + pages="1004--1011", + month=sep, + year=1977 +} + +@MISC{Mel04, + author="Mike Melanson", + title="{VP3} Bitstream Format and Decoding Process", + howpublished="\url{http://www.multimedia.cx/vp3-format.txt}", + month=mar, + year=2004 +} + +@MISC{Poyn97, + author="Charles Poynton", + title="Frequently-Asked Questions about Gamma", + howpublished="\url{http://www.poynton.com/GammaFAQ.html}", + month=feb, + year=1997 +} + +@MANUAL{rec470, + key="ITU470", + title="Reccomendation {ITU-R} {BT}.470-6: Conventional Television Systems", + edition="1970, revised", + organization="International Telecommunications Union", + address="1211 Geneva 20, Switzerland", + year=1998 +} + +@MANUAL{rec601, + key="ITU601", + title="Reccomendation {ITU-R} {BT}.601-5: Studio Encoding Parameters of + Digital Television for Standard 4:3 and Wide-Screen 16:9 Aspect Ratios", + edition="1982, revised", + organization="International Telecommunications Union", + address="1211 Geneva 20, Switzerland", + year=1995 +} + +@MANUAL{rec709, + key="ITU709", + title="Recommendation {ITU-R} {BT}.709-5: Parameter values for the {HDTV} + standards for production and international programme exchange", + edition="1990, revised", + organization="International Telecommunications Union", + address="1211 Geneva 20, Switzerland", + year=2002 +} + +@MANUAL{smpte170m, + key="SMPTE170M", + title="{SMPTE-170M}: Television --- Composite Analog Video Signal --- {NTSC} + for Studio Applications", + organization="Society of Motion Pciture and Television Engineers", + year=1994 +} + +@MANUAL{smpte240m, + key="SMPTE240M", + title="{SMPTE-240M}: Television --- Signal Parameters --- 1125-Line + High-Definition Production", + organization="Society of Motion Pciture and Television Engineers", + year=1999 +} + +@MANUAL{vorbis, + title="{Vorbis~I} specification", + organization="{Xiph.Org Foundation}", + year=2002, + note="\url{http://www.xiph.org/ogg/vorbis/doc/}" +} + +@MANUAL{rfc2119, + author="Scott Bradner", + title="{RFC} 2119: Key words for use in {RFC}s to Indicate Requirement + Levels", + month=mar, + year=1997, + note="\url{http://www.ietf.org/rfc/rfc2119.txt}" +} + +@MANUAL{rfc3533, + author="Silvia Pfeiffer", + title="{RFC} 3533: The {Ogg} Encapsulation Format Version 0", + month=may, + year=2003, + note="\url{http://www.ietf.org/rfc/rfc3533.txt}" +} + +@MANUAL{rfc3534, + author="Linus Walleij", + title="{RFC} 3534: The {application/ogg} Media Type", + month=may, + year=2003, + note="\url{http://www.ietf.org/rfc/rfc3534.txt}" +} + +@MANUAL{rfc3550, + author="H. Schulzrinne, S. Casner, R. Frederick, V. Jacobson", + title="RTP: A Transport Protocol for Real-Time Applications", + month=jul, + year=2003, + note="\url{http://www.ietf.org/rfc/rfc3550.txt}" +} diff --git a/cs/3rd party/libtheora/doc/spec/spec.tex b/cs/3rd party/libtheora/doc/spec/spec.tex new file mode 100644 index 000000000..2206e10e7 --- /dev/null +++ b/cs/3rd party/libtheora/doc/spec/spec.tex @@ -0,0 +1,8195 @@ +\documentclass[9pt,letterpaper]{book} + +\usepackage{latexsym} +\usepackage{amssymb} +\usepackage{amsmath} +\usepackage{bm} +\usepackage{textcomp} +\usepackage{graphicx} +\usepackage{booktabs} +\usepackage{tabularx} +\usepackage{longtable} +\usepackage{ltablex} +\usepackage{wrapfig} +\usepackage{float} +\usepackage[pdfpagemode=None,pdfstartview=FitH,pdfview=FitH,colorlinks=true]% + {hyperref} + +\newtheorem{theorem}{Theorem}[section] +\newcommand{\idx}[1]{{\ensuremath{\mathit{#1}}}} +\newcommand{\qti}{\idx{qti}} +\newcommand{\qtj}{\idx{qtj}} +\newcommand{\pli}{\idx{pli}} +\newcommand{\plj}{\idx{plj}} +\newcommand{\qi}{\idx{qi}} +\newcommand{\ci}{\idx{ci}} +\newcommand{\bmi}{\idx{bmi}} +\newcommand{\bmj}{\idx{bmj}} +\newcommand{\qri}{\idx{qri}} +\newcommand{\qrj}{\idx{qrj}} +\newcommand{\hti}{\idx{hti}} +\newcommand{\sbi}{\idx{sbi}} +\newcommand{\bi}{\idx{bi}} +\newcommand{\bj}{\idx{bj}} +\newcommand{\mbi}{\idx{mbi}} +\newcommand{\mbj}{\idx{mbj}} +\newcommand{\mi}{\idx{mi}} +\newcommand{\cbi}{\idx{cbi}} +\newcommand{\qii}{\idx{qii}} +\newcommand{\ti}{\idx{ti}} +\newcommand{\tj}{\idx{tj}} +\newcommand{\rfi}{\idx{rfi}} +\newcommand{\zzi}{\idx{zzi}} +\newcommand{\ri}{\idx{ri}} +%This somewhat odd construct ensures that \bitvar{\qi}, etc., will set the +% qi in bold face, even though it is in a \mathit font, yet \bitvar{VAR} will +% set VAR in a bold, roman font. +\newcommand{\bitvar}[1]{\ensuremath{\mathbf{\bm{#1}}}} +\newcommand{\locvar}[1]{\ensuremath{\mathrm{#1}}} +\newcommand{\term}[1]{{\em #1}} +\newcommand{\bin}[1]{\ensuremath{\mathtt{b#1}}} +\newcommand{\hex}[1]{\ensuremath{\mathtt{0x#1}}} +\newcommand{\ilog}{\ensuremath{\mathop{\mathrm{ilog}}\nolimits}} +\newcommand{\round}{\ensuremath{\mathop{\mathrm{round}}\nolimits}} +\newcommand{\sign}{\ensuremath{\mathop{\mathrm{sign}}\nolimits}} +\newcommand{\lflim}{\ensuremath{\mathop{\mathrm{lflim}}\nolimits}} + +%Section-based table, figure, and equation numbering. +\numberwithin{equation}{chapter} +\numberwithin{figure}{chapter} +\numberwithin{table}{chapter} + +%Provide section numbering for \paragraph. +\makeatletter +\renewcommand{\paragraph}{\@startsection{paragraph}{4}{0ex}% + {-3.25ex plus -1ex minus -0.2ex}% + {1.5ex plus 0.2ex}% + {\normalfont\normalsize\bfseries}} +\makeatother +\stepcounter{secnumdepth} +\stepcounter{tocdepth} + +\keepXColumns + +\pagestyle{headings} +\bibliographystyle{alpha} + +\title{Theora Specification} +\author{Xiph.Org Foundation} +\date{\today} + + +\begin{document} + +\frontmatter + +\begin{titlepage} +\maketitle +\end{titlepage} +\thispagestyle{empty} +\cleardoublepage + +\pagenumbering{roman} + +\thispagestyle{plain} +\tableofcontents +\cleardoublepage + +\thispagestyle{plain} +\listoffigures +\cleardoublepage + +\thispagestyle{plain} +\listoftables +\cleardoublepage + +\thispagestyle{plain} +\markboth{{\sc Notation and Conventions}}{{\sc Notation and Conventions}} +\chapter*{Notation and Conventions} + +All parameters either passed in or out of a decoding procedure are given in + \bitvar{bold\ face}. + +The prefix \bin{} indicates that the following value is to be interpreted as a + binary number (base 2). +\begin{verse} +{\bf Example:} The value \bin{1110100} is equal to the decimal value 116. +\end{verse} + +The prefix \hex{} indicates the following value is to be interpreted as a + hexadecimal number (base 16). +\begin{verse} +{\bf Example:} The value \hex{74} is equal to the decimal value 116. +\end{verse} + +All arithmetic defined by this specification is exact. +However, any real numbers that do arise will always be converted back to + integers again in short order. +The entire specification can be implemented using only normal integer + operations. +All operations are to be implemented with sufficiently large integers so that + overflow cannot occur. +Where the result of a computation is to be truncated to a fixed-sized binary + representation, this will be explicitly noted. +The size given for all variables is the maximum number of bits needed to store + any value in that variable. +Intermediate computations involving that variable may require more bits. + +The following operators are defined: + +\begin{description} +\item[$|a|$] +The absolute value of a number $a$. +\begin{align*} +|a| & = \left\{\begin{array}{ll} +-a, & a < 0 \\ +a, & a \ge 0 +\end{array}\right. +\end{align*} + +\item[$a*b$] +Multiplication of a number $a$ by a number $b$. +\item[$\frac{a}{b}$] +Exact division of a number $a$ by a number $b$, producing a potentially + non-integer result. + +\item[$\left\lfloor a\right\rfloor$] +The largest integer less than or equal to a real number $a$. + +\item[$\left\lceil a\right\rceil$] +The smallest integer greater than or equal to a real number $a$. + +\item[$a//b$] +Integer division of $a$ by $b$. +\begin{align*} +a//b & = \left\{\begin{array}{ll} +\left\lceil\frac{a}{b}\right\rceil, & a < 0 \\ +\left\lfloor\frac{a}{b}\right\rfloor, & a \ge 0 +\end{array}\right. +\end{align*} + +\item[$a\%b$] +The remainder from the integer division of $a$ by $b$. +\begin{align*} +a\%b & = a-|b|*\left\lfloor\frac{a}{|b|}\right\rfloor +\end{align*} +Note that with this definition, the result is always non-negative and less than + $|b|$. + +\item[$a<>b$] +The value obtained by right-shifting the two's complement integer $a$ by $b$ + bits, filling in the leftmost bits of the new value with $0$ if $a$ is + non-negative and $1$ if $a$ is negative. +This is {\em not} equivalent to integer division of $a$ by $2^b$. +Instead, +\begin{align*} +a>>b & = \left\lfloor\frac{a}{2^b}\right\rfloor. +\end{align*} + +\item[$\round(a)$] +Rounds a number $a$ to the nearest integer, with ties rounded away from $0$. +\begin{align*} +\round(a) = \left\{\begin{array}{ll} +\lceil a-\frac{1}{2}\rceil & a \le 0 \\ +\lfloor a+\frac{1}{2}\rfloor & a > 0 +\end{array}\right. +\end{align*} + +\item[$\sign(a)$] +Returns the sign of a given number. +\begin{align*} +\sign(a) = \left\{\begin{array}{ll} +-1 & a < 0 \\ +0 & a = 0 \\ +1 & a > 0 +\end{array}\right. +\end{align*} + +\item[$\ilog(a)$] +The minimum number of bits required to store a positive integer $a$ in + two's complement notation, or $0$ for a non-positive integer $a$. +\begin{align*} +\ilog(a) = \left\{\begin{array}{ll} +0, & a \le 0 \\ +\left\lfloor\log_2{a}\right\rfloor+1, & a > 0 +\end{array}\right. +\end{align*} + +\begin{verse} +{\bf Examples:} +\begin{itemize} +\item $\ilog(-1)=0$ +\item $\ilog(0)=0$ +\item $\ilog(1)=1$ +\item $\ilog(2)=2$ +\item $\ilog(3)=2$ +\item $\ilog(4)=3$ +\item $\ilog(7)=3$ +\end{itemize} +\end{verse} + +\item[$\min(a,b)$] +The minimum of two numbers $a$ and $b$. + +\item[$\max(a,b)$] +The maximum of two numbers $a$ and $b$. + +\end{description} +\cleardoublepage + + +\thispagestyle{plain} +\markboth{{\sc Key words}}{{\sc Key words}} +\chapter*{Key words} + +%We can't rewrite this, because this is text required by RFC 2119, so we use +% some emergency stretching to get it typeset properly. +\setlength{\emergencystretch}{2em} +The key words ``MUST'', ``MUST NOT'', ``REQUIRED'', ``SHALL'', ``SHALL NOT'', + ``SHOULD'', ``SHOULD NOT'', ``RECOMMENDED'', ``MAY'', and ``OPTIONAL'' in this + document are to be intrepreted as described in RFC 2119 \cite{rfc2119}.\par +\setlength{\emergencystretch}{0em} + +Where such assertions are placed on the contents of a Theora bitstream itself, + implementations should be prepared to encounter bitstreams that do not follow + these requirements. +An application's behavior in the presecence of such non-conforming bitstreams + is not defined by this specification, but any reasonable method of handling + them MAY be used. +By way of example, applications MAY discard the current frame, retain the + current output thus far, or attempt to continue on by assuming some default + values for the erroneous bits. +When such an error occurs in the bitstream headers, an application MAY refuse + to decode the entire stream. +An application SHOULD NOT allow such non-conformant bitstreams to overflow + buffers and potentially execute arbitrary code, as this represents a serious + security risk. + +An application MUST, however, ensure any bits marked as reserved have the value + zero, and refuse to decode the stream if they do not. +These are used as place holders for future bitstream features with which the + current bitstream is forward-compatible. +Such features may not increment the bitstream version number, and can only be + recognized by checking the value of these reserved bits. + +\cleardoublepage + + + +\mainmatter + +\pagenumbering{arabic} +\setcounter{page}{1} + +\chapter{Introduction} + +Theora is a general purpose, lossy video codec. +It is based on the VP3 video codec produced by On2 Technologies + (\url{http://www.on2.com/}). +On2 donated the VP3.1 source code to the Xiph.Org Foundation and released it + under a BSD-like license. +On2 also made an irrevocable, royalty-free license grant for any patent claims + it might have over the software and any derivatives. +No formal specification exists for the VP3 format beyond this source code, + however Mike Melanson maintains a detailed description \cite{Mel04}. +Portions of this specification were adopted from that text with permission. + +\section{VP3 and Theora} + +Theora contains a superset of the features that were available in the original + VP3 codec. +Content encoded with VP3.1 can be losslessly transcoded into the Theora format. +Theora content cannot, in general, be losslessly transcoded into the VP3 + format. +If a feature is not available in the original VP3 format, this is mentioned + when that feature is defined. +A complete list of these features appears in Appendix~\ref{app:vp3-compat}. +%TODO: VP3 - theora comparison in appendix + +\section{Video Formats} + +Theora currently supports progressive video data of arbitrary dimensions at a + constant frame rate in one of several $Y'C_bC_r$ color spaces. +The precise definition the supported color spaces appears in + Section~\ref{sec:colorspaces}. +Three different chroma subsampling formats are supported: 4:2:0, 4:2:2, + and 4:4:4. +The precise details of each of these formats and their sampling locations are + described in Section~\ref{sec:pixfmts}. + +The Theora format does not support interlaced material, variable frame rates, + bit-depths larger than 8 bits per component, nor alternate color spaces such + as RGB or arbitrary multi-channel spaces. +Black and white content can be efficiently encoded, however, because the + uniform chroma planes compress well. +Support for interlaced material is planned for a future version. +\begin{verse} +{\bf Note:} Infrequently changing frame rates---as when film and video + sequences are cut together---can be supported in the Ogg container format by + chaining several Theora streams together. +\end{verse} +Support for increased bit depths or additional color spaces is not planned. + +\section{Classification} + +Theora is a block-based lossy transform codec that utilizes an + $8\times 8$ Type-II Discrete Cosine Transform and block-based motion + compensation. +This places it in the same class of codecs as MPEG-1, -2, -4, and H.263. +The details of how individual blocks are organized and how DCT coefficients are + stored in the bitstream differ substantially from these codecs, however. +Theora supports only intra frames (I frames in MPEG) and inter frames (P frames + in MPEG). +There is no equivalent to the bi-predictive frames (B frames) found in MPEG + codecs. + +\section{Assumptions} + +The Theora codec design assumes a complex, psychovisually-aware encoder and a + simple, low-complexity decoder. +%TODO: Talk more about implementation complexity. + +Theora provides none of its own framing, synchronization, or protection against + transmission errors. +An encoder is solely a method of accepting input video frames and + compressing these frames into raw, unformatted `packets'. +The decoder then accepts these raw packets in sequence, decodes them, and + synthesizes a fascimile of the original video frames. +Theora is a free-form variable bit rate (VBR) codec, and packets have no + minimum size, maximum size, or fixed/expected size. + +Theora packets are thus intended to be used with a transport mechanism that + provides free-form framing, synchronization, positioning, and error correction + in accordance with these design assumptions, such as Ogg (for file transport) + or RTP (for network multicast). +For the purposes of a few examples in this document, we will assume that Theora + is embedded in an Ogg stream specifically, although this is by no means a + requirement or fundamental assumption in the Theora design. + +The specification for embedding Theora into an Ogg transport stream is given in + Appendix~\ref{app:oggencapsulation}. + +\section{Codec Setup and Probability Model} + +Theora's heritage is the proprietary commerical codec VP3, and it retains a + fair amount of inflexibility when compared to Vorbis \cite{vorbis}, the first + Xiph.Org codec, which began as a research codec. +However, to provide additional scope for encoder improvement, Theora adopts + some of the configurable aspects of decoder setup that are present in Vorbis. +This configuration data is not available in VP3, which uses hardcoded values + instead. + +Theora makes the same controversial design decision that Vorbis made to include + the entire probability model for the DCT coefficients and all the quantization + parameters in the bitstream headers. +This is often several hundred fields. +It is therefore impossible to decode any frame in the stream without + having previously fetched the codec info and codec setup headers. + +\begin{verse} +{\bf Note:} Theora {\em can} initiate decode at an arbitrary intra-frame packet + within a bitstream so long as the codec has been initialized with the setup + headers. +\end{verse} + +Thus, Theora headers are both required for decode to begin and relatively large + as bitstream headers go. +The header size is unbounded, although as a rule-of-thumb less than 16kB is + recommended, and Xiph.Org's reference encoder follows this suggestion. +%TODO: Is 8kB enough? My setup header is 7.4kB, that doesn't leave much room +% for comments. +%RG: the lesson from vorbis is that as small as possible is really +% important in some applications. Practically, what's acceptable +% depends a great deal on the target bitrate. I'd leave 16 kB in the +% spec for now. fwiw more than 1k of comments is quite unusual. + +Our own design work indicates that the primary liability of the required header + is in mindshare; it is an unusual design and thus causes some amount of + complaint among engineers as this runs against current design trends and + points out limitations in some existing software/interface designs. +However, we find that it does not fundamentally limit Theora's suitable + application space. + +%silvia: renamed +%\subsection{Format Specification} +\section{Format Conformance} + +The Theora format is well-defined by its decode specification; any encoder that + produces packets that are correctly decoded by an implementation following + this specification may be considered a proper Theora encoder. +A decoder must faithfully and completely implement the specification defined + herein %, except where noted, + to be considered a conformant Theora decoder. +A decoder need not be implemented strictly as described, but the + actual decoder process MUST be {\em entirely mathematically equivalent} + to the described process. +Where appropriate, a non-normative description of encoder processes is + included. +These sections will be marked as such, and a proper Theora encoder is not + bound to follow them. + +%TODO: \subsection{Hardware Profile} + + +\chapter{Coded Video Structure} + +Theora's encoding and decoding process is based on $8\times 8$ blocks of + pixels. +This sections describes how a video frame is laid out, divided into + blocks, and how those blocks are organized. + +\section{Frame Layout} + +A video frame in Theora is a two-dimensional array of pixels. +Theora, like VP3, uses a right-handed coordinate system, with the origin in the + lower-left corner of the frame. +This is contrary to many video formats which use a left-handed coordinate + system with the origin in the upper-left corner of the frame. +%INT: This means that for interlaced material, the definition of `even fields' +%INT: and `odd fields' may be reversed between Theora and other video codecs. +%INT: This document will always refer to them as `top fields' and `bottom +%INT: fields'. + +Theora divides the pixel array up into three separate \term{color planes}, one + for each of the $Y'$, $C_b$, and $C_r$ components of the pixel. +The $Y'$ plane is also called the \term{luma plane}, and the $C_b$ and $C_r$ + planes are also called the \term{chroma planes}. +Each plane is assigned a numerical value, as shown in + Table~\ref{tab:color-planes}. + +\begin{table}[htbp] +\begin{center} +\begin{tabular}{cl}\toprule +Index & Color Plane \\\midrule +$0$ & $Y'$ \\ +$1$ & $C_b$ \\ +$2$ & $C_r$ \\ +\bottomrule\end{tabular} +\end{center} +\caption{Color Plane Indices} +\label{tab:color-planes} +\end{table} + +In some pixel formats, the chroma planes are subsampled by a factor of two + in one or both directions. +This means that the width or height of the chroma planes may be half that of + the total frame width and height. +The luma plane is never subsampled. + +\section{Picture Region} + +An encoded video frame in Theora is required to have a width and height that + are multiples of sixteen, making an integral number of blocks even when the + chroma planes are subsampled. +However, inside a frame a smaller \term{picture region} may be defined + to present material whose dimensions are not a multiple of sixteen pixels, as + shown in Figure~\ref{fig:pic-frame}. +The picture region can be offset from the lower-left corner of the frame by up + to 255 pixels in each direction, and may have an arbitrary width and height, + provided that it is contained entirely within the coded frame. +It is this picture region that contains the actual video data. +The portions of the frame which lie outside the picture region may contain + arbitrary image data, so the frame must be cropped to the picture region + before display. +The picture region plays no other role in the decode process, which operates on + the entire video frame. + +\begin{figure}[htbp] +\begin{center} +\includegraphics{pic-frame} +\end{center} +\caption{Location of frame and picture regions} +\label{fig:pic-frame} +\end{figure} + +\section{Blocks and Super Blocks} +\label{sec:blocks-and-sbs} + +Each color plane is subdivided into \term{blocks} of $8\times 8$ pixels. +Blocks are grouped into $4\times 4$ arrays called \term{super blocks} as + shown in Figure~\ref{fig:superblock}. +Each color plane has its own set of blocks and super blocks. +If the chroma planes are subsampled, they are still divided into $8\times 8$ + blocks of pixels; there are just fewer blocks than in the luma plane. +The boundaries of blocks and super blocks in the luma plane do not necessarily + coincide with those of the chroma planes, if the chroma planes have been + subsampled. + +\begin{figure}[htbp] +\begin{center} +\includegraphics{superblock} +\end{center} +\caption{Subdivision of a frame into blocks and super blocks} +\label{fig:superblock} +\end{figure} + +Blocks are accessed in two different orders in the various decoder processes. +The first is \term{raster order}, illustrated in Figure~\ref{fig:raster-block}. +This accesses each block in row-major order, starting in the lower left of the + frame and continuing along the bottom row of the entire frame, followed by the + next row up, starting on the left edge of the frame, etc. + +\begin{figure}[htbp] +\begin{center} +\includegraphics{raster-block} +\end{center} +\caption{Raster ordering of $n\times m$ blocks} +\label{fig:raster-block} +\end{figure} + +The second is \term{coded order}. +In coded order, blocks are accessed by super block. +Within each frame, super blocks are traversed in raster order, + similar to raster order for blocks. +Within each super block, however, blocks are accessed in a Hilbert curve + pattern, illustrated in Figure~\ref{fig:hilbert-block}. +If a color plane does not contain a complete super block on the top or right + sides, the same ordering is still used, simply with any blocks outside the + frame boundary ommitted. + +\begin{figure}[htbp] +\begin{center} +\includegraphics{hilbert-block} +\end{center} +\caption{Hilbert curve ordering of blocks within a super block} +\label{fig:hilbert-block} +\end{figure} + +To illustrate this ordering, consider a frame that is 240 pixels wide and + 48 pixels high. +Each row of the luma plane has 30 blocks and 8 super blocks, and there are 6 + rows of blocks and two rows of super blocks. + +%When accessed in raster order, each block in the luma plane is assigned the +% following indices: + +%\vspace{\baselineskip} +%\begin{center} +%\begin{tabular}{|ccccccc|}\hline +%150 & 151 & 152 & 153 & $\ldots$ & 178 & 179 \\ +%120 & 121 & 122 & 123 & $\ldots$ & 148 & 149 \\\hline +% 90 & 91 & 92 & 93 & $\ldots$ & 118 & 119 \\ +% 60 & 61 & 62 & 63 & $\ldots$ & 88 & 89 \\ +% 30 & 31 & 32 & 33 & $\ldots$ & 58 & 59 \\ +% 0 & 1 & 2 & 3 & $\ldots$ & 28 & 29 \\\hline +%\end{tabular} +%\end{center} +%\vspace{\baselineskip} + +When accessed in coded order, each block in the luma plane is assigned the + following indices: + +\vspace{\baselineskip} +\begin{center} +\begin{tabular}{|cccc|c|cc|}\hline +123 & 122 & 125 & 124 & $\ldots$ & 179 & 178 \\ +120 & 121 & 126 & 127 & $\ldots$ & 176 & 177 \\\hline + 5 & 6 & 9 & 10 & $\ldots$ & 117 & 118 \\ + 4 & 7 & 8 & 11 & $\ldots$ & 116 & 119 \\ + 3 & 2 & 13 & 12 & $\ldots$ & 115 & 114 \\ + 0 & 1 & 14 & 15 & $\ldots$ & 112 & 113 \\\hline +\end{tabular} +\end{center} +\vspace{\baselineskip} + +Here the index values specify the order in which the blocks would be accessed. +The indices of the blocks are numbered continuously from one color plane to the + next. +They do not reset to zero at the start of each plane. +Instead, the numbering increases continuously from the $Y'$ plane to the $C_b$ + plane to the $C_r$ plane. +The implication is that the blocks from all planes are treated as a unit during + the various processing steps. + +Although blocks are sometimes accessed in raster order, in this document the + index associated with a block is {\em always} its index in coded order. + +\section{Macro Blocks} +\label{sec:mbs} + +A macro block contains a $2\times 2$ array of blocks in the luma plane + {\em and} the co-located blocks in the chroma planes, as shown in + Figure~\ref{fig:macroblock}. +Thus macro blocks can represent anywhere from six to twelve blocks, depending + on how the chroma planes are subsampled. +This is in contrast to super blocks, which only contain blocks from a single + color plane. +% the whole super vs. macro blocks thing is a little confusing, and it can be +% hard to remember which is what initially. A figure would/will help here, +% but I tried to add some text emphasizing the difference in terms of +% functionality. +%TBT: At this point we haven't described any functionality yet. +%TBT: As far as the reader knows, the only purpose of the blocks, macro blocks +%TBT: and super blocks is for data organization---and for blocks and super +%TBT: blocks, this is essentially true. +%TBT: So lets restrict the differences we emphasize to those of data +%TBT: organization, which the sentence I just added above does. +Macro blocks contain information about coding mode and motion vectors for the + corresponding blocks in all color planes. + +\begin{figure}[htbp] + \begin{center} + \includegraphics{macroblock} + \end{center} + \caption{Subdivision of a frame into macro blocks} + \label{fig:macroblock} +\end{figure} + +Macro blocks are also accessed in a \term{coded order}. +This coded order proceeds by examining each super block in the luma plane in + raster order, and traversing the four macro blocks inside using a smaller + Hilbert curve, as shown in Figure~\ref{fig:hilbert-mb}. +%r: I rearranged the wording to make a more formal idiom here +If the luma plane does not contain a complete super block on the top or right + sides, the same ordering is still used, with any macro blocks outside + the frame boundary simply omitted. +Because the frame size is constrained to be a multiple of 16, there are never + any partial macro blocks. +Unlike blocks, macro blocks need never be accessed in a pure raster order. + +\begin{figure}[htbp] +\begin{center} +\includegraphics{hilbert-mb} +\end{center} +\caption{Hilbert curve ordering of macro blocks within a super block} +\label{fig:hilbert-mb} +\end{figure} + +Using the same frame size as the example above, there are 15 macro blocks in + each row and 3 rows of macro blocks. +The macro blocks are assigned the following indices: + +\vspace{\baselineskip} +\begin{center} +\begin{tabular}{|cc|cc|c|cc|c|}\hline +30 & 31 & 32 & 33 & $\cdots$ & 42 & 43 & 44 \\\hline + 1 & 2 & 5 & 6 & $\cdots$ & 25 & 26 & 29 \\ + 0 & 3 & 4 & 7 & $\cdots$ & 24 & 27 & 28 \\\hline +\end{tabular} +\end{center} +\vspace{\baselineskip} + +\section{Coding Modes and Prediction} + +Each block is coded using one of a small, fixed set of \term{coding modes} that + define how the block is predicted from previous frames. +A block is predicted using one of two \term{reference frames}, selected + according to the coding mode. +A reference frame is the fully decoded version of a previous frame in the + stream. +The first available reference frame is the previous intra frame, called the + \term{golden frame}. +The second available reference frame is the previous frame, whether it was an + intra frame or an inter frame. +If the previous frame was an intra frame, then both reference frames are the + same. +See Figure~\ref{fig:reference-frames} for an illustration of the reference + frames used for an intra frame that does not follow an intra frame. + +\begin{figure}[htbp] +\begin{center} +\includegraphics{reference-frames} +\end{center} +\caption{Example of reference frames for an inter frame} +\label{fig:reference-frames} +\end{figure} + +Two coding modes in particular are worth mentioning here. +The INTRA mode is used for blocks that are not predicted from either reference + frame. +This is the only coding mode allowed in intra frames. +The INTER\_NOMV coding mode uses the co-located contents of the block in the + previous frame as the predictor. +This is the default coding mode. + +\section{DCT Coefficients} +\label{sec:dct-coeffs} + +A \term{residual} is added to the predicted contents of a block to form the + final reconstruction. +The residual is stored as a set of quantized coefficients from an integer + approximation of a two-dimensional Type II Discrete Cosine Transform. +The DCT takes an $8\times 8$ array of pixel values as input and returns an + $8\times 8$ array of coefficient values. +The \term{natural ordering} of these coefficients is defined to be row-major + order, from lowest to highest frequency. +They are also often indexed in \term{zig-zag order}, as shown in + Figure~\ref{tab:zig-zag}. + +\begin{figure}[htbp] +\begin{center} +\begin{tabular}[c]{rr|c@{}c@{}c@{}c@{}c@{}c@{}c@{}c@{}c@{}c@{}c@{}c@{}c@{}c@{}c} + &\multicolumn{1}{r}{} & && &&&&&$c$&&& && && \\ + &\multicolumn{1}{r}{} &0&&1&&2&&3&&4&&5&&6&&7 \\\cline{3-17} + &0 & 0 &$\rightarrow$& 1 && 5 &$\rightarrow$& 6 && 14 &$\rightarrow$& 15 && 27 &$\rightarrow$& 28 \\[-0.5\defaultaddspace] + & & &$\swarrow$&&$\nearrow$& &$\swarrow$&&$\nearrow$& &$\swarrow$&&$\nearrow$& &$\swarrow$& \\ + &1 & 2 & & 4 && 7 & & 13 && 16 & & 26 && 29 & & 42 \\[-0.5\defaultaddspace] + & &$\downarrow$&$\nearrow$&&$\swarrow$&&$\nearrow$&&$\swarrow$&&$\nearrow$&&$\swarrow$&&$\nearrow$&$\downarrow$ \\ + &2 & 3 & & 8 && 12 & & 17 && 25 & & 30 && 41 & & 43 \\[-0.5\defaultaddspace] + & & &$\swarrow$&&$\nearrow$& &$\swarrow$&&$\nearrow$& &$\swarrow$&&$\nearrow$& &$\swarrow$& \\ + &3 & 9 & & 11 && 18 & & 24 && 31 & & 40 && 44 & & 53 \\[-0.5\defaultaddspace] +$r$&&$\downarrow$&$\nearrow$&&$\swarrow$&&$\nearrow$&&$\swarrow$&&$\nearrow$&&$\swarrow$&&$\nearrow$&$\downarrow$ \\ + &4 & 10 & & 19 && 23 & & 32 && 39 & & 45 && 52 & & 54 \\[-0.5\defaultaddspace] + & & &$\swarrow$&&$\nearrow$& &$\swarrow$&&$\nearrow$& &$\swarrow$&&$\nearrow$& &$\swarrow$& \\ + &5 & 20 & & 22 && 33 & & 38 && 46 & & 51 && 55 & & 60 \\[-0.5\defaultaddspace] + & &$\downarrow$&$\nearrow$&&$\swarrow$&&$\nearrow$&&$\swarrow$&&$\nearrow$&&$\swarrow$&&$\nearrow$&$\downarrow$ \\ + &6 & 21 & & 34 && 37 & & 47 && 50 & & 56 && 59 & & 61 \\[-0.5\defaultaddspace] + & & &$\swarrow$&&$\nearrow$& &$\swarrow$&&$\nearrow$& &$\swarrow$&&$\nearrow$& &$\swarrow$& \\ + &7 & 35 &$\rightarrow$& 36 && 48 &$\rightarrow$& 49 && 57 &$\rightarrow$& 58 && 62 &$\rightarrow$& 63 +\end{tabular} +\end{center} +\caption{Zig-zag order} +\label{tab:zig-zag} +\end{figure} + +\begin{verse} +{\bf Note:} the row and column indices refer to {\em frequency number} and not + pixel locations. +The frequency numbers are defined independently of the memory organization of + the pixels. +They have been written from top to bottom here to follow conventional notation, + despite the right-handed coordinate system Theora uses for pixel locations. +%RG: I'd rather we were internally consistent and put dc at the lower left. +Many implementations of the DCT operate `in-place'. +That is, they return DCT coefficients in the same memory buffer that the + initial pixel values were stored in. +Due to the right-handed coordinate system used for pixel locations in Theora, + one must note carefully how both pixel values and DCT coefficients are + organized in memory in such a system. +\end{verse} + +DCT coefficient $(0,0)$ is called the \term{DC coefficient}. +All the other coefficients are called \term{AC coefficients}. + + +\chapter{Decoding Overview} + +This section provides a high level description of the Theora codec's + construction. +A bit-by-bit specification appears beginning in Section~\ref{sec:bitpacking}. +The later sections assume a high-level understanding of the Theora decode + process, which is provided below. + +\section{Decoder Configuration} + +Decoder setup consists of configuration of the quantization matrices and the + Huffman codebooks for the DCT coefficients, and a table of limit values for + the deblocking filter. +The remainder of the decoding pipeline is not configurable. + +\subsection{Global Configuration} + +The global codec configuration consists of a few video related fields, such as + frame rate, frame size, picture size and offset, aspect ratio, color space, + pixel format, and a version number. +The version number is divided into a major version, a minor version, amd a + minor revision number. +%r: afaik the released vp3 codec called itself 3.1 and is compatible w/ theora +%r: even though we received the in-progress 3.2 codebase +For the format defined in this specification, these are `3', `2', and + `1', respectively, in reference to Theora's origin as a successor to + the VP3.1 format. + +\subsection{Quantization Matrices} + +Theora allows up to 384 different quantization matrices to be defined, one for + each \term{quantization type}, \term{color plane} ($Y'$, $C_b$, or $C_r$), and + \term{quantization index}, \qi, which ranges from zero to 63, inclusive. +There are currently two quantization types defined, which depend on the coding + mode of the block being dequantized, as shown in Table~\ref{tab:quant-types}. + +\begin{table}[htbp] +\begin{center} +\begin{tabular}{cl}\toprule +Quantization Type & Usage \\\midrule +$0$ & INTRA-mode blocks \\ +$1$ & Blocks in any other mode. \\ +\bottomrule\end{tabular} +\end{center} +\caption{Quantization Type Indices} +\label{tab:quant-types} +\end{table} + +%r: I think 'nominally' is more specific than 'generally' here +The quantization index, on the other hand, nominally represents a progressive + range of quality levels, from low quality near zero to high quality near 63. +However, the interpretation is arbitrary, and it is possible, for example, to + partition the scale into two completely separate ranges with 32 levels each + that are meant to represent different classes of source material, or any + other arrangement that suits the encoder's requirements. + +Each quantization matrix is an $8\times 8$ matrix of 16-bit values, which is + used to quantize the output of the $8\times 8$ DCT\@. +Quantization matrices are specified using three components: a + \term{base matrix} and two \term{scale values}. +The first scale value is the \term{DC scale}, which is applied to the DC + component of the base matrix. +The second scale value is the \term{AC scale}, which is applied to all the + other components of the base matrix. +There are 64 DC scale values and 64 AC scale values, one for each \qi\ value. + +There are 64 elements in each base matrix, one for each DCT coefficient. +They are stored in natural order (cf. Section~\ref{sec:dct-coeffs}). +There is a separate set of base matrices for each quantization type and each + color plane, with up to 64 possible base matrices in each set, one for each + \qi\ value. +%r: we will mention that the given matricies must bound the \qi range +%r: in the detailed section. it's not important at this level. +Typically the bitstream contains matrices for only a sparse subset of the + possible \qi\ values. +The base matrices for the remainder of the \qi\ values are computed using + linear interpolation. +This configuration allows the encoder to adjust the quantization matrices to + approximate the complex, non-linear response of the human visual system to + different quantization errors. + +Finally, because the in-loop deblocking filter strength depends on the strength + of the quantization matrices defined in this header, a table of 64 \term{loop + filter limit values} is defined, one for each \qi\ value. + +The precise specification of how all of this information is decoded appears in + Section~\ref{sub:loop-filter-limits} and Section~\ref{sub:quant-params}. + +\subsection{Huffman Codebooks} + +Theora uses 80 configurable binary Huffman codes to represent the 32 tokens + used to encode DCT coefficients. +Each of the 32 token values has a different semantic meaning and is used to + represent single coefficient values, zero runs, combinations of the two, and + \term{End-Of-Block markers}. + +The 80 codes are divided up into five groups of 16, with each group + corresponding to a set of DCT coefficient indices. +The first group corresponds to the DC coefficient, while the remaining four + groups correspond to different subsets of the AC coefficients. +Within each frame, two pairs of 4-bit codebook indices are stored. +The first pair selects which codebooks to use from the DC coefficient group for + the $Y'$ coefficients and the $C_b$ and $C_r$ coefficients. +The second pair selects which codebooks to use from {\em all four} of the AC + coefficient groups for the $Y'$ coefficients and the $C_b$ and $C_r$ + coefficients. + +The precise specification of how the codebooks are decoded appears in + Section~\ref{sub:huffman-tables}. + +\section{High-Level Decode Process} + +\subsection{Decoder Setup} + +Before decoding can begin, a decoder MUST be initialized using the bitstream + headers corresponding to the stream to be decoded. +Theora uses three header packets; all are required, in order, by this + specification. +Once set up, decode may begin at any intra-frame packet---or even inter-frame + packets, provided the appropriate decoded reference frames have already been + decoded and cached---belonging to the Theora stream. +In Theora I, all packets after the three initial headers are intra-frame or + inter-frame packets. + +The header packets are, in order, the identification header, the comment + header, and the setup header. + +\paragraph{Identification Header} + +The identification header identifies the stream as Theora, provides a version + number, and defines the characteristics of the video stream such as frame + size. +A complete description of the identification header appears in + Section~\ref{sec:idheader}. + +\paragraph{Comment Header} + +The comment header includes user text comments (`tags') and a vendor string + for the application/library that produced the stream. +The format of the comment header is the same as that used in the Vorbis I and + Speex codecs, with slight modifications due to the use of a different bit + packing mechanism. +A complete description of how the comment header is coded appears in + Section~\ref{sec:commentheader}, along with a suggested set of tags. + +\paragraph{Setup Header} + +The setup header includes extensive codec setup information, including the + complete set of quantization matrices and Huffman codebooks needed to decode + the DCT coefficients. +A complete description of the setup header appears in + Section~\ref{sec:setupheader}. + +\subsection{Decode Procedure} + +The decoding and synthesis procedure for all video packets is fundamentally the + same, with some steps omitted for intra frames. +\begin{itemize} +\item +Decode packet type flag. +\item +Decode frame header. +\item +Decode coded block information (inter frames only). +\item +Decode macro block mode information (inter frames only). +\item +Decode motion vectors (inter frames only). +\item +Decode block-level \qi\ information. +\item +Decode DC coefficient for each coded block. +\item +Decode 1st AC coefficient for each coded block. +\item +Decode 2nd AC coefficient for each coded block. +\item +$\ldots$ +\item +Decode 63rd AC coefficient for each coded block. +\item Perform DC coefficient prediction. +\item Reconstruct coded blocks. +\item Copy uncoded bocks. +\item Perform loop filtering. +\end{itemize} + +\begin{verse} +{\bf Note:} clever rearrangement of the steps in this process is possible. +As an example, in a memory-constrained environment, one can make multiple + passes through the DCT coefficients to avoid buffering them all in memory. +On the first pass, the starting location of each coefficient is identified, and + then 64 separate get pointers are used to read in the 64 DCT coefficients + required to reconstruct each coded block in sequence. +This operation produces entirely equivalent output and is naturally perfectly + legal. +It may even be a benefit in non-memory-constrained environments due to a + reduced cache footprint. +\end{verse} + +Theora makes equivalence easy to check by defining all decoding operations in + terms of exact integer operations. +No floating-point math is required, and in particular, the implementation of + the iDCT transform MUST be followed precisely. +This prevents the decoder mismatch problem commonly associated with codecs that + provide a less rigorous transform specification. +Such a mismatch problem would be devastating to Theora, since a single rounding + error in one frame could propagate throughout the entire succeeding frame due + to DC prediction. + +\paragraph{Packet Type Decode} + +Theora uses four packet types. +The first three packet types mark each of the three Theora headers described + above. +The fourth packet type marks a video packet. +All other packet types are reserved; packets marked with a reserved type should + be ignored. + +Additionally, zero-length packets are treated as if they were an inter +frame with no blocks coded. That is, as a duplicate frame. + +\paragraph{Frame Header Decode} + +The frame header contains some global information about the current frame. +The first is the frame type field, which specifies if this is an intra frame or + an inter frame. +Inter frames predict their contents from previously decoded reference frames. +Intra frames can be independently decoded with no established reference frames. + +The next piece of information in the frame header is the list of \qi\ values + allowed in the frame. +Theora allows from one to three different \qi\ values to be used in a single + frame, each of which selects a set of six quantization matrices, one for each + quantization type (inter or intra), and one for each color plane. +The first \qi\ value is {\em always} used when dequantizing DC coefficients. +The \qi\ value used when dequantizing AC coefficients, however, can vary from + block to block. +VP3, in contrast, only allows a single \qi\ value per frame for both the DC and + AC coefficients. + +\paragraph{Coded Block Information} + +This stage determines which blocks in the frame are coded and which are + uncoded. +A \term{coded block list} is constructed which lists all the coded blocks in + coded order. +For intra frames, every block is coded, and so no data needs to be read from + the packet. + +\paragraph{Macro Block Mode Information} + +For intra frames, every block is coded in INTRA mode, and this stage is + skipped. +In inter frames a \term{coded macro block list} is constructed from the coded + block list. +Any macro block which has at least one of its luma blocks coded is considered + coded; all other macro blocks are uncoded, even if they contain coded chroma + blocks. +A coding mode is decoded for each coded macro block, and assigned to all its + constituent coded blocks. +All coded chroma blocks in uncoded macro blocks are assigned the INTER\_NOMV + coding mode. + +\paragraph{Motion Vectors} + +Intra frames are coded entirely in INTRA mode, and so this stage is skipped. +Some inter coding modes, however, require one or more motion vectors to be + specified for each macro block. +These are decoded in this stage, and an appropriate motion vector is assigned + to each coded block in the macro block. + +\paragraph{Block-Level \qi\ Information} + +If a frame allows multiple \qi\ values, the \qi\ value assigned to each block + is decoded here. +Frames that use only a single \qi\ value have nothing to decode. + +\paragraph{DCT Coefficients} + +Finally, the quantized DCT coefficients are decoded. +A list of DCT coefficients in zig-zag order for a single block is represented + by a list of tokens. +A token can take on one of 32 different values, each with a different semantic + meaning. +A single token can represent a single DCT coefficient, a run of zero + coefficients within a single block, a combination of a run of zero + coefficients followed by a single non-zero coefficient, an + \term{End-Of-Block marker}, or a run of EOB markers. +EOB markers signify that the remainder of the block is one long zero run. +Unlike JPEG and MPEG, there is no requirement for each block to end with + a special marker. +If non-EOB tokens yield values for all 64 of the coefficients in a block, then + no EOB marker occurs. + +Each token is associated with a specific \term{token index} in a block. +For single-coefficient tokens, this index is the zig-zag index of the token in + the block. +For zero-run tokens, this index is the zig-zag index of the {\em first} + coefficient in the run. +For combination tokens, the index is again the zig-zag index of the first + coefficient in the zero run. +For EOB markers, which signify that the remainder of the block is one long zero + run, the index is the zig-zag index of the first zero coefficient in that run. +For EOB runs, the token index is that of the first EOB marker in the run. +Due to zero runs and EOB markers, a block does not have to have a token for + every zig-zag index. + +Tokens are grouped in the stream by token index, not by the block they + originate from. +This means that for each zig-zag index in turn, the tokens with that index from + {\em all} the coded blocks are coded in coded block order. +When decoding, a current token index is maintained for each coded block. +This index is advanced by the number of coefficients that are added to the + block as each token is decoded. +After fully decoding all the tokens with token index \ti, the current token + index of every coded block will be \ti\ or greater. + +If an EOB run of $n$ blocks is decoded at token index \ti, then it ends the + next $n$ blocks in coded block order whose current token index is equal to + \ti, but not greater. +If there are fewer than $n$ blocks with a current token index of \ti, then the + decoder goes through the coded block list again from the start, ending blocks + with a current token index of $\ti+1$, and so on, until $n$ blocks have been + ended. + +Tokens are read by parsing a Huffman code that depends on \ti\ and the color + plane of the next coded block whose current token index is equal to \ti, but + not greater. +The Huffman codebooks are selected on a per-frame basis from the 80 codebooks + defined in the setup header. +Many tokens have a fixed number of \term{extra bits} associated with them. +These bits are read from the packet immediately after the token is decoded. +These are used to define things such as coefficient magnitude, sign, and the + length of runs. + +\paragraph{DC Prediction} + +After the coefficients for each block are decoded, the quantized DC value of + each block is adjusted based on the DC values of its neighbors. +This adjustment is performed by scanning the blocks in raster order, not coded + block order. + +\paragraph{Reconstruction} + +Finally, using the coding mode, motion vector (if applicable), quantized + coefficient list, and \qi\ value defined for each block, all the coded blocks + are reconstructed. +The DCT coefficients are dequantized, an inverse DCT transform is applied, and + the predictor is formed from the coding mode and motion vector and added to + the result. + +\paragraph{Loop Filtering} + +To complete the reconstructed frame, an ``in-loop'' deblocking filter is + applied to the edges of all coded blocks. + + +\chapter{Video Formats} + +This section gives a precise description of the video formats that Theora is + capable of storing. +The Theora bitstream is capable of handling video at any arbitrary resolution + up to $1048560\times 1048560$. +Such video would require almost three terabytes of storage per frame for + uncompressed data, so compliant decoders MAY refuse to decode images with + sizes beyond their capabilities. +%TODO: What MUST a "compliant" decoder accept? +%TODO: What SHOULD a decoder use for an upper bound? (derive from total amount +%TODO: of memory and memory bandwidth) +%TODO: Any lower limits? +%TODO: We really need hardware device profiles, but such things should be +%TODO: developed with input from the hardware community. +%TODO: And even then sometimes they're useless + +The remainder of this section talks about two specific aspects of the video + format: the color space and the pixel format. +The first describes how color is represented and how to transform that color + representation into a device independent color space such as CIE $XYZ$ (1931). +The second describes the various schemes for sampling the color values in time + and space. + +\section{Color Space Conventions} + +There are a large number of different color standards used in digital video. +Since Theora is a lossy codec, it restricts itself to only a few of them to + simplify playback. +Unlike the alternate method of describing all the parameters of the color + model, this allows a few dedicated routines for color conversion to be written + and heavily optimized in a decoder. +More flexible conversion functions should instead be specified in an encoder, + where additional computational complexity is more easily tolerated. +The color spaces were selected to give a fair representation of color standards + in use around the world today. +Most of the standards that do not exactly match one of these can be converted + to one fairly easily. + +All Theora color spaces are $Y'C_bC_r$ color spaces with one luma channel and + two chroma channels. +Each channel contains 8-bit discrete values in the range $0\ldots255$, which + represent non-linear gamma pre-corrected signals. +The Theora identification header contains an 8-bit value that describes the + color space. +This merely selects one of the color spaces available from an enumerated list. +Currently, only two color spaces are defined, with a third possibility that + indicates the color space is ``unknown". + +\section{Color Space Conversions and Parameters} +\label{sec:color-xforms} + +The parameters which describe the conversions between each color space are + listed below. +These are the parameters needed to map colors from the encoded $Y'C_bC_r$ + representation to the device-independent color space CIE $XYZ$ (1931). +These parameters define abstract mathematical conversion functions which are + infinitely precise. +The accuracy and precision with which the conversions are performed in a real + system is determined by the quality of output desired and the available + processing power. +Exact decoder output is defined by this specification only in the original + $Y'C_bC_r$ space. + +\begin{description} +\item[$Y'C_bC_r$ to $Y'P_bP_r$:] +\vspace{\baselineskip}\hfill + +This conversion takes 8-bit discrete values in the range $[0\ldots255]$ and + maps them to real values in the range $[0\ldots1]$ for Y and + $[-\frac{1}{2}\ldots\frac{1}{2}]$ for $P_b$ and $P_r$. +Because some values may fall outside the offset and excursion defined for each + channel in the $Y'C_bC_r$ space, the results may fall outside these ranges in + $Y'P_bP_r$ space. +No clamping should be done at this stage. + +\begin{align} +Y'_\mathrm{out} & = + \frac{Y'_\mathrm{in}-\mathrm{Offset}_Y}{\mathrm{Excursion}_Y} \\ +P_b & = + \frac{C_b-\mathrm{Offset}_{C_b}}{\mathrm{Excursion}_{C_b}} \\ +P_r & = + \frac{C_r-\mathrm{Offset}_{C_r}}{\mathrm{Excursion}_{C_r}} +\end{align} + +Parameters: $\mathrm{Offset}_{Y,C_b,C_r}$, $\mathrm{Excursion}_{Y,C_b,C_r}$. + +\item[$Y'P_bP_r$ to $R'G'B'$:] +\vspace{\baselineskip}\hfill + +This conversion takes the one luma and two chroma channel representation and + maps it to the non-linear $R'G'B'$ space used to drive actual output devices. +Values should be clamped into the range $[0\ldots1]$ after this stage. + +\begin{align} +R' & = Y'+2(1-K_r)P_r \\ +G' & = Y'-2\frac{(1-K_b)K_b}{1-K_b-K_r}P_b-2\frac{(1-K_r)K_r}{1-K_b-K_r}P_r\\ +B' & = Y'+2(1-K_b)P_b +\end{align} + +Parameters: $K_b,K_r$. + +\item[$R'G'B'$ to $RGB$ (Output device gamma correction):] +\vspace{\baselineskip}\hfill + +This conversion takes the non-linear $R'G'B'$ voltage levels and maps them to + linear light levels produced by the actual output device. +Note that this conversion is only that of the output device, and its inverse is + {\em not} that used by the input device. +Because a dim viewing environment is assumed in most television standards, the + overall gamma between the input and output devices is usually around $1.1$ to + $1.2$, and not a strict $1.0$. + +For calibration with actual output devices, the model +\begin{align} +L & =(E'+\Delta)^\gamma +\end{align} + should be used, with $\Delta$ the free parameter and $\gamma$ held fixed to + the value specified in this document. +The conversion function presented here is an idealized version with $\Delta=0$. + +\begin{align} +R & = R'^\gamma \\ +G & = G'^\gamma \\ +B & = B'^\gamma +\end{align} + +Parameters: $\gamma$. + +\item[$RGB$ to $R'G'B'$ (Input device gamma correction):] +\vspace{\baselineskip}\hfill + +%TODO: Tag section as non-normative + +This conversion takes linear light levels and maps them to the non-linear + voltage levels produced in the actual input device. +This information is merely informative. +It is not required for building a decoder or for converting between the various + formats and the actual output capabilities of a particular device. + +A linear segment is introduced on the low end to reduce noise in dark areas of + the image. +The rest of the scale is adjusted so that the power segment of the curve + intersects the linear segment with the proper slope, and so that it still maps + 0 to 0 and 1 to 1. + +\begin{align} +R' & = \left\{ +\begin{array}{ll} +\alpha R, & 0\le R<\delta \\ +(1+\epsilon)R^\beta-\epsilon, & \delta\le R\le1 +\end{array}\right. \\ +G' & = \left\{ +\begin{array}{ll} +\alpha G, & 0\le G<\delta \\ +(1+\epsilon)G^\beta-\epsilon, & \delta\le G\le1 +\end{array}\right. \\ +B' & = \left\{ +\begin{array}{ll} +\alpha B, & 0\le B<\delta \\ +(1+\epsilon)B^\beta-\epsilon, & \delta\le B\le1 +\end{array}\right. +\end{align} + +Parameters: $\beta$, $\alpha$, $\delta$, $\epsilon$. + +\item[$RGB$ to CIE $XYZ$ (1931):] +\vspace{\baselineskip}\hfill + +This conversion maps a device-dependent linear RGB space to the + device-independent linear CIE $XYZ$ space. +The parameters are the CIE chromaticity coordinates of the three + primaries---red, green, and blue---as well as the chromaticity coordinates + of the white point of the device. +This is how hardware manufacturers and standards typically describe a + particular $RGB$ space. +The math required to convert these parameters into a useful transformation + matrix is reproduced below. + +\begin{align} +F & = +\left[\begin{array}{ccc} +\frac{x_r}{y_r} & \frac{x_g}{y_g} & \frac{x_b}{y_b} \\ +1 & 1 & 1 \\ +\frac{1-x_r-y_r}{y_r} & \frac{1-x_g-y_g}{y_g} & \frac{1-x_b-y_b}{y_b} +\end{array}\right] \\ +\left[\begin{array}{c} +s_r \\ +s_g \\ +s_b +\end{array}\right] & = +F^{-1}\left[\begin{array}{c} +\frac{x_w}{y_w} \\ +1 \\ +\frac{1-x_w-y_w}{y_w} +\end{array}\right] \\ +\left[\begin{array}{c} +X \\ +Y \\ +Z +\end{array}\right] & = +F\left[\begin{array}{c} +s_rR \\ +s_gG \\ +s_bB +\end{array}\right] +\end{align} +Parameters: $x_r,x_g,x_b,x_w, y_r,y_g,y_b,y_w$. + +\end{description} + +\section{Available Color Spaces} +\label{sec:colorspaces} + +These are the color spaces currently defined for use by Theora video. +Each one has a short name, with which it is referred to in this document, and + a more detailed specification of the standards from which its parameters are + derived. +Some standards do not specify all the parameters necessary. +For these unspecified parameters, this document serves as the definition of + what should be used when encoding or decoding Theora video. + +\subsection{Rec.~470M (Rec.~ITU-R~BT.470-6 System M/NTSC with + Rec.~ITU-R~BT.601-5)} +\label{sec:470m} + +This color space is used by broadcast television and DVDs in much of the + Americas, Japan, Korea, and the Union of Myanmar \cite{rec470}. +This color space may also be used for System M/PAL (Brazil), with an + appropriate conversion supplied by the encoder to compensate for the + different gamma value. +See Section~\ref{sec:470bg} for an appropriate gamma value to assume for M/PAL + input. + +In the US, studio monitors are adjusted to a D65 white point + ($x_w,y_w=0.313,0.329$). +In Japan, studio monitors are adjusted to a D white of 9300K + ($x_w,y_w=0.285,0.293$). + +Rec.~470 does not specify a digital encoding of the color signals. +For Theora, Rec.~ITU-R~BT.601-5 \cite{rec601} is used, starting from the + $R'G'B'$ signals specified by Rec.~470. + +Rec.~470 does not specify an input gamma function. +For Theora, the Rec.~709 \cite{rec709} input function is assumed. +This is the same as that specified by SMPTE 170M \cite{smpte170m}, which claims + to reflect modern practice in the creation of NTSC signals circa 1994. + +The parameters for all the color transformations defined in + Section~\ref{sec:color-xforms} are given in Table~\ref{tab:470m}. + +\begin{table}[htb] +\begin{align*} +\mathrm{Offset}_{Y,C_b,C_r} & = (16, 128, 128) \\ +\mathrm{Excursion}_{Y,C_b,C_r} & = (219, 224, 224) \\ +K_r & = 0.299 \\ +K_b & = 0.114 \\ +\gamma & = 2.2 \\ +\beta & = 0.45 \\ +\alpha & = 4.5 \\ +\delta & = 0.018 \\ +\epsilon & = 0.099 \\ +x_r,y_r & = 0.67, 0.33 \\ +x_g,y_g & = 0.21, 0.71 \\ +x_b,y_b & = 0.14, 0.08 \\ +\text{(Illuminant C) } x_w,y_w & = 0.310, 0.316 \\ +\end{align*} +\caption{Rec.~470M Parameters} +\label{tab:470m} +\end{table} + +\subsection{Rec.~470BG (Rec.~ITU-R~BT.470-6 Systems B and G with + Rec.~ITU-R~BT.601-5)} +\label{sec:470bg} + +This color space is used by the PAL and SECAM systems in much of the rest of + the world \cite{rec470} +This can be used directly by systems (B, B1, D, D1, G, H, I, K, N)/PAL and (B, + D, G, H, K, K1, L)/SECAM\@. + +\begin{verse} +{\bf Note:} the Rec.~470BG chromaticity values are different from those + specified in Rec.~470M\@. +When PAL and SECAM systems were first designed, they were based upon the same + primaries as NTSC\@. +However, as methods of making color picture tubes have changed, the primaries + used have changed as well. +The U.S. recommends using correction circuitry to approximate the existing, + standard NTSC primaries. +Current PAL and SECAM systems have standardized on primaries in accord with + more recent technology. +\end{verse} + +Rec.~470 provisionally permits the use of the NTSC chromaticity values (given + in Section~\ref{sec:470m}) with legacy PAL and SECAM equipment. +In Theora, material must be decoded assuming the new PAL and SECAM primaries. +Material intended for display on old legacy devices should be converted by the + decoder. + +The official Rec.~470BG specifies a gamma value of $\gamma=2.8$. +However, in practice this value is unrealistically high \cite{Poyn97}. +Rec.~470BG states that the overall system gamma should be approximately + $\gamma\beta=1.2$. +Since most cameras pre-correct with a gamma value of $\beta=0.45$, + this suggests an output device gamma of approximately $\gamma=2.67$. +This is the value recommended for use with PAL systems in Theora. + +Rec.~470 does not specify a digital encoding of the color signals. +For Theora, Rec.~ITU-R~BT.601-5 \cite{rec601} is used, starting from the + $R'G'B'$ signals specified by Rec.~470. + +Rec.~470 does not specify an input gamma function. +For Theora, the Rec 709 \cite{rec709} input function is assumed. + +The parameters for all the color transformations defined in + Section~\ref{sec:color-xforms} are given in Table~\ref{tab:470bg}. + +\begin{table}[htb] +\begin{align*} +\mathrm{Offset}_{Y,C_b,C_r} & = (16, 128, 128) \\ +\mathrm{Excursion}_{Y,C_b,C_r} & = (219, 224, 224) \\ +K_r & = 0.299 \\ +K_b & = 0.114 \\ +\gamma & = 2.67 \\ +\beta & = 0.45 \\ +\alpha & = 4.5 \\ +\delta & = 0.018 \\ +\epsilon & = 0.099 \\ +x_r,y_r & = 0.64, 0.33 \\ +x_g,y_g & = 0.29, 0.60 \\ +x_b,y_b & = 0.15, 0.06 \\ +\text{(D65) } x_w,y_w & = 0.313, 0.329 \\ +\end{align*} +\caption{Rec.~470BG Parameters} +\label{tab:470bg} +\end{table} + +\section{Pixel Formats} +\label{sec:pixfmts} + +Theora supports several different pixel formats, each of which uses different + subsampling for the chroma planes relative to the luma plane. +A decoder may need to recover a full resolution chroma plane with samples + co-sited with the luma plane in order to convert to RGB for display or perform + other processing. +Decoders can assume that the chroma signal satisfies the Nyquist-Shannon + sampling theorem. +The ideal low-pass reconstruction filter this implies is not practical, but any + suitable approximation can be used, depending on the available computing + power. +Decoders MAY simply use a box filter, assigning to each luma sample the chroma + sample closest to it. +Encoders would not go wrong in assuming that this will be the most common + approach. + +\subsection{4:4:4 Subsampling} +\label{sec:444} + +All three color planes are stored at full resolution---each pixel has a $Y'$, + a $C_b$ and a $C_r$ value (see Figure~\ref{fig:pixel444}). +The samples in the different planes are all at co-located sites. + +\begin{figure}[htbp] +\begin{center} +\includegraphics{pixel444} +\end{center} +\caption{Pixels encoded 4:4:4} +\label{fig:pixel444} +\end{figure} + +% Figure. +%YRB YRB +% +% +% +%YRB YRB +% +% +% + + +\subsection{4:2:2 Subsampling} +\label{sec:422} + +The $C_b$ and $C_r$ planes are stored with half the horizontal resolution of + the $Y'$ plane. +Thus, each of these planes has half the number of horizontal blocks as the luma + plane (see Figure~\ref{fig:pixel422}). +Similarly, they have half the number of horizontal super blocks, rounded up. +Macro blocks are defined across color planes, and so their number does not + change, but each macro block contains half as many chroma blocks. + +The chroma samples are vertically aligned with the luma samples, but + horizontally centered between two luma samples. +Thus, each luma sample has a unique closest chroma sample. +A horizontal phase shift may be required to produce signals which use different + horizontal chroma sampling locations for compatibility with different systems. + +\begin{figure}[htbp] +\begin{center} +\includegraphics{pixel422} +\end{center} +\caption{Pixels encoded 4:2:2} +\label{fig:pixel422} +\end{figure} + +% Figure. +%Y RB Y Y RB Y +% +% +% +%Y RB Y Y RB Y +% +% +% + +\subsection{4:2:0 Subsampling} +\label{sec:420} + +The $C_b$ and $C_r$ planes are stored with half the horizontal and half the + vertical resolution of the $Y'$ plane. +Thus, each of these planes has half the number of horizontal blocks and half + the number of vertical blocks as the luma plane, for a total of one quarter + the number of blocks (see Figure~\ref{fig:pixel420}). +Similarly, they have half the number of horizontal super blocks and half the + number of vertical super blocks, rounded up. +Macro blocks are defined across color planes, and so their number does not + change, but each macro block contains within it one quarter as many + chroma blocks. + +The chroma samples are vertically and horizontally centered between four luma + samples. +Thus, each luma sample has a unique closest chroma sample. +This is the same sub-sampling pattern used with JPEG, MJPEG, and MPEG-1, and + was inherited from VP3. +A horizontal or vertical phase shift may be required to produce signals which + use different chroma sampling locations for compatibility with different + systems. + +\begin{figure}[htbp] +\begin{center} +\includegraphics{pixel420} +\end{center} +\caption{Pixels encoded 4:2:0} +\label{fig:pixel420} +\end{figure} + +% Figure. +%Y Y Y Y +% +% RB RB +% +%Y Y Y Y +% +% +% +%Y Y Y Y +% +% RB RB +% +%Y Y Y Y +% +% +% + +\subsection{Subsampling and the Picture Region} + +Although the frame size must be an integral number of macro blocks, and thus + both the number of pixels and the number of blocks in each direction must be + even, no such requirement is made of the picture region. +Thus, when using subsampled pixel formats, careful attention must be paid to + which chroma samples correspond to which luma samples. + +As mentioned above, for each pixel format, there is a unique chroma sample that + is the closest to each luma sample. +When cropping the chroma planes to the picture region, all the chroma samples + corresponding to a luma sample in the cropped picture region must be included. +Thus, when dividing the width or height of the picture region by two to obtain + the size of the subsampled chroma planes, they must be rounded up. + +Furthermore, the sampling locations are defined relative to the frame, + {\em not} the picture region. +When using the 4:2:2 and 4:2:0 formats, the locations of chroma samples + relative to the luma samples depends on whether or not the X offset of the + picture region is odd. +If the offset is even, each column of chroma samples corresponds to two columns + of luma samples (see Figure~\ref{fig:pic_even} for an example). +The only exception is if the width is odd, in which case the last column + corresponds to only one column of luma samples (see Figure~\ref{fig:pic_even_odd}). +If the offset is odd, then the first column of chroma samples corresponds to + only one column of luma samples, while the remaining columns each correspond + to two (see Figure~\ref{fig:pic_odd}). +In this case, if the width is even, the last column again corresponds to only + one column of luma samples (see Figure~\ref{fig:pic_odd_even}). + +A similar process is followed with the rows of a picture region of odd height + encoded in the 4:2:0 format. +If the Y offset is even, each row of chroma samples corresponds to two rows of + luma samples (see Figure~\ref{fig:pic_even}), except with an odd height, where + the last row corresponds to one row of chroma luna samples only (see + Figure~\ref{fig:pic_even_odd}). +If the offset is odd, then it is the first row of chroma samples which + corresponds to only one row of luma samples, while the remaining rows each + correspond to two (Figure~\ref{fig:pic_odd}), except with an even height, + where the last row also corresponds to one (Figure~\ref{fig:pic_odd_even}). + +Encoders should be aware of these differences in the subsampling when using an + even or odd offset. +In the typical case, with an even width and height, where one expects two rows + or columns of luma samples for every row or column of chroma samples, the + encoder must take care to ensure that the offsets used are both even. + +\begin{figure}[htbp] +\begin{center} +\includegraphics[width=\textwidth]{pic_even} +\end{center} +\caption{Pixel correspondence between color planes with even picture + offset and even picture size} +\label{fig:pic_even} +\end{figure} + +\begin{figure}[htbp] +\begin{center} +\includegraphics[width=\textwidth]{pic_even_odd} +\end{center} +\caption{Pixel correspondence with even picture offset and + odd picture size} +\label{fig:pic_even_odd} +\end{figure} + +\begin{figure}[htbp] +\begin{center} +\includegraphics[width=\textwidth]{pic_odd} +\end{center} +\caption{Pixel correspondence with odd picture offset and + odd picture size} +\label{fig:pic_odd} +\end{figure} + +\begin{figure}[htbp] +\begin{center} +\includegraphics[width=\textwidth]{pic_odd_even} +\end{center} +\caption{Pixel correspondence with odd picture offset and + even picture size} +\label{fig:pic_odd_even} +\end{figure} + + +\chapter{Bitpacking Convention} +\label{sec:bitpacking} + +\section{Overview} + +The Theora codec uses relatively unstructured raw packets containing + binary integer fields of arbitrary width. +Logically, each packet is a bitstream in which bits are written one-by-one by + the encoder and then read one-by-one in the same order by the decoder. +Most current binary storage arrangements group bits into a native storage unit + of eight bits (octets), sixteen bits, thirty-two bits, or less commonly other + fixed sizes. +The Theora bitpacking convention specifies the correct mapping of the logical + packet bitstream into an actual representation in fixed-width units. + +\subsection{Octets and Bytes} + +In most contemporary architectures, a `byte' is synonymous with an `octect', + that is, eight bits. +For purposes of the bitpacking convention, a byte implies the smallest native + integer storage representation offered by a platform. +Modern file systems invariably offer bytes as the fundamental atom of storage. + +The most ubiquitous architectures today consider a `byte' to be an octet. +Note, however, that the Theora bitpacking convention is still well defined for + any native byte size; an implementation can use the native bit-width of a + given storage system. +This document assumes that a byte is one octet for purposes of example only. + +\subsection{Words and Byte Order} + +A `word' is an integer size that is a grouped multiple of the byte size. +Most architectures consider a word to be a group of two, four, or eight bytes. +Each byte in the word can be ranked by order of `significance', e.g.\ the + significance of the bits in each byte when storing a binary integer in the + word. +Several byte orderings are possible in a word. +The common ones are +\begin{itemize} +\item{Big-endian:} +in which the most significant byte comes first, e.g.\ 3-2-1-0, +\item{Little-endian:} +in which the least significant byte comes first, e.g.\ 0-1-2-3, and +\item{Mixed-endian:} +one of the less-common orderings that cannot be put into the above two + categories, e.g.\ 3-1-2-0 or 0-2-1-3. +\end{itemize} + +The Theora bitpacking convention specifies storage and bitstream manipulation + at the byte, not word, level. +Thus host word ordering is of a concern only during optimization, when writing + code that operates on a word of storage at a time rather than a byte. +Logically, bytes are always encoded and decoded in order from byte zero through + byte $n$. + +\subsection{Bit Order} + +A byte has a well-defined `least significant' bit (LSb), which is the only bit + set when the byte is storing the two's complement integer value $+1$. +A byte's `most significant' bit (MSb) is at the opposite end. +Bits in a byte are numbered from zero at the LSb to $n$ for the MSb, where + $n=7$ in an octet. + +\section{Coding Bits into Bytes} + +The Theora codec needs to encode arbitrary bit-width integers from zero to 32 + bits wide into packets. +These integer fields are not aligned to the boundaries of the byte + representation; the next field is read at the bit position immediately + after the end of the previous field. + +The decoder logically unpacks integers by first reading the MSb of a binary + integer from the logical bitstream, followed by the next most significant + bit, etc., until the required number of bits have been read. +When unpacking the bytes into bits, the decoder begins by reading the MSb of + the integer to be read from the most significant unread bit position of the + source byte, followed by the next-most significant bit position of the + destination integer, and so on up to the requested number of bits. +Note that this differs from the Vorbis I codec, which + begins decoding with the LSb of the source integer, reading it from the + LSb of the source byte. +When all the bits of the current source byte are read, decoding continues with + the MSb of the next byte. +Any unfilled bits in the last byte of the packet MUST be cleared to zero by the + encoder. + +\subsection{Signedness} + +The binary integers decoded by the above process may be either signed or + unsigned. +This varies from integer to integer, and this specification + indicates how each value should be interpreted as it is read. +That is, depending on context, the three bit binary pattern \bin{111} can be + taken to represent either `$7$' as an unsigned integer or `$-1$' as a signed, + two's complement integer. + +\subsection{Encoding Example} + +The following example shows the state of an (8-bit) byte stream after several + binary integers are encoded, including the location of the put pointer for the + next bit to write to and the total length of the stream in bytes. + +Encode the 4 bit unsigned integer value `12' (\bin{1100}) into an empty byte + stream. + +\begin{tabular}{r|ccccccccl} +\multicolumn{1}{r}{}& &&&&$\downarrow$&&&& \\ + & 7 & 6 & 5 & 4 & 3 & 2 & 1 & 0 & \\\cline{1-9} +byte 0 & \textbf{1} & \textbf{1} & \textbf{0} & \textbf{0} & + 0 & 0 & 0 & 0 & $\leftarrow$ \\ +byte 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & \\ +byte 2 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & \\ +byte 3 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & \\ +\multicolumn{1}{c|}{$\vdots$}&\multicolumn{8}{c}{$\vdots$}& \\ +byte $n$ & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & +byte stream length: 1 byte +\end{tabular} +\vspace{\baselineskip} + +Continue by encoding the 3 bit signed integer value `-1' (\bin{111}). + +\begin{tabular}{r|ccccccccl} +\multicolumn{1}{r}{} &&&&&&&&$\downarrow$& \\ + & 7 & 6 & 5 & 4 & 3 & 2 & 1 & 0 & \\\cline{1-9} +byte 0 & \textbf{1} & \textbf{1} & \textbf{0} & \textbf{0} & + \textbf{1} & \textbf{1} & \textbf{1} & 0 & $\leftarrow$ \\ +byte 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & \\ +byte 2 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & \\ +byte 3 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & \\ +\multicolumn{1}{c|}{$\vdots$}&\multicolumn{8}{c}{$\vdots$}& \\ +byte $n$ & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & +byte stream length: 1 byte +\end{tabular} +\vspace{\baselineskip} + +Continue by encoding the 7 bit integer value `17' (\bin{0010001}). + +\begin{tabular}{r|ccccccccl} +\multicolumn{1}{r}{} &&&&&&&$\downarrow$&& \\ + & 7 & 6 & 5 & 4 & 3 & 2 & 1 & 0 & \\\cline{1-9} +byte 0 & \textbf{1} & \textbf{1} & \textbf{0} & \textbf{0} & + \textbf{1} & \textbf{1} & \textbf{1} & \textbf{0} & \\ +byte 1 & \textbf{0} & \textbf{1} & \textbf{0} & \textbf{0} & + \textbf{0} & \textbf{1} & 0 & 0 & $\leftarrow$ \\ +byte 2 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & \\ +byte 3 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & \\ +\multicolumn{1}{c|}{$\vdots$}&\multicolumn{8}{c}{$\vdots$}& \\ +byte $n$ & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & +byte stream length: 2 bytes +\end{tabular} +\vspace{\baselineskip} + +Continue by encoding the 13 bit integer value `6969' (\bin{11011\ 00111001}). + +\begin{tabular}{r|ccccccccl} +\multicolumn{1}{r}{} &&&&$\downarrow$&&&&& \\ + & 7 & 6 & 5 & 4 & 3 & 2 & 1 & 0 & \\\cline{1-9} +byte 0 & \textbf{1} & \textbf{1} & \textbf{0} & \textbf{0} & + \textbf{1} & \textbf{1} & \textbf{1} & \textbf{0} & \\ +byte 1 & \textbf{0} & \textbf{1} & \textbf{0} & \textbf{0} & + \textbf{0} & \textbf{1} & \textbf{1} & \textbf{1} & \\ +byte 2 & \textbf{0} & \textbf{1} & \textbf{1} & \textbf{0} & + \textbf{0} & \textbf{1} & \textbf{1} & \textbf{1} & \\ +byte 3 & \textbf{0} & \textbf{0} & \textbf{1} & + 0 & 0 & 0 & 0 & 0 & $\leftarrow$ \\ +\multicolumn{1}{c|}{$\vdots$}&\multicolumn{8}{c}{$\vdots$}& \\ +byte $n$ & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & +byte stream length: 4 bytes +\end{tabular} +\vspace{\baselineskip} + +\subsection{Decoding Example} + +The following example shows the state of the (8-bit) byte stream encoded in the + previous example after several binary integers are decoded, including the + location of the get pointer for the next bit to read. + +Read a two bit unsigned integer from the example encoded above. + +\begin{tabular}{r|ccccccccl} +\multicolumn{1}{r}{} &&&$\downarrow$&&&&&& \\ + & 7 & 6 & 5 & 4 & 3 & 2 & 1 & 0 & \\\cline{1-9} +byte 0 & \textbf{1} & \textbf{1} & 0 & 0 & 1 & 1 & 1 & 0 & $\leftarrow$ \\ +byte 1 & 0 & 1 & 0 & 0 & 0 & 1 & 1 & 1 & \\ +byte 2 & 0 & 1 & 1 & 0 & 0 & 1 & 1 & 1 & \\ +byte 3 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & +byte stream length: 4 bytes +\end{tabular} +\vspace{\baselineskip} + +Value read: 3 (\bin{11}). + +Read another two bit unsigned integer from the example encoded above. + +\begin{tabular}{r|ccccccccl} +\multicolumn{1}{r}{} &&&&&$\downarrow$&&&& \\ + & 7 & 6 & 5 & 4 & 3 & 2 & 1 & 0 & \\\cline{1-9} +byte 0 & \textbf{1} & \textbf{1} & \textbf{0} & \textbf{0} & + 1 & 1 & 1 & 0 & $\leftarrow$ \\ +byte 1 & 0 & 1 & 0 & 0 & 0 & 1 & 1 & 1 & \\ +byte 2 & 0 & 1 & 1 & 0 & 0 & 1 & 1 & 1 & \\ +byte 3 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & +byte stream length: 4 bytes +\end{tabular} +\vspace{\baselineskip} + +Value read: 0 (\bin{00}). + +Two things are worth noting here. +\begin{itemize} +\item +Although these four bits were originally written as a single four-bit integer, + reading some other combination of bit-widths from the bitstream is well + defined. +No artificial alignment boundaries are maintained in the bitstream. +\item +The first value is the integer `$3$' only because the context stated we were + reading an unsigned integer. +Had the context stated we were reading a signed integer, the returned value + would have been the integer `$-1$'. +\end{itemize} + +\subsection{End-of-Packet Alignment} + +The typical use of bitpacking is to produce many independent byte-aligned + packets which are embedded into a larger byte-aligned container structure, + such as an Ogg transport bitstream. +Externally, each bitstream encoded as a byte stream MUST begin and end on a + byte boundary. +Often, the encoded packet bitstream is not an integer number of bytes, and so + there is unused space in the last byte of a packet. + +%r: I think the generality here is necessary to be consistent with our assertions +%r: elsewhere about being independent of transport and byte width +When a Theora encoder produces packets for embedding in a byte-aligned + container, unused space in the last byte of a packet is always zeroed during + the encoding process. +Thus, should this unused space be read, it will return binary zeroes. +There is no marker pattern or stuffing bits that will allow the decoder to + obtain the exact size, in bits, of the original bitstream. +This knowledge is not required for decoding. + +Attempting to read past the end of an encoded packet results in an + `end-of-packet' condition. +Any further read operations after an `end-of-packet' condition shall also + return `end-of-packet'. +Unlike Vorbis, Theora does not use truncated packets as a normal mode of + operation. +Therefore if a decoder encounters the `end-of-packet' condition during normal + decoding, it may attempt to use the bits that were read to recover as much of + encoded data as possible, signal a warning or error, or both. + +\subsection{Reading Zero Bit Integers} + +Reading a zero bit integer returns the value `$0$' and does not increment + the stream pointer. +Reading to the end of the packet, but not past the end, so that an + `end-of-packet' condition is not triggered, and then reading a zero bit + integer shall succeed, returning `$0$', and not trigger an `end-of-packet' + condition. +Reading a zero bit integer after a previous read sets the `end-of-packet' + condition shall fail, also returning `end-of-packet'. + +\chapter{Bitstream Headers} +\label{sec:headers} + +A Theora bitstream begins with three header packets. +The header packets are, in order, the identification header, the comment + header, and the setup header. +All are required for decode compliance. +An end-of-packet condition encountered while decoding the identification or + setup header packets renders the stream undecodable. +An end-of-packet condition encountered while decode the comment header is a + non-fatal error condition, and MAY be ignored by a decoder. + +\paragraph{VP3 Compatibility} + +VP3 relies on the headers provided by its container, usually either AVI or + Quicktime. +As such, several parameters available in these headers are not available to VP3 + streams. +These are indicated as they appear in the sections below. + +\section{Common Header Decode} +\label{sub:common-header} + +\begin{figure}[H] +\begin{center} +\begin{verbatim} + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | header type | `t' | `h' | `e' | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | `o' | `r' | `a' | data... | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | ... header-specific data ... | + | ... | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +\end{verbatim} +\end{center} +\caption{Common Header Packet Layout} +\label{fig:commonheader} +\end{figure} + + +\paragraph{Input parameters:} None. + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{HEADERTYPE} & Integer & 8 & No & The type of the header being + decoded. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:} None. +\medskip + +Each header packet begins with the same header fields, which are decoded as + follows: + +\begin{enumerate} +\item +Read an 8-bit unsigned integer as \bitvar{HEADERTYPE}. +If the most significant bit of this integer is not set, then stop. +This is not a header packet. +\item +Read 6 8-bit unsigned integers. +If these do not have the values \hex{74}, \hex{68}, \hex{65}, \hex{6F}, + \hex{72}, and \hex{61}, respectively, then stop. +This stream is not decodable by this specification. +These values correspond to the ASCII values of the characters `t', `h', `e', + `o', `r', and `a'. +\end{enumerate} + +Decode continues according to \bitvar{HEADERTYPE}. +The identification header is type \hex{80}, the comment header is type + \hex{81}, and the setup header is type \hex{82}. +These packets must occur in the order: identification, comment, setup. +%r: I clarified the initial-bit scheme here +%TBT: Dashes let the reader know they'll have to pick up the rest of the +%TBT: sentence after the explanatory phrase. +%TBT: Otherwise it just sounds like the bit must exist. +All header packets have the most significant bit of the type + field---which is the initial bit in the packet---set. +This distinguishes them from video data packets in which the first bit + is unset. +% extra header packets are a feature Dan argued for way back when for +% backward-compatible extensions (and icc colourspace for example) +% I think it's reasonable +%TBT: You can always just stick more stuff in the setup header. +Packets with other header types (\hex{83}--\hex{FF}) are reserved and MUST be + ignored. + +\section{Identification Header Decode} +\label{sec:idheader} + +\begin{figure}[H] +\begin{center} +\begin{verbatim} + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | 0x80 | `t' | `h' | `e' | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | `o' | `r' | `a' | VMAJ | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | VMIN | VREV | FMBW | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | FMBH | PICW... | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | ...PICW | PICH | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | PICX | PICY | FRN... | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | ...FRN | FRD... | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | ...FRD | PARN... | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | ...PARN | PARD | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | CS | NOMBR | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | QUAL | KFGSHIFT| PF| Res | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +\end{verbatim} +\end{center} +\caption{Identification Header Packet} +\label{fig:idheader} +\end{figure} + +\paragraph{Input parameters:} None. + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{VMAJ} & Integer & 8 & No & The major version number. \\ +\bitvar{VMIN} & Integer & 8 & No & The minor version number. \\ +\bitvar{VREV} & Integer & 8 & No & The version revision number. \\ +\bitvar{FMBW} & Integer & 16 & No & The width of the frame in macro + blocks. \\ +\bitvar{FMBH} & Integer & 16 & No & The height of the frame in macro + blocks. \\ +\bitvar{NSBS} & Integer & 32 & No & The total number of super blocks in a + frame. \\ +\bitvar{NBS} & Integer & 36 & No & The total number of blocks in a + frame. \\ +\bitvar{NMBS} & Integer & 32 & No & The total number of macro blocks in a + frame. \\ +\bitvar{PICW} & Integer & 20 & No & The width of the picture region in + pixels. \\ +\bitvar{PICH} & Integer & 20 & No & The height of the picture region in + pixels. \\ +\bitvar{PICX} & Integer & 8 & No & The X offset of the picture region in + pixels. \\ +\bitvar{PICY} & Integer & 8 & No & The Y offset of the picture region in + pixels. \\ +\bitvar{FRN} & Integer & 32 & No & The frame-rate numerator. \\ +\bitvar{FRD} & Integer & 32 & No & The frame-rate denominator. \\ +\bitvar{PARN} & Integer & 24 & No & The pixel aspect-ratio numerator. \\ +\bitvar{PARD} & Integer & 24 & No & The pixel aspect-ratio denominator. \\ +\bitvar{CS} & Integer & 8 & No & The color space. \\ +\bitvar{PF} & Integer & 2 & No & The pixel format. \\ +\bitvar{NOMBR} & Integer & 24 & No & The nominal bitrate of the stream, in + bits per second. \\ +\bitvar{QUAL} & Integer & 6 & No & The quality hint. \\ +\bitvar{KFGSHIFT} & Integer & 5 & No & The amount to shift the key frame + number by in the granule position. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:} None. +\medskip + +The identification header is a short header with only a few fields used to + declare the stream definitively as Theora and provide detailed information + about the format of the fully decoded video data. +The identification header is decoded as follows: + +\begin{enumerate} +\item +Decode the common header fields according to the procedure described in + Section~\ref{sub:common-header}. +If \bitvar{HEADERTYPE} returned by this procedure is not \hex{80}, then stop. +This packet is not the identification header. +\item +Read an 8-bit unsigned integer as \bitvar{VMAJ}. +If \bitvar{VMAJ} is not $3$, then stop. +This stream is not decodable according to this specification. +\item +Read an 8-bit unsigned integer as \bitvar{VMIN}. +If \bitvar{VMIN} is not $2$, then stop. +This stream is not decodable according to this specification. +\item +Read an 8-bit unsigned integer as \bitvar{VREV}. +If \bitvar{VREV} is greater than $1$, then this stream +may contain optional features or interpretational changes +documented in a future version of this specification. +Regardless of the value of \bitvar{VREV}, the stream is decodable +according to this specification. +\item +Read a 16-bit unsigned integer as \bitvar{FMBW}. +This MUST be greater than zero. +This specifies the width of the coded frame in macro blocks. +The actual width of the frame in pixels is $\bitvar{FMBW}*16$. +\item +Read a 16-bit unsigned integer as \bitvar{FMBH}. +This MUST be greater than zero. +This specifies the height of the coded frame in macro blocks. +The actual height of the frame in pixels is $\bitvar{FMBH}*16$. +\item +Read a 24-bit unsigned integer as \bitvar{PICW}. +This MUST be no greater than $(\bitvar{FMBW}*16)$. +Note that 24 bits are read, even though only 20 bits are sufficient to specify + any value of the picture width. +This is done to preserve octet alignment in this header, to allow for a + simplified parser implementation. +\item +Read a 24-bit unsigned integer as \bitvar{PICH}. +This MUST be no greater than $(\bitvar{FMBH}*16)$. +Together with \bitvar{PICW}, this specifies the size of the displayable picture + region within the coded frame. +See Figure~\ref{fig:pic-frame}. +Again, 24 bits are read instead of 20. +\item +Read an 8-bit unsigned integer as \bitvar{PICX}. +This MUST be no greater than $(\bitvar{FMBW}*16-\bitvar{PICX})$. +\item +Read an 8-bit unsigned integer as \bitvar{PICY}. +This MUST be no greater than $(\bitvar{FMBH}*16-\bitvar{PICY})$. +Together with \bitvar{PICX}, this specifies the location of the lower-left + corner of the displayable picture region. +See Figure~\ref{fig:pic-frame}. +\item +Read a 32-bit unsigned integer as \bitvar{FRN}. +This MUST be greater than zero. +\item +Read a 32-bit unsigned integer as \bitvar{FRD}. +This MUST be greater than zero. +Theora is a fixed-frame rate video codec. +Frames are sampled at the constant rate of $\frac{\bitvar{FRN}}{\bitvar{FRD}}$ + frames per second. +The presentation time of the first frame is at zero seconds. +No mechanism is provided to specify a non-zero offset for the initial + frame. +\item +Read a 24-bit unsigned integer as \bitvar{PARN}. +\item +Read a 24-bit unsigned integer as \bitvar{PARD}. +Together with \bitvar{PARN}, these specify the aspect ratio of the pixels + within a frame, defined as the ratio of the physical width of a pixel to its + physical height. +This is given by the ratio $\bitvar{PARN}:\bitvar{PARD}$. +If either of these fields are zero, this indicates that pixel aspect ratio + information was not available to the encoder. +In this case it MAY be specified by the application via an external means, or + a default value of $1:1$ MAY be used. +\item +Read an 8-bit unsigned integer as \bitvar{CS}. +This is a value from an enumerated list of the available color spaces, given in + Table~\ref{tab:colorspaces}. +The `Undefined' value indicates that color space information was not available + to the encoder. +It MAY be specified by the application via an external means. +If a reserved value is given, a decoder MAY refuse to decode the stream. +\begin{table}[htbp] +\begin{center} +\begin{tabular*}{215pt}{cl@{\extracolsep{\fill}}c}\toprule +Value & Color Space \\\midrule +$0$ & Undefined. \\ +$1$ & Rec.~470M (see Section~\ref{sec:470m}). \\ +$2$ & Rec.~470BG (see Section~\ref{sec:470bg}). \\ +$3$ & Reserved. \\ +$\vdots$ & \\ +$255$ & \\ +\bottomrule\end{tabular*} +\end{center} +\caption{Enumerated List of Color Spaces} +\label{tab:colorspaces} +\end{table} +\item +Read a 24-bit unsigned integer as \bitvar{NOMBR} signifying a rate in bits +per second. Rates equal to or greater than $2^{24}-1$ bits per second are +represented as $2^{24}-1$. +The \bitvar{NOMBR} field is used only as a hint. +For pure VBR streams, this value may be considerably off. +The field MAY be set to zero to indicate that the encoder did not care to +speculate. +\item +Read a 6-bit unsigned integer as \bitvar{QUAL}. +This value is used to provide a hint as to the relative quality of the stream + when compared to others produced by the same encoder. +Larger values indicate higher quality. +This can be used, for example, to select among several streams containing the + same material encoded with different settings. +\item +Read a 5-bit unsigned integer as \bitvar{KFGSHIFT}. +The \bitvar{KFGSHIFT} is used to partition the granule position associated with + each packet into two different parts. +The frame number of the last key frame, starting from zero, is stored in the + upper $64-\bitvar{KFGSHIFT}$ bits, while the lower \bitvar{KFGSHIFT} bits + contain the number of frames since the last keyframe. +Complete details on the granule position mapping are specified in Section~REF. +\item +Read a 2-bit unsigned integer as \bitvar{PF}. +The \bitvar{PF} field contains a value from an enumerated list of the available + pixel formats, given in Table~\ref{tab:pixel-formats}. +If the reserved value $1$ is given, stop. +This stream is not decodable according to this specification. + +\begin{table}[htbp] +\begin{center} +\begin{tabular*}{215pt}{cl@{\extracolsep{\fill}}c}\toprule +Value & Pixel Format \\\midrule +$0$ & 4:2:0 (see Section~\ref{sec:420}). \\ +$1$ & Reserved. \\ +$2$ & 4:2:2 (see Section~\ref{sec:422}). \\ +$3$ & 4:4:4 (see Section~\ref{sec:444}). \\ +\bottomrule\end{tabular*} +\end{center} +\caption{Enumerated List of Pixel Formats} +\label{tab:pixel-formats} +\end{table} + +\item +Read a 3-bit unsigned integer. +These bits are reserved. +If this value is not zero, then stop. +This stream is not decodable according to this specification. +\item +Assign \bitvar{NSBS} a value according to \bitvar{PF}, as given by + Table~\ref{tab:nsbs-for-pf}. + +\begin{table}[bt] +\begin{center} +\begin{tabular}{cc}\toprule +\bitvar{PF} & \bitvar{NSBS} \\\midrule +$0$ & $\begin{aligned} +&((\bitvar{FMBW}+1)//2)*((\bitvar{FMBH}+1)//2)\\ +& +2*((\bitvar{FMBW}+3)//4)*((\bitvar{FMBH}+3)//4) +\end{aligned}$ \\\midrule +$2$ & $\begin{aligned} +&((\bitvar{FMBW}+1)//2)*((\bitvar{FMBH}+1)//2)\\ +& +2*((\bitvar{FMBW}+3)//4)*((\bitvar{FMBH}+1)//2) +\end{aligned}$ \\\midrule +$3$ & $3*((\bitvar{FMBW}+1)//2)*((\bitvar{FMBH}+1)//2)$ \\ +\bottomrule\end{tabular} +\end{center} +\caption{Number of Super Blocks for each Pixel Format} +\label{tab:nsbs-for-pf} +\end{table} + +\item +Assign \bitvar{NBS} a value according to \bitvar{PF}, as given by + Table~\ref{tab:nbs-for-pf}. + +\begin{table}[tb] +\begin{center} +\begin{tabular}{cc}\toprule +\bitvar{PF} & \bitvar{NBS} \\\midrule +$0$ & $6*\bitvar{FMBW}*\bitvar{FMBH}$ \\\midrule +$2$ & $8*\bitvar{FMBW}*\bitvar{FMBH}$ \\\midrule +$3$ & $12*\bitvar{FMBW}*\bitvar{FMBH}$ \\ +\bottomrule\end{tabular} +\end{center} +\caption{Number of Blocks for each Pixel Format} +\label{tab:nbs-for-pf} +\end{table} + +\item +Assign \bitvar{NMBS} the value $(\bitvar{FMBW}*\bitvar{FMBH})$. + +\end{enumerate} + +\paragraph{VP3 Compatibility} + +VP3 does not correctly handle frame sizes that are not a multiple of 16. +Thus, \bitvar{PICW} and \bitvar{PICH} should be set to the frame width and + height in pixels, respectively, and \bitvar{PICX} and \bitvar{PICY} should be + set to zero. +VP3 headers do not specify a color space. +VP3 only supports the 4:2:0 pixel format. + +\section{Comment Header} +\label{sec:commentheader} + +The Theora comment header is the second of three header packets that begin a + Theora stream. +It is meant for short text comments, not aribtrary metadata; arbitrary metadata + belongs in a separate logical stream that provides greater structure and + machine parseability. + +%r: I tried to morph this a little more in the direction of our +% application space +The comment field is meant to be used much like someone jotting a quick note on + the label of a video. +It should be a little information to remember the disc or tape by and explain it to + others; a short, to-the-point text note that can be more than a couple words, + but isn't going to be more than a short paragraph. +The essentials, in other words, whatever they turn out to be, e.g.: + +%TODO: Example + +The comment header is stored as a logical list of eight-bit clean vectors; the + number of vectors is bounded at $2^{32}-1$ and the length of each vector is + limited to $2^{32}-1$ bytes. +The vector length is encoded; the vector contents themselves are not null + terminated. +In addition to the vector list, there is a single vector for a vendor name, + also eight-bit clean with a length encoded in 32 bits. +%TODO: The 1.0 release of libtheora sets the vendor string to ... + +\subsection{Comment Length Decode} +\label{sub:comment-len} + +\begin{figure} +\begin{center} +\begin{tabular}{ | c | c | } + \hline + 4 byte length & + UTF-8 encoded string ...\\ + \hline +\end{tabular} +\end{center} +\caption{Length encoded string layout} +\label{fig:comment-len} +\end{figure} + +\paragraph{Input parameters:} None. + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{LEN} & Integer & 32 & No & A single 32-bit length value. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\locvar{LEN0} & Integer & 8 & No & The first octet of the string length. \\ +\locvar{LEN1} & Integer & 8 & No & The second octet of the string length. \\ +\locvar{LEN2} & Integer & 8 & No & The third octet of the string length. \\ +\locvar{LEN3} & Integer & 8 & No & The fourth octet of the string + length. \\ +\bottomrule\end{tabularx} +\medskip + +A single comment vector is decoded as follows: + +\begin{enumerate} +\item +Read an 8-bit unsigned integer as \locvar{LEN0}. +\item +Read an 8-bit unsigned integer as \locvar{LEN1}. +\item +Read an 8-bit unsigned integer as \locvar{LEN2}. +\item +Read an 8-bit unsigned integer as \locvar{LEN3}. +\item +Assign \bitvar{LEN} the value $(\locvar{LEN0}+(\locvar{LEN1}<<8)+ + (\locvar{LEN2}<<16)+(\locvar{LEN3}<<24))$. +This construction is used so that on platforms with 8-bit bytes, the memory + organization of the comment header is identical with that of Vorbis I, + allowing for common parsing code despite the different bit packing + conventions. +\end{enumerate} + +\subsection{Comment Header Decode} + +\begin{figure} +\begin{center} +\begin{tabular}{ | c | } + \hline + vendor string \\ \hline + number of comments \\ \hline + comment string \\ \hline + comment string \\ \hline + ... \\ + \hline +\end{tabular} +\end{center} +\caption{Comment Header Layout} +\label{fig:commentheader} +\end{figure} + +\paragraph{Input parameters:} None. + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{VENDOR} & \multicolumn{3}{l}{String} & The vendor string. \\ +\bitvar{NCOMMENTS} & Integer & 32 & No & The number of user + comments. \\ +\bitvar{COMMENTS} & \multicolumn{3}{l}{String Array} & A list of + \bitvar{NCOMMENTS} user comment values. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\locvar{\ci} & Integer & 32 & No & The index of the current user + comment. \\ +\bottomrule\end{tabularx} +\medskip + +The complete comment header is decoded as follows: + +\begin{enumerate} +\item +Decode the common header fields according to the procedure described in + Section~\ref{sub:common-header}. +If \bitvar{HEADERTYPE} returned by this procedure is not \hex{81}, then stop. +This packet is not the comment header. +\item +Decode the length of the vendor string using the procedure given in + Section~\ref{sub:comment-len} into \bitvar{LEN}. +\item +Read \bitvar{LEN} 8-bit unsigned integers. +\item +Set the string \bitvar{VENDOR} to the contents of these octets. +\item +Decode the number of user comments using the procedure given in + Section~\ref{sub:comment-len} into \bitvar{LEN}. +\item +Assign \bitvar{NCOMMENTS} the value stored in \bitvar{LEN}. +\item +For each consecutive value of \locvar{\ci} from $0$ to + $(\bitvar{NCOMMENTS}-1)$, inclusive: +\begin{enumerate} +\item +Decode the length of the current user comment using the procedure given in + Section~\ref{sub:comment-len} into \bitvar{LEN}. +\item +Read \bitvar{LEN} 8-bit unsigned integers. +\item +Set the string $\bitvar{COMMENTS}[\locvar{\ci}]$ to the contents of these + octets. +\end{enumerate} +\end{enumerate} + +The comment header comprises the entirety of the second header packet. +Unlike the first header packet, it is not generally the only packet on the + second page and may span multiple pages. +The length of the comment header packet is (practically) unbounded. +The comment header packet is not optional; it must be present in the stream + even if it is logically empty. + +%TODO: \paragraph{VP3 Compatibility} + +\subsection{User Comment Format} + +The user comment vectors are structured similarly to a UNIX environment + variable. +That is, comment fields consist of a field name and a corresponding value and + look like: +\begin{center} +\begin{tabular}{rcl} +$\bitvar{COMMENTS}[0]$ & = & ``TITLE=the look of Theora" \\ +$\bitvar{COMMENTS}[1]$ & = & ``DIRECTOR=me" +\end{tabular} +\end{center} + +The field name is case-insensitive and MUST consist of ASCII characters + \hex{20} through \hex{7D}, \hex{3D} (`=') excluded. +ASCII \hex{41} through \hex{5A} inclusive (characters `A'--`Z') are to be + considered equivalent to ASCII \hex{61} through \hex{7A} inclusive + (characters `a'--`z'). +An entirely empty field name---one that is zero characters long---is not + disallowed. + +The field name is immediately followed by ASCII \hex{3D} (`='); this equals + sign is used to terminate the field name. + +The data immediately after \hex{3D} until the end of the vector is the eight-bit + clean value of the field contents encoded as a UTF-8 string~\cite{rfc2044}. + +Field names MUST NOT be `internationalized'; this is a concession to + simplicity, not an attempt to exclude the majority of the world that doesn't + speak English. +Applications MAY wish to present internationalized versions of the standard + field names listed below to the user, but they are not to be stored in the + bitstream. +Field {\em contents}, however, use the UTF-8 character encoding to allow easy + representation of any language. + +Individual `vendors' MAY use non-standard field names within reason. +The proper use of comment fields as human-readable notes has already been + explained. +Abuse will be discouraged. + +There is no vendor-specific prefix to `non-standard' field names. +Vendors SHOULD make some effort to avoid arbitrarily polluting the common + namespace. +%"and other bodies"? +%If you're going to be that vague, you might as well not say anything at all. +Xiph.Org and other bodies will generally collect and rationalize the more + useful tags to help with standardization. + +Field names are not restricted to occur only once within a comment header. +%TODO: Example + +\paragraph{Field Names} + +%r should this be an appendix? + +Below is a proposed, minimal list of standard field names with a description of + their intended use. +No field names are mandatory; a comment header may contain one or more, all, or + none of the names in this list. + +\begin{description} +\item{TITLE:} Video name. +\item{ARTIST:} Filmmaker or other creator name. +\item{VERSION:} Subtitle, remix info, or other text distinguishing + versions of a video. +\item{DATE:} Date associated with the video. Implementations SHOULD attempt + to parse this field as an ISO 8601 date for machine interpretation and + conversion. +\item{LOCATION:} Location associated with the video. This is usually the + filming location for non-fiction works. +\item{COPYRIGHT:} Copyright statement. +\item{LICENSE:} Copyright and other licensing information. + Implementations wishing to do automatic parsing of e.g + of distribution terms SHOULD look here for a URL uniquely defining + the license. If no instance of this field is present, or if no + instance contains a parseable URL, and implementation MAY look + in the COPYRIGHT field for such a URL. +\item{ORGANIZATION:} Studio name, Publisher, or other organization + involved in the creation of the video. + +\item{DIRECTOR:} Director or Filmmaker credit, similar to ARTIST. +\item{PRODUCER:} Producer credit for the video. +\item{COMPOSER:} Music credit for the video. +\item{ACTOR:} Acting credit for the video. + +\item{TAG:} subject or category tag, keyword, or other content + classification labels. The value of each instance of this + field SHOULD be treated as a single label, with multiple + instances of the field for multiple tags. The value of + a single field SHOULD NOT be parsed into multiple tags + based on some internal delimeter. +\item{DESCRIPTION:} General description, summary, or blurb. +\end{description} + +\section{Setup Header} +\label{sec:setupheader} + +The Theora setup header contains the limit values used to drive the loop + filter, the base matrices and scale values used to build the dequantization + tables, and the Huffman tables used to unpack the DCT tokens. +Because the contents of this header are specific to Theora, no concessions have + been made to keep the fields octet-aligned for easy parsing. + +\begin{figure} +\begin{center} +\begin{tabular}{ | c | } + \hline + common header block \\ \hline + loop filter table resolution \\ \hline + loop filter table \\ \hline + scale table resolution \\ \hline + AC scale table \\ \hline + DC scale table \\ \hline + number of base matricies \\ \hline + base quatization matricies \\ \hline + ... \\ \hline + quant range interpolation table \\ \hline + DCT token Huffman tables \\ + \hline +\end{tabular} +\end{center} +\caption{Setup Header structure} +\label{fig:setupheader} +\end{figure} + +\subsection{Loop Filter Limit Table Decode} +\label{sub:loop-filter-limits} + +\paragraph{Input parameters:} None. + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{LFLIMS} & \multicolumn{1}{p{40pt}}{Integer array} & + 7 & No & A 64-element array of loop filter limit + values. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\locvar{\qi} & Integer & 6 & No & The quantization index. \\ +\locvar{NBITS} & Integer & 3 & No & The size of values being read in the + current table. \\ +\bottomrule\end{tabularx} +\medskip + +This procedure decodes the table of loop filter limit values used to drive the + loop filter, which is described in Section~\ref{sub:loop-filter-limits}. +It is decoded as follows: + +\begin{enumerate} +\item +Read a 3-bit unsigned integer as \locvar{NBITS}. +\item +For each consecutive value of \locvar{\qi} from $0$ to $63$, inclusive: +\begin{enumerate} +\item +Read an \locvar{NBITS}-bit unsigned integer as $\bitvar{LFLIMS}[\locvar{\qi}]$. +\end{enumerate} +\end{enumerate} + +\paragraph{VP3 Compatibility} + +The loop filter limit values are hardcoded in VP3. +The values used are given in Appendix~\ref{app:vp3-loop-filter-limits}. + +\subsection{Quantization Parameters Decode} +\label{sub:quant-params} + +\paragraph{Input parameters:} None. + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{ACSCALE} & \multicolumn{1}{p{40pt}}{Integer array} & + 16 & No & A 64-element array of scale values for + AC coefficients for each \qi\ value. \\ +\bitvar{DCSCALE} & \multicolumn{1}{p{40pt}}{Integer array} & + 16 & No & A 64-element array of scale values for + the DC coefficient for each \qi\ value. \\ +\bitvar{NBMS} & Integer & 10 & No & The number of base matrices. \\ +\bitvar{BMS} & \multicolumn{1}{p{50pt}}{2D Integer array} & + 8 & No & A $\bitvar{NBMS}\times 64$ array + containing the base matrices. \\ +\bitvar{NQRS} & \multicolumn{1}{p{50pt}}{2D Integer array} & + 6 & No & A $2\times 3$ array containing the + number of quant ranges for a given \qti\ and \pli, respectively. +This is at most $63$. \\ +\bitvar{QRSIZES} & \multicolumn{1}{p{50pt}}{3D Integer array} & + 6 & No & A $2\times 3\times 63$ array of the + sizes of each quant range for a given \qti\ and \pli, respectively. +Only the first $\bitvar{NQRS}[\qti][\pli]$ values are used. \\ +\bitvar{QRBMIS} & \multicolumn{1}{p{50pt}}{3D Integer array} & + 9 & No & A $2\times 3\times 64$ array of the + \bmi's used for each quant range for a given \qti\ and \pli, respectively. +Only the first $(\bitvar{NQRS}[\qti][\pli]+1)$ values are used. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\locvar{\qti} & Integer & 1 & No & A quantization type index. +See Table~\ref{tab:quant-types}.\\ +\locvar{\qtj} & Integer & 1 & No & A quantization type index. \\ +\locvar{\pli} & Integer & 2 & No & A color plane index. +See Table~\ref{tab:color-planes}.\\ +\locvar{\plj} & Integer & 2 & No & A color plane index. \\ +\locvar{\qi} & Integer & 6 & No & The quantization index. \\ +\locvar{\ci} & Integer & 6 & No & The DCT coefficient index. \\ +\locvar{\bmi} & Integer & 9 & No & The base matrix index. \\ +\locvar{\qri} & Integer & 6 & No & The quant range index. \\ +\locvar{NBITS} & Integer & 5 & No & The size of fields to read. \\ +\locvar{NEWQR} & Integer & 1 & No & Flag that indicates a new set of quant + ranges will be defined. \\ +\locvar{RPQR} & Integer & 1 & No & Flag that indicates the quant ranges to + copy will come from the same color plane. \\ +\bottomrule\end{tabularx} +\medskip + +The AC scale and DC scale values are defined in two simple tables with 64 + values each, one for each \qi\ value. +The same scale values are used for every quantization type and color plane. + +The base matrices for all quantization types and color planes are stored in a + single table. +These are then referenced by index in several sets of \term{quant ranges}. +The purpose of the quant ranges is to specify which base matrices are used for + which \qi\ values. + +A set of quant ranges is defined for each quantization type and color plane. +To save space in the header, bit flags allow a set of quant ranges to be copied + from a previously defined set instead of being specified explicitly. +Every set except the first one can be copied from the immediately preceding + set. +Similarly, if the quantization type is not $0$, the set can be copied from the + set defined for the same color plane for the preceding quantization type. +This formulation allows compact representation of, for example, the same + set of quant ranges in both chroma channels, as is done in the original VP3, + or the same set of quant ranges in INTRA and INTER modes. + +Each quant range is defined by a size and two base matrix indices, one for each + end of the range. +The base matrix for the end of one range is used as the start of the next + range, so that for $n$ ranges, $n+1$ base matrices are specified. +The base matrices for the \qi\ values between the two endpoints of the range + are generated by linear interpolation. + +%TODO: figure + +The location of the endpoints of each range is encoded by their size. +The \qi\ value for the left end-point is the sum of the sizes of all preceding + ranges, and the \qi\ value for the right end-point adds the size of the + current range. +Thus the sum of the sizes of all the ranges MUST be 63, so that the last range + falls on the last possible \qi\ value. + +The complete set of quantization parameters are decoded as follows: + +\begin{enumerate} +\item +Read a 4-bit unsigned integer. +Assign \locvar{NBITS} the value read, plus one. +\item +For each consecutive value of \locvar{\qi} from $0$ to $63$, inclusive: +\begin{enumerate} +\item +Read an \locvar{NBITS}-bit unsigned integer as + $\bitvar{ACSCALE}[\locvar{\qi}]$. +\end{enumerate} +\item +Read a 4-bit unsigned integer. +Assign \locvar{NBITS} the value read, plus one. +\item +For each consecutive value of \locvar{\qi} from $0$ to $63$, inclusive: +\begin{enumerate} +\item +Read an \locvar{NBITS}-bit unsigned integer as + $\bitvar{DCSCALE}[\locvar{\qi}]$. +\end{enumerate} +\item +Read a 9-bit unsigned integer. +Assign \bitvar{NBMS} the value decoded, plus one. +\bitvar{NBMS} MUST be no greater than 384. +\item +For each consecutive value of \locvar{\bmi} from $0$ to $(\bitvar{NBMS}-1)$, + inclusive: +\begin{enumerate} +\item +For each consecutive value of \locvar{\ci} from $0$ to $63$, inclusive: +\begin{enumerate} +\item +Read an 8-bit unsigned integer as $\bitvar{BMS}[\locvar{\bmi}][\locvar{\ci}]$. +\end{enumerate} +\end{enumerate} +\item +For each consecutive value of \locvar{\qti} from $0$ to $1$, inclusive: +\begin{enumerate} +\item +For each consecutive value of \locvar{\pli} from $0$ to $2$, inclusive: +\begin{enumerate} +\item +If $\locvar{\qti}>0$ or $\locvar{\pli}>0$, read a 1-bit unsigned integer as + \locvar{NEWQR}. +\item +Else, assign \locvar{NEWQR} the value one. +\item +If \locvar{NEWQR} is zero, then we are copying a previously defined set of + quant ranges. +In that case: +\begin{enumerate} +\item +If $\locvar{\qti}>0$, read a 1-bit unsigned integer as \locvar{RPQR}. +\item +Else, assign \locvar{RPQR} the value zero. +\item +If \locvar{RPQR} is one, assign \locvar{\qtj} the value $(\locvar{\qti}-1)$ + and assign \locvar{\plj} the value \locvar{\pli}. +This selects the set of quant ranges defined for the same color plane as this + one, but for the previous quantization type. +\item +Else assign \locvar{\qtj} the value $(3*\locvar{\qti}+\locvar{\pli}-1)//3$ and + assign \locvar{\plj} the value $(\locvar{\pli}+2)\%3$. +This selects the most recent set of quant ranges defined. +\item +Assign $\bitvar{NQRS}[\locvar{\qti}][\locvar{\pli}]$ the value + $\bitvar{NQRS}[\locvar{\qtj}][\locvar{\plj}]$. +\item +Assign $\bitvar{QRSIZES}[\locvar{\qti}][\locvar{\pli}]$ the values in + $\bitvar{QRSIZES}[\locvar{\qtj}][\locvar{\plj}]$. +\item +Assign $\bitvar{QRBMIS}[\locvar{\qti}][\locvar{\pli}]$ the values in + $\bitvar{QRBMIS}[\locvar{\qtj}][\locvar{\plj}]$. +\end{enumerate} +\item +Else, \locvar{NEWQR} is one, which indicates that we are defining a new set of + quant ranges. +In that case: +\begin{enumerate} +\item +Assign $\locvar{\qri}$ the value zero. +\item +Assign $\locvar{\qi}$ the value zero. +\item +Read an $\ilog(\bitvar{NBMS}-1)$-bit unsigned integer as\\ + $\bitvar{QRBMIS}[\locvar{\qti}][\locvar{\pli}][\locvar{\qri}]$. +If this is greater than or equal to \bitvar{NBMS}, stop. +The stream is undecodable. +\item +\label{step:qr-loop} +Read an $\ilog(62-\locvar{\qi})$-bit unsigned integer. +Assign\\ $\bitvar{QRSIZES}[\locvar{\qti}][\locvar{\pli}][\locvar{\qri}]$ the value + read, plus one. +\item +Assign \locvar{\qi} the value $\locvar{\qi}+ + \bitvar{QRSIZES}[\locvar{\qti}][\locvar{\pli}][\locvar{\qri}]$. +\item +Assign \locvar{\qri} the value $\locvar{\qri}+1$. +\item +Read an $\ilog(\bitvar{NBMS}-1)$-bit unsigned integer as\\ + $\bitvar{QRBMIS}[\locvar{\qti}][\locvar{\pli}][\locvar{\qri}]$. +\item +If \locvar{\qi} is less than 63, go back to step~\ref{step:qr-loop}. +\item +If \locvar{\qi} is greater than 63, stop. +The stream is undecodable. +\item +Assign $\bitvar{NQRS}[\locvar{\qti}][\locvar{\pli}]$ the value \locvar{\qri}. +\end{enumerate} +\end{enumerate} +\end{enumerate} +\end{enumerate} + +\paragraph{VP3 Compatibility} + +The quantization parameters are hardcoded in VP3. +The values used are given in Appendix~\ref{app:vp3-quant-params}. + +\subsection{Computing a Quantization Matrix} +\label{sub:quant-mat} + +\paragraph{Input parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{ACSCALE} & \multicolumn{1}{p{40pt}}{Integer array} & + 16 & No & A 64-element array of scale values for + AC coefficients for each \qi\ value. \\ +\bitvar{DCSCALE} & \multicolumn{1}{p{40pt}}{Integer array} & + 16 & No & A 64-element array of scale values for + the DC coefficient for each \qi\ value. \\ +\bitvar{BMS} & \multicolumn{1}{p{50pt}}{2D Integer array} & + 8 & No & A $\bitvar{NBMS}\times 64$ array + containing the base matrices. \\ +\bitvar{NQRS} & \multicolumn{1}{p{50pt}}{2D Integer array} & + 6 & No & A $2\times 3$ array containing the + number of quant ranges for a given \qti\ and \pli, respectively. +This is at most $63$. \\ +\bitvar{QRSIZES} & \multicolumn{1}{p{50pt}}{3D Integer array} & + 6 & No & A $2\times 3\times 63$ array of the + sizes of each quant range for a given \qti\ and \pli, respectively. +Only the first $\bitvar{NQRS}[\qti][\pli]$ values are used. \\ +\bitvar{QRBMIS} & \multicolumn{1}{p{50pt}}{3D Integer array} & + 9 & No & A $2\times 3\times 64$ array of the + \bmi's used for each quant range for a given \qti\ and \pli, respectively. +Only the first $(\bitvar{NQRS}[\qti][\pli]+1)$ values are used. \\ +\bitvar{\qti} & Integer & 1 & No & A quantization type index. +See Table~\ref{tab:quant-types}.\\ +\bitvar{\pli} & Integer & 2 & No & A color plane index. +See Table~\ref{tab:color-planes}.\\ +\bitvar{\qi} & Integer & 6 & No & The quantization index. \\ +\bottomrule\end{tabularx} + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{QMAT} & \multicolumn{1}{p{40pt}}{Integer array} & + 16 & No & A 64-element array of quantization + values for each DCT coefficient in natural order. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\locvar{\ci} & Integer & 6 & No & The DCT coefficient index. \\ +\locvar{\bmi} & Integer & 9 & No & The base matrix index. \\ +\locvar{\bmj} & Integer & 9 & No & The base matrix index. \\ +\locvar{\qri} & Integer & 6 & No & The quant range index. \\ +\locvar{QISTART} & Integer & 6 & No & The left end-point of the \qi\ range. \\ +\locvar{QIEND } & Integer & 6 & No & The right end-point of the \qi\ range. \\ +\locvar{BM} & \multicolumn{1}{p{40pt}}{Integer array} & + 8 & No & A 64-element array containing the + interpolated base matrix. \\ +\locvar{QMIN} & Integer & 16 & No & The minimum quantization value allowed + for the current coefficient. \\ +\locvar{QSCALE} & Integer & 16 & No & The current scale value. \\ +\bottomrule\end{tabularx} +\medskip + +The following procedure can be used to generate a single quantization matrix + for a given quantization type, color plane, and \qi\ value, given the + quantization parameters decoded in Section~\ref{sub:quant-params}. + +Note that the product of the scale value and the base matrix value is in units + of $100$ths of a pixel value, and thus is divided by $100$ to return it to + units of a single pixel value. +This value is then scaled by four, to match the scaling of the DCT output, + which is also a factor of four larger than the orthonormal version of the + transform. + +\begin{enumerate} +\item +Assign \locvar{\qri} the index of a quant range such that +\begin{displaymath} +\bitvar{\qi} \ge \sum_{\qrj=0}^{\locvar{\qri}-1} + \bitvar{QRSIZES}[\bitvar{\qti}][\bitvar{\pli}][\qrj], +\end{displaymath} + and +\begin{displaymath} +\bitvar{\qi} \le \sum_{\qrj=0}^{\locvar{\qri}} + \bitvar{QRSIZES}[\bitvar{\qti}][\bitvar{\pli}][\qrj], +\end{displaymath} + where summation from $0$ to $-1$ is defined to be zero. +If there is more than one such value of $\locvar{\qri}$, i.e., if \bitvar{\qi} + lies on the boundary between two quant ranges, then the output will be the + same regardless of which one is chosen. +\item +Assign \locvar{QISTART} the value +\begin{displaymath} +\sum_{\qrj=0}^{\qri-1} \bitvar{QRSIZES}[\bitvar{\qti}][\bitvar{\pli}][\qrj]. +\end{displaymath} +\item +Assign \locvar{QIEND} the value +\begin{displaymath} +\sum_{\qrj=0}^{\qri} \bitvar{QRSIZES}[\bitvar{\qti}][\bitvar{\pli}][\qrj]. +\end{displaymath} +\item +Assign \locvar{\bmi} the value + $\bitvar{QRBMIS}[\bitvar{\qti}][\bitvar{\pli}][\qri]$. +\item +Assign \locvar{\bmj} the value + $\bitvar{QRBMIS}[\bitvar{\qti}][\bitvar{\pli}][\qri+1]$. +\item +For each consecutive value of \locvar{\ci} from $0$ to $63$, inclusive: +\begin{enumerate} +\item +Assign $\locvar{BM}[\locvar{\ci}]$ the value +\begin{displaymath} +\begin{split} +(&2*(\locvar{QIEND}-\bitvar{\qi})*\bitvar{BMS}[\locvar{\bmi}][\locvar{\ci}]\\ + &+2*(\bitvar{\qi}- + \locvar{QISTART})*\bitvar{BMS}[\locvar{\bmj}][\locvar{\ci}]\\ + &+\bitvar{QRSIZES}[\bitvar{\qti}][\bitvar{\pli}][\locvar{\qri}])// + (2*\bitvar{QRSIZES}[\bitvar{\qti}][\bitvar{\pli}][\locvar{\qri}]) +\end{split} +\end{displaymath} +\item +Assign \locvar{QMIN} the value given by Table~\ref{tab:qmin} according to + \bitvar{\qti} and \locvar{\ci}. + +\begin{table}[htbp] +\begin{center} +\begin{tabular}{clr}\toprule +Coefficient & \multicolumn{1}{c}{\bitvar{\qti}} + & \locvar{QMIN} \\\midrule +$\locvar{\ci}=0$ & $0$ (Intra) & $16$ \\ +$\locvar{\ci}>0$ & $0$ (Intra) & $8$ \\ +$\locvar{\ci}=0$ & $1$ (Inter) & $32$ \\ +$\locvar{\ci}>0$ & $1$ (Inter) & $16$ \\ +\bottomrule\end{tabular} +\end{center} +\caption{Minimum Quantization Values} +\label{tab:qmin} +\end{table} + +\item +If \locvar{\ci} equals zero, assign $\locvar{QSCALE}$ the value + $\bitvar{DCSCALE}[\bitvar{\qi}]$. +\item +Else, assign $\locvar{QSCALE}$ the value + $\bitvar{ACSCALE}[\bitvar{\qi}]$. +\item +Assign $\bitvar{QMAT}[\locvar{\ci}]$ the value +\begin{displaymath} +\max(\locvar{QMIN}, + \min((\locvar{QSCALE}*\locvar{BM}[\locvar{\ci}]//100)*4,4096)). +\end{displaymath} +\end{enumerate} +\end{enumerate} + +\subsection{DCT Token Huffman Tables} +\label{sub:huffman-tables} + +\paragraph{Input parameters:} None. + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{HTS} & \multicolumn{3}{l}{Huffman table array} + & An 80-element array of Huffman tables + with up to 32 entries each. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\locvar{HBITS} & Bit string & 32 & No & A string of up to 32 bits. \\ +\locvar{TOKEN} & Integer & 5 & No & A single DCT token value. \\ +\locvar{ISLEAF} & Integer & 1 & No & Flag that indicates if the current + node of the tree being decoded is a leaf node. \\ +\bottomrule\end{tabularx} +\medskip + +The Huffman tables used to decode DCT tokens are stored in the setup header in + the form of a binary tree. +This enforces the requirements that the code be full---so that any sequence of + bits will produce a valid sequence of tokens---and that the code be + prefix-free so that there is no ambiguity when decoding. + +One more restriction is placed on the tables that is not explicitly enforced by + the bitstream syntax, but nevertheless must be obeyed by compliant encoders. +There must be no more than 32 entries in a single table. +Note that this restriction along with the fullness requirement limit the + maximum size of a single Huffman code to 32 bits. +It is probably a good idea to enforce this latter consequence explicitly when + implementing the decoding procedure as a recursive algorithm, so as to prevent + a possible stack overflow given an invalid bitstream. + +Although there are 32 different DCT tokens, and thus a normal table will have + exactly 32 entries, this is not explicitly required. +It is allowable to use a Huffman code that omits some---but not all---of the + possible token values. +It is also allowable, if not particularly useful, to specify multiple codes for + the same token value in a single table. +Note also that token values may appear in the tree in any order. +In particular, it is not safe to assume that token value zero (which ends a + single block), has a Huffman code of all zeros. + +The tree is decoded as follows: + +\begin{enumerate} +\item +For each consecutive value of \locvar{\hti} from $0$ to $79$, inclusive: +\begin{enumerate} +\item +Set \locvar{HBITS} to the empty string. +\item +\label{step:huff-tree-loop} +If \locvar{HBITS} is longer than 32 bits in length, stop. +The stream is undecodable. +\item +Read a 1-bit unsigned integer as \locvar{ISLEAF}. +\item +If \locvar{ISLEAF} is one: +\begin{enumerate} +\item +If the number of entries in table $\bitvar{HTS}[\locvar{\hti}]$ is already 32, + stop. +The stream is undecodable. +\item +Read a 5-bit unsigned integer as \locvar{TOKEN}. +\item +Add the pair $(\locvar{HBITS},\locvar{TOKEN})$ to Huffman table + $\bitvar{HTS}[\locvar{\hti}]$. +\end{enumerate} +\item +Otherwise: +\begin{enumerate} +\item +Add a `0' to the end of \locvar{HBITS}. +\item +Decode the `0' sub-tree using this procedure, starting from + step~\ref{step:huff-tree-loop}. +\item +Remove the `0' from the end of \locvar{HBITS} and add a `1' to the end of + \locvar{HBITS}. +\item +Decode the `1' sub-tree using this procedure, starting from + step~\ref{step:huff-tree-loop}. +\item +Remove the `1' from the end of \locvar{HBITS}. +\end{enumerate} +\end{enumerate} +\end{enumerate} + +\paragraph{VP3 Compatibility} + +The DCT token Huffman tables are hardcoded in VP3. +The values used are given in Appendix~\ref{app:vp3-huffman-tables}. + +\subsection{Setup Header Decode} + +\paragraph{Input parameters:} None. + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{LFLIMS} & \multicolumn{1}{p{40pt}}{Integer array} & + 7 & No & A 64-element array of loop filter limit + values. \\ +\bitvar{ACSCALE} & \multicolumn{1}{p{40pt}}{Integer array} & + 16 & No & A 64-element array of scale values for + AC coefficients for each \qi\ value. \\ +\bitvar{DCSCALE} & \multicolumn{1}{p{40pt}}{Integer array} & + 16 & No & A 64-element array of scale values for + the DC coefficient for each \qi\ value. \\ +\bitvar{NBMS} & Integer & 10 & No & The number of base matrices. \\ +\bitvar{BMS} & \multicolumn{1}{p{50pt}}{2D Integer array} & + 8 & No & A $\bitvar{NBMS}\times 64$ array + containing the base matrices. \\ +\bitvar{NQRS} & \multicolumn{1}{p{50pt}}{2D Integer array} & + 6 & No & A $2\times 3$ array containing the + number of quant ranges for a given \qti\ and \pli, respectively. +This is at most $63$. \\ +\bitvar{QRSIZES} & \multicolumn{1}{p{50pt}}{3D Integer array} & + 6 & No & A $2\times 3\times 63$ array of the + sizes of each quant range for a given \qti\ and \pli, respectively. +Only the first $\bitvar{NQRS}[\qti][\pli]$ values will be used. \\ +\bitvar{QRBMIS} & \multicolumn{1}{p{50pt}}{3D Integer array} & + 9 & No & A $2\times 3\times 64$ array of the + \bmi's used for each quant range for a given \qti\ and \pli, respectively. +Only the first $(\bitvar{NQRS}[\qti][\pli]+1)$ values will be used. \\ +\bitvar{HTS} & \multicolumn{3}{l}{Huffman table array} + & An 80-element array of Huffman tables + with up to 32 entries each. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:} None. +\medskip + +The complete setup header is decoded as follows: + +\begin{enumerate} +\item +Decode the common header fields according to the procedure described in + Section~\ref{sub:common-header}. +If \bitvar{HEADERTYPE} returned by this procedure is not \hex{82}, then stop. +This packet is not the setup header. +\item +Decode the loop filter limit value table using the procedure given in + Section~\ref{sub:loop-filter-limits} into \bitvar{LFLIMS}. +\item +Decode the quantization parameters using the procedure given in + Section~\ref{sub:quant-params}. +The results are stored in \bitvar{ACSCALE}, \bitvar{DCSCALE}, \bitvar{NBMS}, + \bitvar{BMS}, \bitvar{NQRS}, \bitvar{QRSIZES}, and \bitvar{QRBMIS}. +\item +Decode the DCT token Huffman tables using the procedure given in + Section~\ref{sub:huffman-tables} into \bitvar{HTS}. +\end{enumerate} + +\chapter{Frame Decode} + +This section describes the complete procedure necessary to decode a single + frame. +This begins with the frame header, followed by coded block flags, macro block + modes, motion vectors, block-level \qi\ values, and finally the DCT residual + tokens, which are used to reconstruct the frame. + +\section{Frame Header Decode} +\label{sub:frame-header} + +\paragraph{Input parameters:} None. + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{FTYPE} & Integer & 1 & No & The frame type. \\ +\bitvar{NQIS} & Integer & 2 & No & The number of \qi\ values. \\ +\bitvar{QIS} & \multicolumn{1}{p{40pt}}{Integer array} & + 6 & No & An \bitvar{NQIS}-element array of + \qi\ values. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\locvar{MOREQIS} & Integer & 1 & No & A flag indicating there are more + \qi\ values to be decoded. \\ +\bottomrule\end{tabularx} +\medskip + +The frame header selects which type of frame is being decoded, intra or inter, + and contains the list of \qi\ values that will be used in this frame. +The first \qi\ value will be used for {\em all} DC coefficients in all blocks. +This is done to ensure that DC prediction, which is done in the quantized + domain, works as expected. +The AC coefficients, however, can be dequantized using any \qi\ value on the + list, selected on a block-by-block basis. + +\begin{enumerate} +\item +Read a 1-bit unsigned integer. +If the value read is not zero, stop. +This is not a data packet. +\item +Read a 1-bit unsigned integer as \bitvar{FTYPE}. +This is the type of frame being decoded, as given in + Table~\ref{tab:frame-type}. +If this is the first frame being decoded, this MUST be zero. + +\begin{table}[htbp] +\begin{center} +\begin{tabular}{cl}\toprule +\bitvar{FTYPE} & Frame Type \\\midrule +$0$ & Intra frame \\ +$1$ & Inter frame \\ +\bottomrule\end{tabular} +\end{center} +\caption{Frame Type Values} +\label{tab:frame-type} +\end{table} + +\item +Read in a 6-bit unsigned integer as $\bitvar{QIS}[0]$. +\item +Read a 1-bit unsigned integer as \locvar{MOREQIS}. +\item +If \locvar{MOREQIS} is zero, set \bitvar{NQIS} to 1. +\item +Otherwise: +\begin{enumerate} +\item +Read in a 6-bit unsigned integer as $\bitvar{QIS}[1]$. +\item +Read a 1-bit unsigned integer as \locvar{MOREQIS}. +\item +If \locvar{MOREQIS} is zero, set \bitvar{NQIS} to 2. +\item +Otherwise: +\begin{enumerate} +\item +Read in a 6-bit unsigned integer as $\bitvar{QIS}[2]$. +\item +Set \bitvar{NQIS} to 3. +\end{enumerate} +\end{enumerate} +\item +If \bitvar{FTYPE} is 0, read a 3-bit unsigned integer. +These bits are reserved. +If this value is not zero, stop. +This frame is not decodable according to this specification. +\end{enumerate} + +\paragraph{VP3 Compatibility} + +The precise format of the frame header is substantially different in Theora + than in VP3. +The original VP3 format includes a larger number of unused, reserved bits that + are required to be zero. +The original VP3 frame header also can contain only a single \qi\ value, + because VP3 does not support block-level \qi\ values and uses the same + \qi\ value for all the coefficients in a frame. + +\section{Run-Length Encoded Bit Strings} + +Two variations of run-length encoding are used to store sequences of bits for + the block coded flags and the block-level \qi\ values. +The procedures to decode these bit sequences are specified in the following two + sections. + +\subsection{Long-Run Bit String Decode} +\label{sub:long-run} + +\paragraph{Input parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{NBITS} & Integer & 36 & No & The number of bits to decode. \\ +\bottomrule\end{tabularx} + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{BITS} & Bit string & & & The decoded bits. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\locvar{LEN} & Integer & 36 & No & The number of bits decoded so far. \\ +\locvar{BIT} & Integer & 1 & No & The value associated with the current + run. \\ +\locvar{RLEN} & Integer & 13 & No & The length of the current run. \\ +\locvar{RBITS} & Integer & 4 & No & The number of extra bits needed to + decode the run length. \\ +\locvar{RSTART} & Integer & 6 & No & The start of the possible run-length + values for a given Huffman code. \\ +\locvar{ROFFS} & Integer & 12 & No & The offset from \locvar{RSTART} of the + run-length. \\ +\bottomrule\end{tabularx} +\medskip + +There is no practical limit to the number of consecutive 0's and 1's that can + be decoded with this procedure. +In reality, the run length is limited by the number of blocks in a single + frame, because more will never be requested. +A separate procedure described in Section~\ref{sub:short-run} is used when + there is a known limit on the maximum size of the runs. + +For the first run, a single bit value is read, and then a Huffman-coded + representation of a run length is decoded, and that many copies of the bit + value are appended to the bit string. +For each consecutive run, the value of the bit is toggled instead of being read + from the bitstream. + +The only exception is if the length of the previous run was 4129, the maximum + possible length encodable by the Huffman-coded representation. +In this case another bit value is read from the stream, to allow for + consecutive runs of 0's or 1's longer than this maximum. + +Note that in both cases---for the first run and after a run of length 4129---if + no more bits are needed, then no bit value is read. + +The complete decoding procedure is as follows: + +\begin{enumerate} +\item +Assign \locvar{LEN} the value 0. +\item +Assign \bitvar{BITS} the empty string. +\item +If \locvar{LEN} equals \bitvar{NBITS}, return the completely decoded string + \bitvar{BITS}. +\item +Read a 1-bit unsigned integer as \locvar{BIT}. +\item +\label{step:long-run-loop} +Read a bit at a time until one of the Huffman codes given in + Table~\ref{tab:long-run} is recognized. + +\begin{table}[htbp] +\begin{center} +\begin{tabular}{lrrl}\toprule +Huffman Code & \locvar{RSTART} & \locvar{RBITS} & Run Lengths \\\midrule +\bin{0} & $1$ & $0$ & $1$ \\ +\bin{10} & $2$ & $1$ & $2\ldots 3$ \\ +\bin{110} & $4$ & $1$ & $4\ldots 5$ \\ +\bin{1110} & $6$ & $2$ & $6\ldots 9$ \\ +\bin{11110} & $10$ & $3$ & $10\ldots 17$ \\ +\bin{111110} & $18$ & $4$ & $18\ldots 33$ \\ +\bin{111111} & $34$ & $12$ & $34\ldots 4129$ \\ +\bottomrule\end{tabular} +\end{center} +\caption{Huffman Codes for Long Run Lengths} +\label{tab:long-run} +\end{table} + +\item +Assign \locvar{RSTART} and \locvar{RBITS} the values given in + Table~\ref{tab:long-run} according to the Huffman code read. +\item +Read an \locvar{RBITS}-bit unsigned integer as \locvar{ROFFS}. +\item +Assign \locvar{RLEN} the value $(\locvar{RSTART}+\locvar{ROFFS})$. +\item +Append \locvar{RLEN} copies of \locvar{BIT} to \bitvar{BITS}. +\item +Add \locvar{RLEN} to the value \locvar{LEN}. +\locvar{LEN} MUST be less than or equal to \bitvar{NBITS}. +\item +If \locvar{LEN} equals \bitvar{NBITS}, return the completely decoded string + \bitvar{BITS}. +\item +If \locvar{RLEN} equals 4129, read a 1-bit unsigned integer as \locvar{BIT}. +\item +Otherwise, assign \locvar{BIT} the value $(1-\locvar{BIT})$. +\item +Continue decoding runs from step~\ref{step:long-run-loop}. +\end{enumerate} + +\paragraph{VP3 Compatibility} + +VP3 does not read a new bit value after decoding a run length of 4129. +This limits the maximum number of consecutive 0's or 1's to 4129 in + VP3-compatible streams. +For reasonable video sizes of $1920\times 1080$ or less in 4:2:0 format---the + only pixel format VP3 supports---this does not pose any problems because runs + longer than 4129 are not needed. + +\subsection{Short-Run Bit String Decode} +\label{sub:short-run} + +\paragraph{Input parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{NBITS} & Integer & 36 & No & The number of bits to decode. \\ +\bottomrule\end{tabularx} + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{BITS} & Bit string & & & The decoded bits. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\locvar{LEN} & Integer & 36 & No & The number of bits decoded so far. \\ +\locvar{BIT} & Integer & 1 & No & The value associated with the current + run. \\ +\locvar{RLEN} & Integer & 13 & No & The length of the current run. \\ +\locvar{RBITS} & Integer & 4 & No & The number of extra bits needed to + decode the run length. \\ +\locvar{RSTART} & Integer & 6 & No & The start of the possible run-length + values for a given Huffman code. \\ +\locvar{ROFFS} & Integer & 12 & No & The offset from \locvar{RSTART} of the + run-length. \\ +\bottomrule\end{tabularx} +\medskip + +This procedure is similar to the procedure outlined in + Section~\ref{sub:long-run}, except that the maximum number of consecutive 0's + or 1's is limited to 30. +This is the maximum run length needed when encoding a bit for each of the 16 + blocks in a super block when it is known that not all the bits in a super + block are the same. + +The complete decoding procedure is as follows: + +\begin{enumerate} +\item +Assign \locvar{LEN} the value 0. +\item +Assign \bitvar{BITS} the empty string. +\item +If \locvar{LEN} equals \bitvar{NBITS}, return the completely decoded string + \bitvar{BITS}. +\item +Read a 1-bit unsigned integer as \locvar{BIT}. +\item +\label{step:short-run-loop} +Read a bit at a time until one of the Huffman codes given in + Table~\ref{tab:short-run} is recognized. + +\begin{table}[htbp] +\begin{center} +\begin{tabular}{lrrl}\toprule +Huffman Code & \locvar{RSTART} & \locvar{RBITS} & Run Lengths \\\midrule +\bin{0} & $1$ & $1$ & $1\ldots 2$ \\ +\bin{10} & $3$ & $1$ & $3\ldots 4$ \\ +\bin{110} & $5$ & $1$ & $5\ldots 6$ \\ +\bin{1110} & $7$ & $2$ & $7\ldots 10$ \\ +\bin{11110} & $11$ & $2$ & $11\ldots 14$ \\ +\bin{11111} & $15$ & $4$ & $15\ldots 30$ \\ +\bottomrule\end{tabular} +\end{center} +\caption{Huffman Codes for Short Run Lengths} +\label{tab:short-run} +\end{table} + +\item +Assign \locvar{RSTART} and \locvar{RBITS} the values given in + Table~\ref{tab:short-run} according to the Huffman code read. +\item +Read an \locvar{RBITS}-bit unsigned integer as \locvar{ROFFS}. +\item +Assign \locvar{RLEN} the value $(\locvar{RSTART}+\locvar{ROFFS})$. +\item +Append \locvar{RLEN} copies of \locvar{BIT} to \bitvar{BITS}. +\item +Add \locvar{RLEN} to the value \locvar{LEN}. +\locvar{LEN} MUST be less than or equal to \bitvar{NBITS}. +\item +If \locvar{LEN} equals \bitvar{NBITS}, return the completely decoded string + \bitvar{BITS}. +\item +Assign \locvar{BIT} the value $(1-\locvar{BIT})$. +\item +Continue decoding runs from step~\ref{step:short-run-loop}. +\end{enumerate} + +\section{Coded Block Flags Decode} +\label{sub:coded-blocks} + +\paragraph{Input parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{FTYPE} & Integer & 1 & No & The frame type. \\ +\bitvar{NSBS} & Integer & 32 & No & The total number of super blocks in a + frame. \\ +\bitvar{NBS} & Integer & 36 & No & The total number of blocks in a + frame. \\ +\bottomrule\end{tabularx} + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{BCODED} & \multicolumn{1}{p{40pt}}{Integer Array} & + 1 & No & An \bitvar{NBS}-element array of flags + indicating which blocks are coded. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\locvar{NBITS} & Integer & 36 & No & The length of a bit string to decode. \\ +\locvar{BITS} & Bit string & & & A decoded set of flags. \\ +\locvar{SBPCODED} & \multicolumn{1}{p{40pt}}{Integer Array} & + 1 & No & An \bitvar{NSBS}-element array of flags + indicating whether or not each super block is partially coded. \\ +\locvar{SBFCODED} & \multicolumn{1}{p{40pt}}{Integer Array} & + 1 & No & An \bitvar{NSBS}-element array of flags + indicating whether or not each non-partially coded super block is fully + coded. \\ +\locvar{\sbi} & Integer & 32 & No & The index of the current super + block. \\ +\locvar{\bi} & Integer & 36 & No & The index of the current block in coded + order. \\ +\bottomrule\end{tabularx} +\medskip + +This procedure determines which blocks are coded in a given frame. +In an intra frame, it marks all blocks coded. +In an inter frame, however, any or all of the blocks may remain uncoded. +The output is a list of bit flags, one for each block, marking it coded or not + coded. + +It is important to note that flags are still decoded for any blocks which lie + entirely outside the picture region, even though they are not displayed. +Encoders MAY choose to code such blocks. +Decoders MUST faithfully reconstruct such blocks, because their contents can be + used for predictors in future frames. +Flags are \textit{not} decoded for portions of a super block which lie outside + the full frame, as there are no blocks in those regions. + +The complete procedure is as follows: + +\begin{enumerate} +\item +If \bitvar{FTYPE} is zero (intra frame): +\begin{enumerate} +\item +For each consecutive value of \locvar{\bi} from 0 to $(\locvar{NBS}-1)$, assign + $\bitvar{BCODED}[\locvar{\bi}]$ the value one. +\end{enumerate} +\item +Otherwise (inter frame): +\begin{enumerate} +\item +Assign \locvar{NBITS} the value \bitvar{NSBS}. +\item +Read an \locvar{NBITS}-bit bit string into \locvar{BITS}, using the procedure + described in Section~\ref{sub:long-run}. +This represents the list of partially coded super blocks. +\item +For each consecutive value of \locvar{\sbi} from 0 to $(\locvar{NSBS}-1)$, + remove the bit at the head of the string \locvar{BITS} and assign it to + $\locvar{SBPCODED}[\locvar{\sbi}]$. +\item +Assign \locvar{NBITS} the total number of super blocks such that \\ + $\locvar{SBPCODED}[\locvar{\sbi}]$ equals zero. +\item +Read an \locvar{NBITS}-bit bit string into \locvar{BITS}, using the procedure + described in Section~\ref{sub:long-run}. +This represents the list of fully coded super blocks. +\item +For each consecutive value of \locvar{\sbi} from 0 to $(\locvar{NSBS}-1)$ such + that $\locvar{SBPCODED}[\locvar{\sbi}]$ equals zero, remove the bit at the + head of the string \locvar{BITS} and assign it to + $\locvar{SBFCODED}[\locvar{\sbi}]$. +\item +Assign \locvar{NBITS} the number of blocks contained in super blocks where + $\locvar{SBPCODED}[\locvar{\sbi}]$ equals one. +Note that this might {\em not} be equal to 16 times the number of partially + coded super blocks, since super blocks which overlap the edge of the frame + will have fewer than 16 blocks in them. +\item +Read an \locvar{NBITS}-bit bit string into \locvar{BITS}, using the procedure + described in Section~\ref{sub:short-run}. +\item +For each block in coded order---indexed by \locvar{\bi}: +\begin{enumerate} +\item +Assign \locvar{\sbi} the index of the super block containing block + \locvar{\bi}. +\item +If $\locvar{SBPCODED}[\locvar{\sbi}]$ is zero, assign + $\bitvar{BCODED}[\locvar{\bi}]$ the value $\locvar{SBFCODED}[\locvar{\sbi}]$. +\item +Otherwise, remove the bit at the head of the string \locvar{BITS} and assign it + to $\bitvar{BCODED}[\locvar{\bi}]$. +\end{enumerate} +\end{enumerate} +\end{enumerate} + +\section{Macro Block Coding Modes} +\label{sub:mb-modes} + +\paragraph{Input parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{FTYPE} & Integer & 1 & No & The frame type. \\ +\bitvar{NMBS} & Integer & 32 & No & The total number of macro blocks in a + frame. \\ +\bitvar{NBS} & Integer & 36 & No & The total number of blocks in a + frame. \\ +\bitvar{BCODED} & \multicolumn{1}{p{40pt}}{Integer Array} & + 1 & No & An \bitvar{NBS}-element array of flags + indicating which blocks are coded. \\ +\bottomrule\end{tabularx} + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{MBMODES} & \multicolumn{1}{p{40pt}}{Integer Array} & + 3 & No & An \bitvar{NMBS}-element array of coding + modes for each macro block. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\locvar{MSCHEME} & Integer & 3 & No & The mode coding scheme. \\ +\locvar{MALPHABET} & \multicolumn{1}{p{40pt}}{Integer array} + & 3 & No & The list of modes corresponding to each + Huffman code. \\ +\locvar{\mbi} & Integer & 32 & No & The index of the current macro + block. \\ +\locvar{\bi} & Integer & 36 & No & The index of the current block in + coded order. \\ +\locvar{\mi} & Integer & 3 & No & The index of a Huffman code from + Table~\ref{tab:mode-codes}, starting from $0$. \\ +\bottomrule\end{tabularx} +\medskip + +In an intra frame, every macro block marked as coded in INTRA mode. +In an inter frame, however, a macro block can be coded in one of eight coding + modes, given in Table~\ref{tab:coding-modes}. +All of the blocks in all color planes contained in a macro block will be + assigned the coding mode of that macro block. + +\begin{table}[htbp] +\begin{center} +\begin{tabular}{cl}\toprule +Index & Coding Mode \\\midrule +$0$ & INTER\_NOMV \\ +$1$ & INTRA \\ +$2$ & INTER\_MV \\ +$3$ & INTER\_MV\_LAST \\ +$4$ & INTER\_MV\_LAST2 \\ +$5$ & INTER\_GOLDEN\_NOMV \\ +$6$ & INTER\_GOLDEN\_MV \\ +$7$ & INTER\_MV\_FOUR \\ +\bottomrule\end{tabular} +\end{center} +\caption{Macro Block Coding Modes} +\label{tab:coding-modes} +\end{table} + +An important thing to note is that a coding mode is only stored in the + bitstream for a macro block if it has at least one {\em luma} block coded. +A macro block that contains coded blocks in the chroma planes, but not in the + luma plane, MUST be coded in INTER\_NOMV mode. +Thus, no coding mode needs to be decoded for such a macro block. + +Coding modes are encoded using one of eight different schemes. +Schemes 0 through 6 use the same simple Huffman code to represent the mode + numbers, as given in Table~\ref{tab:mode-codes}. +The difference in the schemes is the mode number assigned to each code. +Scheme 0 uses an assignment specified in the bitstream, while schemes 1--6 use + a fixed assignment, also given in Table~\ref{tab:mode-codes}. +Scheme 7 simply codes each mode directly in the bitstream using three bits. + +\begin{table}[htbp] +\begin{center} +\begin{tabular}{lccccccc}\toprule +Scheme & $1$ & $2$ & $3$ & $4$ & $5$ & $6$ & $7$ \\\cmidrule{2-7} +Huffman Code & \multicolumn{6}{c}{Coding Mode} & \locvar{\mi} \\\midrule +\bin{0} & $3$ & $3$ & $3$ & $3$ & $0$ & $0$ & $0$ \\ +\bin{10} & $4$ & $4$ & $2$ & $2$ & $3$ & $5$ & $1$ \\ +\bin{110} & $2$ & $0$ & $4$ & $0$ & $4$ & $3$ & $2$ \\ +\bin{1110} & $0$ & $2$ & $0$ & $4$ & $2$ & $4$ & $3$ \\ +\bin{11110} & $1$ & $1$ & $1$ & $1$ & $1$ & $2$ & $4$ \\ +\bin{111110} & $5$ & $5$ & $5$ & $5$ & $5$ & $1$ & $5$ \\ +\bin{1111110} & $6$ & $6$ & $6$ & $6$ & $6$ & $6$ & $6$ \\ +\bin{1111111} & $7$ & $7$ & $7$ & $7$ & $7$ & $7$ & $7$ \\ +\bottomrule\end{tabular} +\end{center} +\caption{Macro Block Mode Schemes} +\label{tab:mode-codes} +\end{table} + +\begin{enumerate} +\item +If \bitvar{FTYPE} is 0 (intra frame): +\begin{enumerate} +\item +For each consecutive value of \locvar{\mbi} from 0 to $(\bitvar{NMBS}-1)$, + inclusive, assign $\bitvar{MBMODES}[\mbi]$ the value 1 (INTRA). +\end{enumerate} +\item +Otherwise (inter frame): +\begin{enumerate} +\item +Read a 3-bit unsigned integer as \locvar{MSCHEME}. +\item +If \locvar{MSCHEME} is 0: +\begin{enumerate} +\item +For each consecutive value of \locvar{MODE} from 0 to 7, inclusive: +\begin{enumerate} +\item +Read a 3-bit unsigned integer as \locvar{\mi}. +\item +Assign $\locvar{MALPHABET}[\mi]$ the value \locvar{MODE}. +\end{enumerate} +\end{enumerate} +\item +Otherwise, if \locvar{MSCHEME} is not 7, assign the entries of + \locvar{MALPHABET} the values in the corresponding column of + Table~\ref{tab:mode-codes}. +\item +For each consecutive macro block in coded order (cf. + Section~\ref{sec:mbs})---indexed by \locvar{\mbi}: +\begin{enumerate} +\item +If a block \locvar{\bi} in the luma plane of macro block \locvar{\mbi} exists + such that $\bitvar{BCODED}[\locvar{\bi}]$ is 1: +\begin{enumerate} +\item +If \locvar{MSCHEME} is not 7, read one bit at a time until one of the Huffman + codes in Table~\ref{tab:mode-codes} is recognized, and assign + $\bitvar{MBMODES}[\locvar{\mbi}]$ the value + $\locvar{MALPHABET}[\locvar{\mi}]$, where \locvar{\mi} is the index of the + Huffman code decoded. +\item +Otherwise, read a 3-bit unsigned integer as $\bitvar{MBMODES}[\locvar{\mbi}]$. +\end{enumerate} +\item +Otherwise, if no luma-plane blocks in the macro block are coded, assign + $\bitvar{MBMODES}[\locvar{\mbi}]$ the value 0 (INTER\_NOMV). +\end{enumerate} +\end{enumerate} +\end{enumerate} + +\section{Motion Vectors} + +In an intra frame, no motion vectors are used, and so motion vector decoding is + skipped. +In an inter frame, however, many of the inter coding modes require a motion + vector in order to specify an offset into the reference frame from which to + predict a block. +These procedures assigns such a motion vector to every block. + +\subsection{Motion Vector Decode} +\label{sub:mv-decode} + +\paragraph{Input parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{MVMODE} & Integer & 1 & No & The motion vector decoding method. \\ +\bottomrule\end{tabularx} + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{MVX} & Integer & 6 & Yes & The X component of the motion + vector. \\ +\bitvar{MVY} & Integer & 6 & Yes & The Y component of the motion + vector. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\locvar{MVSIGN} & Integer & 1 & No & The sign of the motion vector component + just decoded. \\ +\bottomrule\end{tabularx} +\medskip + +The individual components of a motion vector can be coded using one of two + methods. +The first uses a variable length Huffman code, given in + Table~\ref{tab:mv-huff-codes}. +The second encodes the magnitude of the component directly in 5 bits, and the + sign in one bit. +Note that in this case there are two representations for the value zero. +For compatibility with VP3, a sign bit is read even if the magnitude read is + zero. +One scheme is chosen and used for the entire frame. + +Each component can take on integer values from $-31\ldots 31$, inclusive, at + half-pixel resolution, i.e. $-15.5\ldots 15.5$ pixels in the luma plane. +For each subsampled axis in the chroma planes, the corresponding motion vector + component is interpreted as being at quarter-pixel resolution, i.e. + $-7.75\ldots 7.75$ pixels. +The precise details of how these vectors are used to compute predictors for + each block are described in Section~\ref{sec:predictors}. + +\begin{table}[ht] +\begin{center} +\begin{tabular}{lrlr}\toprule +Huffman Code & Value & Huffman Code & Value \\\midrule +\bin{000} & $0$ \\ +\bin{001} & $1$ & \bin{010} & $-1$ \\ +\bin{0110} & $2$ & \bin{0111} & $-2$ \\ +\bin{1000} & $3$ & \bin{1001} & $-3$ \\ +\bin{101000} & $4$ & \bin{101001} & $-4$ \\ +\bin{101010} & $5$ & \bin{101011} & $-5$ \\ +\bin{101100} & $6$ & \bin{101101} & $-6$ \\ +\bin{101110} & $7$ & \bin{101111} & $-7$ \\ +\bin{1100000} & $8$ & \bin{1100001} & $-8$ \\ +\bin{1100010} & $9$ & \bin{1100011} & $-9$ \\ +\bin{1100100} & $10$ & \bin{1100101} & $-10$ \\ +\bin{1100110} & $11$ & \bin{1100111} & $-11$ \\ +\bin{1101000} & $12$ & \bin{1101001} & $-12$ \\ +\bin{1101010} & $13$ & \bin{1101011} & $-13$ \\ +\bin{1101100} & $14$ & \bin{1101101} & $-14$ \\ +\bin{1101110} & $15$ & \bin{1101111} & $-15$ \\ +\bin{11100000} & $16$ & \bin{11100001} & $-16$ \\ +\bin{11100010} & $17$ & \bin{11100011} & $-17$ \\ +\bin{11100100} & $18$ & \bin{11100101} & $-18$ \\ +\bin{11100110} & $19$ & \bin{11100111} & $-19$ \\ +\bin{11101000} & $20$ & \bin{11101001} & $-20$ \\ +\bin{11101010} & $21$ & \bin{11101011} & $-21$ \\ +\bin{11101100} & $22$ & \bin{11101101} & $-22$ \\ +\bin{11101110} & $23$ & \bin{11101111} & $-23$ \\ +\bin{11110000} & $24$ & \bin{11110001} & $-24$ \\ +\bin{11110010} & $25$ & \bin{11110011} & $-25$ \\ +\bin{11110100} & $26$ & \bin{11110101} & $-26$ \\ +\bin{11110110} & $27$ & \bin{11110111} & $-27$ \\ +\bin{11111000} & $28$ & \bin{11111001} & $-28$ \\ +\bin{11111010} & $29$ & \bin{11111011} & $-29$ \\ +\bin{11111100} & $30$ & \bin{11111101} & $-30$ \\ +\bin{11111110} & $31$ & \bin{11111111} & $-31$ \\ +\bottomrule\end{tabular} +\end{center} +\caption{Huffman Codes for Motion Vector Components} +\label{tab:mv-huff-codes} +\end{table} + +A single motion vector is decoded is follows: + +\begin{enumerate} +\item +If \bitvar{MVMODE} is 0: +\begin{enumerate} +\item +Read 1 bit at a time until one of the Huffman codes in + Table~\ref{tab:mv-huff-codes} is recognized, and assign the value to + \locvar{MVX}. +\item +Read 1 bit at a time until one of the Huffman codes in + Table~\ref{tab:mv-huff-codes} is recognized, and assign the value to + \locvar{MVY}. +\end{enumerate} +\item +Otherwise: +\begin{enumerate} +\item +Read a 5-bit unsigned integer as \bitvar{MVX}. +\item +Read a 1-bit unsigned integer as \locvar{MVSIGN}. +\item +If \locvar{MVSIGN} is 1, assign \bitvar{MVX} the value $-\bitvar{MVX}$. +\item +Read a 5-bit unsigned integer as \bitvar{MVY}. +\item +Read a 1-bit unsigned integer as \locvar{MVSIGN}. +\item +If \locvar{MVSIGN} is 1, assign \bitvar{MVY} the value $-\bitvar{MVY}$. +\end{enumerate} +\end{enumerate} + +\subsection{Macro Block Motion Vector Decode} +\label{sub:mb-mv-decode} + +\paragraph{Input parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{PF} & Integer & 2 & No & The pixel format. \\ +\bitvar{NMBS} & Integer & 32 & No & The total number of macro blocks in a + frame. \\ +\bitvar{MBMODES} & \multicolumn{1}{p{40pt}}{Integer Array} & + 3 & No & An \bitvar{NMBS}-element array of coding + modes for each macro block. \\ +\bitvar{NBS} & Integer & 36 & No & The total number of blocks in a + frame. \\ +\bitvar{BCODED} & \multicolumn{1}{p{40pt}}{Integer Array} & + 1 & No & An \bitvar{NBS}-element array of flags + indicating which blocks are coded. \\ +\bottomrule\end{tabularx} + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{MVECTS} & \multicolumn{1}{p{50pt}}{Array of 2D Integer Vectors} & + 6 & Yes & An \bitvar{NBS}-element array of + motion vectors for each block. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\locvar{LAST1} & \multicolumn{1}{p{50pt}}{2D Integer Vector} & + 6 & Yes & The last motion vector. \\ +\locvar{LAST2} & \multicolumn{1}{p{50pt}}{2D Integer Vector} & + 6 & Yes & The second to last motion vector. \\ +\locvar{MVX} & Integer & 6 & Yes & The X component of a motion vector. \\ +\locvar{MVY} & Integer & 6 & Yes & The Y component of a motion vector. \\ +\locvar{\mbi} & Integer & 32 & No & The index of the current macro + block. \\ +\locvar{A} & Integer & 36 & No & The index of the lower-left luma block + in the macro block. \\ +\locvar{B} & Integer & 36 & No & The index of the lower-right luma + block in the macro block. \\ +\locvar{C} & Integer & 36 & No & The index of the upper-left luma block + in the macro block. \\ +\locvar{D} & Integer & 36 & No & The index of the upper-right luma + block in the macro block. \\ +\locvar{E} & Integer & 36 & No & The index of a chroma block in the + macro block, depending on the pixel format. \\ +\locvar{F} & Integer & 36 & No & The index of a chroma block in the + macro block, depending on the pixel format. \\ +\locvar{G} & Integer & 36 & No & The index of a chroma block in the + macro block, depending on the pixel format. \\ +\locvar{H} & Integer & 36 & No & The index of a chroma block in the + macro block, depending on the pixel format. \\ +\locvar{I} & Integer & 36 & No & The index of a chroma block in the + macro block, depending on the pixel format. \\ +\locvar{J} & Integer & 36 & No & The index of a chroma block in the + macro block, depending on the pixel format. \\ +\locvar{K} & Integer & 36 & No & The index of a chroma block in the + macro block, depending on the pixel format. \\ +\locvar{L} & Integer & 36 & No & The index of a chroma block in the + macro block, depending on the pixel format. \\ +\bottomrule\end{tabularx} +\medskip + +Motion vectors are stored for each macro block. +In every mode except for INTER\_MV\_FOUR, every block in all the color planes + are assigned the same motion vector. +In INTER\_MV\_FOUR mode, all four blocks in the luma plane are assigned their + own motion vector, and motion vectors for blocks in the chroma planes are + computed from these, using averaging appropriate to the pixel format. + +For INTER\_MV and INTER\_GOLDEN\_MV modes, a single motion vector is decoded + and applied to each block. +For INTER\_MV\_FOUR macro blocks, a motion vector is decoded for each coded + luma block, in raster order, not coded order. +Uncoded luma blocks receive the default $(0,0)$ vector for the purposes of + computing the chroma motion vectors. + +None of the remaining macro block coding modes require decoding motion vectors + from the stream. +INTRA mode does not use a motion-compensated predictor, and thus does not + require a motion vector. +Both the INTER\_NOMV and the INTER\_GOLDEN\_NOMV modes use the default + vector $(0,0)$ for each block. +This also includes all macro blocks with no coded luma blocks, as they are + coded in INTER\_NOMV mode by definition. + +The modes INTER\_MV\_LAST and INTER\_MV\_LAST2 use the motion vector from the + last macro block (in coded order) and the second to last macro block, + respectively, that contained a motion vector pointing to the previous frame. +Thus no explicit motion vector needs to be decoded for these modes. +Macro blocks coded in INTRA mode or one of the GOLDEN modes are not considered + in this process. +For macro blocks coded in INTER\_MV\_FOUR mode, this process uses the vector + from the last coded luma block in the macro block, again in raster order, not + coded order. +This is usually the upper-right block. +If an insufficient number of macro blocks have been coded in one of the INTER + modes, then the $(0,0)$ vector is used instead. + +The motion vectors are decoded from the stream as follows: + +\begin{enumerate} +\item +Assign \locvar{LAST1} and \locvar{LAST2} both the value $(0,0)$. +\item +Read a 1-bit unsigned integer as \locvar{MVMODE}. +Note that this value is read even if no macro blocks require a motion vector to + be decoded. +\item +For each consecutive value of \locvar{\mbi} from 0 to $(\bitvar{NMBS}-1)$: +\begin{enumerate} +\item +If $\bitvar{MBMODES}[\locvar{\mbi}]$ is 7 (INTER\_MV\_FOUR): +\begin{enumerate} +\item +Let \locvar{A}, \locvar{B}, \locvar{C}, and \locvar{D} be the indices in coded + order \locvar{\bi} of the luma blocks in macro block \locvar{\mbi}, arranged + into raster order. +Thus, \locvar{A} is the index in coded order of the block in the lower left, + \locvar{B} the lower right, \locvar{C} the upper left, and \locvar{D} the + upper right. % TODO: as shown in Figure~REF. +\item If $\bitvar{BCODED}[\locvar{A}]$ is non-zero: +\begin{enumerate} +\item Decode a single motion vector into \locvar{MVX} and \locvar{MVY} using + the procedure described in Section~\ref{sub:mv-decode}. +\item Assign $\bitvar{MVECTS}[\locvar{A}]$ the value + $(\locvar{MVX},\locvar{MVY})$. +\end{enumerate} +\item Otherwise, assign $\bitvar{MVECTS}[\locvar{A}]$ the value $(0,0)$. +\item If $\bitvar{BCODED}[\locvar{B}]$ is non-zero: +\begin{enumerate} +\item Decode a single motion vector into \locvar{MVX} and \locvar{MVY} using + the procedure described in Section~\ref{sub:mv-decode}. +\item Assign $\bitvar{MVECTS}[\locvar{B}]$ the value + $(\locvar{MVX},\locvar{MVY})$. +\end{enumerate} +\item +Otherwise assign $\bitvar{MVECTS}[\locvar{B}]$ the value $(0,0)$. +\item If $\bitvar{BCODED}[\locvar{C}]$ is non-zero: +\begin{enumerate} +\item Decode a single motion vector into \locvar{MVX} and \locvar{MVY} using + the procedure described in Section~\ref{sub:mv-decode}. +\item Assign $\bitvar{MVECTS}[\locvar{C}]$ the value + $(\locvar{MVX},\locvar{MVY})$. +\end{enumerate} +\item Otherwise assign $\bitvar{MVECTS}[\locvar{C}]$ the value $(0,0)$. +\item If $\bitvar{BCODED}[\locvar{D}]$ is non-zero: +\begin{enumerate} +\item Decode a single motion vector into \locvar{MVX} and \locvar{MVY} using + the procedure described in Section~\ref{sub:mv-decode}. +\item Assign $\bitvar{MVECTS}[\locvar{D}]$ the value + $(\locvar{MVX},\locvar{MVY})$. +\end{enumerate} +\item +Otherwise, assign $\bitvar{MVECTS}[\locvar{D}]$ the value $(0,0)$. +\item +If \bitvar{PF} is 0 (4:2:0): +\begin{enumerate} +\item +Let \locvar{E} and \locvar{F} be the index in coded order of the one block in + the macro block from the $C_b$ and $C_r$ planes, respectively. +\item +Assign $\bitvar{MVECTS}[\locvar{E}]$ and $\bitvar{MVECTS}[\locvar{F}]$ the + value +\begin{multline*} +(\round\biggl(\frac{\begin{aligned} + \bitvar{MVECTS}[\locvar{A}]_x+\bitvar{MVECTS}[\locvar{B}]_x+\\ + \bitvar{MVECTS}[\locvar{C}]_x+\bitvar{MVECTS}[\locvar{D}]_x + \end{aligned}}{4}\biggr), \\ + \round\biggl(\frac{\begin{aligned} + \bitvar{MVECTS}[\locvar{A}]_y+\bitvar{MVECTS}[\locvar{B}]_y+\\ + \bitvar{MVECTS}[\locvar{C}]_y+\bitvar{MVECTS}[\locvar{D}]_y + \end{aligned}}{4}\biggr)) +\end{multline*} +\end{enumerate} +\item +If \bitvar{PF} is 2 (4:2:2): +\begin{enumerate} +\item +Let \locvar{E} and \locvar{F} be the indices in coded order of the bottom and + top blocks in the macro block from the $C_b$ plane, respectively, and + \locvar{G} and \locvar{H} be the indices in coded order of the bottom and top + blocks in the $C_r$ plane, respectively. %TODO: as shown in Figure~REF. +\item +Assign $\bitvar{MVECTS}[\locvar{E}]$ and $\bitvar{MVECTS}[\locvar{G}]$ the + value +\begin{multline*} +(\round\left(\frac{ + \bitvar{MVECTS}[\locvar{A}]_x+\bitvar{MVECTS}[\locvar{B}]_x}{2}\right), \\ + \round\left(\frac{ + \bitvar{MVECTS}[\locvar{A}]_y+\bitvar{MVECTS}[\locvar{B}]_y}{2}\right)) +\end{multline*} +\item +Assign $\bitvar{MVECTS}[\locvar{F}]$ and $\bitvar{MVECTS}[\locvar{H}]$ the + value +\begin{multline*} +(\round\left(\frac{ + \bitvar{MVECTS}[\locvar{C}]_x+\bitvar{MVECTS}[\locvar{D}]_x}{2}\right), \\ + \round\left(\frac{ + \bitvar{MVECTS}[\locvar{C}]_y+\bitvar{MVECTS}[\locvar{D}]_y}{2}\right)) +\end{multline*} +\end{enumerate} +\item +If \bitvar{PF} is 3 (4:4:4): +\begin{enumerate} +\item +Let \locvar{E}, \locvar{F}, \locvar{G}, and \locvar{H} be the indices + \locvar{\bi} in coded order of the $C_b$ plane blocks in macro block + \locvar{\mbi}, arranged into raster order, and \locvar{I}, \locvar{J}, + \locvar{K}, and \locvar{L} be the indices \locvar{\bi} in coded order of the + $C_r$ plane blocks in macro block \locvar{\mbi}, arranged into raster order. + %TODO: as shown in Figure~REF. +\item +Assign $\bitvar{MVECTS}[\locvar{E}]$ and $\bitvar{MVECTS}[\locvar{I}]$ the + value \\ $\bitvar{MVECTS}[\locvar{A}]$. +\item +Assign $\bitvar{MVECTS}[\locvar{F}]$ and $\bitvar{MVECTS}[\locvar{J}]$ the + value \\ $\bitvar{MVECTS}[\locvar{B}]$. +\item +Assign $\bitvar{MVECTS}[\locvar{G}]$ and $\bitvar{MVECTS}[\locvar{K}]$ the + value \\ $\bitvar{MVECTS}[\locvar{C}]$. +\item +Assign $\bitvar{MVECTS}[\locvar{H}]$ and $\bitvar{MVECTS}[\locvar{L}]$ the + value \\ $\bitvar{MVECTS}[\locvar{D}]$. +\end{enumerate} +\item +Assign \locvar{LAST2} the value \locvar{LAST1}. +\item +Assign \locvar{LAST1} the value $(\locvar{MVX},\locvar{MVY})$. +This is the value of the motion vector decoded from the last coded luma block + in raster order. +There must always be at least one, since macro blocks with no coded luma blocks + must use mode 0:~INTER\_NOMV. +\end{enumerate} +\item +Otherwise, if $\bitvar{MBMODES}[\locvar{\mbi}]$ is 6 (INTER\_GOLDEN\_MV), + decode a single motion vector into \locvar{MVX} and \locvar{MVY} using the + procedure described in Section~\ref{sub:mv-decode}. +\item +Otherwise, if $\bitvar{MBMODES}[\locvar{\mbi}]$ is 4 (INTER\_MV\_LAST2): +\begin{enumerate} +\item +Assign $(\locvar{MVX},\locvar{MVY})$ the value \locvar{LAST2}. +\item +Assign \locvar{LAST2} the value \locvar{LAST1}. +\item +Assign \locvar{LAST1} the value $(\locvar{MVX},\locvar{MVY})$. +\end{enumerate} +\item +Otherwise, if $\bitvar{MBMODES}[\locvar{\mbi}]$ is 3 (INTER\_MV\_LAST), assign + $(\locvar{MVX},\locvar{MVY})$ the value \locvar{LAST1}. +\item +Otherwise, if $\bitvar{MBMODES}[\locvar{\mbi}]$ is 2 (INTER\_MV): +\begin{enumerate} +\item +Decode a single motion vector into \locvar{MVX} and \locvar{MVY} using the + procedure described in Section~\ref{sub:mv-decode}. +\item +Assign \locvar{LAST2} the value \locvar{LAST1}. +\item +Assign \locvar{LAST1} the value $(\locvar{MVX},\locvar{MVY})$. +\end{enumerate} +\item +Otherwise ($\bitvar{MBMODES}[\locvar{\mbi}]$ is 5:~INTER\_GOLDEN\_NOMV, + 1:~INTRA, or 0:~INTER\_NOMV), assign \locvar{MVX} and \locvar{MVY} the value + zero. +\item +If $\bitvar{MBMODES}[\locvar{\mbi}]$ is not 7 (not INTER\_MV\_FOUR), then for + each coded block \locvar{\bi} in macro block \locvar{\mbi}: +\begin{enumerate} +\item +Assign $\bitvar{MVECTS}[\locvar{\bi}]$ the value $(\locvar{MVX},\locvar{MVY})$. +\end{enumerate} +\end{enumerate} +\end{enumerate} + +\paragraph{VP3 Compatibility} + +Unless all four luma blocks in the macro block are coded, the VP3 encoder does + not select mode INTER\_MV\_FOUR. +Theora removes this restriction by treating the motion vector for an uncoded + luma block as the default $(0,0)$ vector. +This is consistent with the premise that the block has not changed since the + previous frame and that chroma information can be largely ignored when + estimating motion. + +No modification is required for INTER\_MV\_FOUR macro blocks in VP3 streams to + be decoded correctly by a Theora decoder. +However, regardless of how many of the luma blocks are actually coded, the VP3 + decoder always reads four motion vectors from the stream for INTER\_MV\_FOUR + mode. +The motion vectors read are used to calculate the motion vectors for the chroma + blocks, but are otherwise ignored. +Thus, care should be taken when creating Theora streams meant to be backwards + compatible with VP3 to only use INTER\_MV\_FOUR mode when all four luma + blocks are coded. + +\section{Block-Level \qi\ Decode} +\label{sub:block-qis} + +\paragraph{Input parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{NBS} & Integer & 36 & No & The total number of blocks in a + frame. \\ +\bitvar{BCODED} & \multicolumn{1}{p{40pt}}{Integer Array} & + 1 & No & An \bitvar{NBS}-element array of flags + indicating which blocks are coded. \\ +\bitvar{NQIS} & Integer & 2 & No & The number of \qi\ values. \\ +\bottomrule\end{tabularx} + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{QIIS} & \multicolumn{1}{p{40pt}}{Integer Array} & + 2 & No & An \bitvar{NBS}-element array of + \locvar{\qii} values for each block. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\locvar{NBITS} & Integer & 36 & No & The length of a bit string to decode. \\ +\locvar{BITS} & Bit string & & & A decoded set of flags. \\ +\locvar{\bi} & Integer & 36 & No & The index of the current block in + coded order. \\ +\locvar{\qii} & Integer & 2 & No & The index of \qi\ value in the list of + \qi\ values defined for this frame. \\ +\bottomrule\end{tabularx} +\medskip + +This procedure selects the \qi\ value to be used for dequantizing the AC + coefficients of each block. +DC coefficients all use the same \qi\ value, so as to avoid interference with + the DC prediction mechanism, which occurs in the quantized domain. + +The value is actually represented by an index \locvar{\qii} into the list of + \qi\ values defined for the frame. +The decoder makes multiple passes through the list of coded blocks, one for + each \qi\ value except the last one. +In each pass, an RLE-coded bitmask is decoded to divide the blocks into two + groups: those that use the current \qi\ value in the list, and those that use + a value from later in the list. +Each subsequent pass is restricted to the blocks in the second group. + +\begin{enumerate} +\item +For each value of \locvar{\bi} from 0 to $(\bitvar{NBS}-1)$, assign + $\bitvar{QIIS}[\locvar{\bi}]$ the value zero. +\item +For each consecutive value of \locvar{\qii} from 0 to $(\bitvar{NQIS}-2)$: +\begin{enumerate} +\item +Assign \locvar{NBITS} be the number of blocks \locvar{\bi} such that + $\bitvar{BCODED}[\locvar{\bi}]$ is non-zero and $\bitvar{QIIS}[\locvar{\bi}]$ + equals $\locvar{\qii}$. +\item +Read an \locvar{NBITS}-bit bit string into \locvar{BITS}, using the procedure + described in Section~\ref{sub:long-run}. +This represents the list of blocks that use \qi\ value \locvar{\qii} or higher. +\item +For each consecutive value of \locvar{\bi} from 0 to $(\bitvar{NBS}-1)$ such + that $\bitvar{BCODED}[\locvar{\bi}]$ is non-zero and + $\bitvar{QIIS}[\locvar{\bi}]$ equals $\locvar{\qii}$: +\begin{enumerate} +\item +Remove the bit at the head of the string \locvar{BITS} and add its value to + $\bitvar{QIIS}[\locvar{\bi}]$. +\end{enumerate} +\end{enumerate} +\end{enumerate} + +\paragraph{VP3 Compatibility} + +For VP3 compatible streams, only one \qi\ value can be specified in the frame + header, so the main loop of the above procedure, which would iterate from $0$ + to $-1$, is never executed. +Thus, no bits are read, and each block uses the one \qi\ value defined for the + frame. + +\cleardoublepage + +\section{DCT Coefficients} +\label{sec:dct-decode} + +The quantized DCT coefficients are decoded by making 64 passes through the list + of coded blocks, one for each token index in zig-zag order. +For the DC tokens, two Huffman tables are chosen from among the first 16, one + for the luma plane and one for the chroma planes. +The AC tokens, however, are divided into four different groups. +Again, two 4-bit indices are decoded, one for the luma plane, and one for the + chroma planes, but these select the codebooks for {\em all four} groups. +AC coefficients in group one use codebooks $16\ldots 31$, while group two uses + $32\ldots 47$, etc. +Note that this second set of indices is decoded even if there are no non-zero + AC coefficients in the frame. + +Tokens are divided into two major types: EOB tokens, which fill the remainder + of one or more blocks with zeros, and coefficient tokens, which fill in one or + more coefficients within a single block. +A decoding procedure for the first is given in Section~\ref{sub:eob-token}, and + for the second in Section~\ref{sub:coeff-token}. +The decoding procedure for the complete set of quantized coefficients is given + in Section~\ref{sub:dct-coeffs}. + +\subsection{EOB Token Decode} +\label{sub:eob-token} + +\paragraph{Input parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{TOKEN} & Integer & 5 & No & The token being decoded. +This must be in the range $0\ldots 6$. \\ +\bitvar{NBS} & Integer & 36 & No & The total number of blocks in a + frame. \\ +\bitvar{TIS} & \multicolumn{1}{p{40pt}}{Integer Array} & + 7 & No & An \bitvar{NBS}-element array of the + current token index for each block. \\ +\bitvar{NCOEFFS} & \multicolumn{1}{p{40pt}}{Integer Array} & + 7 & No & An \bitvar{NBS}-element array of the + coefficient count for each block. \\ +\bitvar{COEFFS} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 16 & Yes & An $\bitvar{NBS}\times 64$ array of + quantized DCT coefficient values for each block in zig-zag order. \\ +\bitvar{\bi} & Integer & 36 & No & The index of the current block in + coded order. \\ +\bitvar{\ti} & Integer & 6 & No & The current token index. \\ +\bottomrule\end{tabularx} + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{TIS} & \multicolumn{1}{p{40pt}}{Integer Array} & + 7 & No & An \bitvar{NBS}-element array of the + current token index for each block. \\ +\bitvar{COEFFS} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 16 & Yes & An $\bitvar{NBS}\times 64$ array of + quantized DCT coefficient values for each block in zig-zag order. \\ +\bitvar{EOBS} & Integer & 36 & No & The remaining length of the current + EOB run. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\locvar{\bj} & Integer & 36 & No & Another index of a block in coded + order. \\ +\locvar{\tj} & Integer & 6 & No & Another token index. \\ +\bottomrule\end{tabularx} +\medskip + +A summary of the EOB tokens is given in Table~\ref{tab:eob-tokens}. +An important thing to note is that token 6 does not add an offset to the + decoded run value, even though in general it should only be used for runs of + size 32 or longer. +If a value of zero is decoded for this run, it is treated as an EOB run the + size of the remaining coded blocks. + +\begin{table}[htbp] +\begin{center} +\begin{tabular}{ccl}\toprule +Token Value & Extra Bits & EOB Run Lengths \\\midrule +$0$ & $0$ & $1$ \\ +$1$ & $0$ & $2$ \\ +$2$ & $0$ & $3$ \\ +$3$ & $2$ & $4\ldots 7$ \\ +$4$ & $3$ & $8\ldots 15$ \\ +$5$ & $4$ & $16\ldots 31$ \\ +$6$ & $12$ & $1\ldots 4095$, or all remaining blocks \\ +\bottomrule\end{tabular} +\end{center} +\caption{EOB Token Summary} +\label{tab:eob-tokens} +\end{table} + +There is no restriction that one EOB token cannot be immediately followed by + another, so no special cases are necessary to extend the range of the maximum + run length as were required in Section~\ref{sub:long-run}. +Indeed, depending on the lengths of the Huffman codes, it may even cheaper to + encode, by way of example, an EOB run of length 31 followed by an EOB run of + length 1 than to encode an EOB run of length 32 directly. +There is also no restriction that an EOB run stop at the end of a color plane + or a token index. +The run MUST, however, end at or before the end of the frame. + +\begin{enumerate} +\item +If \bitvar{TOKEN} is 0, assign \bitvar{EOBS} the value 1. +\item +Otherwise, if \bitvar{TOKEN} is 1, assign \bitvar{EOBS} the value 2. +\item +Otherwise, if \bitvar{TOKEN} is 2, assign \bitvar{EOBS} the value 3. +\item +Otherwise, if \bitvar{TOKEN} is 3: +\begin{enumerate} +\item +Read a 2-bit unsigned integer as \bitvar{EOBS}. +\item +Assign \bitvar{EOBS} the value $(\bitvar{EOBS}+4)$. +\end{enumerate} +\item +Otherwise, if \bitvar{TOKEN} is 4: +\begin{enumerate} +\item +Read a 3-bit unsigned integer as \bitvar{EOBS}. +\item +Assign \bitvar{EOBS} the value $(\bitvar{EOBS}+8)$. +\end{enumerate} +\item +Otherwise, if \bitvar{TOKEN} is 5: +\begin{enumerate} +\item +Read a 4-bit unsigned integer as \bitvar{EOBS}. +\item +Assign \bitvar{EOBS} the value $(\bitvar{EOBS}+16)$. +\end{enumerate} +\item +Otherwise, \bitvar{TOKEN} is 6: +\begin{enumerate} +\item +Read a 12-bit unsigned integer as \bitvar{EOBS}. +\item +If \bitvar{EOBS} is zero, assign \bitvar{EOBS} to be the number of coded blocks + \locvar{\bj} such that $\bitvar{TIS}[\locvar{\bj}]$ is less than 64. +\end{enumerate} +\item +For each value of \locvar{\tj} from $\bitvar{\ti}$ to 63, assign + $\bitvar{COEFFS}[\bitvar{\bi}][\locvar{\tj}]$ the value zero. +\item +Assign $\bitvar{NCOEFFS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]$. +\item +Assign $\bitvar{TIS}[\bitvar{\bi}]$ the value 64. +\item +Assign \bitvar{EOBS} the value $(\bitvar{EOBS}-1)$. +\end{enumerate} + +\paragraph{VP3 Compatibility} + +The VP3 encoder does not use the special interpretation of a zero-length EOB + run, though its decoder {\em does} support it. +That may be due more to a happy accident in the way the decoder was written + than intentional design, however, and other VP3 implementations might not + reproduce it faithfully. +For backwards compatibility, it may be wise to avoid it, especially as for most + frame sizes there are fewer than 4095 blocks, making it unnecessary. + +\subsection{Coefficient Token Decode} +\label{sub:coeff-token} + +\paragraph{Input parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{TOKEN} & Integer & 5 & No & The token being decoded. +This must be in the range $7\ldots 31$. \\ +\bitvar{NBS} & Integer & 36 & No & The total number of blocks in a + frame. \\ +\bitvar{TIS} & \multicolumn{1}{p{40pt}}{Integer Array} & + 7 & No & An \bitvar{NBS}-element array of the + current token index for each block. \\ +\bitvar{COEFFS} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 16 & Yes & An $\bitvar{NBS}\times 64$ array of + quantized DCT coefficient values for each block in zig-zag order. \\ +\bitvar{\bi} & Integer & 36 & No & The index of the current block in + coded order. \\ +\bitvar{\ti} & Integer & 6 & No & The current token index. \\ +\bottomrule\end{tabularx} + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{TIS} & \multicolumn{1}{p{40pt}}{Integer Array} & + 7 & No & An \bitvar{NBS}-element array of the + current token index for each block. \\ +\bitvar{NCOEFFS} & \multicolumn{1}{p{40pt}}{Integer Array} & + 7 & No & An \bitvar{NBS}-element array of the + coefficient count for each block. \\ +\bitvar{COEFFS} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 16 & Yes & An $\bitvar{NBS}\times 64$ array of + quantized DCT coefficient values for each block in zig-zag order. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\locvar{SIGN} & Integer & 1 & No & A flag indicating the sign of the + current coefficient. \\ +\locvar{MAG} & Integer & 10 & No & The magnitude of the current + coefficient. \\ +\locvar{RLEN} & Integer & 6 & No & The length of the current zero run. \\ +\locvar{\tj} & Integer & 6 & No & Another token index. \\ +\bottomrule\end{tabularx} +\medskip + +Each of these tokens decodes one or more coefficients in the current block. +A summary of the meanings of the token values is presented in + Table~\ref{tab:coeff-tokens}. +There are often several different ways to tokenize a given coefficient list. +Which one is optimal depends on the exact lengths of the Huffman codes used to + represent each token. +Note that we do not update the coefficient count for the block if we decode a + pure zero run. + +\begin{table}[htbp] +\begin{center} +\begin{tabularx}{\textwidth}{cclX}\toprule +Token Value & Extra Bits & \multicolumn{1}{p{55pt}}{Number of Coefficients} + & Description \\\midrule +$7$ & $3$ & $1\ldots 8$ & Short zero run. \\ +$8$ & $6$ & $1\ldots 64$ & Zero run. \\ +$9$ & $0$ & $1$ & $1$. \\ +$10$ & $0$ & $1$ & $-1$. \\ +$11$ & $0$ & $1$ & $2$. \\ +$12$ & $0$ & $1$ & $-2$. \\ +$13$ & $1$ & $1$ & $\pm 3$. \\ +$14$ & $1$ & $1$ & $\pm 4$. \\ +$15$ & $1$ & $1$ & $\pm 5$. \\ +$16$ & $1$ & $1$ & $\pm 6$. \\ +$17$ & $2$ & $1$ & $\pm 7\ldots 8$. \\ +$18$ & $3$ & $1$ & $\pm 9\ldots 12$. \\ +$19$ & $4$ & $1$ & $\pm 13\ldots 20$. \\ +$20$ & $5$ & $1$ & $\pm 21\ldots 36$. \\ +$21$ & $6$ & $1$ & $\pm 37\ldots 68$. \\ +$22$ & $10$ & $1$ & $\pm 69\ldots 580$. \\ +$23$ & $1$ & $2$ & One zero followed by $\pm 1$. \\ +$24$ & $1$ & $3$ & Two zeros followed by $\pm 1$. \\ +$25$ & $1$ & $4$ & Three zeros followed by + $\pm 1$. \\ +$26$ & $1$ & $5$ & Four zeros followed by + $\pm 1$. \\ +$27$ & $1$ & $6$ & Five zeros followed by + $\pm 1$. \\ +$28$ & $3$ & $7\ldots 10$ & $6\ldots 9$ zeros followed by + $\pm 1$. \\ +$29$ & $4$ & $11\ldots 18$ & $10\ldots 17$ zeros followed by + $\pm 1$.\\ +$30$ & $2$ & $2$ & One zero followed by + $\pm 2\ldots 3$. \\ +$31$ & $3$ & $3\ldots 4$ & $2\ldots 3$ zeros followed by + $\pm 2\ldots 3$. \\ +\bottomrule\end{tabularx} +\end{center} +\caption{Coefficient Token Summary} +\label{tab:coeff-tokens} +\end{table} + +For tokens which represent more than one coefficient, they MUST NOT bring the + total number of coefficients in the block to more than 64. +Care should be taken in a decoder to check for this, as otherwise it may permit + buffer overflows from invalidly formed packets. +\begin{verse} +{\bf Note:} One way to achieve this efficiently is to combine the inverse + zig-zag mapping (described later in Section~\ref{sub:dequant}) with + coefficient decode, and use a table look-up to map zig-zag indices greater + than 63 to a safe location. +\end{verse} + +\begin{enumerate} +\item +If \bitvar{TOKEN} is 7: +\begin{enumerate} +\item +Read in a 3-bit unsigned integer as \locvar{RLEN}. +\item +Assign \locvar{RLEN} the value $(\locvar{RLEN}+1)$. +\item +For each value of \locvar{\tj} from \bitvar{\ti} to + $(\bitvar{\ti}+\locvar{RLEN}-1)$, assign + $\bitvar{COEFFS}[\bitvar{\bi}][\locvar{\tj}]$ the value zero. +\item +Assign $\bitvar{TIS}[\bitvar{\bi}]$ the value + $\bitvar{TIS}[\bitvar{\bi}]+\locvar{RLEN}$. +\end{enumerate} +\item +Otherwise, if \bitvar{TOKEN} is 8: +\begin{enumerate} +\item +Read in a 6-bit unsigned integer as \locvar{RLEN}. +\item +Assign \locvar{RLEN} the value $(\locvar{RLEN}+1)$. +\item +For each value of \locvar{\tj} from \bitvar{\ti} to + $(\bitvar{\ti}+\locvar{RLEN}-1)$, assign + $\bitvar{COEFFS}[\bitvar{\bi}][\locvar{\tj}]$ the value zero. +\item +Assign $\bitvar{TIS}[\bitvar{\bi}]$ the value + $\bitvar{TIS}[\bitvar{\bi}]+\locvar{RLEN}$. +\end{enumerate} +\item +Otherwise, if \bitvar{TOKEN} is 9: +\begin{enumerate} +\item +Assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}]$ the value $1$. +\item +Assign $\bitvar{TIS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]+1$. +\item +Assign $\bitvar{NCOEFFS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]$. +\end{enumerate} +\item +Otherwise, if \bitvar{TOKEN} is 10: +\begin{enumerate} +\item +Assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}]$ the value $-1$. +\item +Assign $\bitvar{TIS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]+1$. +\item +Assign $\bitvar{NCOEFFS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]$. +\end{enumerate} +\item +Otherwise, if \bitvar{TOKEN} is 11: +\begin{enumerate} +\item +Assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}]$ the value $2$. +\item +Assign $\bitvar{TIS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]+1$. +\item +Assign $\bitvar{NCOEFFS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]$. +\end{enumerate} +\item +Otherwise, if \bitvar{TOKEN} is 12: +\begin{enumerate} +\item +Assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}]$ the value $-2$. +\item +Assign $\bitvar{TIS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]+1$. +\item +Assign $\bitvar{NCOEFFS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]$. +\end{enumerate} +\item +Otherwise, if \bitvar{TOKEN} is 13: +\begin{enumerate} +\item +Read a 1-bit unsigned integer as \locvar{SIGN}. +\item +If \locvar{SIGN} is zero, assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}]$ + the value $3$. +\item +Otherwise, assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}]$ the value $-3$. +\item +Assign $\bitvar{TIS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]+1$. +\item +Assign $\bitvar{NCOEFFS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]$. +\end{enumerate} +\item +Otherwise, if \bitvar{TOKEN} is 14: +\begin{enumerate} +\item +Read a 1-bit unsigned integer as \locvar{SIGN}. +\item +If \locvar{SIGN} is zero, assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}]$ + the value $4$. +\item +Otherwise, assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}]$ the value $-4$. +\item +Assign $\bitvar{TIS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]+1$. +\item +Assign $\bitvar{NCOEFFS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]$. +\end{enumerate} +\item +Otherwise, if \bitvar{TOKEN} is 15: +\begin{enumerate} +\item +Read a 1-bit unsigned integer as \locvar{SIGN}. +\item +If \locvar{SIGN} is zero, assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}]$ + the value $5$. +\item +Otherwise, assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}]$ the value $-5$. +\item +Assign $\bitvar{TIS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]+1$. +\item +Assign $\bitvar{NCOEFFS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]$. +\end{enumerate} +\item +Otherwise, if \bitvar{TOKEN} is 16: +\begin{enumerate} +\item +Read a 1-bit unsigned integer as \locvar{SIGN}. +\item +If \locvar{SIGN} is zero, assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}]$ + the value $6$. +\item +Otherwise, assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}]$ the value $-6$. +\item +Assign $\bitvar{TIS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]+1$. +\item +Assign $\bitvar{NCOEFFS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]$. +\end{enumerate} +\item +Otherwise, if \bitvar{TOKEN} is 17: +\begin{enumerate} +\item +Read a 1-bit unsigned integer as \locvar{SIGN}. +\item +Read a 1-bit unsigned integer as \locvar{MAG}. +\item +Assign \locvar{MAG} the value $(\locvar{MAG}+7)$. +\item +If \locvar{SIGN} is zero, assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}]$ + the value $\locvar{MAG}$. +\item +Otherwise, assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}]$ the value + $-\locvar{MAG}$. +\item +Assign $\bitvar{TIS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]+1$. +\item +Assign $\bitvar{NCOEFFS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]$. +\end{enumerate} +\item +Otherwise, if \bitvar{TOKEN} is 18: +\begin{enumerate} +\item +Read a 1-bit unsigned integer as \locvar{SIGN}. +\item +Read a 2-bit unsigned integer as \locvar{MAG}. +\item +Assign \locvar{MAG} the value $(\locvar{MAG}+9)$. +\item +If \locvar{SIGN} is zero, assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}]$ + the value $\locvar{MAG}$. +\item +Otherwise, assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}]$ the value + $-\locvar{MAG}$. +\item +Assign $\bitvar{TIS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]+1$. +\item +Assign $\bitvar{NCOEFFS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]$. +\end{enumerate} +\item +Otherwise, if \bitvar{TOKEN} is 19: +\begin{enumerate} +\item +Read a 1-bit unsigned integer as \locvar{SIGN}. +\item +Read a 3-bit unsigned integer as \locvar{MAG}. +\item +Assign \locvar{MAG} the value $(\locvar{MAG}+13)$. +\item +If \locvar{SIGN} is zero, assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}]$ + the value $\locvar{MAG}$. +\item +Otherwise, assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}]$ the value + $-\locvar{MAG}$. +\item +Assign $\bitvar{TIS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]+1$. +\item +Assign $\bitvar{NCOEFFS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]$. +\end{enumerate} +\item +Otherwise, if \bitvar{TOKEN} is 20: +\begin{enumerate} +\item +Read a 1-bit unsigned integer as \locvar{SIGN}. +\item +Read a 4-bit unsigned integer as \locvar{MAG}. +\item +Assign \locvar{MAG} the value $(\locvar{MAG}+21)$. +\item +If \locvar{SIGN} is zero, assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}]$ + the value $\locvar{MAG}$. +\item +Otherwise, assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}]$ the value + $-\locvar{MAG}$. +\item +Assign $\bitvar{TIS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]+1$. +\item +Assign $\bitvar{NCOEFFS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]$. +\end{enumerate} +\item +Otherwise, if \bitvar{TOKEN} is 21: +\begin{enumerate} +\item +Read a 1-bit unsigned integer as \locvar{SIGN}. +\item +Read a 5-bit unsigned integer as \locvar{MAG}. +\item +Assign \locvar{MAG} the value $(\locvar{MAG}+37)$. +\item +If \locvar{SIGN} is zero, assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}]$ + the value $\locvar{MAG}$. +\item +Otherwise, assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}]$ the value + $-\locvar{MAG}$. +\item +Assign $\bitvar{TIS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]+1$. +\item +Assign $\bitvar{NCOEFFS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]$. +\end{enumerate} +\item +Otherwise, if \bitvar{TOKEN} is 22: +\begin{enumerate} +\item +Read a 1-bit unsigned integer as \locvar{SIGN}. +\item +Read a 9-bit unsigned integer as \locvar{MAG}. +\item +Assign \locvar{MAG} the value $(\locvar{MAG}+69)$. +\item +If \locvar{SIGN} is zero, assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}]$ + the value $\locvar{MAG}$. +\item +Otherwise, assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}]$ the value + $-\locvar{MAG}$. +\item +Assign $\bitvar{TIS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]+1$. +\item +Assign $\bitvar{NCOEFFS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]$. +\end{enumerate} +\item +Otherwise, if \bitvar{TOKEN} is 23: +\begin{enumerate} +\item +Assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}]$ the value zero. +\item +Read a 1-bit unsigned integer as SIGN. +\item +If \locvar{SIGN} is zero, assign + $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}+1]$ the value $1$. +\item +Otherwise, assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}+1]$ the value + $-1$. +\item +Assign $\bitvar{TIS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]+2$. +\item +Assign $\bitvar{NCOEFFS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]$. +\end{enumerate} +\item +Otherwise, if \bitvar{TOKEN} is 24: +\begin{enumerate} +\item +For each value of \locvar{\tj} from \bitvar{\ti} to $(\bitvar{\ti}+1)$, assign + $\bitvar{COEFFS}[\bitvar{\bi}][\locvar{\tj}]$ the value zero. +\item +Read a 1-bit unsigned integer as SIGN. +\item +If \locvar{SIGN} is zero, assign + $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}+2]$ the value $1$. +\item +Otherwise, assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}+2]$ the value + $-1$. +\item +Assign $\bitvar{TIS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]+3$. +\item +Assign $\bitvar{NCOEFFS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]$. +\end{enumerate} +\item +Otherwise, if \bitvar{TOKEN} is 25: +\begin{enumerate} +\item +For each value of \locvar{\tj} from \bitvar{\ti} to $(\bitvar{\ti}+2)$, assign + $\bitvar{COEFFS}[\bitvar{\bi}][\locvar{\tj}]$ the value zero. +\item +Read a 1-bit unsigned integer as SIGN. +\item +If \locvar{SIGN} is zero, assign + $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}+3]$ the value $1$. +\item +Otherwise, assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}+3]$ the value + $-1$. +\item +Assign $\bitvar{TIS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]+4$. +\item +Assign $\bitvar{NCOEFFS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]$. +\end{enumerate} +\item +Otherwise, if \bitvar{TOKEN} is 26: +\begin{enumerate} +\item +For each value of \locvar{\tj} from \bitvar{\ti} to $(\bitvar{\ti}+3)$, assign + $\bitvar{COEFFS}[\bitvar{\bi}][\locvar{\tj}]$ the value zero. +\item +Read a 1-bit unsigned integer as SIGN. +\item +If \locvar{SIGN} is zero, assign + $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}+4]$ the value $1$. +\item +Otherwise, assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}+4]$ the value + $-1$. +\item +Assign $\bitvar{TIS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]+5$. +\item +Assign $\bitvar{NCOEFFS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]$. +\end{enumerate} +\item +Otherwise, if \bitvar{TOKEN} is 27: +\begin{enumerate} +\item +For each value of \locvar{\tj} from \bitvar{\ti} to $(\bitvar{\ti}+4)$, assign + $\bitvar{COEFFS}[\bitvar{\bi}][\locvar{\tj}]$ the value zero. +\item +Read a 1-bit unsigned integer as SIGN. +\item +If \locvar{SIGN} is zero, assign + $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}+5]$ the value $1$. +\item +Otherwise, assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}+5]$ the value + $-1$. +\item +Assign $\bitvar{TIS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]+6$. +\item +Assign $\bitvar{NCOEFFS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]$. +\end{enumerate} +\item +Otherwise, if \bitvar{TOKEN} is 28: +\begin{enumerate} +\item +Read a 1-bit unsigned integer as \locvar{SIGN}. +\item +Read a 2-bit unsigned integer as \locvar{RLEN}. +\item +Assign \locvar{RLEN} the value $(\locvar{RLEN}+6)$. +\item +For each value of \locvar{\tj} from \bitvar{\ti} to + $(\bitvar{\ti}+\locvar{RLEN}-1)$, assign + $\bitvar{COEFFS}[\bitvar{\bi}][\locvar{\tj}]$ the value zero. +\item +If \locvar{SIGN} is zero, assign + $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}+\locvar{RLEN}]$ the value $1$. +\item +Otherwise, assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}+\locvar{RLEN}]$ + the value $-1$. +\item +Assign $\bitvar{TIS}[\bitvar{\bi}]$ the value + $\bitvar{TIS}[\bitvar{\bi}]+\locvar{RLEN}+1$. +\item +Assign $\bitvar{NCOEFFS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]$. +\end{enumerate} +\item +Otherwise, if \bitvar{TOKEN} is 29: +\begin{enumerate} +\item +Read a 1-bit unsigned integer as \locvar{SIGN}. +\item +Read a 3-bit unsigned integer as \locvar{RLEN}. +\item +Assign \locvar{RLEN} the value $(\locvar{RLEN}+10)$. +\item +For each value of \locvar{\tj} from \bitvar{\ti} to + $(\bitvar{\ti}+\locvar{RLEN}-1)$, assign + $\bitvar{COEFFS}[\bitvar{\bi}][\locvar{\tj}]$ the value zero. +\item +If \locvar{SIGN} is zero, assign + $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}+\locvar{RLEN}]$ the value $1$. +\item +Otherwise, assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}+\locvar{RLEN}]$ + the value $-1$. +\item +Assign $\bitvar{TIS}[\bitvar{\bi}]$ the value + $\bitvar{TIS}[\bitvar{\bi}]+\locvar{RLEN}+1$. +Assign $\bitvar{NCOEFFS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]$. +\end{enumerate} +\item +Otherwise, if \bitvar{TOKEN} is 30: +\begin{enumerate} +\item +Assign $\bitvar{COEFFS}[\bitvar{\bi}][\locvar{\ti}]$ the value zero. +\item +Read a 1-bit unsigned integer as \locvar{SIGN}. +\item +Read a 1-bit unsigned integer as \locvar{MAG}. +\item +Assign \locvar{MAG} the value $(\locvar{MAG}+2)$. +\item +If \locvar{SIGN} is zero, assign + $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}+1]$ the value $\locvar{MAG}$. +\item +Otherwise, assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}+1]$ the value + $-\locvar{MAG}$. +\item +Assign $\bitvar{TIS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]+2$. +Assign $\bitvar{NCOEFFS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]$. +\end{enumerate} +\item +Otherwise, if \bitvar{TOKEN} is 31: +\begin{enumerate} +\item +Read a 1-bit unsigned integer as \locvar{SIGN}. +\item +Read a 1-bit unsigned integer as \locvar{MAG}. +\item +Assign \locvar{MAG} the value $(\locvar{MAG}+2)$. +\item +Read a 1-bit unsigned integer as \locvar{RLEN}. +\item +Assign \locvar{RLEN} the value $(\locvar{RLEN}+2)$. +\item +For each value of \locvar{\tj} from \bitvar{\ti} to + $(\bitvar{\ti}+\locvar{RLEN}-1)$, assign + $\bitvar{COEFFS}[\bitvar{\bi}][\locvar{\tj}]$ the value zero. +\item +If \locvar{SIGN} is zero, assign + $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}+\locvar{RLEN}]$ the value + $\locvar{MAG}$. +\item +Otherwise, assign $\bitvar{COEFFS}[\bitvar{\bi}][\bitvar{\ti}+\locvar{RLEN}]$ + the value $-\locvar{MAG}$. +\item +Assign $\bitvar{TIS}[\bitvar{\bi}]$ the value + $\bitvar{TIS}[\bitvar{\bi}]+\locvar{RLEN}+1$. +Assign $\bitvar{NCOEFFS}[\bitvar{\bi}]$ the value $\bitvar{TIS}[\bitvar{\bi}]$. +\end{enumerate} +\end{enumerate} + +\subsection{DCT Coefficient Decode} +\label{sub:dct-coeffs} + +\paragraph{Input parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{NBS} & Integer & 36 & No & The total number of blocks in a + frame. \\ +\bitvar{BCODED} & \multicolumn{1}{p{40pt}}{Integer Array} & + 1 & No & An \bitvar{NBS}-element array of flags + indicating which blocks are coded. \\ +\bitvar{NMBS} & Integer & 32 & No & The total number of macro blocks in a + frame. \\ +\bitvar{HTS} & \multicolumn{3}{l}{Huffman table array} + & An 80-element array of Huffman tables + with up to 32 entries each. \\ +\bottomrule\end{tabularx} + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{COEFFS} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 16 & Yes & An $\bitvar{NBS}\times 64$ array of + quantized DCT coefficient values for each block in zig-zag order. \\ +\bitvar{NCOEFFS} & \multicolumn{1}{p{40pt}}{Integer Array} & + 7 & No & An \bitvar{NBS}-element array of the + coefficient count for each block. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\locvar{NLBS} & Integer & 34 & No & The number of blocks in the luma + plane. \\ +\locvar{TIS} & \multicolumn{1}{p{40pt}}{Integer Array} & + 7 & No & An \bitvar{NBS}-element array of the + current token index for each block. \\ +\locvar{EOBS} & Integer & 36 & No & The remaining length of the current + EOB run. \\ +\locvar{TOKEN} & Integer & 5 & No & The current token being decoded. \\ +\locvar{HG} & Integer & 3 & No & The current Huffman table group. \\ +\locvar{\cbi} & Integer & 36 & No & The index of the current block in the + coded block list. \\ +\locvar{\bi} & Integer & 36 & No & The index of the current block in + coded order. \\ +\locvar{\bj} & Integer & 36 & No & Another index of a block in coded + order. \\ +\locvar{\ti} & Integer & 6 & No & The current token index. \\ +\locvar{\tj} & Integer & 6 & No & Another token index. \\ +\locvar{\hti_L} & Integer & 4 & No & The index of the current Huffman table + to use for the luma plane within a group. \\ +\locvar{\hti_C} & Integer & 4 & No & The index of the current Huffman table + to use for the chroma planes within a group. \\ +\locvar{\hti} & Integer & 7 & No & The index of the current Huffman table + to use. \\ +\bottomrule\end{tabularx} +\medskip + +This procedure puts the above two procedures to work to decode the entire set + of DCT coefficients for the frame. +At the end of this procedure, \locvar{EOBS} MUST be zero, and + $\locvar{TIS}[\locvar{\bi}]$ MUST be 64 for every coded \locvar{\bi}. + +Note that we update the coefficient count of every block before continuing an + EOB run or decoding a token, despite the fact that it is already up to date + unless the previous token was a pure zero run. +This is done intentionally to mimic the VP3 accounting rules. +Thus the only time the coefficient count does not include the coefficients in a + pure zero run is when when that run reaches all the way to coefficient 63. +Note, however, that regardless of the coefficient count, any additional + coefficients are still set to zero. +The only use of the count is in determining if a special case of the inverse + DCT can be used in Section~\ref{sub:2d-idct}. + +\begin{enumerate} +\item +Assign \locvar{NLBS} the value $(\bitvar{NMBS}*4)$. +\item +For each consecutive value of \locvar{\bi} from 0 to $(\bitvar{NBS}-1)$, + assign $\locvar{TIS}[\locvar{\bi}]$ the value zero. +\item +Assign \locvar{EOBS} the value 0. +\item +For each consecutive value of \locvar{\ti} from 0 to 63: +\begin{enumerate} +\item +If \locvar{\ti} is $0$ or $1$: +\begin{enumerate} +\item +Read a 4-bit unsigned integer as \locvar{\hti_L}. +\item +Read a 4-bit unsigned integer as \locvar{\hti_C}. +\end{enumerate} +\item +For each consecutive value of \locvar{\bi} from 0 to $(\bitvar{NBS}-1)$ for + which $\bitvar{BCODED}[\locvar{\bi}]$ is non-zero and + $\locvar{TIS}[\locvar{\bi}]$ equals \locvar{\ti}: +\begin{enumerate} +\item +Assign $\bitvar{NCOEFFS}[\locvar{\bi}]$ the value \locvar{\ti}. +\item +If \locvar{EOBS} is greater than zero: +\begin{enumerate} +\item +For each value of \locvar{\tj} from $\locvar{\ti}$ to 63, assign + $\bitvar{COEFFS}[\locvar{\bi}][\locvar{\tj}]$ the value zero. +\item +Assign $\locvar{TIS}[\locvar{\bi}]$ the value 64. +\item +Assign \locvar{EOBS} the value $(\locvar{EOBS}-1)$. +\end{enumerate} +\item +Otherwise: +\begin{enumerate} +\item +Assign \locvar{HG} a value based on \locvar{\ti} from + Table~\ref{tab:huff-groups}. + +\begin{table}[htbp] +\begin{center} +\begin{tabular}{lc}\toprule +\locvar{\ti} & \locvar{HG} \\\midrule +$0$ & $0$ \\ +$1\ldots 5$ & $1$ \\ +$6\ldots 14$ & $2$ \\ +$15\ldots 27$ & $3$ \\ +$28\ldots 63$ & $4$ \\ +\bottomrule\end{tabular} +\end{center} +\caption{Huffman Table Groups} +\label{tab:huff-groups} +\end{table} + +\item +If \locvar{\bi} is less than \locvar{NLBS}, assign \locvar{\hti} the value + $(16*\locvar{HG}+\locvar{\hti_L})$. +\item +Otherwise, assign \locvar{\hti} the value + $(16*\locvar{HG}+\locvar{\hti_C})$. +\item +Read one bit at a time until one of the codes in $\bitvar{HTS}[\locvar{\hti}]$ + is recognized, and assign the value to \locvar{TOKEN}. +\item +If \locvar{TOKEN} is less than 7, expand an EOB token using the procedure given + in Section~\ref{sub:eob-token} to update $\locvar{TIS}[\locvar{\bi}]$, + $\bitvar{COEFFS}[\locvar{\bi}]$, and \locvar{EOBS}. +\item +Otherwise, expand a coefficient token using the procedure given in + Section~\ref{sub:coeff-token} to update $\locvar{TIS}[\locvar{\bi}]$, + $\bitvar{COEFFS}[\locvar{\bi}]$, and $\bitvar{NCOEFFS}[\locvar{\bi}]$. +\end{enumerate} +\end{enumerate} +\end{enumerate} +\end{enumerate} + +\section{Undoing DC Prediction} + +The actual value of a DC coefficient decoded by Section~\ref{sec:dct-decode} is + the residual from a predicted value computed by the encoder. +This prediction is only applied to DC coefficients. +Quantized AC coefficients are encoded directly. + +This section describes how to undo this prediction to recover the original + DC coefficients. +The predicted DC value for a block is computed from the DC values of its + immediate neighbors which precede the block in raster order. +Thus, reversing this prediction must procede in raster order, instead of coded + order. + +Note that this step comes before dequantizing the coefficients. +For this reason, DC coefficients are all quantized with the same \qi\ value, + regardless of the block-level \qi\ values decoded in + Section~\ref{sub:block-qis}. +Those \qi\ values are applied only to the AC coefficients. + +\subsection{Computing the DC Predictor} +\label{sub:dc-pred} + +\paragraph{Input parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{BCODED} & \multicolumn{1}{p{40pt}}{Integer Array} & + 1 & No & An \bitvar{NBS}-element array of flags + indicating which blocks are coded. \\ +\bitvar{MBMODES} & \multicolumn{1}{p{40pt}}{Integer Array} & + 3 & No & An \bitvar{NMBS}-element array of + coding modes for each macro block. \\ +\bitvar{LASTDC} & \multicolumn{1}{p{40pt}}{Integer Array} & + 16 & Yes & A 3-element array containing the + most recently decoded DC value, one for inter mode and for each reference + frame. \\ +\bitvar{COEFFS} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 16 & Yes & An $\bitvar{NBS}\times 64$ array of + quantized DCT coefficient values for each block in zig-zag order. \\ +\bitvar{\bi} & Integer & 36 & No & The index of the current block in + coded order. \\ +\bottomrule\end{tabularx} + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{DCPRED} & Integer & 16 & Yes & The predicted DC value for the current + block. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\locvar{P} & \multicolumn{1}{p{40pt}}{Integer Array} & + 1 & No & A 4-element array indicating which + neighbors can be used for DC prediction. \\ +\locvar{PBI} & \multicolumn{1}{p{40pt}}{Integer Array} & + 36 & No & A 4-element array containing the + coded-order block index of the current block's neighbors. \\ +\locvar{W} & \multicolumn{1}{p{40pt}}{Integer Array} & + 7 & Yes & A 4-element array of the weights to + apply to each neighboring DC value. \\ +\locvar{PDIV} & Integer & 8 & No & The value to divide the weighted sum + by. \\ +\locvar{\bj} & Integer & 36 & No & The index of a neighboring block in + coded order. \\ +\locvar{\mbi} & Integer & 32 & No & The index of the macro block + containing block \bitvar{\bi}. \\ +\locvar{\mbj} & Integer & 32 & No & The index of the macro block + containing block \locvar{\bj}. \\ +\locvar{\rfi} & Integer & 2 & No & The index of the reference frame + indicated by the coding mode for macro block \locvar{\mbi}. \\ +\bottomrule\end{tabularx} +\medskip + +This procedure outlines how a predictor is formed for a single block. + +The predictor is computed as a weighted sum of the neighboring DC values from + coded blocks which use the same reference frame. +This latter condition is determined only by checking the coding mode for the + block. +Even if the golden frame and the previous frame are in fact the same, e.g. for + the first inter frame after an intra frame, they are still treated as being + different for the purposes of DC prediction. +The weighted sum is divided by a power of two, with truncation towards zero, + and the result is checked for outranging if necessary. + +If there are no neighboring coded blocks which use the same reference frame as + the current block, then the most recent DC value of any block that used that + reference frame is used instead. +If no such block exists, then the predictor is set to zero. + +\begin{enumerate} +\item +Assign \locvar{\mbi} the index of the macro block containing block + \bitvar{\bi}. +\item +Assign \locvar{\rfi} the value of the Reference Frame Index column of + Table~\ref{tab:cm-refs} corresponding to $\bitvar{MBMODES}[\locvar{\mbi}]$. + +\begin{table}[htpb] +\begin{center} +\begin{tabular}{ll}\toprule +Coding Mode & Reference Frame Index \\\midrule +$0$ (INTER\_NOMV) & $1$ (Previous) \\ +$1$ (INTRA) & $0$ (None) \\ +$2$ (INTER\_MV) & $1$ (Previous) \\ +$3$ (INTER\_MV\_LAST) & $1$ (Previous) \\ +$4$ (INTER\_MV\_LAST2) & $1$ (Previous) \\ +$5$ (INTER\_GOLDEN\_NOMV) & $2$ (Golden) \\ +$6$ (INTER\_GOLDEN\_MV) & $2$ (Golden) \\ +$7$ (INTER\_MV\_FOUR) & $1$ (Previous) \\ +\bottomrule\end{tabular} +\end{center} +\caption{Reference Frames for Each Coding Mode} +\label{tab:cm-refs} +\end{table} + +\item +If block \bitvar{\bi} is not along the left edge of the coded frame: +\begin{enumerate} +\item +Assign \locvar{\bj} the coded-order index of block \bitvar{\bi}'s left + neighbor, i.e., in the same row but one column to the left. +\item +If $\bitvar{BCODED}[\bj]$ is not zero: +\begin{enumerate} +\item +Assign \locvar{\mbj} the index of the macro block containing block + \locvar{\bj}. +\item +If the value of the Reference Frame Index column of Table~\ref{tab:cm-refs} + corresonding to $\bitvar{MBMODES}[\locvar{\mbj}]$ equals \locvar{\rfi}: +\begin{enumerate} +\item +Assign $\locvar{P}[0]$ the value $1$. +\item +Assign $\locvar{PBI}[0]$ the value \locvar{\bj}. +\end{enumerate} +\item +Otherwise, assign $\locvar{P}[0]$ the value zero. +\end{enumerate} +\item +Otherwise, assign $\locvar{P}[0]$ the value zero. +\end{enumerate} +\item +Otherwise, assign $\locvar{P}[0]$ the value zero. + +\item +If block \bitvar{\bi} is not along the left edge nor the bottom edge of the + coded frame: +\begin{enumerate} +\item +Assign \locvar{\bj} the coded-order index of block \bitvar{\bi}'s lower-left + neighbor, i.e., one row down and one column to the left. +\item +If $\bitvar{BCODED}[\bj]$ is not zero: +\begin{enumerate} +\item +Assign \locvar{\mbj} the index of the macro block containing block + \locvar{\bj}. +\item +If the value of the Reference Frame Index column of Table~\ref{tab:cm-refs} + corresonding to $\bitvar{MBMODES}[\locvar{\mbj}]$ equals \locvar{\rfi}: +\begin{enumerate} +\item +Assign $\locvar{P}[1]$ the value $1$. +\item +Assign $\locvar{PBI}[1]$ the value \locvar{\bj}. +\end{enumerate} +\item +Otherwise, assign $\locvar{P}[1]$ the value zero. +\end{enumerate} +\item +Otherwise, assign $\locvar{P}[1]$ the value zero. +\end{enumerate} +\item +Otherwise, assign $\locvar{P}[1]$ the value zero. + +\item +If block \bitvar{\bi} is not along the bottom edge of the coded frame: +\begin{enumerate} +\item +Assign \locvar{\bj} the coded-order index of block \bitvar{\bi}'s lower + neighbor, i.e., in the same column but one row down. +\item +If $\bitvar{BCODED}[\bj]$ is not zero: +\begin{enumerate} +\item +Assign \locvar{\mbj} the index of the macro block containing block + \locvar{\bj}. +\item +If the value of the Reference Frame Index column of Table~\ref{tab:cm-refs} + corresonding to $\bitvar{MBMODES}[\locvar{\mbj}]$ equals \locvar{\rfi}: +\begin{enumerate} +\item +Assign $\locvar{P}[2]$ the value $1$. +\item +Assign $\locvar{PBI}[2]$ the value \locvar{\bj}. +\end{enumerate} +\item +Otherwise, assign $\locvar{P}[2]$ the value zero. +\end{enumerate} +\item +Otherwise, assign $\locvar{P}[2]$ the value zero. +\end{enumerate} +\item +Otherwise, assign $\locvar{P}[2]$ the value zero. + +\item +If block \bitvar{\bi} is not along the right edge nor the bottom edge of the + coded frame: +\begin{enumerate} +\item +Assign \locvar{\bj} the coded-order index of block \bitvar{\bi}'s lower-right + neighbor, i.e., one row down and one column to the right. +\item +If $\bitvar{BCODED}[\bj]$ is not zero: +\begin{enumerate} +\item +Assign \locvar{\mbj} the index of the macro block containing block + \locvar{\bj}. +\item +If the value of the Reference Frame Index column of Table~\ref{tab:cm-refs} + corresonding to $\bitvar{MBMODES}[\locvar{\mbj}]$ equals \locvar{\rfi}: +\begin{enumerate} +\item +Assign $\locvar{P}[3]$ the value $1$. +\item +Assign $\locvar{PBI}[3]$ the value \locvar{\bj}. +\end{enumerate} +\item +Otherwise, assign $\locvar{P}[3]$ the value zero. +\end{enumerate} +\item +Otherwise, assign $\locvar{P}[3]$ the value zero. +\end{enumerate} +\item +Otherwise, assign $\locvar{P}[3]$ the value zero. + +\item +If none of the values $\locvar{P}[0]$, $\locvar{P}[1]$, $\locvar{P}[2]$, nor + $\locvar{P}[3]$ are non-zero, then assign \bitvar{DCPRED} the value + $\bitvar{LASTDC}[\locvar{\rfi}]$. +\item +Otherwise: +\begin{enumerate} +\item +Assign the array \locvar{W} and the variable \locvar{PDIV} the values from the + row of Table~\ref{tab:dc-weights} corresonding to the values of each + $\locvar{P}[\idx{i}]$. + +\begin{table}[htb] +\begin{center} +\begin{tabular}{ccccrrrrr}\toprule +\multicolumn{1}{p{25pt}}{\centering$\locvar{P}[0]$ (L)} & +\multicolumn{1}{p{25pt}}{\centering$\locvar{P}[1]$ (DL)} & +\multicolumn{1}{p{25pt}}{\centering$\locvar{P}[2]$ (D)} & +\multicolumn{1}{p{25pt}}{\centering$\locvar{P}[3]$ (DR)} & +\multicolumn{1}{p{25pt}}{\centering$\locvar{W}[0]$ (L)} & +\multicolumn{1}{p{25pt}}{\centering$\locvar{W}[1]$ (DL)} & +\multicolumn{1}{p{25pt}}{\centering$\locvar{W}[2]$ (D)} & +\multicolumn{1}{p{25pt}}{\centering$\locvar{W}[3]$ (DR)} & +\locvar{PDIV} \\\midrule +$1$ & $0$ & $0$ & $0$ & $1$ & $0$ & $0$ & $0$ & $1$ \\ +$0$ & $1$ & $0$ & $0$ & $0$ & $1$ & $0$ & $0$ & $1$ \\ +$1$ & $1$ & $0$ & $0$ & $1$ & $0$ & $0$ & $0$ & $1$ \\ +$0$ & $0$ & $1$ & $0$ & $0$ & $0$ & $1$ & $0$ & $1$ \\ +$1$ & $0$ & $1$ & $0$ & $1$ & $0$ & $1$ & $0$ & $2$ \\ +$0$ & $1$ & $1$ & $0$ & $0$ & $0$ & $1$ & $0$ & $1$ \\ +$1$ & $1$ & $1$ & $0$ & $29$ & $-26$ & $29$ & $0$ & $32$ \\ +$0$ & $0$ & $0$ & $1$ & $0$ & $0$ & $0$ & $1$ & $1$ \\ +$1$ & $0$ & $0$ & $1$ & $75$ & $0$ & $0$ & $53$ & $128$ \\ +$0$ & $1$ & $0$ & $1$ & $0$ & $1$ & $0$ & $1$ & $2$ \\ +$1$ & $1$ & $0$ & $1$ & $75$ & $0$ & $0$ & $53$ & $128$ \\ +$0$ & $0$ & $1$ & $1$ & $0$ & $0$ & $1$ & $0$ & $1$ \\ +$1$ & $0$ & $1$ & $1$ & $75$ & $0$ & $0$ & $53$ & $128$ \\ +$0$ & $1$ & $1$ & $1$ & $0$ & $3$ & $10$ & $3$ & $16$ \\ +$1$ & $1$ & $1$ & $1$ & $29$ & $-26$ & $29$ & $0$ & $32$ \\ +\bottomrule\end{tabular} +\end{center} +\caption{Weights and Divisors for Each Set of Available DC Predictors} +\label{tab:dc-weights} +\end{table} + +\item +Assign \bitvar{DCPRED} the value zero. +\item +If $\locvar{P}[0]$ is non-zero, assign \bitvar{DCPRED} the value + $(\bitvar{DCPRED}+\locvar{W}[0]*\bitvar{COEFFS}[\locvar{PBI}[0]][0])$. +\item +If $\locvar{P}[1]$ is non-zero, assign \bitvar{DCPRED} the value + $(\bitvar{DCPRED}+\locvar{W}[1]*\bitvar{COEFFS}[\locvar{PBI}[1]][0])$. +\item +If $\locvar{P}[2]$ is non-zero, assign \bitvar{DCPRED} the value + $(\bitvar{DCPRED}+\locvar{W}[2]*\bitvar{COEFFS}[\locvar{PBI}[2]][0])$. +\item +If $\locvar{P}[3]$ is non-zero, assign \bitvar{DCPRED} the value + $(\bitvar{DCPRED}+\locvar{W}[3]*\bitvar{COEFFS}[\locvar{PBI}[3]][0])$. +\item +Assign \bitvar{DCPRED} the value $(\bitvar{DCPRED}//\locvar{PDIV})$. +\item +If $\locvar{P}[0]$, $\locvar{P}[1]$, and $\locvar{P}[2]$ are all non-zero: +\begin{enumerate} +\item +If $|\bitvar{DCPRED}-\bitvar{COEFFS}[\locvar{PBI}[2]][0]|$ is greater than + $128$, assign \bitvar{DCPRED} the value $\bitvar{COEFFS}[\locvar{PBI}[2]][0]$. +\item +Otherwise, if $|\bitvar{DCPRED}-\bitvar{COEFFS}[\locvar{PBI}[0]][0]|$ is + greater than $128$, assign \bitvar{DCPRED} the value + $\bitvar{COEFFS}[\locvar{PBI}[0]][0]$. +\item +Otherwise, if $|\bitvar{DCPRED}-\bitvar{COEFFS}[\locvar{PBI}[1]][0]|$ is + greater than $128$, assign \bitvar{DCPRED} the value + $\bitvar{COEFFS}[\locvar{PBI}[1]][0]$. +\end{enumerate} +\end{enumerate} +\end{enumerate} + +\subsection{Inverting the DC Prediction Process} +\label{sub:dc-pred-undo} + +\paragraph{Input parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{BCODED} & \multicolumn{1}{p{40pt}}{Integer Array} & + 1 & No & An \bitvar{NBS}-element array of flags + indicating which blocks are coded. \\ +\bitvar{MBMODES} & \multicolumn{1}{p{40pt}}{Integer Array} & + 3 & No & An \bitvar{NMBS}-element array of + coding modes for each macro block. \\ +\bitvar{COEFFS} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 16 & Yes & An $\bitvar{NBS}\times 64$ array of + quantized DCT coefficient values for each block in zig-zag order. \\ +\bottomrule\end{tabularx} + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{COEFFS} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 16 & Yes & An $\bitvar{NBS}\times 64$ array of + quantized DCT coefficient values for each block in zig-zag order. The DC + value of each block will be updated. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\locvar{LASTDC} & \multicolumn{1}{p{40pt}}{Integer Array} & + 16 & Yes & A 3-element array containing the + most recently decoded DC value, one for inter mode and for each reference + frame. \\ +\locvar{DCPRED} & Integer & 11 & Yes & The predicted DC value for the current + block. \\ +\locvar{DC} & Integer & 17 & Yes & The actual DC value for the current + block. \\ +\locvar{\bi} & Integer & 36 & No & The index of the current block in + coded order. \\ +\locvar{\mbi} & Integer & 32 & No & The index of the macro block + containing block \locvar{\bi}. \\ +\locvar{\rfi} & Integer & 2 & No & The index of the reference frame + indicated by the coding mode for macro block \locvar{\mbi}. \\ +\locvar{\pli} & Integer & 2 & No & A color plane index. \\ +\bottomrule\end{tabularx} +\medskip + +This procedure describes the complete process of undoing the DC prediction to + recover the original DC values. +Because it is possible to add a value as large as $580$ to the predicted DC + coefficient value at every block, which will then be used to increase the + predictor for the next block, the reconstructed DC value could overflow a + 16-bit integer. +This is handled by truncating the result to a 16-bit signed representation, + simply throwing away any higher bits in the two's complement representation of + the number. + +\begin{enumerate} +\item +For each consecutive value of \locvar{\pli} from $0$ to $2$: +\begin{enumerate} +\item +Assign $\locvar{LASTDC}[0]$ the value zero. +\item +Assign $\locvar{LASTDC}[1]$ the value zero. +\item +Assign $\locvar{LASTDC}[2]$ the value zero. +\item +For each block of color plane \locvar{\pli} in {\em raster} order, with + coded-order index \locvar{\bi}: +\begin{enumerate} +\item +If $\bitvar{BCODED}[\locvar{\bi}]$ is non-zero: +\begin{enumerate} +\item +Compute the value \locvar{DCPRED} using the procedure outlined in + Section~\ref{sub:dc-pred}. +\item +Assign \locvar{DC} the value + $(\bitvar{COEFFS}[\locvar{\bi}][0]+\locvar{DCPRED})$. +\item +Truncate \locvar{DC} to a 16-bit representation by dropping any higher-order + bits. +\item +Assign $\bitvar{COEFFS}[\locvar{\bi}][0]$ the value \locvar{DC}. +\item +Assign \locvar{\mbi} the index of the macro block containing block + \locvar{\bi}. +\item +Assign \locvar{\rfi} the value of the Reference Frame Index column of + Table~\ref{tab:cm-refs} corresponding to $\bitvar{MBMODES}[\locvar{\mbi}]$. +\item +Assign $\locvar{LASTDC}[\rfi]$ the value $\locvar{DC}$. +\end{enumerate} +\end{enumerate} +\end{enumerate} +\end{enumerate} + +\section{Reconstruction} + +At this stage, the complete contents of the data packet have been decoded. +All that remains is to reconstruct the contents of the new frame. +This is applied on a block by block basis, and as each block is independent, + the order they are processed in does not matter. + +\subsection{Predictors} +\label{sec:predictors} + +For each block, a predictor is formed based on its coding mode and motion + vector. +There are three basic types of predictors: the intra predictor, the whole-pixel + predictor, and the half-pixel predictor. +The former is used for all blocks coded in INTRA mode, while all other blocks + use one of the latter two. +The whole-pixel predictor is used if the fractional part of both motion vector + components is zero, otherwise the half-pixel predictor is used. + +\subsubsection{The Intra Predictor} +\label{sub:predintra} + +\paragraph{Input parameters:} None. + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{PRED} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & An $8\times 8$ array of predictor + values to use for INTRA coded blocks. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\locvar{\idx{bx}} & Integer & 3 & No & The horizontal pixel index in the + block. \\ +\locvar{\idx{by}} & Integer & 3 & No & The vertical pixel index in the + block. \\ +\bottomrule\end{tabularx} +\medskip + +The intra predictor is nothing more than the constant value $128$. +This is applied for the sole purpose of centering the range of possible DC + values for INTRA blocks around zero. + +\begin{enumerate} +\item +For each value of \locvar{\idx{by}} from $0$ to $7$, inclusive: +\begin{enumerate} +\item +For each value of \locvar{\idx{bx}} from $0$ to $7$, inclusive: +\begin{enumerate} +\item +Assign $\bitvar{PRED}[\locvar{\idx{by}}][\locvar{\idx{bx}}]$ the value $128$. +\end{enumerate} +\end{enumerate} +\end{enumerate} + +\subsubsection{The Whole-Pixel Predictor} +\label{sub:predfullpel} + +\paragraph{Input parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{RPW} & Integer & 20 & No & The width of the current plane of the + reference frame in pixels. \\ +\bitvar{RPH} & Integer & 20 & No & The height of the current plane of the + reference frame in pixels. \\ +\bitvar{REFP} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPH}\times\bitvar{RPW}$ + array containing the contents of the current plane of the reference frame. \\ +\bitvar{BX} & Integer & 20 & No & The horizontal pixel index of the + lower-left corner of the current block. \\ +\bitvar{BY} & Integer & 20 & No & The vertical pixel index of the + lower-left corner of the current block. \\ +\bitvar{MVX} & Integer & 5 & No & The horizontal component of the block + motion vector. +This is always a whole-pixel value. \\ +\bitvar{MVY} & Integer & 5 & No & The vertical component of the block + motion vector. +This is always a whole-pixel value. \\ +\bottomrule\end{tabularx} + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{PRED} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & An $8\times 8$ array of predictor + values to use for INTER coded blocks. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\locvar{\idx{bx}} & Integer & 3 & Yes & The horizontal pixel index in the + block. \\ +\locvar{\idx{by}} & Integer & 3 & Yes & The vertical pixel index in the + block. \\ +\locvar{\idx{rx}} & Integer & 20 & No & The horizontal pixel index in the + reference frame. \\ +\locvar{\idx{ry}} & Integer & 20 & No & The vertical pixel index in the + reference frame. \\ +\bottomrule\end{tabularx} +\medskip + +The whole pixel predictor simply copies verbatim the contents of the reference + frame pointed to by the block's motion vector. +If the vector points outside the reference frame, then the closest value on the + edge of the reference frame is used instead. +In practice, this is usually implemented by expanding the size of the reference + frame by $8$ or $16$ pixels on each side---depending on whether or not the + corresponding axis is subsampled in the current plane---and copying the border + pixels into this region. + +\begin{enumerate} +\item +For each value of \locvar{\idx{by}} from $0$ to $7$, inclusive: +\begin{enumerate} +\item +Assign \locvar{\idx{ry}} the value + $(\bitvar{BY}+\bitvar{MVY}+\locvar{\idx{by}})$. +\item +If \locvar{\idx{ry}} is greater than $(\bitvar{RPH}-1)$, assign + \locvar{\idx{ry}} the value $(\bitvar{RPH}-1)$. +\item +If \locvar{\idx{ry}} is less than zero, assign \locvar{\idx{ry}} the value + zero. +\item +For each value of \locvar{\idx{bx}} from $0$ to $7$, inclusive: +\begin{enumerate} +\item +Assign \locvar{\idx{rx}} the value + $(\bitvar{BX}+\bitvar{MVX}+\locvar{\idx{bx}})$. +\item +If \locvar{\idx{rx}} is greater than $(\bitvar{RPW}-1)$, assign + \locvar{\idx{rx}} the value $(\bitvar{RPW}-1)$. +\item +If \locvar{\idx{rx}} is less than zero, assign \locvar{\idx{rx}} the value + zero. +\item +Assign $\bitvar{PRED}[\locvar{\idx{by}}][\locvar{\idx{bx}}]$ the value + $\bitvar{REFP}[\locvar{\idx{ry}}][\locvar{\idx{rx}}]$. +\end{enumerate} +\end{enumerate} +\end{enumerate} + +\subsubsection{The Half-Pixel Predictor} +\label{sub:predhalfpel} + +\paragraph{Input parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{RPW} & Integer & 20 & No & The width of the current plane of the + reference frame in pixels. \\ +\bitvar{RPH} & Integer & 20 & No & The height of the current plane of the + reference frame in pixels. \\ +\bitvar{REFP} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPH}\times\bitvar{RPW}$ + array containing the contents of the current plane of the reference frame. \\ +\bitvar{BX} & Integer & 20 & No & The horizontal pixel index of the + lower-left corner of the current block. \\ +\bitvar{BY} & Integer & 20 & No & The vertical pixel index of the + lower-left corner of the current block. \\ +\bitvar{MVX} & Integer & 5 & No & The horizontal component of the first + whole-pixel motion vector. \\ +\bitvar{MVY} & Integer & 5 & No & The vertical component of the first + whole-pixel motion vector. \\ +\bitvar{MVX2} & Integer & 5 & No & The horizontal component of the second + whole-pixel motion vector. \\ +\bitvar{MVY2} & Integer & 5 & No & The vertical component of the second + whole-pixel motion vector. \\ +\bottomrule\end{tabularx} + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{PRED} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & An $8\times 8$ array of predictor + values to use for INTER coded blocks. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\locvar{\idx{bx}} & Integer & 3 & Yes & The horizontal pixel index in the + block. \\ +\locvar{\idx{by}} & Integer & 3 & Yes & The vertical pixel index in the + block. \\ +\locvar{\idx{rx1}} & Integer & 20 & No & The first horizontal pixel index in + the reference frame. \\ +\locvar{\idx{ry1}} & Integer & 20 & No & The first vertical pixel index in the + reference frame. \\ +\locvar{\idx{rx2}} & Integer & 20 & No & The second horizontal pixel index in + the reference frame. \\ +\locvar{\idx{ry2}} & Integer & 20 & No & The second vertical pixel index in + the reference frame. \\ +\bottomrule\end{tabularx} +\medskip + +If one or both of the components of the block motion vector is not a + whole-pixel value, then the half-pixel predictor is used. +The half-pixel predictor converts the fractional motion vector into two + whole-pixel motion vectors. +The first is formed by truncating the values of each component towards zero, + and the second is formed by truncating them away from zero. +The contributions from the reference frame at the locations pointed to by each + vector are averaged, truncating towards negative infinity. + +Only two samples from the reference frame contribute to each predictor value, + even if both components of the motion vector have non-zero fractional + components. +Motion vector components with quarter-pixel accuracy in the chroma planes are + treated exactly the same as those with half-pixel accuracy. +Any non-zero fractional part gets rounded one way in the first vector, and the + other way in the second. + +\begin{enumerate} +\item +For each value of \locvar{\idx{by}} from $0$ to $7$, inclusive: +\begin{enumerate} +\item +Assign \locvar{\idx{ry1}} the value + $(\bitvar{BY}+\bitvar{MVY1}+\locvar{\idx{by}})$. +\item +If \locvar{\idx{ry1}} is greater than $(\bitvar{RPH}-1)$, assign + \locvar{\idx{ry1}} the value $(\bitvar{RPH}-1)$. +\item +If \locvar{\idx{ry1}} is less than zero, assign \locvar{\idx{ry1}} the value + zero. +\item +Assign \locvar{\idx{ry2}} the value + $(\bitvar{BY}+\bitvar{MVY2}+\locvar{\idx{by}})$. +\item +If \locvar{\idx{ry2}} is greater than $(\bitvar{RPH}-1)$, assign + \locvar{\idx{ry2}} the value $(\bitvar{RPH}-1)$. +\item +If \locvar{\idx{ry2}} is less than zero, assign \locvar{\idx{ry2}} the value + zero. +\item +For each value of \locvar{\idx{bx}} from $0$ to $7$, inclusive: +\begin{enumerate} +\item +Assign \locvar{\idx{rx1}} the value + $(\bitvar{BX}+\bitvar{MVX1}+\locvar{\idx{bx}})$. +\item +If \locvar{\idx{rx1}} is greater than $(\bitvar{RPW}-1)$, assign + \locvar{\idx{rx1}} the value $(\bitvar{RPW}-1)$. +\item +If \locvar{\idx{rx1}} is less than zero, assign \locvar{\idx{rx1}} the value + zero. +\item +Assign \locvar{\idx{rx2}} the value + $(\bitvar{BX}+\bitvar{MVX2}+\locvar{\idx{bx}})$. +\item +If \locvar{\idx{rx2}} is greater than $(\bitvar{RPW}-1)$, assign + \locvar{\idx{rx2}} the value $(\bitvar{RPW}-1)$. +\item +If \locvar{\idx{rx2}} is less than zero, assign \locvar{\idx{rx2}} the value + zero. +\item +Assign $\bitvar{PRED}[\locvar{\idx{by}}][\locvar{\idx{bx}}]$ the value +\begin{equation*} + (\bitvar{REFP}[\locvar{\idx{ry1}}][\locvar{\idx{rx1}}]+ + \bitvar{REFP}[\locvar{\idx{ry2}}][\locvar{\idx{rx2}}])>>1. +\end{equation*} +\end{enumerate} +\end{enumerate} +\end{enumerate} + +\subsection{Dequantization} +\label{sub:dequant} + +\paragraph{Input parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{COEFFS} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 16 & Yes & An $\bitvar{NBS}\times 64$ array of + quantized DCT coefficient values for each block in zig-zag order. \\ +\bitvar{ACSCALE} & \multicolumn{1}{p{40pt}}{Integer array} & + 16 & No & A 64-element array of scale values for + AC coefficients for each \qi\ value. \\ +\bitvar{DCSCALE} & \multicolumn{1}{p{40pt}}{Integer array} & + 16 & No & A 64-element array of scale values for + the DC coefficient for each \qi\ value. \\ +\bitvar{BMS} & \multicolumn{1}{p{50pt}}{2D Integer array} & + 8 & No & A $\bitvar{NBMS}\times 64$ array + containing the base matrices. \\ +\bitvar{NQRS} & \multicolumn{1}{p{50pt}}{2D Integer array} & + 6 & No & A $2\times 3$ array containing the + number of quant ranges for a given \qti\ and \pli, respectively. +This is at most $63$. \\ +\bitvar{QRSIZES} & \multicolumn{1}{p{50pt}}{3D Integer array} & + 6 & No & A $2\times 3\times 63$ array of the + sizes of each quant range for a given \qti\ and \pli, respectively. +Only the first $\bitvar{NQRS}[\qti][\pli]$ values are used. \\ +\bitvar{QRBMIS} & \multicolumn{1}{p{50pt}}{3D Integer array} & + 9 & No & A $2\times 3\times 64$ array of the + \bmi's used for each quant range for a given \qti\ and \pli, respectively. +Only the first $(\bitvar{NQRS}[\qti][\pli]+1)$ values are used. \\ +\bitvar{\qti} & Integer & 1 & No & A quantization type index. +See Table~\ref{tab:quant-types}.\\ +\bitvar{\pli} & Integer & 2 & No & A color plane index. +See Table~\ref{tab:color-planes}.\\ +\bitvar{\idx{qi0}} & Integer & 6 & No & The quantization index of the DC + coefficient. \\ +\bitvar{\qi} & Integer & 6 & No & The quantization index of the AC + coefficients. \\ +\bitvar{\bi} & Integer & 36 & No & The index of the current block in + coded order. \\ +\bottomrule\end{tabularx} + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{DQC} & \multicolumn{1}{p{40pt}}{Integer Array} & + 14 & Yes & A $64$-element array of dequantized + DCT coefficients in natural order (cf. Section~\ref{sec:dct-coeffs}). \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\locvar{QMAT} & \multicolumn{1}{p{40pt}}{Integer array} & + 16 & No & A 64-element array of quantization + values for each DCT coefficient in natural order. \\ +\locvar{\ci} & Integer & 6 & No & The DCT coefficient index in natural + order. \\ +\locvar{\zzi} & Integer & 6 & No & The DCT coefficient index in zig-zag + order. \\ +\locvar{C} & Integer & 29 & Yes & A single dequantized coefficient. \\ +\bottomrule\end{tabularx} +\medskip + +This procedure takes the quantized DCT coefficient values in zig-zag order for + a single block---after DC prediction has been undone---and returns the + dequantized values in natural order. +If large coefficient values are decoded for coarsely quantized coefficients, + the resulting dequantized value can be significantly larger than 16 bits. +Such a coefficient is truncated to a signed 16-bit representation by discarding + the higher-order bits of its twos-complement representation. + +Although this procedure recomputes the quantization matrices from the + parameters in the setup header for each block, there are at most six different + ones used for each color plane. +An efficient implementation could compute them once in advance. + +\begin{enumerate} +\item +Using \bitvar{ACSCALE}, \bitvar{DCSCALE}, \bitvar{BMS}, \bitvar{NQRS}, + \bitvar{QRSIZES}, \bitvar{QRBMIS}, \bitvar{\qti}, \bitvar{\pli}, and + \bitvar{\idx{qi0}}, use the procedure given in Section~\ref{sub:quant-mat} to + compute the DC quantization matrix \locvar{QMAT}. +\item +Assign \locvar{C} the value + $\bitvar{COEFFS}[\bitvar{\bi}][0]*\locvar{QMAT}[0]$. +\item +Truncate \locvar{C} to a 16-bit representation by dropping any higher-order + bits. +\item +Assign $\bitvar{DQC}[0]$ the value \locvar{C}. +\item +Using \bitvar{ACSCALE}, \bitvar{DCSCALE}, \bitvar{BMS}, \bitvar{NQRS}, + \bitvar{QRSIZES}, \bitvar{QRBMIS}, \bitvar{\qti}, \bitvar{\pli}, and + \bitvar{\qi}, use the procedure given in Section~\ref{sub:quant-mat} to + compute the AC quantization matrix \locvar{QMAT}. +\item +For each value of \locvar{\ci} from 1 to 63, inclusive: +\begin{enumerate} +\item +Assign \locvar{\zzi} the index in zig-zag order corresponding to \locvar{\ci}. +E.g., the value at row $(\locvar{\ci}//8)$ and column $(\locvar{\ci}\%8)$ in + Figure~\ref{tab:zig-zag} +\item +Assign \locvar{C} the value + $\bitvar{COEFFS}[\bitvar{\bi}][\locvar{\zzi}]*\locvar{QMAT}[\locvar{\ci}]$. +\item +Truncate \locvar{C} to a 16-bit representation by dropping any higher-order + bits. +\item +Assign $\bitvar{DQC}[\locvar{\ci}]$ the value \locvar{C}. +\end{enumerate} +\end{enumerate} + +\subsection{The Inverse DCT} + +The 2D inverse DCT is separated into two applications of the 1D inverse DCT. +The transform is first applied to each row, and then applied to each column of + the result. + +Each application of the 1D inverse DCT scales the values by a factor of two + relative to the orthonormal version of the transform, for a total scale factor + of four for the 2D transform. +It is assumed that a similar scale factor is applied during the forward DCT + used in the encoder, so that a division by 16 is required after the transform + has been applied in both directions. +The inclusion of this scale factor allows the integerized transform to operate + with increased precision. +All divisions throughout the transform are implemented with right shifts. +Only the final division by $16$ is rounded, with ties rounded towards positive + infinity. + +All intermediate values are truncated to a 32-bit signed representation by + discarding any higher-order bits in their two's complement representation. +The final output of each 1D transform is truncated to a 16-bit signed value in + the same manner. +In practice, if the high word of a $16\times 16$ bit multiplication can be + obtained directly, 16 bits is sufficient for every calculation except scaling + by $C4$. +Thus we truncate to 16 bits before that multiplication to allow an + implementation entirely in 16-bit registers. +Implementations using larger registers must sign-extend the 16-bit value to + maintain compatibility. + +Note that if 16-bit register are used, overflow in the additions and + subtractions should be handled using \textit{unsaturated} arithmetic. +That is, the high-order bits should be discarded and the low-order bits + retained, instead of clamping the result to the maximum or minimum value. +This allows the maximum flexibility in re-ordering these instructions without + deviating from this specification. + +The 1D transform can only overflow if input coefficients larger than $\pm 6201$ + are present. +However, the result of applying the 2D forward transform on pixel values in the + range $-255\ldots 255$ can be as large as $\pm 8157$ due to the scale factor + of four that is applied, and quantization errors could make this even larger. +Therefore, the coefficients cannot simply be clamped into a valid range before + the transform. + +\subsubsection{The 1D Inverse DCT} +\label{sub:1d-idct} + +\paragraph{Input parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{Y} & \multicolumn{1}{p{40pt}}{Integer Array} & + 16 & Yes & An 8-element array of DCT + coefficients. \\ +\bottomrule\end{tabularx} + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{X} & \multicolumn{1}{p{40pt}}{Integer Array} & + 16 & Yes & An 8-element array of output values. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\locvar{T} & \multicolumn{1}{p{40pt}}{Integer Array} & + 32 & Yes & An 8-element array containing the + current value of each signal line. \\ +\locvar{R} & Integer & 32 & Yes & A temporary value. \\ +\bottomrule\end{tabularx} +\medskip + +A compliant decoder MUST use the exact implementation of the inverse DCT + defined in this specification. +Some operations may be re-ordered, but the result must be precisely equivalent. +This is a design decision that limits some avenues of decoder optimization, but + prevents any drift in the prediction loop. +The full inverse DCT described in this section is only used when there is at + least one non-zero AC coefficient. +Otherwise, a special DC-only case is used, which is described below in + step~\ref{step:dc-only-idct} of Section~\ref{sub:recon}. +The DC-only special case is not exactly equivalent to applying the full inverse + transform, because it avoids the intermediate multiplications and truncation, + and it MUST be used in place of the full transform to ensure bit-exact decode. + +Theora uses a 16-bit integerized approximation of the 8-point 1D inverse DCT + based on the Chen factorization \cite{CSF77}. +It requires 16 multiplications and 26 additions and subtractions. + +\begin{figure}[htbp] +\begin{center} +\includegraphics[width=\textwidth]{idct} +\end{center} +\caption{Signal Flow Graph for the 1D Inverse DCT} +\label{fig:idct} +\end{figure} + +A signal flow graph of the transformation is presented in + Figure~\ref{fig:idct}. +This graph provides a good visualization of which parts of the transform are + parallelizable. +Time increases from left to right. + +Each signal line is involved in an operation where the line is marked with a + dot $\cdot$ or a circled plus sign $\oplus$. +The constants $\locvar{C}i$ and $\locvar{S}j$ are the 16-bit integer + approximations of $\cos(\frac{i\pi}{16})$ and $\sin(\frac{j\pi}{16})$ listed + in Table~\ref{tab:dct-consts}. +When they appear next to a signal line, the value on that line is scaled by the + given constant. +A circled minus sign $\ominus$ next to a signal line indicates that the value + on that line is negated. + +Operations on a single signal path through the graph cannot be reordered, but + operations on different paths may be, or may be executed in parallel. +Different graphs may be obtainable using the associative, commutative, and + distributive properties of unsaturated arithmetic. +The column of numbers on the left represents an initial permutation of the + input DCT coefficients. +The column on the right represents the unpermuted output. +One can be obtained by bit-reversing the 3-bit binary representation of the + other. + +\begin{table}[htbp] +\begin{center} +\begin{tabular}{llr}\toprule +$\locvar{C}i$ & $\locvar{S}j$ & Value \\\midrule +$\locvar{C1}$ & $\locvar{S7}$ & $64277$ \\ +$\locvar{C2}$ & $\locvar{S6}$ & $60547$ \\ +$\locvar{C3}$ & $\locvar{S5}$ & $54491$ \\ +$\locvar{C4}$ & $\locvar{S4}$ & $46341$ \\ +$\locvar{C5}$ & $\locvar{S3}$ & $36410$ \\ +$\locvar{C6}$ & $\locvar{S2}$ & $25080$ \\ +$\locvar{C7}$ & $\locvar{S1}$ & $12785$ \\ +\bottomrule\end{tabular} +\end{center} +\caption{16-bit Approximations of Sines and Cosines} +\label{tab:dct-consts} +\end{table} + +\begin{enumerate} +\item +Assign $\locvar{T}[0]$ the value $\bitvar{Y}[0]+\bitvar{Y}[4]$. +\item +Truncate $\locvar{T}[0]$ to a 16-bit signed representation by dropping any + higher-order bits. +\item +Assign $\locvar{T}[0]$ the value + $\locvar{C4}*\locvar{T}[0]>>16$. +\item +Assign $\locvar{T}[1]$ the value $\bitvar{Y}[0]-\bitvar{Y}[4]$. +\item +Truncate $\locvar{T}[1]$ to a 16-bit signed representation by dropping any + higher-order bits. +\item +Assign $\locvar{T}[1]$ the value $\locvar{C4}*\locvar{T}[1]>>16$. +\item +Assign $\locvar{T}[2]$ the value $(\locvar{C6}*\bitvar{Y}[2]>>16)- + (\locvar{S6}*\bitvar{Y}[6]>>16)$. +\item +Assign $\locvar{T}[3]$ the value $(\locvar{S6}*\bitvar{Y}[2]>>16)+ + (\locvar{C6}*\bitvar{Y}[6]>>16)$. +\item +Assign $\locvar{T}[4]$ the value $(\locvar{C7}*\bitvar{Y}[1]>>16)- + (\locvar{S7}*\bitvar{Y}[7]>>16)$. +\item +Assign $\locvar{T}[5]$ the value $(\locvar{C3}*\bitvar{Y}[5]>>16)- + (\locvar{S3}*\bitvar{Y}[3]>>16)$. +\item +Assign $\locvar{T}[6]$ the value $(\locvar{S3}*\bitvar{Y}[5]>>16)+ + (\locvar{C3}*\bitvar{Y}[3]>>16)$. +\item +Assign $\locvar{T}[7]$ the value $(\locvar{S7}*\bitvar{Y}[1]>>16)+ + (\locvar{C7}*\bitvar{Y}[7]>>16)$. +\item +Assign \locvar{R} the value $\locvar{T}[4]+\locvar{T}[5]$. +\item +Assign $\locvar{T}[5]$ the value $\locvar{T}[4]-\locvar{T}[5]$. +\item +Truncate $\locvar{T}[5]$ to a 16-bit signed representation by dropping any + higher-order bits. +\item +Assign $\locvar{T}[5]$ the value $\locvar{C4}*\locvar{T}[5]>>16$. +\item +Assign $\locvar{T}[4]$ the value $\locvar{R}$. +\item +Assign \locvar{R} the value $\locvar{T}[7]+\locvar{T}[6]$. +\item +Assign $\locvar{T}[6]$ the value $\locvar{T}[7]-\locvar{T}[6]$. +\item +Truncate $\locvar{T}[6]$ to a 16-bit signed representation by dropping any + higher-order bits. +\item +Assign $\locvar{T}[6]$ the value $\locvar{C4}*\locvar{T}[6]>>16$. +\item +Assign $\locvar{T}[7]$ the value $\locvar{R}$. +\item +Assign \locvar{R} the value $\locvar{T}[0]+\locvar{T}[3]$. +\item +Assign $\locvar{T}[3]$ the value $\locvar{T}[0]-\locvar{T}[3]$. +\item +Assign $\locvar{T}[0]$ the value \locvar{R}. +\item +Assign \locvar{R} the value $\locvar{T}[1]+\locvar{T}[2]$ +\item +Assign $\locvar{T}[2]$ the value $\locvar{T}[1]-\locvar{T}[2]$ +\item +Assign $\locvar{T}[1]$ the value \locvar{R}. +\item +Assign \locvar{R} the value $\locvar{T}[6]+\locvar{T}[5]$. +\item +Assign $\locvar{T}[5]$ the value $\locvar{T}[6]-\locvar{T}[5]$. +\item +Assign $\locvar{T}[6]$ the value \locvar{R}. +\item +Assign \locvar{R} the value $\locvar{T}[0]+\locvar{T}[7]$. +\item +Truncate \locvar{R} to a 16-bit signed representation by dropping any + higher-order bits. +\item +Assign $\bitvar{X}[0]$ the value \locvar{R}. +\item +Assign \locvar{R} the value $\locvar{T}[1]+\locvar{T}[6]$. +\item +Truncate \locvar{R} to a 16-bit signed representation by dropping any + higher-order bits. +\item +Assign $\bitvar{X}[1]$ the value \locvar{R}. +\item +Assign \locvar{R} the value $\locvar{T}[2]+\locvar{T}[5]$. +\item +Truncate \locvar{R} to a 16-bit signed representation by dropping any + higher-order bits. +\item +Assign $\bitvar{X}[2]$ the value \locvar{R}. +\item +Assign \locvar{R} the value $\locvar{T}[3]+\locvar{T}[4]$. +\item +Truncate \locvar{R} to a 16-bit signed representation by dropping any + higher-order bits. +\item +Assign $\bitvar{X}[3]$ the value \locvar{R}. +\item +Assign \locvar{R} the value $\locvar{T}[3]-\locvar{T}[4]$. +\item +Truncate \locvar{R} to a 16-bit signed representation by dropping any + higher-order bits. +\item +Assign $\bitvar{X}[4]$ the value \locvar{R}. +\item +Assign \locvar{R} the value $\locvar{T}[2]-\locvar{T}[5]$. +\item +Truncate \locvar{R} to a 16-bit signed representation by dropping any + higher-order bits. +\item +Assign $\bitvar{X}[5]$ the value \locvar{R}. +\item +Assign \locvar{R} the value $\locvar{T}[1]-\locvar{T}[6]$. +\item +Truncate \locvar{R} to a 16-bit signed representation by dropping any + higher-order bits. +\item +Assign $\bitvar{X}[6]$ the value \locvar{R}. +\item +Assign \locvar{R} the value $\locvar{T}[0]-\locvar{T}[7]$. +\item +Truncate \locvar{R} to a 16-bit signed representation by dropping any + higher-order bits. +\item +Assign $\bitvar{X}[7]$ the value \locvar{R}. +\end{enumerate} + +\subsubsection{The 2D Inverse DCT} +\label{sub:2d-idct} + +\paragraph{Input parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{DQC} & \multicolumn{1}{p{40pt}}{Integer Array} & + 14 & Yes & A $64$-element array of dequantized + DCT coefficients in natural order (cf. Section~\ref{sec:dct-coeffs}). \\ +\bottomrule\end{tabularx} + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{RES} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 16 & Yes & An $8\times 8$ array containing the + decoded residual for the current block. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\locvar{\ci} & Integer & 3 & No & The column index. \\ +\locvar{\ri} & Integer & 3 & No & The row index. \\ +\locvar{Y} & \multicolumn{1}{p{40pt}}{Integer Array} & + 16 & Yes & An 8-element array of 1D iDCT input + values. \\ +\locvar{X} & \multicolumn{1}{p{40pt}}{Integer Array} & + 16 & Yes & An 8-element array of 1D iDCT output + values. \\ +\bottomrule\end{tabularx} +\medskip + +This procedure applies the 1D inverse DCT transform 16 times to a block of + dequantized coefficients: once for each of the 8 rows, and once for each of + the 8 columns of the result. +Note that the coordinate system used for the columns is the same right-handed + coordinate system used by the rest of Theora. +Thus, the column is indexed from bottom to top, not top to bottom. +The final values are divided by sixteen, rounding with ties rounded towards + postive infinity. + +\begin{enumerate} +\item +For each value of \locvar{\ri} from 0 to 7: +\begin{enumerate} +\item +For each value of \locvar{\ci} from 0 to 7: +\begin{enumerate} +\item +Assign $\locvar{Y}[\locvar{\ci}]$ the value + $\bitvar{DQC}[\locvar{\ri}*8+\locvar{\ci}]$. +\end{enumerate} +\item +Compute \locvar{X}, the 1D inverse DCT of \locvar{Y} using the procedure + described in Section~\ref{sub:1d-idct}. +\item +For each value of $\locvar{\ci}$ from 0 to 7: +\begin{enumerate} +\item +Assign $\bitvar{RES}[\locvar{\ri}][\locvar{\ci}]$ the value + $\locvar{X}[\locvar{\ci}]$. +\end{enumerate} +\end{enumerate} +\item +For each value of \locvar{\ci} from 0 to 7: +\begin{enumerate} +\item +For each value of \locvar{\ri} from 0 to 7: +\begin{enumerate} +\item +Assign $\locvar{Y}[\locvar{\ri}]$ the value + $\bitvar{RES}[\locvar{\ri}][\locvar{\ci}]$. +\end{enumerate} +\item +Compute \locvar{X}, the 1D inverse DCT of \locvar{Y} using the procedure + described in Section~\ref{sub:1d-idct}. +\item +For each value of \locvar{\ri} from 0 to 7: +\begin{enumerate} +\item +Assign $\bitvar{RES}[\locvar{\ri}][\locvar{\ci}]$ the value + $(\locvar{X}[\locvar{\ri}]+8)>>4$. +\end{enumerate} +\end{enumerate} +\end{enumerate} + +\subsubsection{The 1D Forward DCT (Non-Normative)} + +\paragraph{Input parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{X} & \multicolumn{1}{p{40pt}}{Integer Array} & + 14 & Yes & An 8-element array of input values. \\ +\bottomrule\end{tabularx} + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{Y} & \multicolumn{1}{p{40pt}}{Integer Array} & + 16 & Yes & An 8-element array of DCT + coefficients. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\locvar{T} & \multicolumn{1}{p{40pt}}{Integer Array} & + 16 & Yes & An 8-element array containing the + current value of each signal line. \\ +\locvar{R} & Integer & 16 & Yes & A temporary value. \\ +\bottomrule\end{tabularx} +\medskip + +The forward transform used in the encoder is not mandated by this standard as + the inverse one is. +Precise equivalence in the inverse transform alone is all that is required to + guarantee that there is no mismatch in the prediction loop between encoder and + any compliant decoder implementation. +However, a forward transform is provided here as a convenience for implementing + an encoder. +This is the version of the transform used by Xiph.Org's Theora encoder, which + is the same as that used by VP3. +Like the inverse DCT, it is first applied to each row, and then applied to each + column of the result. + +\begin{figure}[htbp] +\begin{center} +\includegraphics[width=\textwidth]{fdct} +\end{center} +\caption{Signal Flow Graph for the 1D Forward DCT} +\label{fig:fdct} +\end{figure} + +The signal flow graph for the forward transform is given in + Figure~\ref{fig:fdct}. +It is largely the reverse of the flow graph given for the inverse DCT. +It is important to note that the signs on the constants in the rotations have + changed, and the \locvar{C4} scale factors on one of the lower butterflies now + appear on the opposite side. +The column of numbers on the left represents the unpermuted input, and the + column on the right the permuted output DCT coefficients. + +A proper division by $2^{16}$ is done after the multiplications instead of a + shift in the forward transform. +This can be implemented quickly by adding an offset of $\hex{FFFF}$ if the + number is negative, and then shifting as before. +This slightly increases the computational complexity of the transform. +Unlike the inverse DCT, 16-bit registers and a $16\times16\rightarrow32$ bit + multiply are sufficient to avoid any overflow, so long as the input is in the + range $-6270\ldots 6270$, which is larger than required. + +\begin{enumerate} +\item +Assign $\locvar{T}[0]$ the value $\bitvar{X}[0]+\bitvar{X}[7]$. +\item +Assign $\locvar{T}[1]$ the value $\bitvar{X}[1]+\bitvar{X}[6]$. +\item +Assign $\locvar{T}[2]$ the value $\bitvar{X}[2]+\bitvar{X}[5]$. +\item +Assign $\locvar{T}[3]$ the value $\bitvar{X}[3]+\bitvar{X}[4]$. +\item +Assign $\locvar{T}[4]$ the value $\bitvar{X}[3]-\bitvar{X}[4]$. +\item +Assign $\locvar{T}[5]$ the value $\bitvar{X}[2]-\bitvar{X}[5]$. +\item +Assign $\locvar{T}[6]$ the value $\bitvar{X}[1]-\bitvar{X}[6]$. +\item +Assign $\locvar{T}[7]$ the value $\bitvar{X}[0]-\bitvar{X}[7]$. +\item +Assign \locvar{R} the value $\locvar{T}[0]+\locvar{T}[3]$. +\item +Assign $\locvar{T}[3]$ the value $\locvar{T}[0]-\locvar{T}[3]$. +\item +Assign $\locvar{T}[0]$ the value \locvar{R}. +\item +Assign \locvar{R} the value $\locvar{T}[1]+\locvar{T}[2]$. +\item +Assign $\locvar{T}[2]$ the value $\locvar{T}[1]-\locvar{T}[2]$. +\item +Assign $\locvar{T}[1]$ the value \locvar{R}. +\item +Assign \locvar{R} the value $\locvar{T}[6]-\locvar{T}[5]$. +\item +Assign $\locvar{T}[6]$ the value + $(\locvar{C4}*(\locvar{T}[6]+\locvar{T}[5]))//16$. +\item +Assign $\locvar{T}[5]$ the value $(\locvar{C4}*\locvar{R})//16$. +\item +Assign \locvar{R} the value $\locvar{T}[4]+\locvar{T}[5]$. +\item +Assign $\locvar{T}[5]$ the value $\locvar{T}[4]-\locvar{T}[5]$. +\item +Assign $\locvar{T}[4]$ the value \locvar{R}. +\item +Assign \locvar{R} the value $\locvar{T}[7]+\locvar{T}[6]$. +\item +Assign $\locvar{T}[6]$ the value $\locvar{T}[7]-\locvar{T}[6]$. +\item +Assign $\locvar{T}[7]$ the value \locvar{R}. +\item +Assign $\bitvar{Y}[0]$ the value + $(\locvar{C4}*(\locvar{T}[0]+\locvar{T}[1]))//16$. +\item +Assign $\bitvar{Y}[4]$ the value + $(\locvar{C4}*(\locvar{T}[0]-\locvar{T}[1]))//16$. +\item +Assign $\bitvar{Y}[2]$ the value + $((\locvar{S6}*\locvar{T}[3])//16)+ + ((\locvar{C6}*\locvar{T}[2])//16)$. +\item +Assign $\bitvar{Y}[6]$ the value + $((\locvar{C6}*\locvar{T}[3])//16)- + ((\locvar{S6}*\locvar{T}[2])//16)$. +\item +Assign $\bitvar{Y}[1]$ the value + $((\locvar{S7}*\locvar{T}[7])//16)+ + ((\locvar{C7}*\locvar{T}[4])//16)$. +\item +Assign $\bitvar{Y}[5]$ the value + $((\locvar{S3}*\locvar{T}[6])//16)+ + ((\locvar{C3}*\locvar{T}[5])//16)$. +\item +Assign $\bitvar{Y}[3]$ the value + $((\locvar{C3}*\locvar{T}[6])//16)- + ((\locvar{S3}*\locvar{T}[5])//16)$. +\item +Assign $\bitvar{Y}[7]$ the value + $((\locvar{C7}*\locvar{T}[7])//16)- + ((\locvar{S7}*\locvar{T}[4])//16)$. +\end{enumerate} + +\subsection{The Complete Reconstruction Algorithm} +\label{sub:recon} + +\paragraph{Input parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{ACSCALE} & \multicolumn{1}{p{40pt}}{Integer array} & + 16 & No & A 64-element array of scale values + for AC coefficients for each \qi\ value. \\ +\bitvar{DCSCALE} & \multicolumn{1}{p{40pt}}{Integer array} & + 16 & No & A 64-element array of scale values + for the DC coefficient for each \qi\ value. \\ +\bitvar{BMS} & \multicolumn{1}{p{50pt}}{2D Integer array} & + 8 & No & A $\bitvar{NBMS}\times 64$ array + containing the base matrices. \\ +\bitvar{NQRS} & \multicolumn{1}{p{50pt}}{2D Integer array} & + 6 & No & A $2\times 3$ array containing the + number of quant ranges for a given \qti\ and \pli, respectively. +This is at most $63$. \\ +\bitvar{QRSIZES} & \multicolumn{1}{p{50pt}}{3D Integer array} & + 6 & No & A $2\times 3\times 63$ array of the + sizes of each quant range for a given \qti\ and \pli, respectively. +Only the first $\bitvar{NQRS}[\qti][\pli]$ values are used. \\ +\bitvar{QRBMIS} & \multicolumn{1}{p{50pt}}{3D Integer array} & + 9 & No & A $2\times 3\times 64$ array of the + \bmi's used for each quant range for a given \qti\ and \pli, respectively. +Only the first $(\bitvar{NQRS}[\qti][\pli]+1)$ values are used. \\ +\bitvar{RPYW} & Integer & 20 & No & The width of the $Y'$ plane of the + reference frames in pixels. \\ +\bitvar{RPYH} & Integer & 20 & No & The height of the $Y'$ plane of the + reference frames in pixels. \\ +\bitvar{RPCW} & Integer & 20 & No & The width of the $C_b$ and $C_r$ + planes of the reference frames in pixels. \\ +\bitvar{RPCH} & Integer & 20 & No & The height of the $C_b$ and $C_r$ + planes of the reference frames in pixels. \\ +\bitvar{GOLDREFY} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPYH}\times\bitvar{RPYW}$ + array containing the contents of the $Y'$ plane of the golden reference + frame. \\ +\bitvar{GOLDREFCB} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPCH}\times\bitvar{RPCW}$ + array containing the contents of the $C_b$ plane of the golden reference + frame. \\ +\bitvar{GOLDREFCR} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPCH}\times\bitvar{RPCW}$ + array containing the contents of the $C_r$ plane of the golden reference + frame. \\ +\bitvar{PREVREFY} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPYH}\times\bitvar{RPYW}$ + array containing the contents of the $Y'$ plane of the previous reference + frame. \\ +\bitvar{PREVREFCB} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPCH}\times\bitvar{RPCW}$ + array containing the contents of the $C_b$ plane of the previous reference + frame. \\ +\bitvar{PREVREFCR} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPCH}\times\bitvar{RPCW}$ + array containing the contents of the $C_r$ plane of the previous reference + frame. \\ +\bitvar{NBS} & Integer & 36 & No & The total number of blocks in a + frame. \\ +\bitvar{BCODED} & \multicolumn{1}{p{40pt}}{Integer Array} & + 1 & No & An \bitvar{NBS}-element array of + flags indicating which blocks are coded. \\ +\bitvar{MBMODES} & \multicolumn{1}{p{40pt}}{Integer Array} & + 3 & No & An \bitvar{NMBS}-element array of + coding modes for each macro block. \\ +\bitvar{MVECTS} & \multicolumn{1}{p{50pt}}{Array of 2D Integer Vectors} & + 6 & Yes & An \bitvar{NBS}-element array of + motion vectors for each block. \\ +\bitvar{COEFFS} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 16 & Yes & An $\bitvar{NBS}\times 64$ array of + quantized DCT coefficient values for each block in zig-zag order. \\ +\bitvar{NCOEFFS} & \multicolumn{1}{p{40pt}}{Integer Array} & + 7 & No & An \bitvar{NBS}-element array of the + coefficient count for each block. \\ +\bitvar{QIS} & \multicolumn{1}{p{40pt}}{Integer array} & + 6 & No & An \bitvar{NQIS}-element array of + \qi\ values. \\ +\bitvar{QIIS} & \multicolumn{1}{p{40pt}}{Integer Array} & + 2 & No & An \bitvar{NBS}-element array of + \locvar{\qii} values for each block. \\ +\bottomrule\end{tabularx} + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{RECY} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPYH}\times\bitvar{RPYW}$ + array containing the contents of the $Y'$ plane of the reconstructed frame. \\ +\bitvar{RECCB} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPCH}\times\bitvar{RPCW}$ + array containing the contents of the $C_b$ plane of the reconstructed frame. \\ +\bitvar{RECCR} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPCH}\times\bitvar{RPCW}$ + array containing the contents of the $C_r$ plane of the reconstructed frame. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\locvar{RPW} & Integer & 20 & No & The width of the current plane of the + current reference frame in pixels. \\ +\locvar{RPH} & Integer & 20 & No & The height of the current plane of + the current reference frame in pixels. \\ +\locvar{REFP} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPH}\times\bitvar{RPW}$ + array containing the contents of the current plane of the current reference + frame. \\ +\locvar{BX} & Integer & 20 & No & The horizontal pixel index of the + lower-left corner of the current block. \\ +\locvar{BY} & Integer & 20 & No & The vertical pixel index of the + lower-left corner of the current block. \\ +\locvar{MVX} & Integer & 5 & No & The horizontal component of the first + whole-pixel motion vector. \\ +\locvar{MVY} & Integer & 5 & No & The vertical component of the first + whole-pixel motion vector. \\ +\locvar{MVX2} & Integer & 5 & No & The horizontal component of the second + whole-pixel motion vector. \\ +\locvar{MVY2} & Integer & 5 & No & The vertical component of the second + whole-pixel motion vector. \\ +\locvar{PRED} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & An $8\times 8$ array of predictor + values to use for the current block. \\ +\locvar{RES} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 16 & Yes & An $8\times 8$ array containing the + decoded residual for the current block. \\ +\locvar{QMAT} & \multicolumn{1}{p{40pt}}{Integer array} & + 16 & No & A 64-element array of quantization + values for each DCT coefficient in natural order. \\ +\locvar{DC} & Integer & 29 & Yes & The dequantized DC coefficient of a + block. \\ +\locvar{P} & Integer & 17 & Yes & A reconstructed pixel value. \\ +\locvar{\bi} & Integer & 36 & No & The index of the current block in + coded order. \\ +\locvar{\mbi} & Integer & 32 & No & The index of the macro block + containing block \locvar{\bi}. \\ +\locvar{\pli} & Integer & 2 & No & The color plane index of the current + block. \\ +\locvar{\rfi} & Integer & 2 & No & The index of the reference frame + indicated by the coding mode for macro block \locvar{\mbi}. \\ +\locvar{\idx{bx}} & Integer & 3 & No & The horizontal pixel index in the + block. \\ +\locvar{\idx{by}} & Integer & 3 & No & The vertical pixel index in the + block. \\ +\locvar{\qti} & Integer & 1 & No & A quantization type index. +See Table~\ref{tab:quant-types}.\\ +\locvar{\idx{qi0}} & Integer & 6 & No & The quantization index of the DC + coefficient. \\ +\locvar{\qi} & Integer & 6 & No & The quantization index of the AC + coefficients. \\ +\bottomrule\end{tabularx} +\medskip + +This section takes the decoded packet data and uses the previously defined + procedures to reconstruct each block of the current frame. +For coded blocks, a predictor is formed using the coding mode and, if + applicable, the motion vector, and then the residual is computed from the + quantized DCT coefficients. +For uncoded blocks, the contents of the co-located block are copied from the + previous frame and the residual is cleared to zero. +Then the predictor and residual are added, and the result clamped to the range + $0\ldots 255$ and stored in the current frame. + +In the special case that a block contains only a DC coefficient, the + dequantization and inverse DCT transform is skipped. +Instead the constant pixel value for the entire block is computed in one step. +Note that the truncation of intermediate operations is omitted and the final + rounding is slightly different in this case. +The check for whether or not the block contains only a DC coefficient is based + on the coefficient count returned from the token decode procedure of + Section~\ref{sec:dct-decode}, and not by checking to see if the remaining + coefficient values are zero. +Also note that even when the coefficient count indicates the block contains + zero coefficients, the DC coefficient is still processed, as undoing DC + prediction might have made it non-zero. + +After this procedure, the frame is completely reconstructed, but before it can + be used as a reference frame, a loop filter must be run over it to help reduce + blocking artifacts. +This is detailed in Section~\ref{sec:loopfilter}. + +\begin{enumerate} +\item +Assign \locvar{\idx{qi0}} the value $\bitvar{QIS}[0]$. +\item +For each value of \locvar{\bi} from 0 to $(\bitvar{NBS}-1)$: +\begin{enumerate} +\item +Assign \locvar{\pli} the index of the color plane block \locvar{\bi} belongs + to. +\item +Assign \locvar{BX} the horizontal pixel index of the lower-left corner of block + \locvar{\bi}. +\item +Assign \locvar{BY} the vertical pixel index of the lower-left corner of block + \locvar{\bi}. +\item +If $\bitvar{BCODED}[\locvar{\bi}]$ is non-zero: +\begin{enumerate} +\item +Assign \locvar{\mbi} the index of the macro block containing block + \locvar{\bi}. +\item +If $\bitvar{MBMODES}[\locvar{\mbi}]$ is 1 (INTRA), assign \locvar{\qti} the + value $0$. +\item +Otherwise, assign \locvar{\qti} the value $1$. +\item +Assign \locvar{\rfi} the value of the Reference Frame Index column of + Table~\ref{tab:cm-refs} corresponding to $\bitvar{MBMODES}[\locvar{\mbi}]$. +\item +If \locvar{\rfi} is zero, compute \locvar{PRED} using the procedure given in + Section~\ref{sub:predintra}. +\item +Otherwise: +\begin{enumerate} +\item +Assign \locvar{REFP}, \locvar{RPW}, and \locvar{RPH} the values given in + Table~\ref{tab:refp} corresponding to current value of \locvar{\rfi} and + \locvar{\pli}. + +\begin{table}[htbp] +\begin{center} +\begin{tabular}{cclll}\toprule +\locvar{\rfi} & \locvar{\pli} & +\locvar{REFP} & \locvar{RPW} & \locvar{RPH} \\\midrule +$1$ & $0$ & \bitvar{PREVREFY} & \bitvar{RPYW} & \bitvar{RPYH} \\ +$1$ & $1$ & \bitvar{PREVREFCB} & \bitvar{RPCW} & \bitvar{RPCH} \\ +$1$ & $2$ & \bitvar{PREVREFCR} & \bitvar{RPCW} & \bitvar{RPCH} \\ +$2$ & $0$ & \bitvar{GOLDREFY} & \bitvar{RPYW} & \bitvar{RPYH} \\ +$2$ & $1$ & \bitvar{GOLDREFCB} & \bitvar{RPCW} & \bitvar{RPCH} \\ +$2$ & $2$ & \bitvar{GOLDREFCR} & \bitvar{RPCW} & \bitvar{RPCH} \\ +\bottomrule\end{tabular} +\end{center} +\caption{Reference Planes and Sizes for Each \locvar{\rfi} and \locvar{\pli}} +\label{tab:refp} +\end{table} + +\item +Assign \locvar{MVX} the value +\begin{equation*} + \left\lfloor\lvert\bitvar{MVECTS}[\locvar{\bi}]_x\rvert\right\rfloor* + \sign(\bitvar{MVECTS}[\locvar{\bi}]_x). +\end{equation*} +\item +Assign \locvar{MVY} the value +\begin{equation*} + \left\lfloor\lvert\bitvar{MVECTS}[\locvar{\bi}]_y\rvert\right\rfloor* + \sign(\bitvar{MVECTS}[\locvar{\bi}]_y). +\end{equation*} +\item +Assign \locvar{MVX2} the value +\begin{equation*} + \left\lceil\lvert\bitvar{MVECTS}[\locvar{\bi}]_x\rvert\right\rceil* + \sign(\bitvar{MVECTS}[\locvar{\bi}]_x). +\end{equation*} +\item +Assign \locvar{MVY2} the value +\begin{equation*} + \left\lceil\lvert\bitvar{MVECTS}[\locvar{\bi}]_y\rvert\right\rceil* + \sign(\bitvar{MVECTS}[\locvar{\bi}]_y). +\end{equation*} +\item +If \locvar{MVX} equals \locvar{MVX2} and \locvar{MVY} equals \locvar{MVY2}, + use the values \locvar{REFP}, \locvar{RPW}, \locvar{RPH}, \locvar{BX}, + \locvar{BY}, \locvar{MVX}, and \locvar{MVY}, compute \locvar{PRED} using the + procedure given in Section~\ref{sub:predfullpel}. +\item +Otherwise, use the values \locvar{REFP}, \locvar{RPW}, \locvar{RPH}, + \locvar{BX}, \locvar{BY}, \locvar{MVX}, \locvar{MVY}, \locvar{MVX2}, and + \locvar{MVY2} to compute \locvar{PRED} using the procedure given in + Section~\ref{sub:predhalfpel}. +\end{enumerate} +\item +\label{step:dc-only-idct} +If $\bitvar{NCOEFFS}[\locvar{\bi}]$ is less than 2: +\begin{enumerate} +\item +Using \bitvar{ACSCALE}, \bitvar{DCSCALE}, \bitvar{BMS}, \bitvar{NQRS}, \\ + \bitvar{QRSIZES}, \bitvar{QRBMIS}, \locvar{\qti}, \locvar{\pli}, and + \locvar{\idx{qi0}}, use the procedure given in Section~\ref{sub:quant-mat} to + compute the DC quantization matrix \locvar{QMAT}. +\item +Assign \locvar{DC} the value +\begin{equation*} + (\bitvar{COEFFS}[\bitvar{\bi}][0]*\locvar{QMAT}[0]+15)>>5. +\end{equation*} +\item +Truncate \locvar{DC} to a 16-bit signed representation by dropping any + higher-order bits. +\item +For each value of \locvar{\idx{by}} from 0 to 7, and each value of + \locvar{\idx{bx}} from 0 to 7, assign + $\locvar{RES}[\locvar{\idx{by}}][\locvar{\idx{bx}}]$ the value \locvar{DC}. +\end{enumerate} +\item +Otherwise: +\begin{enumerate} +\item +Assign \locvar{\qi} the value $\bitvar{QIS}[\bitvar{QIIS}[\locvar{\bi}]]$. +\item +Using \bitvar{ACSCALE}, \bitvar{DCSCALE}, \bitvar{BMS}, \bitvar{NQRS}, \\ + \bitvar{QRSIZES}, \bitvar{QRBMIS}, \locvar{\qti}, \locvar{\pli}, + \locvar{\idx{qi0}}, and \locvar{\qi}, compute \locvar{DQC} using the procedure + given in Section~\ref{sub:dequant}. +\item +Using \locvar{DQC}, compute \locvar{RES} using the procedure given in + Section~\ref{sub:2d-idct}. +\end{enumerate} +\end{enumerate} +\item +Otherwise: +\begin{enumerate} +\item +Assign \locvar{\rfi} the value 1. +\item +Assign \locvar{REFP}, \locvar{RPW}, and \locvar{RPH} the values given in + Table~\ref{tab:refp} corresponding to current value of \locvar{\rfi} and + \locvar{\pli}. +\item +Assign \locvar{MVX} the value 0. +\item +Assign \locvar{MVY} the value 0. +\item +Using the values \locvar{REFP}, \locvar{RPW}, \locvar{RPH}, \locvar{BX}, + \locvar{BY}, \locvar{MVX}, and \locvar{MVY}, compute \locvar{PRED} using the + procedure given in Section~\ref{sub:predfullpel}. +This is simply a copy of the co-located block in the previous reference frame. +\item +For each value of \locvar{\idx{by}} from 0 to 7, and each value of + \locvar{\idx{bx}} from 0 to 7, assign + $\locvar{RES}[\locvar{\idx{by}}][\locvar{\idx{bx}}]$ the value 0. +\end{enumerate} +\item +For each value of \locvar{\idx{by}} from 0 to 7, and each value of + \locvar{\idx{bx}} from 0 to 7: +\begin{enumerate} +\item +Assign \locvar{P} the value + $(\locvar{PRED}[\locvar{\idx{by}}][\locvar{\idx{bx}}]+ + \locvar{RES}[\locvar{\idx{by}}][\locvar{\idx{bx}}])$. +\item +If \locvar{P} is greater than $255$, assign \locvar{P} the value $255$. +\item +If \locvar{P} is less than $0$, assign \locvar{P} the value $0$. +\item +If \locvar{\pli} equals 0, assign + $\bitvar{RECY}[\locvar{BY}+\locvar{\idx{by}}][\locvar{BX}+\locvar{\idx{bx}}]$ + the value \locvar{P}. +\item +Otherwise, if \locvar{\pli} equals 1, assign + $\bitvar{RECB}[\locvar{BY}+\locvar{\idx{by}}][\locvar{BX}+\locvar{\idx{bx}}]$ + the value \locvar{P}. +\item +Otherwise, \locvar{\pli} equals 2, so assign + $\bitvar{RECR}[\locvar{BY}+\locvar{\idx{by}}][\locvar{BX}+\locvar{\idx{bx}}]$ + the value \locvar{P}. +\end{enumerate} +\end{enumerate} +\end{enumerate} + +\section{Loop Filtering} +\label{sec:loopfilter} + +\begin{figure}[htbp] +\begin{center} +\includegraphics{lflim} +\end{center} +\caption{The loop filter response function.} +\label{fig:lflim} +\end{figure} + +The loop filter is a simple deblocking filter that is based on running a small + edge detecting filter over the coded block edges and adjusting the pixel + values by a tapered response. +The filter response is modulated by the following non-linear function: +\begin{align*} +\lflim(\locvar{R},\bitvar{L})&=\left\{\begin{array}{ll} +0, & \locvar{R}\le-2*\bitvar{L} \\ +-\locvar{R}-2*\bitvar{L}, & -2*\bitvar{L}<\locvar{R}\le-\bitvar{L} \\ +\locvar{R}, & -\bitvar{L}<\locvar{R}<\bitvar{L} \\ +-\locvar{R}+2*\bitvar{L}, & \bitvar{L}\le\locvar{R}<2*\bitvar{L} \\ +0, & 2*\bitvar{L}\le\locvar{R} +\end{array}\right. +\end{align*} +Here \bitvar{L} is a limiting value equal to $\bitvar{LFLIMS}[\idx{qi0}]$. +It defines the peaks of the function, illustrated in Figure~\ref{fig:lflim}. +\bitvar{LFLIMS} is an array of values specified in the setup header and is + indexed by \idx{qi0}, the first quantization index for the frame, the one used + for all the DC coefficients. +Larger values of \bitvar{L} indicate a stronger filter. + +\subsection{Horizontal Filter} +\label{sub:filth} + +\paragraph{Input parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{RECP} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPH}\times\bitvar{RPW}$ + array containing the contents of a plane of the reconstructed frame. \\ +\bitvar{FX} & Integer & 20 & No & The horizontal pixel index of the + lower-left corner of the area to be filtered. \\ +\bitvar{FY} & Integer & 20 & No & The vertical pixel index of the + lower-left corner of the area to be filtered. \\ +\bitvar{L} & Integer & 7 & No & The loop filter limit value. \\ +\bottomrule\end{tabularx} + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{RECP} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPH}\times\bitvar{RPW}$ + array containing the contents of a plane of the reconstructed frame. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\locvar{R} & Integer & 9 & Yes & The edge detector response. \\ +\locvar{P} & Integer & 9 & Yes & A filtered pixel value. \\ +\locvar{\idx{by}} & Integer & 20 & No & The vertical pixel index in the + block. \\ +\bottomrule\end{tabularx} +\medskip + +This procedure applies a $4$-tap horizontal filter to each row of a vertical + block edge. + +\begin{enumerate} +\item +For each value of \locvar{\idx{by}} from $0$ to $7$: +\begin{enumerate} +\item +Assign \locvar{R} the value +\begin{multline*} +(\bitvar{RECP}[\bitvar{FY}+\locvar{\idx{by}}][\bitvar{FX}]- + 3*\bitvar{RECP}[\bitvar{FY}+\locvar{\idx{by}}][\bitvar{FX}+1]+\\ + 3*\bitvar{RECP}[\bitvar{FY}+\locvar{\idx{by}}][\bitvar{FX}+2]- + \bitvar{RECP}[\bitvar{FY}+\locvar{\idx{by}}][\bitvar{FX}+3]+4)>>3 +\end{multline*} +\item +Assign \locvar{P} the value + $(\bitvar{RECP}[\bitvar{FY}+\locvar{\idx{by}}][\bitvar{FX}+1]+ + \lflim(\locvar{R},\bitvar{L}))$. +\item +If \locvar{P} is less than zero, assign + $\bitvar{RECP}[\bitvar{FY}+\locvar{\idx{by}}][\bitvar{FX}+1]$ the value zero. +\item +Otherwise, if \locvar{P} is greater than $255$, assign + $\bitvar{RECP}[\bitvar{FY}+\locvar{\idx{by}}][\bitvar{FX}+1]$ the value $255$. +\item +Otherwise, assign + $\bitvar{RECP}[\bitvar{FY}+\locvar{\idx{by}}][\bitvar{FX}+1]$ the value + \locvar{P}. +\item +Assign \locvar{P} the value + $(\bitvar{RECP}[\bitvar{FY}+\locvar{\idx{by}}][\bitvar{FX}+2]- + \lflim(\locvar{R},\bitvar{L}))$. +\item +If \locvar{P} is less than zero, assign + $\bitvar{RECP}[\bitvar{FY}+\locvar{\idx{by}}][\bitvar{FX}+2]$ the value zero. +\item +Otherwise, if \locvar{P} is greater than $255$, assign + $\bitvar{RECP}[\bitvar{FY}+\locvar{\idx{by}}][\bitvar{FX}+2]$ the value $255$. +\item +Otherwise, assign + $\bitvar{RECP}[\bitvar{FY}+\locvar{\idx{by}}][\bitvar{FX}+2]$ the value + \locvar{P}. +\end{enumerate} +\end{enumerate} + +\subsection{Vertical Filter} +\label{sub:filtv} + +\paragraph{Input parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{RECP} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPH}\times\bitvar{RPW}$ + array containing the contents of a plane of the reconstructed frame. \\ +\bitvar{FX} & Integer & 20 & No & The horizontal pixel index of the + lower-left corner of the area to be filtered. \\ +\bitvar{FY} & Integer & 20 & No & The vertical pixel index of the + lower-left corner of the area to be filtered. \\ +\bitvar{L} & Integer & 7 & No & The loop filter limit value. \\ +\bottomrule\end{tabularx} + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{RECP} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPH}\times\bitvar{RPW}$ + array containing the contents of a plane of the reconstructed frame. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\locvar{R} & Integer & 9 & Yes & The edge detector response. \\ +\locvar{P} & Integer & 9 & Yes & A filtered pixel value. \\ +\locvar{\idx{bx}} & Integer & 20 & No & The horizontal pixel index in the + block. \\ +\bottomrule\end{tabularx} +\medskip + +This procedure applies a $4$-tap vertical filter to each column of a horizontal + block edge. + +\begin{enumerate} +\item +For each value of \locvar{\idx{bx}} from $0$ to $7$: +\begin{enumerate} +\item +Assign \locvar{R} the value +\begin{multline*} +(\bitvar{RECP}[\bitvar{FY}][\bitvar{FX}+\locvar{\idx{bx}}]- + 3*\bitvar{RECP}[\bitvar{FY}+1][\bitvar{FX}+\locvar{\idx{bx}}]+\\ + 3*\bitvar{RECP}[\bitvar{FY}+2][\bitvar{FX}+\locvar{\idx{bx}}]- + \bitvar{RECP}[\bitvar{FY}+3][\bitvar{FX}+\locvar{\idx{bx}}]+4)>>3 +\end{multline*} +\item +Assign \locvar{P} the value + $(\bitvar{RECP}[\bitvar{FY}+1][\bitvar{FX}+\locvar{\idx{bx}}]+ + \lflim(\locvar{R},\bitvar{L}))$. +\item +If \locvar{P} is less than zero, assign + $\bitvar{RECP}[\bitvar{FY}+1][\bitvar{FX}+\locvar{\idx{bx}}]$ the value zero. +\item +Otherwise, if \locvar{P} is greater than $255$, assign + $\bitvar{RECP}[\bitvar{FY}+1][\bitvar{FX}+\locvar{\idx{bx}}]$ the value $255$. +\item +Otherwise, assign + $\bitvar{RECP}[\bitvar{FY}+1][\bitvar{FX}+\locvar{\idx{bx}}]$ the value + \locvar{P}. +\item +Assign \locvar{P} the value + $(\bitvar{RECP}[\bitvar{FY}+2][\bitvar{FX}+\locvar{\idx{bx}}]- + \lflim(\locvar{R},\bitvar{L}))$. +\item +If \locvar{P} is less than zero, assign + $\bitvar{RECP}[\bitvar{FY}+2][\bitvar{FX}+\locvar{\idx{bx}}]$ the value zero. +\item +Otherwise, if \locvar{P} is greater than $255$, assign + $\bitvar{RECP}[\bitvar{FY}+2][\bitvar{FX}+\locvar{\idx{bx}}]$ the value $255$. +\item +Otherwise, assign + $\bitvar{RECP}[\bitvar{FY}+2][\bitvar{FX}+\locvar{\idx{bx}}]$ the value + \locvar{P}. +\end{enumerate} +\end{enumerate} + +\subsection{Complete Loop Filter} +\label{sub:loop-filt} + +\paragraph{Input parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{LFLIMS} & \multicolumn{1}{p{40pt}}{Integer array} & + 7 & No & A 64-element array of loop filter limit + values. \\ +\bitvar{RPYW} & Integer & 20 & No & The width of the $Y'$ plane of the + reconstruced frame in pixels. \\ +\bitvar{RPYH} & Integer & 20 & No & The height of the $Y'$ plane of the + reconstruced frame in pixels. \\ +\bitvar{RPCW} & Integer & 20 & No & The width of the $C_b$ and $C_r$ + planes of the reconstruced frame in pixels. \\ +\bitvar{RPCH} & Integer & 20 & No & The height of the $C_b$ and $C_r$ + planes of the reconstruced frame in pixels. \\ +\bitvar{NBS} & Integer & 36 & No & The total number of blocks in a + frame. \\ +\bitvar{BCODED} & \multicolumn{1}{p{40pt}}{Integer Array} & + 1 & No & An \bitvar{NBS}-element array of + flags indicating which blocks are coded. \\ +\bitvar{QIS} & \multicolumn{1}{p{40pt}}{Integer array} & + 6 & No & An \bitvar{NQIS}-element array of + \qi\ values. \\ +\bitvar{RECY} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPYH}\times\bitvar{RPYW}$ + array containing the contents of the $Y'$ plane of the reconstructed frame. \\ +\bitvar{RECCB} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPCH}\times\bitvar{RPCW}$ + array containing the contents of the $C_b$ plane of the reconstructed frame. \\ +\bitvar{RECCR} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPCH}\times\bitvar{RPCW}$ + array containing the contents of the $C_r$ plane of the reconstructed frame. \\ +\bottomrule\end{tabularx} + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{RECY} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPYH}\times\bitvar{RPYW}$ + array containing the contents of the $Y'$ plane of the reconstructed frame. \\ +\bitvar{RECCB} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPCH}\times\bitvar{RPCW}$ + array containing the contents of the $C_b$ plane of the reconstructed frame. \\ +\bitvar{RECCR} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPCH}\times\bitvar{RPCW}$ + array containing the contents of the $C_r$ plane of the reconstructed frame. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\locvar{RPW} & Integer & 20 & No & The width of the current plane of the + reconstructed frame in pixels. \\ +\locvar{RPH} & Integer & 20 & No & The height of the current plane of + the reconstructed frame in pixels. \\ +\locvar{RECP} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPH}\times\bitvar{RPW}$ + array containing the contents of the current plane of the reconstruced + frame. \\ +\locvar{BX} & Integer & 20 & No & The horizontal pixel index of the + lower-left corner of the current block. \\ +\locvar{BY} & Integer & 20 & No & The vertical pixel index of the + lower-left corner of the current block. \\ +\locvar{FX} & Integer & 20 & No & The horizontal pixel index of the + lower-left corner of the area to be filtered. \\ +\locvar{FY} & Integer & 20 & No & The vertical pixel index of the + lower-left corner of the area to be filtered. \\ +\locvar{L} & Integer & 7 & No & The loop filter limit value. \\ +\locvar{\bi} & Integer & 36 & No & The index of the current block in + coded order. \\ +\locvar{\bj} & Integer & 36 & No & The index of a neighboring block in + coded order. \\ +\locvar{\pli} & Integer & 2 & No & The color plane index of the current + block. \\ +\bottomrule\end{tabularx} +\medskip + +This procedure defines the order that the various block edges are filtered. +Because each application of one of the two filters above destructively modifies + the contents of the reconstructed image, the precise output obtained differs + depending on the order that horizontal and vertical filters are applied to the + edges of a single block. +The order defined here conforms to that used by VP3. + +\begin{enumerate} +\item +Assign \locvar{L} the value $\bitvar{LFLIMS}[\bitvar{QIS}[0]]$. +\item +For each block in {\em raster} order, with coded-order index \locvar{\bi}: +\begin{enumerate} +\item +If $\bitvar{BCODED}[\locvar{\bi}]$ is non-zero: +\begin{enumerate} +\item +Assign \locvar{\pli} the index of the color plane block \locvar{\bi} belongs + to. +\item +Assign \locvar{RECP}, \locvar{RPW}, and \locvar{RPH} the values given in + Table~\ref{tab:recp} corresponding to the value of \locvar{\pli}. + +\begin{table}[htbp] +\begin{center} +\begin{tabular}{clll}\toprule +\locvar{\pli} & \locvar{RECP} & \locvar{RPW} & \locvar{RPH} \\\midrule +$0$ & \bitvar{RECY} & \bitvar{RPYW} & \bitvar{RPYH} \\ +$1$ & \bitvar{RECCB} & \bitvar{RPCW} & \bitvar{RPCH} \\ +$2$ & \bitvar{RECCR} & \bitvar{RPCW} & \bitvar{RPCH} \\ +\bottomrule\end{tabular} +\end{center} +\caption{Reconstructed Planes and Sizes for Each \locvar{\pli}} +\label{tab:recp} +\end{table} + +\item +Assign \locvar{BX} the horizontal pixel index of the lower-left corner of the + block \locvar{\bi}. +\item +Assign \locvar{BY} the vertical pixel index of the lower-left corner of the + block \locvar{\bi}. +\item +If \locvar{BX} is greater than zero: +\begin{enumerate} +\item +Assign \locvar{FX} the value $(\locvar{BX}-2)$. +\item +Assign \locvar{FY} the value \locvar{BY}. +\item +Using \locvar{RECP}, \locvar{FX}, \locvar{FY}, and \locvar{L}, apply the + horizontal block filter to the left edge of block \locvar{\bi} with the + procedure described in Section~\ref{sub:filth}. +\end{enumerate} +\item +If \locvar{BY} is greater than zero: +\begin{enumerate} +\item +Assign \locvar{FX} the value \locvar{BX}. +\item +Assign \locvar{FY} the value $(\locvar{BY}-2)$ +\item +Using \locvar{RECP}, \locvar{FX}, \locvar{FY}, and \locvar{L}, apply the + vertical block filter to the bottom edge of block \locvar{\bi} with the + procedure described in Section~\ref{sub:filtv}. +\end{enumerate} +\item +If $(\locvar{BX}+8)$ is less than \locvar{RPW} and + $\bitvar{BCODED}[\locvar{\bj}]$ is zero, where \locvar{\bj} is the coded-order + index of the block adjacent to \locvar{\bi} on the right: +\begin{enumerate} +\item +Assign \locvar{FX} the value $(\locvar{BX}+6)$. +\item +Assign \locvar{FY} the value \locvar{BY}. +\item +Using \locvar{RECP}, \locvar{FX}, \locvar{FY}, and \locvar{L}, apply the + horizontal block filter to the right edge of block \locvar{\bi} with the + procedure described in Section~\ref{sub:filth}. +\end{enumerate} +\item +If $(\locvar{BY}+8)$ is less than \locvar{RPH} and + $\bitvar{BCODED}[\locvar{\bj}]$ is zero, where \locvar{\bj} is the coded-order + index of the block adjacent to \locvar{\bi} above: +\begin{enumerate} +\item +Assign \locvar{FX} the value \locvar{BX}. +\item +Assign \locvar{FY} the value $(\locvar{BY}+6)$ +\item +Using \locvar{RECP}, \locvar{FX}, \locvar{FY}, and \locvar{L}, apply the + vertical block filter to the top edge of block \locvar{\bi} with the + procedure described in Section~\ref{sub:filtv}. +\end{enumerate} +\end{enumerate} +\end{enumerate} +\end{enumerate} + +\paragraph{VP3 Compatibility} + +The original VP3 decoder implemented unrestricted motion vectors by enlarging + the reconstructed frame buffers and repeating the pixels on its edges into the + padding region. +However, for the previous reference frame this padding ocurred before the loop + filter was applied, but for the golden reference frame it occurred afterwards. + +This means that for the previous reference frame, the padding values were + required to be stored separately from the main image values. +Furthermore, even if the previous and golden reference frames were in fact the + same frame, they could have different padding values. +Finally, the encoder did not apply the loop filter at all, which resulted in + artifacts, particularly in near-static scenes, due to prediction-loop + mismatch. +This last can only be considered a bug in the VP3 encoder. + +Given all these things, Theora now uniformly applies the loop filter before + the reference frames are padded. +This means it is possible to use the same buffer for the previous and golden + reference frames when they do indeed refer to the same frame. +It also means that on architectures where memory bandwidth is limited, it is + possible to avoid storing padding values, and simply clamp the motion vectors + applied to each pixel as described in Sections~\ref{sub:predfullpel} + and~\ref{sub:predhalfpel}. +This means that the predicted pixel values along the edges of the frame might + differ slightly between VP3 and Theora, but since the VP3 encoder did not + apply the loop filter in the first place, this is not likely to impose any + serious compatibility issues. + +\section{Complete Frame Decode} + +\paragraph{Input parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{FMBW} & Integer & 16 & No & The width of the frame in macro + blocks. \\ +\bitvar{FMBH} & Integer & 16 & No & The height of the frame in macro + blocks. \\ +\bitvar{NSBS} & Integer & 32 & No & The total number of super blocks in a + frame. \\ +\bitvar{NBS} & Integer & 36 & No & The total number of blocks in a + frame. \\ +\bitvar{NMBS} & Integer & 32 & No & The total number of macro blocks in a + frame. \\ +\bitvar{FRN} & Integer & 32 & No & The frame-rate numerator. \\ +\bitvar{FRD} & Integer & 32 & No & The frame-rate denominator. \\ +\bitvar{PARN} & Integer & 24 & No & The pixel aspect-ratio numerator. \\ +\bitvar{PARD} & Integer & 24 & No & The pixel aspect-ratio + denominator. \\ +\bitvar{CS} & Integer & 8 & No & The color space. \\ +\bitvar{PF} & Integer & 2 & No & The pixel format. \\ +\bitvar{NOMBR} & Integer & 24 & No & The nominal bitrate of the stream, in + bits per second. \\ +\bitvar{QUAL} & Integer & 6 & No & The quality hint. \\ +\bitvar{KFGSHIFT} & Integer & 5 & No & The amount to shift the key frame + number by in the granule position. \\ +\bitvar{LFLIMS} & \multicolumn{1}{p{40pt}}{Integer array} & + 7 & No & A 64-element array of loop filter + limit values. \\ +\bitvar{ACSCALE} & \multicolumn{1}{p{40pt}}{Integer array} & + 16 & No & A 64-element array of scale values + for AC coefficients for each \qi\ value. \\ +\bitvar{DCSCALE} & \multicolumn{1}{p{40pt}}{Integer array} & + 16 & No & A 64-element array of scale values + for the DC coefficient for each \qi\ value. \\ +\bitvar{NBMS} & Integer & 10 & No & The number of base matrices. \\ +\bitvar{BMS} & \multicolumn{1}{p{50pt}}{2D Integer array} & + 8 & No & A $\bitvar{NBMS}\times 64$ array + containing the base matrices. \\ +\bitvar{NQRS} & \multicolumn{1}{p{50pt}}{2D Integer array} & + 6 & No & A $2\times 3$ array containing the + number of quant ranges for a given \qti\ and \pli, respectively. +This is at most $63$. \\ +\bitvar{QRSIZES} & \multicolumn{1}{p{50pt}}{3D Integer array} & + 6 & No & A $2\times 3\times 63$ array of the + sizes of each quant range for a given \qti\ and \pli, respectively. +Only the first $\bitvar{NQRS}[\qti][\pli]$ values will be used. \\ +\bitvar{QRBMIS} & \multicolumn{1}{p{50pt}}{3D Integer array} & + 9 & No & A $2\times 3\times 64$ array of the + \bmi's used for each quant range for a given \qti\ and \pli, respectively. +Only the first $(\bitvar{NQRS}[\qti][\pli]+1)$ values will be used. \\ +\bitvar{HTS} & \multicolumn{3}{l}{Huffman table array} + & An 80-element array of Huffman tables + with up to 32 entries each. \\ +\bitvar{GOLDREFY} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPYH}\times\bitvar{RPYW}$ + array containing the contents of the $Y'$ plane of the golden reference + frame. \\ +\bitvar{GOLDREFCB} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPCH}\times\bitvar{RPCW}$ + array containing the contents of the $C_b$ plane of the golden reference + frame. \\ +\bitvar{GOLDREFCR} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPCH}\times\bitvar{RPCW}$ + array containing the contents of the $C_r$ plane of the golden reference + frame. \\ +\bitvar{PREVREFY} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPYH}\times\bitvar{RPYW}$ + array containing the contents of the $Y'$ plane of the previous reference + frame. \\ +\bitvar{PREVREFCB} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPCH}\times\bitvar{RPCW}$ + array containing the contents of the $C_b$ plane of the previous reference + frame. \\ +\bitvar{PREVREFCR} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPCH}\times\bitvar{RPCW}$ + array containing the contents of the $C_r$ plane of the previous reference + frame. \\ +\bottomrule\end{tabularx} + +\paragraph{Output parameters:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\bitvar{RECY} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPYH}\times\bitvar{RPYW}$ + array containing the contents of the $Y'$ plane of the reconstructed frame. \\ +\bitvar{RECCB} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPCH}\times\bitvar{RPCW}$ + array containing the contents of the $C_b$ plane of the reconstructed + frame. \\ +\bitvar{RECCR} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPCH}\times\bitvar{RPCW}$ + array containing the contents of the $C_r$ plane of the reconstructed + frame. \\ +\bitvar{GOLDREFY} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPYH}\times\bitvar{RPYW}$ + array containing the contents of the $Y'$ plane of the golden reference + frame. \\ +\bitvar{GOLDREFCB} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPCH}\times\bitvar{RPCW}$ + array containing the contents of the $C_b$ plane of the golden reference + frame. \\ +\bitvar{GOLDREFCR} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPCH}\times\bitvar{RPCW}$ + array containing the contents of the $C_r$ plane of the golden reference + frame. \\ +\bitvar{PREVREFY} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPYH}\times\bitvar{RPYW}$ + array containing the contents of the $Y'$ plane of the previous reference + frame. \\ +\bitvar{PREVREFCB} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPCH}\times\bitvar{RPCW}$ + array containing the contents of the $C_b$ plane of the previous reference + frame. \\ +\bitvar{PREVREFCR} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 8 & No & A $\bitvar{RPCH}\times\bitvar{RPCW}$ + array containing the contents of the $C_r$ plane of the previous reference + frame. \\ +\bottomrule\end{tabularx} + +\paragraph{Variables used:}\hfill\\* +\begin{tabularx}{\textwidth}{@{}llrcX@{}}\toprule +\multicolumn{1}{c}{Name} & +\multicolumn{1}{c}{Type} & +\multicolumn{1}{p{30pt}}{\centering Size (bits)} & +\multicolumn{1}{c}{Signed?} & +\multicolumn{1}{c}{Description and restrictions} \\\midrule\endhead +\locvar{FTYPE} & Integer & 1 & No & The frame type. \\ +\locvar{NQIS} & Integer & 2 & No & The number of \qi\ values. \\ +\locvar{QIS} & \multicolumn{1}{p{40pt}}{Integer array} & + 6 & No & An \locvar{NQIS}-element array of + \qi\ values. \\ +\locvar{BCODED} & \multicolumn{1}{p{40pt}}{Integer Array} & + 1 & No & An \bitvar{NBS}-element array of flags + indicating which blocks are coded. \\ +\locvar{MBMODES} & \multicolumn{1}{p{40pt}}{Integer Array} & + 3 & No & An \bitvar{NMBS}-element array of + coding modes for each macro block. \\ +\locvar{MVECTS} & \multicolumn{1}{p{50pt}}{Array of 2D Integer Vectors} & + 6 & Yes & An \bitvar{NBS}-element array of motion + vectors for each block. \\ +\locvar{QIIS} & \multicolumn{1}{p{40pt}}{Integer Array} & + 2 & No & An \bitvar{NBS}-element array of + \locvar{\qii} values for each block. \\ +\locvar{COEFFS} & \multicolumn{1}{p{50pt}}{2D Integer Array} & + 16 & Yes & An $\bitvar{NBS}\times 64$ array of + quantized DCT coefficient values for each block in zig-zag order. \\ +\locvar{NCOEFFS} & \multicolumn{1}{p{40pt}}{Integer Array} & + 7 & No & An \bitvar{NBS}-element array of the + coefficient count for each block. \\ +\bitvar{RPYW} & Integer & 20 & No & The width of the $Y'$ plane of the + reference frames in pixels. \\ +\bitvar{RPYH} & Integer & 20 & No & The height of the $Y'$ plane of the + reference frames in pixels. \\ +\bitvar{RPCW} & Integer & 20 & No & The width of the $C_b$ and $C_r$ + planes of the reference frames in pixels. \\ +\bitvar{RPCH} & Integer & 20 & No & The height of the $C_b$ and $C_r$ + planes of the reference frames in pixels. \\ +\locvar{\bi} & Integer & 36 & No & The index of the current block in coded + order. \\ +\bottomrule\end{tabularx} +\medskip + +This procedure uses all the procedures defined in the previous section of this + chapter to decode and reconstruct a complete frame. +It takes as input values decoded from the headers, as well as the current + reference frames. +As output, it gives the uncropped, reconstructed frame. +This should be cropped to picture region before display. +As a special case, a 0-byte packet is treated exactly like an inter frame with + no coded blocks. + +\begin{enumerate} +\item +If the size of the data packet is non-zero: +\begin{enumerate} +\item +Decode the frame header values \locvar{FTYPE}, \locvar{NQIS}, and \locvar{QIS} + using the procedure given in Section~\ref{sub:frame-header}. +\item +Using \locvar{FTYPE}, \bitvar{NSBS}, and \bitvar{NBS}, decode the list of coded + block flags into \locvar{BCODED} using the procedure given in + Section~\ref{sub:coded-blocks}. +\item +Using \locvar{FTYPE}, \bitvar{NMBS}, \bitvar{NBS}, and \bitvar{BCODED}, decode + the macro block coding modes into \locvar{MBMODES} using the procedure given + in Section~\ref{sub:mb-modes}. +\item +If \locvar{FTYPE} is non-zero (inter frame), using \bitvar{PF}, \bitvar{NMBS}, + \locvar{MBMODES}, \bitvar{NBS}, and \locvar{BCODED}, decode the motion vectors + into \locvar{MVECTS} using the procedure given in + Section~\ref{sub:mb-mv-decode}. +\item +Using \bitvar{NBS}, \locvar{BCODED}, and \locvar{NQIS}, decode the block-level + \qi\ values into \locvar{QIIS} using the procedure given in + Section~\ref{sub:block-qis}. +\item +Using \bitvar{NBS}, \bitvar{NMBS}, \locvar{BCODED}, and \bitvar{HTS}, decode + the DCT coefficients into \locvar{NCOEFFS} and \locvar{NCOEFFS} using the + procedure given in Section~\ref{sub:dct-coeffs}. +\item +Using \locvar{BCODED} and \locvar{MBMODES}, undo the DC prediction on the DC + coefficients stored in \locvar{COEFFS} using the procedure given in + Section~\ref{sub:dc-pred-undo}. +\end{enumerate} +\item +Otherwise: +\begin{enumerate} +\item +Assign \locvar{FTYPE} the value 1 (inter frame). +\item +Assign \locvar{NQIS} the value 1. +\item +Assign $\locvar{QIS}[0]$ the value 63. +\item +For each value of \locvar{\bi} from 0 to $(\bitvar{NBS}-1)$, assign + $\locvar{BCODED}[\locvar{\bi}]$ the value zero. +\end{enumerate} +\item +Assign \locvar{RPYW} and \locvar{RPYH} the values $(16*\bitvar{FMBW})$ and + $(16*\bitvar{FMBH})$, respectively. +\item +Assign \locvar{RPCW} and \locvar{RPCH} the values from the row of + Table~\ref{tab:rpcwh-for-pf} corresponding to \bitvar{PF}. + +\begin{table}[tb] +\begin{center} +\begin{tabular}{crr}\toprule +\bitvar{PF} & \multicolumn{1}{c}{\locvar{RPCW}} + & \multicolumn{1}{c}{\locvar{RPCH}} \\\midrule +$0$ & $8*\bitvar{FMBW}$ & $8*\bitvar{FMBH}$ \\ +$2$ & $8*\bitvar{FMBW}$ & $16*\bitvar{FMBH}$ \\ +$3$ & $16*\bitvar{FMBW}$ & $16*\bitvar{FMBH}$ \\ +\bottomrule\end{tabular} +\end{center} +\caption{Width and Height of Chroma Planes for each Pixel Format} +\label{tab:rpcwh-for-pf} +\end{table} + +\item +Using \bitvar{ACSCALE}, \bitvar{DCSCALE}, \bitvar{BMS}, \bitvar{NQRS}, + \bitvar{QRSIZES}, \bitvar{QRBMIS}, \bitvar{NBS}, \locvar{BCODED}, + \locvar{MBMODES}, \locvar{MVECTS}, \locvar{COEFFS}, \locvar{NCOEFFS}, + \locvar{QIS}, \locvar{QIIS}, \locvar{RPYW}, \locvar{RPYH}, \locvar{RPCW}, + \locvar{RPCH}, \bitvar{GOLDREFY}, \bitvar{GOLDREFCB}, \bitvar{GOLDREFCR}, + \bitvar{PREVREFY}, \bitvar{PREVREFCB}, and \bitvar{PREVREFCR}, reconstruct the + complete frame into \bitvar{RECY}, \bitvar{RECCB}, and \bitvar{RECCR} using + the procedure given in Section~\ref{sub:recon}. +\item +Using \bitvar{LFLIMS}, \locvar{RPYW}, \locvar{RPYH}, \locvar{RPCW}, + \locvar{RPCH}, \bitvar{NBS}, \locvar{BCODED}, and \locvar{QIS}, apply the loop + filter to the reconstructed frame in \bitvar{RECY}, \bitvar{RECCB}, and + \bitvar{RECCR} using the procedure given in Section~\ref{sub:loop-filt}. +\item +If \locvar{FTYPE} is zero (intra frame), assign \bitvar{GOLDREFY}, + \bitvar{GOLDREFCB}, and \bitvar{GOLDREFCR} the values \bitvar{RECY}, + \bitvar{RECCB}, and \bitvar{RECCR}, respectively. +\item +Assign \bitvar{PREVREFY}, \bitvar{PREVREFCB}, and \bitvar{PREVREFCR} the values + \bitvar{RECY}, \bitvar{RECCB}, and \bitvar{RECCR}, respectively. +\end{enumerate} + +%\backmatter +\appendix + +\chapter{Ogg Bitstream Encapsulation} +\label{app:oggencapsulation} + +\section{Overview} + +This document specifies the embedding or encapsulation of Theora packets + in an Ogg transport stream. + +Ogg is a stream oriented wrapper for coded, linear time-based data. +It provides syncronization, multiplexing, framing, error detection and + seeking landmarks for the decoder and complements the raw packet format + used by the Theora codec. + +This document assumes familiarity with the details of the Ogg standard. +The Xiph.Org documentation provides an overview of the Ogg transport stream + format at \url{http://www.xiph.org/ogg/doc/oggstream.html} and a detailed + description at \url{http://www.xiph.org/ogg/doc/framing.html}. +The format is also defined in RFC~3533 \cite{rfc3533}. +While Theora packets can be embedded in a wide variety of media + containers and streaming mechanisms, the Xiph.Org Foundation + recommends Ogg as the native format for Theora video in file-oriented + storage and transmission contexts. + +\subsection{MIME type} + +The generic MIME type of any Ogg file is {\tt application/ogg}. +The specific MIME type for the Ogg Theora profile documented here +is {\tt video/ogg}. This is the MIME type recommended for files +conforming to this appendix. The recommended filename extension +is {\tt .ogv}. + +Outside of an encapsulation, the mime type {\tt video/theora} may + be used to refer specifically to the Theora compressed video stream. + +\section{Embedding in a logical bitstream} + +Ogg separates the concept of a {\em logical bitstream} consisting of the + framing of a particular sequence of packets and complete within itself + from the {\em physical bitstream} which may consist either of a single + logical bitstream or a number of logical bitstreams multiplexed + together. +This section specifies the embedding of Theora packets in a logical Ogg + bitstream. +The mapping of Ogg Theora logical bitstreams into a multiplexed physical Ogg + stream is described in the next section. + +\subsection{Headers} + +The initial identification header packet appears by itself in a + single Ogg page. +This page defines the start of the logical stream and MUST have + the `beginning of stream' flag set. + +The second and third header packets (comment metadata and decoder + setup data) can together span one or more Ogg pages. +If there are additional non-normative header packets, they MUST be + included in this sequence of pages as well. +The comment header packet MUST begin the second Ogg page in the logical + bitstream, and there MUST be a page break between the last header + packet and the first frame data packet. + +These two page break requirements facilitate stream identification and + simplify header acquisition for seeking and live streaming applications. + +All header pages MUST have their granule position field set to zero. + +\subsection{Frame data} + +The first frame data packet in a logical bitstream MUST begin a new Ogg + page. +All other data packets are placed one at a time into Ogg pages + until the end of the stream. +Packets can span pages and multiple packets can be placed within any + one page. +The last page in the logical bitstream SHOULD have its + 'end of stream' flag set to indicate complete transmission + of the available video. + +Frame data pages MUST be marked with a granule position corresponding to + the end of the display interval of the last frame/packet that finishes + in that page. See the next section for details. + +\subsection{Granule position} + +Data packets are marked by a granulepos derived from the count of decodable +frames after that packet is processed. The field itself is divided into two +sections, the width of the less significant section being given by the KFGSHIFT +parameter decoded from the identification header +(Section~\ref{sec:idheader}). +The more significant portion of the field gives the count of coded +frames after the coding of the last keyframe in stream, and the less +significant portion gives the count of frames since the last keyframe. +Thus a stream would begin with a split granulepos of $1|0$ (a keyframe), +followed by $1|1$, $1|2$, $1|3$, etc. Around a keyframe in the +middle of the stream the granulepos sequence might be $1234|35$, +$1234|36$, $1234|37$, $1271|0$ (for the keyframe), $1271|1$, and so +on. In this way the granulepos field increased monotonically as required +by the Ogg format, but contains information necessary to efficiently +find the previous keyframe to continue decoding after a seek. + +Prior to bitstream version 3.2.1, data packets were marked by a +granulepos derived from the index of the frame being decoded, +rather than the count. That is they marked the beginning of the +display interval of a frame rather than the end. Such streams +have the VREV field of the identification header set to `0' +instead of `1'. They can be interpreted according to the description +above by adding 1 to the more signification field of the split +granulepos when VREV is less than 1. + +\section{Multiplexed stream mapping} + +Applications supporting Ogg Theora must support Theora bitstreams + multiplexed with compressed audio data in the Vorbis I and Speex + formats, and should support Ogg-encapsulated MNG graphics for overlays. + +Multiple audio and video bitstreams may be multiplexed together. +How playback of multiple/alternate streams is handled is up to the + application. +Some conventions based on included metadata aide interoperability + in this respect. +%TODO: describe multiple vs. alternate streams, language mapping +% and reference metadata descriptions. + +\subsection{Chained streams} + +Ogg Theora decoders and playback applications MUST support both grouped + streams (multiplexed concurrent logical streams) and chained streams + (sequential concatenation of independent physical bitstreams). + +The number and codec data types of multiplexed streams and the decoder + parameters for those stream types that re-occur can all change at a + chaining boundary. +A playback application MUST be prepared to handle such changes and + SHOULD do so smoothly with the minimum possible visible disruption. +The specification of grouped streams below applies independently to each + segment of a chained bitstream. + +\subsection{Grouped streams} + +At the beginning of a multiplexed stream, the `beginning of stream' + pages for each logical bitstream will be grouped together. +Within these, the first page to occur MUST be the Theora page. +This facilitates identification of Ogg Theora files among other + Ogg-encapsulated content. +A playback application must nevertheless handle streams where this + arrangement is not correct. +%TBT: Then what's the point of requiring it in the spec? + +If there is more than one Theora logical stream, the first page should + be from the primary stream. +That is, the best choice for the stream a generic player should begin + displaying without special user direction. +If there is more than one audio stream, or of any other stream + type, the identification page of the primary stream of that type + should be placed before the others. +%TBT: That's all pretty vague. + +After the `beginning of stream' pages, the header pages of each of + the logical streams MUST be grouped together before any data pages + occur. + +After all the header pages have been placed, + the data pages are multiplexed together. +They should be placed in the stream in increasing order by the + time equivalents of their granule position fields. +This facilitates seeking while limiting the buffering requirements of the + playback demultiplexer. +%TODO: A lot of this language is encoder-oriented. +%TODO: We define a decoder-oriented specification. +%TODO: The language should be changed to match. + +\cleardoublepage +\chapter{VP3} + +\section{VP3 Compatibility} +\label{app:vp3-compat} +This section lists all of the encoder and decoder issues that may affect VP3 + compatibly. +Each is described in more detail in the text itself. +This list is provided merely for reference. + +\begin{itemize} +\item +Bitstream headers (Section~\ref{sec:headers}). +\begin{itemize} +\item +Identification header (Section~\ref{sec:idheader}). +\begin{itemize} +\item +Non-multiple of 16 picture sizes. +\item +Standardized color spaces. +\item +Support for $4:4:4$ and $4:2:2$ pixel formats. +\end{itemize} +\item +Setup header +\begin{itemize} +\item +Loop filter limit values (Section~\ref{sub:loop-filter-limits}). +\item +Quantization parameters (Section~\ref{sub:quant-params}). +\item +Huffman tables (Section~\ref{sub:huffman-tables}). +\end{itemize} +\end{itemize} +\item +Frame header format (Section~\ref{sub:frame-header}). +\item +Extended long-run bit strings (Section~\ref{sub:long-run}). +\item +INTER\_MV\_FOUR handling of uncoded blocks (Section~\ref{sub:mb-mv-decode}). +\item +Block-level \qi\ values (Section~\ref{sub:block-qis}). +\item +Zero-length EOB runs (Section~\ref{sub:eob-token}). +\item +Unrestricted motion vector padding and the loop filter + (Section~\ref{sub:loop-filt}). +\end{itemize} + +\section{Loop Filter Limit Values} +\label{app:vp3-loop-filter-limits} + +The hard-coded loop filter limit values used in VP3 are defined as follows: +\begin{align*} +\bitvar{LFLIMS} = & \begin{array}[t]{r@{}rrrrrrrr@{}l} +\{ & 30, & 25, & 20, & 20, & 15, & 15, & 14, & 14, & \\ + & 13, & 13, & 12, & 12, & 11, & 11, & 10, & 10, & \\ + & 9, & 9, & 8, & 8, & 7, & 7, & 7, & 7, & \\ + & 6, & 6, & 6, & 6, & 5, & 5, & 5, & 5, & \\ + & 4, & 4, & 4, & 4, & 3, & 3, & 3, & 3, & \\ + & 2, & 2, & 2, & 2, & 2, & 2, & 2, & 2, & \\ + & 0, & 0, & 0, & 0, & 0, & 0, & 0, & 0, & \\ + & 0, & 0, & 0, & 0, & 0, & 0, & 0, & 0\;\ & \!\} \\ +\end{array} +\end{align*} + +\section{Quantization Parameters} +\label{app:vp3-quant-params} + +The hard-coded quantization parameters used by VP3 are defined as follows: + +\begin{align*} +\bitvar{ACSCALE} = & \begin{array}[t]{r@{}rrrrrrrr@{}l} +\{ & 500, & 450, & 400, & 370, & 340, & 310, & 285, & 265, & \\ + & 245, & 225, & 210, & 195, & 185, & 180, & 170, & 160, & \\ + & 150, & 145, & 135, & 130, & 125, & 115, & 110, & 107, & \\ + & 100, & 96, & 93, & 89, & 85, & 82, & 75, & 74, & \\ + & 70, & 68, & 64, & 60, & 57, & 56, & 52, & 50, & \\ + & 49, & 45, & 44, & 43, & 40, & 38, & 37, & 35, & \\ + & 33, & 32, & 30, & 29, & 28, & 25, & 24, & 22, & \\ + & 21, & 19, & 18, & 17, & 15, & 13, & 12, & 10\;\ & \!\} \\ +\end{array} \\ +\bitvar{DCSCALE} = & \begin{array}[t]{r@{}rrrrrrrr@{}l} +\{ & 220, & 200, & 190, & 180, & 170, & 170, & 160, & 160, & \\ + & 150, & 150, & 140, & 140, & 130, & 130, & 120, & 120, & \\ + & 110, & 110, & 100, & 100, & 90, & 90, & 90, & 80, & \\ + & 80, & 80, & 70, & 70, & 70, & 60, & 60, & 60, & \\ + & 60, & 50, & 50, & 50, & 50, & 40, & 40, & 40, & \\ + & 40, & 40, & 30, & 30, & 30, & 30, & 30, & 30, & \\ + & 30, & 20, & 20, & 20, & 20, & 20, & 20, & 20, & \\ + & 20, & 10, & 10, & 10, & 10, & 10, & 10, & 10\;\ & \!\} \\ +\end{array} +\end{align*} + +VP3 defines only a single quantization range for each quantization type and + color plane, and the base matrix used is constant throughout the range. +There are three base matrices defined. +The first is used for the $Y'$ channel of INTRA mode blocks, and the second for + both the $C_b$ and $C_r$ channels of INTRA mode blocks. +The last is used for INTER mode blocks of all channels. + +\begin{align*} +\bitvar{BMS} = \{ & \begin{array}[t]{r@{}rrrrrrrr@{}l} +\{ & 16, & 11, & 10, & 16, & 24, & 40, & 51, & 61, & \\ + & 12, & 12, & 14, & 19, & 26, & 58, & 60, & 55, & \\ + & 14, & 13, & 16, & 24, & 40, & 57, & 69, & 56, & \\ + & 14, & 17, & 22, & 29, & 51, & 87, & 80, & 62, & \\ + & 18, & 22, & 37, & 58, & 68, & 109, & 103, & 77, & \\ + & 24, & 35, & 55, & 64, & 81, & 104, & 113, & 92, & \\ + & 49, & 64, & 78, & 87, & 103, & 121, & 120, & 101, & \\ + & 72, & 92, & 95, & 98, & 112, & 100, & 103, & 99\;\ & \!\}, \\ +%\end{array} \\ +%& \begin{array}[t]{r@{}rrrrrrrr@{}l} +\{ & 17, & 18, & 24, & 47, & 99, & 99, & 99, & 99, & \\ + & 18, & 21, & 26, & 66, & 99, & 99, & 99, & 99, & \\ + & 24, & 26, & 56, & 99, & 99, & 99, & 99, & 99, & \\ + & 47, & 66, & 99, & 99, & 99, & 99, & 99, & 99, & \\ + & 99, & 99, & 99, & 99, & 99, & 99, & 99, & 99, & \\ + & 99, & 99, & 99, & 99, & 99, & 99, & 99, & 99, & \\ + & 99, & 99, & 99, & 99, & 99, & 99, & 99, & 99, & \\ + & 99, & 99, & 99, & 99, & 99, & 99, & 99, & 99\;\ & \!\}, \\ +%\end{array} \\ +%& \begin{array}[t]{r@{}rrrrrrrr@{}l} +\{ & 16, & 16, & 16, & 20, & 24, & 28, & 32, & 40, & \\ + & 16, & 16, & 20, & 24, & 28, & 32, & 40, & 48, & \\ + & 16, & 20, & 24, & 28, & 32, & 40, & 48, & 64, & \\ + & 20, & 24, & 28, & 32, & 40, & 48, & 64, & 64, & \\ + & 24, & 28, & 32, & 40, & 48, & 64, & 64, & 64, & \\ + & 28, & 32, & 40, & 48, & 64, & 64, & 64, & 96, & \\ + & 32, & 40, & 48, & 64, & 64, & 64, & 96, & 128, & \\ + & 40, & 48, & 64, & 64, & 64, & 96, & 128, & 128\;\ & \!\}\;\;\} \\ +\end{array} +\end{align*} + +The remaining parameters simply assign these matrices to the proper quant + ranges. + +\begin{align*} +\bitvar{NQRS} = & \{ \{1, 1, 1\}, \{1, 1, 1\} \} \\ +\bitvar{QRSIZES} = & + \{ \{ \{63\}, \{63\}, \{63\} \}, \{ \{63\}, \{63\}, \{63\} \} \} \\ +\bitvar{QRBMIS} = & + \{ \{ \{0, 0\}, \{1, 1\}, \{1, 1\} \}, \{ \{2, 2\}, \{2, 2\}, \{2, 2\} \} \} \\ +\end{align*} + +\section{Huffman Tables} +\label{app:vp3-huffman-tables} + +The following tables contain the hard-coded Huffman codes used by VP3. +There are 80 tables in all, each with a Huffman code for all 32 token values. +The tokens are sorted by the most significant bits of their Huffman code. +This is the same order in which they will be decoded from the setup header. + +\include{vp3huff} + +\cleardoublepage +\chapter{Colophon} + +Ogg is a \href{http://www.xiph.org}{Xiph.Org Foundation} effort to protect + essential tenets of Internet multimedia from corporate hostage-taking; Open + Source is the net's greatest tool to keep everyone honest. +See \href{http://www.xiph.org/about.html}{About the Xiph.Org Foundation} for + details. + +Ogg Theora is the first Ogg video codec. +Anyone may freely use and distribute the Ogg and Theora specifications, whether + in private, public, or corporate capacity. +However, the Xiph.Org Foundation and the Ogg project reserve the right to set + the Ogg Theora specification and certify specification compliance. + +Xiph.Org's Theora software codec implementation is distributed under a BSD-like + license. +This does not restrict third parties from distributing independent + implementations of Theora software under other licenses. + +\begin{wrapfigure}{l}{0pt} +\includegraphics[width=2.5cm]{xifish} +\end{wrapfigure} + +These pages are Copyright \textcopyright{} 2004-2007 Xiph.Org Foundation. +All rights reserved. +Ogg, Theora, Vorbis, Xiph.Org Foundation and their logos are trademarks + (\texttrademark) of the \href{http://www.xiph.org}{Xiph.Org Foundation}. + +This document is set in \LaTeX. + + + +\cleardoublepage +\bibliography{spec} + +\end{document} diff --git a/cs/3rd party/libtheora/doc/spec/superblock.fig b/cs/3rd party/libtheora/doc/spec/superblock.fig new file mode 100644 index 000000000..082c31f16 --- /dev/null +++ b/cs/3rd party/libtheora/doc/spec/superblock.fig @@ -0,0 +1,72 @@ +#FIG 3.2 Produced by xfig version 3.2.5-alpha4 +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +6 270 180 5905 4860 +6 387 3531 1542 4687 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 387 4687 675 4687 675 4397 387 4397 387 4687 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 675 4687 963 4687 963 4397 675 4397 675 4687 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 963 4687 1252 4687 1252 4397 963 4397 963 4687 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1252 4397 1542 4397 1542 4109 1252 4109 1252 4397 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 387 4397 675 4397 675 4109 387 4109 387 4397 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 387 4109 675 4109 675 3820 387 3820 387 4109 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 963 4109 1252 4109 1252 3820 963 3820 963 4109 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1252 4109 1542 4109 1542 3820 1252 3820 1252 4109 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1252 3820 1542 3820 1542 3531 1252 3531 1252 3820 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 675 3820 963 3820 963 3531 675 3531 675 3820 +-6 +6 387 3531 1542 4687 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1252 4687 1542 4687 1542 4397 1252 4397 1252 4687 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 963 4397 1252 4397 1252 4109 963 4109 963 4397 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 963 3820 1252 3820 1252 3531 963 3531 963 3820 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 387 3820 675 3820 675 3531 387 3531 387 3820 +-6 +6 357 3502 1570 4715 +6 675 3820 963 4397 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 675 4397 963 4397 963 4109 675 4109 675 4397 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 675 4109 963 4109 963 3820 675 3820 675 4109 +-6 +2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 387 3531 1542 3531 1542 4687 387 4687 387 3531 +-6 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 + 387 353 5876 353 5876 4687 387 4687 387 353 +2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1542 3531 2697 3531 2697 4687 1542 4687 1542 3531 +2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2697 3531 3854 3531 3854 4687 2697 4687 2697 3531 +2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 387 2375 1542 2375 1542 3531 387 3531 387 2375 +2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1542 2375 2697 2375 2697 3531 1542 3531 1542 2375 +2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 387 1220 1542 1220 1542 2375 387 2375 387 1220 +4 0 0 50 -1 0 7 0.0000 4 125 270 270 4831 (0,0)\001 +4 0 0 50 -1 0 7 0.0000 4 96 367 473 297 Frame\001 +4 0 0 50 -1 0 7 0.0000 4 125 1002 501 3474 Super Block (4x4)\001 +4 0 0 50 -1 0 7 0.0000 4 96 203 415 4657 8x8\001 +4 0 0 50 -1 0 7 0.0000 4 96 318 357 4513 Block\001 +4 0 0 50 -1 0 13 0.0000 4 20 145 4085 4081 ...\001 +4 0 0 50 -1 0 13 4.7124 4 20 145 848 815 ...\001 +-6 diff --git a/cs/3rd party/libtheora/doc/spec/vp3huff.c b/cs/3rd party/libtheora/doc/spec/vp3huff.c new file mode 100644 index 000000000..8de44d3b1 --- /dev/null +++ b/cs/3rd party/libtheora/doc/spec/vp3huff.c @@ -0,0 +1,918 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggTheora SOFTWARE 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 Theora SOURCE CODE IS COPYRIGHT (C) 2002-2007 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + function: dump the VP3.1 huffman tables in a form suitable for + inclusion in the spec. + last mod: $Id$ + + ********************************************************************/ + +#include +#include +#include + + + +typedef struct{ + unsigned long pattern; + int nbits; +}theora_huff_code; + + + +/*The default Huffman codes used for VP3.1. + These tables were generated by /experimental/derf/theora-exp/tools/huffgen.c + using the same algorithm and sampled frequency counts used by VP3.*/ +const theora_huff_code TH_VP31_HUFF_CODES[80][32]={ + { + {0x002D, 6},{0x0026, 7},{0x0166, 9},{0x004E, 8}, + {0x02CE,10},{0x059E,11},{0x027D,11},{0x0008, 5}, + {0x04F9,12},{0x000F, 4},{0x000E, 4},{0x001B, 5}, + {0x0006, 4},{0x0008, 4},{0x0005, 4},{0x001A, 5}, + {0x0015, 5},{0x0007, 4},{0x000C, 4},{0x0001, 3}, + {0x0000, 3},{0x0009, 4},{0x0017, 5},{0x0029, 6}, + {0x0028, 6},{0x00B2, 8},{0x04F8,12},{0x059F,11}, + {0x009E, 9},{0x013F,10},{0x0012, 6},{0x0058, 7} + }, + { + {0x0010, 5},{0x0047, 7},{0x01FF, 9},{0x008C, 8}, + {0x03FC,10},{0x046A,11},{0x0469,11},{0x0022, 6}, + {0x11A1,13},{0x000E, 4},{0x000D, 4},{0x0004, 4}, + {0x0005, 4},{0x0009, 4},{0x0006, 4},{0x001E, 5}, + {0x0016, 5},{0x0007, 4},{0x000C, 4},{0x0001, 3}, + {0x0000, 3},{0x000A, 4},{0x0017, 5},{0x007D, 7}, + {0x007E, 7},{0x011B, 9},{0x08D1,12},{0x03FD,10}, + {0x046B,11},{0x11A0,13},{0x007C, 7},{0x00FE, 8} + }, + { + {0x0016, 5},{0x0020, 6},{0x0086, 8},{0x0087, 8}, + {0x0367,10},{0x06CC,11},{0x06CB,11},{0x006E, 7}, + {0x366D,14},{0x000F, 4},{0x000E, 4},{0x0004, 4}, + {0x0005, 4},{0x000A, 4},{0x0006, 4},{0x001A, 5}, + {0x0011, 5},{0x0007, 4},{0x000C, 4},{0x0001, 3}, + {0x0000, 3},{0x0009, 4},{0x0017, 5},{0x006F, 7}, + {0x006D, 7},{0x0364,10},{0x0D9A,12},{0x06CA,11}, + {0x1B37,13},{0x366C,14},{0x0042, 7},{0x00D8, 8} + }, + { + {0x0000, 4},{0x002D, 6},{0x00F7, 8},{0x0058, 7}, + {0x0167, 9},{0x02CB,10},{0x02CA,10},{0x000E, 6}, + {0x1661,13},{0x0003, 3},{0x0002, 3},{0x0008, 4}, + {0x0009, 4},{0x000D, 4},{0x0002, 4},{0x001F, 5}, + {0x0017, 5},{0x0001, 4},{0x000C, 4},{0x000E, 4}, + {0x000A, 4},{0x0006, 5},{0x0078, 7},{0x000F, 6}, + {0x007A, 7},{0x0164, 9},{0x0599,11},{0x02CD,10}, + {0x0B31,12},{0x1660,13},{0x0079, 7},{0x00F6, 8} + }, + { + {0x0003, 4},{0x003C, 6},{0x000F, 7},{0x007A, 7}, + {0x001D, 8},{0x0020, 9},{0x0072,10},{0x0006, 6}, + {0x0399,13},{0x0004, 3},{0x0005, 3},{0x0005, 4}, + {0x0006, 4},{0x000E, 4},{0x0004, 4},{0x0000, 4}, + {0x0019, 5},{0x0002, 4},{0x000D, 4},{0x0007, 4}, + {0x001F, 5},{0x0030, 6},{0x0011, 8},{0x0031, 6}, + {0x0005, 6},{0x0021, 9},{0x00E7,11},{0x0038, 9}, + {0x01CD,12},{0x0398,13},{0x007B, 7},{0x0009, 7} + }, + { + {0x0009, 4},{0x0002, 5},{0x0074, 7},{0x0007, 6}, + {0x00EC, 8},{0x00D1, 9},{0x01A6,10},{0x0006, 6}, + {0x0D21,13},{0x0005, 3},{0x0006, 3},{0x0008, 4}, + {0x0007, 4},{0x000F, 4},{0x0004, 4},{0x0000, 4}, + {0x001C, 5},{0x0002, 4},{0x0005, 4},{0x0003, 4}, + {0x000C, 5},{0x0035, 7},{0x01A7,10},{0x001B, 6}, + {0x0077, 7},{0x01A5,10},{0x0349,11},{0x00D0, 9}, + {0x0691,12},{0x0D20,13},{0x0075, 7},{0x00ED, 8} + }, + { + {0x000A, 4},{0x000C, 5},{0x0012, 6},{0x001B, 6}, + {0x00B7, 8},{0x016C, 9},{0x0099, 9},{0x005A, 7}, + {0x16D8,13},{0x0007, 3},{0x0006, 3},{0x0009, 4}, + {0x0008, 4},{0x0000, 3},{0x0005, 4},{0x0017, 5}, + {0x000E, 5},{0x0002, 4},{0x0003, 4},{0x000F, 5}, + {0x001A, 6},{0x004D, 8},{0x2DB3,14},{0x002C, 6}, + {0x0011, 6},{0x02DA,10},{0x05B7,11},{0x0098, 9}, + {0x0B6D,12},{0x2DB2,14},{0x0010, 6},{0x0027, 7} + }, + { + {0x000D, 4},{0x000F, 5},{0x001D, 6},{0x0008, 5}, + {0x0051, 7},{0x0056, 8},{0x00AF, 9},{0x002A, 7}, + {0x148A,13},{0x0007, 3},{0x0000, 2},{0x0008, 4}, + {0x0009, 4},{0x000C, 4},{0x0006, 4},{0x0017, 5}, + {0x000B, 5},{0x0016, 5},{0x0015, 5},{0x0009, 5}, + {0x0050, 7},{0x00AE, 9},{0x2917,14},{0x001C, 6}, + {0x0014, 6},{0x0290,10},{0x0523,11},{0x0149, 9}, + {0x0A44,12},{0x2916,14},{0x0053, 7},{0x00A5, 8} + }, + { + {0x0001, 4},{0x001D, 6},{0x00F5, 8},{0x00F4, 8}, + {0x024D,10},{0x0499,11},{0x0498,11},{0x0001, 5}, + {0x0021, 6},{0x0006, 3},{0x0005, 3},{0x0006, 4}, + {0x0005, 4},{0x0002, 4},{0x0007, 5},{0x0025, 6}, + {0x007B, 7},{0x001C, 6},{0x0020, 6},{0x000D, 6}, + {0x0048, 7},{0x0092, 8},{0x0127, 9},{0x000E, 4}, + {0x0004, 4},{0x0011, 5},{0x000C, 6},{0x003C, 6}, + {0x000F, 5},{0x0000, 5},{0x001F, 5},{0x0013, 5} + }, + { + {0x0005, 4},{0x003C, 6},{0x0040, 7},{0x000D, 7}, + {0x0031, 9},{0x0061,10},{0x0060,10},{0x0002, 5}, + {0x00F5, 8},{0x0006, 3},{0x0005, 3},{0x0007, 4}, + {0x0006, 4},{0x0002, 4},{0x0009, 5},{0x0025, 6}, + {0x0007, 6},{0x0021, 6},{0x0024, 6},{0x0010, 6}, + {0x0041, 7},{0x00F4, 8},{0x0019, 8},{0x000E, 4}, + {0x0003, 4},{0x0011, 5},{0x0011, 6},{0x003F, 6}, + {0x003E, 6},{0x007B, 7},{0x0000, 4},{0x0013, 5} + }, + { + {0x000A, 4},{0x0007, 5},{0x0001, 6},{0x0009, 6}, + {0x0131, 9},{0x0261,10},{0x0260,10},{0x0015, 6}, + {0x0001, 7},{0x0007, 3},{0x0006, 3},{0x0008, 4}, + {0x0007, 4},{0x0006, 4},{0x0012, 5},{0x002F, 6}, + {0x0014, 6},{0x0027, 6},{0x002D, 6},{0x0016, 6}, + {0x004D, 7},{0x0099, 8},{0x0000, 7},{0x0004, 4}, + {0x0001, 4},{0x0005, 5},{0x0017, 6},{0x002E, 6}, + {0x002C, 6},{0x0008, 6},{0x0006, 5},{0x0001, 5} + }, + { + {0x0000, 3},{0x000E, 5},{0x0017, 6},{0x002A, 6}, + {0x0010, 7},{0x00F9,10},{0x00F8,10},{0x001E, 7}, + {0x003F, 8},{0x0007, 3},{0x0006, 3},{0x0009, 4}, + {0x0008, 4},{0x0006, 4},{0x000F, 5},{0x0005, 5}, + {0x0016, 6},{0x0029, 6},{0x002B, 6},{0x0015, 6}, + {0x0050, 7},{0x0011, 7},{0x007D, 9},{0x0004, 4}, + {0x0017, 5},{0x0006, 5},{0x0014, 6},{0x002C, 6}, + {0x002D, 6},{0x000E, 6},{0x0009, 6},{0x0051, 7} + }, + { + {0x0002, 3},{0x0018, 5},{0x002F, 6},{0x000D, 5}, + {0x0053, 7},{0x0295,10},{0x0294,10},{0x00A4, 8}, + {0x007C, 8},{0x0000, 2},{0x0007, 3},{0x0009, 4}, + {0x0008, 4},{0x001B, 5},{0x000C, 5},{0x0028, 6}, + {0x006A, 7},{0x001E, 6},{0x001D, 6},{0x0069, 7}, + {0x00D7, 8},{0x007D, 8},{0x014B, 9},{0x0019, 5}, + {0x0016, 5},{0x002E, 6},{0x001C, 6},{0x002B, 6}, + {0x002A, 6},{0x0068, 7},{0x003F, 7},{0x00D6, 8} + }, + { + {0x0002, 3},{0x001B, 5},{0x000C, 5},{0x0018, 5}, + {0x0029, 6},{0x007F, 8},{0x02F0,10},{0x0198, 9}, + {0x0179, 9},{0x0000, 2},{0x0007, 3},{0x0009, 4}, + {0x0008, 4},{0x001A, 5},{0x000D, 5},{0x002A, 6}, + {0x0064, 7},{0x001E, 6},{0x0067, 7},{0x005F, 7}, + {0x00CD, 8},{0x007E, 8},{0x02F1,10},{0x0016, 5}, + {0x000E, 5},{0x002E, 6},{0x0065, 7},{0x002B, 6}, + {0x0028, 6},{0x003E, 7},{0x00BD, 8},{0x0199, 9} + }, + { + {0x0002, 3},{0x0007, 4},{0x0016, 5},{0x0006, 4}, + {0x0036, 6},{0x005C, 7},{0x015D, 9},{0x015C, 9}, + {0x02BF,10},{0x0000, 2},{0x0007, 3},{0x0009, 4}, + {0x0008, 4},{0x0018, 5},{0x0034, 6},{0x002A, 6}, + {0x005E, 7},{0x006A, 7},{0x0064, 7},{0x005D, 7}, + {0x00CB, 8},{0x00AD, 8},{0x02BE,10},{0x0014, 5}, + {0x0033, 6},{0x006E, 7},{0x005F, 7},{0x006F, 7}, + {0x006B, 7},{0x00CA, 8},{0x00AC, 8},{0x015E, 9} + }, + { + {0x000F, 4},{0x001D, 5},{0x0018, 5},{0x000B, 4}, + {0x0019, 5},{0x0029, 6},{0x00D6, 8},{0x0551,11}, + {0x0AA1,12},{0x0001, 2},{0x0000, 2},{0x0009, 4}, + {0x0008, 4},{0x001B, 5},{0x0038, 6},{0x0028, 6}, + {0x0057, 7},{0x006A, 7},{0x0068, 7},{0x0056, 7}, + {0x00E5, 8},{0x0155, 9},{0x0AA0,12},{0x0073, 7}, + {0x0069, 7},{0x00D7, 8},{0x00AB, 8},{0x00E4, 8}, + {0x00A9, 8},{0x0151, 9},{0x0150, 9},{0x02A9,10} + }, + { + {0x0008, 5},{0x0025, 7},{0x017A, 9},{0x02F7,10}, + {0x0BDB,12},{0x17B4,13},{0x2F6B,14},{0x001D, 5}, + {0x2F6A,14},{0x0008, 4},{0x0007, 4},{0x0001, 4}, + {0x0002, 4},{0x000A, 4},{0x0006, 4},{0x0000, 4}, + {0x001C, 5},{0x0009, 4},{0x000D, 4},{0x000F, 4}, + {0x000C, 4},{0x0003, 4},{0x000A, 5},{0x0016, 5}, + {0x0013, 6},{0x005D, 7},{0x0024, 7},{0x00BC, 8}, + {0x005C, 7},{0x05EC,11},{0x000B, 5},{0x005F, 7} + }, + { + {0x000F, 5},{0x0010, 6},{0x004B, 8},{0x00C6, 8}, + {0x031D,10},{0x0C71,12},{0x0C70,12},{0x0001, 4}, + {0x0C73,12},{0x0008, 4},{0x0009, 4},{0x0002, 4}, + {0x0003, 4},{0x000B, 4},{0x0006, 4},{0x0000, 4}, + {0x001C, 5},{0x0005, 4},{0x000D, 4},{0x000F, 4}, + {0x000A, 4},{0x0019, 5},{0x0013, 6},{0x001D, 5}, + {0x0030, 6},{0x0062, 7},{0x0024, 7},{0x004A, 8}, + {0x018F, 9},{0x0C72,12},{0x000E, 5},{0x0011, 6} + }, + { + {0x001B, 5},{0x0003, 6},{0x008D, 8},{0x0040, 7}, + {0x0239,10},{0x0471,11},{0x08E0,12},{0x0003, 4}, + {0x11C3,13},{0x000A, 4},{0x0009, 4},{0x0004, 4}, + {0x0005, 4},{0x000E, 4},{0x0007, 4},{0x0001, 4}, + {0x001E, 5},{0x0006, 4},{0x000C, 4},{0x000B, 4}, + {0x0002, 4},{0x0000, 5},{0x0041, 7},{0x001F, 5}, + {0x0022, 6},{0x0002, 6},{0x008F, 8},{0x008C, 8}, + {0x011D, 9},{0x11C2,13},{0x001A, 5},{0x0021, 6} + }, + { + {0x001F, 5},{0x0003, 6},{0x0003, 7},{0x0043, 7}, + {0x000B, 9},{0x0015,10},{0x0051,12},{0x0003, 4}, + {0x0050,12},{0x000D, 4},{0x000C, 4},{0x0004, 4}, + {0x0006, 4},{0x000E, 4},{0x000A, 4},{0x0001, 4}, + {0x001E, 5},{0x0005, 4},{0x0009, 4},{0x0007, 4}, + {0x0011, 5},{0x0002, 6},{0x0004, 8},{0x0002, 4}, + {0x002D, 6},{0x0020, 6},{0x0042, 7},{0x0001, 7}, + {0x0000, 7},{0x0029,11},{0x0017, 5},{0x002C, 6} + }, + { + {0x0003, 4},{0x001F, 6},{0x003A, 7},{0x005D, 7}, + {0x0173, 9},{0x02E4,10},{0x172D,13},{0x0004, 4}, + {0x172C,13},{0x000F, 4},{0x000E, 4},{0x0009, 4}, + {0x0008, 4},{0x000C, 4},{0x000A, 4},{0x0001, 4}, + {0x0016, 5},{0x0002, 4},{0x0005, 4},{0x001A, 5}, + {0x002F, 6},{0x0038, 7},{0x05CA,11},{0x0006, 4}, + {0x0037, 6},{0x001E, 6},{0x003B, 7},{0x0039, 7}, + {0x00B8, 8},{0x0B97,12},{0x0000, 4},{0x0036, 6} + }, + { + {0x0006, 4},{0x0037, 6},{0x005D, 7},{0x000C, 6}, + {0x00B9, 8},{0x02E3,10},{0x05C4,11},{0x0004, 4}, + {0x1715,13},{0x0000, 3},{0x000F, 4},{0x0008, 4}, + {0x0007, 4},{0x000C, 4},{0x0009, 4},{0x001D, 5}, + {0x0016, 5},{0x001C, 5},{0x001A, 5},{0x000B, 5}, + {0x005E, 7},{0x0170, 9},{0x1714,13},{0x000A, 4}, + {0x000A, 5},{0x0036, 6},{0x005F, 7},{0x001B, 7}, + {0x001A, 7},{0x0B8B,12},{0x0002, 4},{0x0007, 5} + }, + { + {0x000C, 4},{0x000B, 5},{0x0079, 7},{0x0022, 6}, + {0x00F0, 8},{0x0119, 9},{0x0230,10},{0x001D, 5}, + {0x08C4,12},{0x0001, 3},{0x0000, 3},{0x000A, 4}, + {0x0009, 4},{0x000B, 4},{0x0007, 4},{0x001C, 5}, + {0x003D, 6},{0x000D, 5},{0x0008, 5},{0x0015, 6}, + {0x008D, 8},{0x118B,13},{0x118A,13},{0x000D, 4}, + {0x0010, 5},{0x0009, 5},{0x0014, 6},{0x0047, 7}, + {0x00F1, 8},{0x0463,11},{0x001F, 5},{0x000C, 5} + }, + { + {0x0000, 3},{0x001A, 5},{0x0033, 6},{0x000C, 5}, + {0x0046, 7},{0x01E3, 9},{0x03C5,10},{0x0017, 5}, + {0x1E21,13},{0x0002, 3},{0x0001, 3},{0x0009, 4}, + {0x000A, 4},{0x0007, 4},{0x001B, 5},{0x003D, 6}, + {0x001B, 6},{0x0022, 6},{0x0079, 7},{0x00F0, 8}, + {0x1E20,13},{0x1E23,13},{0x1E22,13},{0x000E, 4}, + {0x0016, 5},{0x0018, 5},{0x0032, 6},{0x001A, 6}, + {0x0047, 7},{0x0789,11},{0x001F, 5},{0x0010, 5} + }, + { + {0x001D, 5},{0x0061, 7},{0x004E, 8},{0x009E, 9}, + {0x027C,11},{0x09F5,13},{0x09F4,13},{0x0003, 4}, + {0x0060, 7},{0x0000, 3},{0x000F, 4},{0x000B, 4}, + {0x000A, 4},{0x0009, 4},{0x0005, 4},{0x000D, 5}, + {0x0031, 6},{0x0008, 5},{0x0038, 6},{0x0012, 6}, + {0x0026, 7},{0x013F,10},{0x04FB,12},{0x000D, 4}, + {0x0002, 4},{0x000C, 5},{0x0039, 6},{0x001C, 6}, + {0x000F, 5},{0x001D, 6},{0x0008, 4},{0x0019, 5} + }, + { + {0x0007, 4},{0x0019, 6},{0x00AB, 8},{0x00AA, 8}, + {0x0119,10},{0x0461,12},{0x0460,12},{0x001B, 5}, + {0x0047, 8},{0x0001, 3},{0x0000, 3},{0x000C, 4}, + {0x000B, 4},{0x0009, 4},{0x0005, 4},{0x000D, 5}, + {0x0035, 6},{0x003D, 6},{0x003C, 6},{0x0018, 6}, + {0x0022, 7},{0x008D, 9},{0x0231,11},{0x000E, 4}, + {0x001F, 5},{0x0009, 5},{0x002B, 6},{0x0010, 6}, + {0x0034, 6},{0x0054, 7},{0x0008, 4},{0x0014, 5} + }, + { + {0x000C, 4},{0x0005, 5},{0x0008, 6},{0x005B, 7}, + {0x004D, 9},{0x0131,11},{0x0261,12},{0x001A, 5}, + {0x0012, 7},{0x0000, 3},{0x000F, 4},{0x000A, 4}, + {0x0009, 4},{0x0006, 4},{0x001B, 5},{0x0006, 5}, + {0x001C, 6},{0x002C, 6},{0x0015, 6},{0x005A, 7}, + {0x0027, 8},{0x0099,10},{0x0260,12},{0x000E, 4}, + {0x0004, 4},{0x000F, 5},{0x0007, 5},{0x001D, 6}, + {0x000B, 5},{0x0014, 6},{0x0008, 4},{0x0017, 5} + }, + { + {0x000F, 4},{0x0013, 5},{0x0075, 7},{0x0024, 6}, + {0x0095, 8},{0x0251,10},{0x04A0,11},{0x0010, 5}, + {0x00C8, 8},{0x0002, 3},{0x0001, 3},{0x0001, 4}, + {0x0000, 4},{0x001A, 5},{0x0011, 5},{0x002C, 6}, + {0x0065, 7},{0x0074, 7},{0x004B, 7},{0x00C9, 8}, + {0x0129, 9},{0x0943,12},{0x0942,12},{0x0003, 3}, + {0x000A, 4},{0x001C, 5},{0x0018, 5},{0x0033, 6}, + {0x0017, 5},{0x002D, 6},{0x001B, 5},{0x003B, 6} + }, + { + {0x0003, 3},{0x001A, 5},{0x002D, 6},{0x0038, 6}, + {0x0028, 7},{0x0395,10},{0x0E51,12},{0x0037, 6}, + {0x00E4, 8},{0x0001, 3},{0x0000, 3},{0x001F, 5}, + {0x001E, 5},{0x0017, 5},{0x003A, 6},{0x0073, 7}, + {0x002A, 7},{0x002B, 7},{0x0029, 7},{0x01CB, 9}, + {0x0729,11},{0x1CA1,13},{0x1CA0,13},{0x0004, 3}, + {0x000A, 4},{0x0004, 4},{0x0018, 5},{0x0036, 6}, + {0x000B, 5},{0x002C, 6},{0x0019, 5},{0x003B, 6} + }, + { + {0x0004, 3},{0x0004, 4},{0x003F, 6},{0x0017, 5}, + {0x0075, 7},{0x01F5, 9},{0x07D1,11},{0x0017, 6}, + {0x01F6, 9},{0x0001, 3},{0x0000, 3},{0x001B, 5}, + {0x001A, 5},{0x000A, 5},{0x0032, 6},{0x0074, 7}, + {0x00F8, 8},{0x00F9, 8},{0x01F7, 9},{0x03E9,10}, + {0x0FA0,12},{0x1F43,13},{0x1F42,13},{0x0003, 3}, + {0x000A, 4},{0x001E, 5},{0x001C, 5},{0x003B, 6}, + {0x0018, 5},{0x0016, 6},{0x0016, 5},{0x0033, 6} + }, + { + {0x0004, 3},{0x0007, 4},{0x0018, 5},{0x001E, 5}, + {0x0036, 6},{0x0031, 7},{0x0177, 9},{0x0077, 7}, + {0x0176, 9},{0x0001, 3},{0x0000, 3},{0x001A, 5}, + {0x0019, 5},{0x003A, 6},{0x0019, 6},{0x005C, 7}, + {0x00BA, 8},{0x0061, 8},{0x00C1, 9},{0x0180,10}, + {0x0302,11},{0x0607,12},{0x0606,12},{0x0002, 3}, + {0x000A, 4},{0x001F, 5},{0x001C, 5},{0x0037, 6}, + {0x0016, 5},{0x0076, 7},{0x000D, 5},{0x002F, 6} + }, + { + {0x0000, 3},{0x000A, 4},{0x001A, 5},{0x000C, 4}, + {0x001D, 5},{0x0039, 6},{0x0078, 7},{0x005E, 7}, + {0x0393,11},{0x0002, 3},{0x0001, 3},{0x0016, 5}, + {0x000F, 5},{0x002E, 6},{0x005F, 7},{0x0073, 8}, + {0x00E5, 9},{0x01C8,10},{0x0E4A,13},{0x1C97,14}, + {0x1C96,14},{0x0E49,13},{0x0E48,13},{0x0004, 3}, + {0x0006, 4},{0x001F, 5},{0x001B, 5},{0x001D, 6}, + {0x0038, 6},{0x0038, 7},{0x003D, 6},{0x0079, 7} + }, + { + {0x000B, 5},{0x002B, 7},{0x0054, 8},{0x01B7, 9}, + {0x06D9,11},{0x0DB1,12},{0x0DB0,12},{0x0002, 4}, + {0x00AB, 9},{0x0009, 4},{0x000A, 4},{0x0007, 4}, + {0x0008, 4},{0x000F, 4},{0x000C, 4},{0x0003, 4}, + {0x001D, 5},{0x0004, 4},{0x000B, 4},{0x0006, 4}, + {0x001A, 5},{0x0003, 6},{0x00AA, 9},{0x0001, 4}, + {0x0000, 5},{0x0014, 6},{0x006C, 7},{0x00DA, 8}, + {0x0002, 6},{0x036D,10},{0x001C, 5},{0x0037, 6} + }, + { + {0x001D, 5},{0x0004, 6},{0x00B6, 8},{0x006A, 8}, + {0x05B9,11},{0x16E1,13},{0x16E0,13},{0x0007, 4}, + {0x016F, 9},{0x000C, 4},{0x000D, 4},{0x0009, 4}, + {0x0008, 4},{0x000F, 4},{0x000A, 4},{0x0003, 4}, + {0x0017, 5},{0x0002, 4},{0x0004, 4},{0x001C, 5}, + {0x002C, 6},{0x006B, 8},{0x0B71,12},{0x0005, 4}, + {0x0003, 5},{0x001B, 6},{0x005A, 7},{0x0034, 7}, + {0x0005, 6},{0x02DD,10},{0x0000, 4},{0x000C, 5} + }, + { + {0x0003, 4},{0x007F, 7},{0x00A1, 8},{0x00A0, 8}, + {0x020C,10},{0x0834,12},{0x106B,13},{0x0007, 4}, + {0x0082, 8},{0x000E, 4},{0x000D, 4},{0x000B, 4}, + {0x000C, 4},{0x0000, 3},{0x0009, 4},{0x0002, 4}, + {0x0011, 5},{0x001E, 5},{0x0015, 5},{0x003E, 6}, + {0x0040, 7},{0x041B,11},{0x106A,13},{0x0006, 4}, + {0x000A, 5},{0x0029, 6},{0x007E, 7},{0x0051, 7}, + {0x0021, 6},{0x0107, 9},{0x0004, 4},{0x000B, 5} + }, + { + {0x0007, 4},{0x001B, 6},{0x00F6, 8},{0x00E9, 8}, + {0x03A1,10},{0x0740,11},{0x0E82,12},{0x001F, 5}, + {0x01EF, 9},{0x0001, 3},{0x0002, 3},{0x000B, 4}, + {0x000C, 4},{0x000D, 4},{0x0008, 4},{0x001C, 5}, + {0x0003, 5},{0x0012, 5},{0x0002, 5},{0x0075, 7}, + {0x01D1, 9},{0x1D07,13},{0x1D06,13},{0x000A, 4}, + {0x0013, 5},{0x003B, 6},{0x001A, 6},{0x007A, 7}, + {0x003C, 6},{0x01EE, 9},{0x0000, 4},{0x000C, 5} + }, + { + {0x000D, 4},{0x003D, 6},{0x0042, 7},{0x0037, 7}, + {0x00D9, 9},{0x0362,11},{0x06C6,12},{0x001F, 5}, + {0x0086, 8},{0x0001, 3},{0x0002, 3},{0x000C, 4}, + {0x000B, 4},{0x000A, 4},{0x0001, 4},{0x000F, 5}, + {0x0025, 6},{0x003C, 6},{0x001A, 6},{0x0087, 8}, + {0x01B0,10},{0x0D8F,13},{0x0D8E,13},{0x000E, 4}, + {0x0013, 5},{0x000C, 5},{0x0024, 6},{0x0020, 6}, + {0x0011, 5},{0x006D, 8},{0x0000, 4},{0x000E, 5} + }, + { + {0x0000, 3},{0x0012, 5},{0x0076, 7},{0x0077, 7}, + {0x014D, 9},{0x0533,11},{0x14C9,13},{0x0013, 5}, + {0x00A5, 8},{0x0002, 3},{0x0003, 3},{0x000B, 4}, + {0x000C, 4},{0x0008, 4},{0x001A, 5},{0x002B, 6}, + {0x0075, 7},{0x0074, 7},{0x00A7, 8},{0x0298,10}, + {0x14C8,13},{0x14CB,13},{0x14CA,13},{0x000F, 4}, + {0x001C, 5},{0x0007, 5},{0x002A, 6},{0x0028, 6}, + {0x001B, 5},{0x00A4, 8},{0x0002, 4},{0x0006, 5} + }, + { + {0x0002, 3},{0x001A, 5},{0x002B, 6},{0x003A, 6}, + {0x00ED, 8},{0x0283,10},{0x0A0A,12},{0x0004, 5}, + {0x00A1, 8},{0x0004, 3},{0x0003, 3},{0x000B, 4}, + {0x000C, 4},{0x001F, 5},{0x0006, 5},{0x0077, 7}, + {0x00A3, 8},{0x00A2, 8},{0x0140, 9},{0x1417,13}, + {0x1416,13},{0x0A09,12},{0x0A08,12},{0x0000, 3}, + {0x001E, 5},{0x0007, 5},{0x002A, 6},{0x0029, 6}, + {0x001C, 5},{0x00EC, 8},{0x001B, 5},{0x0005, 5} + }, + { + {0x0002, 3},{0x0002, 4},{0x0018, 5},{0x001D, 5}, + {0x0035, 6},{0x00E4, 8},{0x01CF,11},{0x001D, 7}, + {0x0072, 9},{0x0004, 3},{0x0005, 3},{0x0006, 4}, + {0x0007, 4},{0x0006, 5},{0x0073, 7},{0x0038, 8}, + {0x01CE,11},{0x039B,12},{0x0398,12},{0x0733,13}, + {0x0732,13},{0x0735,13},{0x0734,13},{0x0000, 3}, + {0x001F, 5},{0x001B, 5},{0x0034, 6},{0x000F, 6}, + {0x001E, 5},{0x00E5, 8},{0x0019, 5},{0x0038, 6} + }, + { + {0x0016, 5},{0x0050, 7},{0x0172, 9},{0x02E7,10}, + {0x1732,13},{0x2E67,14},{0x2E66,14},{0x0006, 4}, + {0x0051, 7},{0x0001, 3},{0x0000, 3},{0x000D, 4}, + {0x000C, 4},{0x0009, 4},{0x001C, 5},{0x0009, 5}, + {0x001C, 6},{0x001D, 6},{0x005D, 7},{0x00B8, 8}, + {0x05CD,11},{0x1731,13},{0x1730,13},{0x000F, 4}, + {0x0005, 4},{0x000F, 5},{0x0008, 5},{0x0029, 6}, + {0x001D, 5},{0x002F, 6},{0x0008, 4},{0x0015, 5} + }, + { + {0x0009, 4},{0x0021, 6},{0x0040, 7},{0x00AD, 8}, + {0x02B0,10},{0x1589,13},{0x1588,13},{0x001C, 5}, + {0x005F, 7},{0x0000, 3},{0x000F, 4},{0x000D, 4}, + {0x000C, 4},{0x0006, 4},{0x0011, 5},{0x002A, 6}, + {0x0057, 7},{0x005E, 7},{0x0041, 7},{0x0159, 9}, + {0x0563,11},{0x158B,13},{0x158A,13},{0x0001, 3}, + {0x0005, 4},{0x0014, 5},{0x003B, 6},{0x002E, 6}, + {0x0004, 4},{0x003A, 6},{0x0007, 4},{0x0016, 5} + }, + { + {0x000E, 4},{0x0007, 5},{0x0046, 7},{0x0045, 7}, + {0x0064, 9},{0x032A,12},{0x0657,13},{0x0018, 5}, + {0x000D, 6},{0x0000, 3},{0x000F, 4},{0x000A, 4}, + {0x000B, 4},{0x001A, 5},{0x0036, 6},{0x0047, 7}, + {0x0044, 7},{0x0018, 7},{0x0033, 8},{0x00CB,10}, + {0x0656,13},{0x0329,12},{0x0328,12},{0x0002, 3}, + {0x0006, 4},{0x0019, 5},{0x000E, 5},{0x0037, 6}, + {0x0009, 4},{0x000F, 5},{0x0002, 4},{0x0010, 5} + }, + { + {0x0003, 3},{0x0018, 5},{0x0023, 6},{0x0077, 7}, + {0x0194, 9},{0x1956,13},{0x32AF,14},{0x003A, 6}, + {0x0076, 7},{0x0002, 3},{0x0001, 3},{0x001F, 5}, + {0x001E, 5},{0x0014, 5},{0x0022, 6},{0x0064, 7}, + {0x0197, 9},{0x0196, 9},{0x032B,10},{0x0654,11}, + {0x32AE,14},{0x1955,13},{0x1954,13},{0x0000, 3}, + {0x0009, 4},{0x001C, 5},{0x0015, 5},{0x0010, 5}, + {0x000D, 4},{0x0017, 5},{0x0016, 5},{0x0033, 6} + }, + { + {0x0005, 3},{0x0006, 4},{0x003E, 6},{0x0010, 5}, + {0x0048, 7},{0x093F,12},{0x24FA,14},{0x0032, 6}, + {0x0067, 7},{0x0002, 3},{0x0001, 3},{0x001B, 5}, + {0x001E, 5},{0x0034, 6},{0x0066, 7},{0x0092, 8}, + {0x0126, 9},{0x024E,10},{0x049E,11},{0x49F7,15}, + {0x49F6,15},{0x24F9,14},{0x24F8,14},{0x0000, 3}, + {0x0007, 4},{0x0018, 5},{0x0011, 5},{0x003F, 6}, + {0x000E, 4},{0x0013, 5},{0x0035, 6},{0x0025, 6} + }, + { + {0x0005, 3},{0x0008, 4},{0x0012, 5},{0x001C, 5}, + {0x001C, 6},{0x00EA, 9},{0x1D75,14},{0x001E, 6}, + {0x0066, 7},{0x0001, 3},{0x0002, 3},{0x001B, 5}, + {0x001A, 5},{0x001F, 6},{0x003B, 7},{0x0074, 8}, + {0x01D6,10},{0x03AF,11},{0x1D74,14},{0x1D77,14}, + {0x1D76,14},{0x0EB9,13},{0x0EB8,13},{0x000F, 4}, + {0x0006, 4},{0x0013, 5},{0x003B, 6},{0x003A, 6}, + {0x0000, 3},{0x0018, 5},{0x0032, 6},{0x0067, 7} + }, + { + {0x0004, 3},{0x000A, 4},{0x001B, 5},{0x000C, 4}, + {0x000D, 5},{0x00E6, 8},{0x0684,11},{0x0072, 7}, + {0x00E7, 8},{0x0002, 3},{0x0001, 3},{0x0017, 5}, + {0x0016, 5},{0x0018, 6},{0x00D1, 8},{0x01A0, 9}, + {0x0686,11},{0x0D0F,12},{0x0D0A,12},{0x1A17,13}, + {0x1A16,13},{0x1A1D,13},{0x1A1C,13},{0x000F, 4}, + {0x001D, 5},{0x000E, 5},{0x0035, 6},{0x0038, 6}, + {0x0000, 3},{0x000F, 5},{0x0019, 6},{0x0069, 7} + }, + { + {0x0003, 3},{0x000C, 4},{0x001B, 5},{0x0000, 3}, + {0x0003, 4},{0x002E, 6},{0x0051, 9},{0x00BC, 8}, + {0x0053, 9},{0x0004, 3},{0x0002, 3},{0x0016, 5}, + {0x0015, 5},{0x0015, 7},{0x0050, 9},{0x00A4,10}, + {0x0294,12},{0x052B,13},{0x052A,13},{0x052D,13}, + {0x052C,13},{0x052F,13},{0x052E,13},{0x000E, 4}, + {0x001A, 5},{0x0004, 5},{0x0028, 6},{0x0029, 6}, + {0x000F, 4},{0x000B, 6},{0x005F, 7},{0x00BD, 8} + }, + { + {0x0003, 4},{0x0009, 6},{0x00D0, 8},{0x01A3, 9}, + {0x0344,10},{0x0D14,12},{0x1A2B,13},{0x0004, 4}, + {0x0015, 7},{0x0000, 3},{0x000F, 4},{0x000B, 4}, + {0x000C, 4},{0x000E, 4},{0x0009, 4},{0x001B, 5}, + {0x000A, 5},{0x0014, 5},{0x000D, 5},{0x002A, 6}, + {0x0014, 7},{0x068B,11},{0x1A2A,13},{0x0008, 4}, + {0x000B, 5},{0x002B, 6},{0x000B, 6},{0x0069, 7}, + {0x0035, 6},{0x0008, 6},{0x0007, 4},{0x000C, 5} + }, + { + {0x000A, 4},{0x003C, 6},{0x0032, 7},{0x0030, 7}, + {0x00C5, 9},{0x0621,12},{0x0620,12},{0x001F, 5}, + {0x0033, 7},{0x0001, 3},{0x0000, 3},{0x000E, 4}, + {0x000D, 4},{0x000C, 4},{0x0004, 4},{0x000D, 5}, + {0x0026, 6},{0x0027, 6},{0x0014, 6},{0x0063, 8}, + {0x0189,10},{0x0623,12},{0x0622,12},{0x000B, 4}, + {0x0012, 5},{0x003D, 6},{0x0022, 6},{0x0015, 6}, + {0x000B, 5},{0x0023, 6},{0x0007, 4},{0x0010, 5} + }, + { + {0x000F, 4},{0x000C, 5},{0x0043, 7},{0x0010, 6}, + {0x0044, 8},{0x0114,10},{0x0455,12},{0x0018, 5}, + {0x0023, 7},{0x0001, 3},{0x0000, 3},{0x000E, 4}, + {0x000D, 4},{0x0009, 4},{0x0019, 5},{0x0009, 5}, + {0x0017, 6},{0x0016, 6},{0x0042, 7},{0x008B, 9}, + {0x0454,12},{0x0457,12},{0x0456,12},{0x000B, 4}, + {0x0015, 5},{0x000A, 5},{0x0029, 6},{0x0020, 6}, + {0x000D, 5},{0x0028, 6},{0x0007, 4},{0x0011, 5} + }, + { + {0x0001, 3},{0x001A, 5},{0x0029, 6},{0x002A, 6}, + {0x00A0, 8},{0x0285,10},{0x1425,13},{0x0002, 5}, + {0x0000, 7},{0x0002, 3},{0x0003, 3},{0x000C, 4}, + {0x000B, 4},{0x0008, 4},{0x0012, 5},{0x0001, 6}, + {0x0051, 7},{0x0001, 7},{0x0143, 9},{0x0508,11}, + {0x1424,13},{0x1427,13},{0x1426,13},{0x000F, 4}, + {0x001C, 5},{0x0003, 5},{0x0037, 6},{0x002B, 6}, + {0x0013, 5},{0x0036, 6},{0x001D, 5},{0x0001, 5} + }, + { + {0x0004, 3},{0x001F, 5},{0x003D, 6},{0x0006, 5}, + {0x0016, 7},{0x0053, 9},{0x014A,11},{0x0034, 6}, + {0x002A, 8},{0x0002, 3},{0x0003, 3},{0x000B, 4}, + {0x000C, 4},{0x001C, 5},{0x0037, 6},{0x0017, 7}, + {0x002B, 8},{0x0028, 8},{0x00A4,10},{0x052D,13}, + {0x052C,13},{0x052F,13},{0x052E,13},{0x0000, 3}, + {0x001D, 5},{0x0007, 5},{0x0004, 5},{0x0035, 6}, + {0x0014, 5},{0x0036, 6},{0x0015, 5},{0x003C, 6} + }, + { + {0x0004, 3},{0x000A, 4},{0x0007, 5},{0x001D, 5}, + {0x0009, 6},{0x01F3, 9},{0x07C7,11},{0x0008, 6}, + {0x01F0, 9},{0x0003, 3},{0x0002, 3},{0x000D, 4}, + {0x000C, 4},{0x0017, 5},{0x007D, 7},{0x01F2, 9}, + {0x07C6,11},{0x07C5,11},{0x1F12,13},{0x3E27,14}, + {0x3E26,14},{0x1F11,13},{0x1F10,13},{0x0000, 3}, + {0x001E, 5},{0x0006, 5},{0x0039, 6},{0x0038, 6}, + {0x003F, 6},{0x002C, 6},{0x0005, 5},{0x002D, 6} + }, + { + {0x0002, 3},{0x0007, 4},{0x0018, 5},{0x0003, 4}, + {0x0005, 5},{0x0035, 7},{0x004F, 9},{0x0012, 7}, + {0x04E5,13},{0x0005, 3},{0x0004, 3},{0x000D, 4}, + {0x000E, 4},{0x0033, 6},{0x0026, 8},{0x009D,10}, + {0x04E4,13},{0x04E7,13},{0x04E6,13},{0x04E1,13}, + {0x04E0,13},{0x04E3,13},{0x04E2,13},{0x0000, 3}, + {0x001F, 5},{0x000C, 5},{0x003D, 6},{0x003C, 6}, + {0x0032, 6},{0x0034, 7},{0x001B, 6},{0x0008, 6} + }, + { + {0x0000, 3},{0x0004, 4},{0x001C, 5},{0x000F, 4}, + {0x0002, 4},{0x0007, 5},{0x0075, 7},{0x00E8, 8}, + {0x1D2A,13},{0x0005, 3},{0x0004, 3},{0x000D, 4}, + {0x000C, 4},{0x0077, 7},{0x0E96,12},{0x3A57,14}, + {0x3A56,14},{0x3A5D,14},{0x3A5C,14},{0x3A5F,14}, + {0x3A5E,14},{0x1D29,13},{0x1D28,13},{0x0003, 3}, + {0x0006, 5},{0x000A, 5},{0x002C, 7},{0x0017, 6}, + {0x0076, 7},{0x01D3, 9},{0x03A4,10},{0x002D, 7} + }, + { + {0x000A, 4},{0x0024, 6},{0x00BF, 8},{0x0085, 8}, + {0x0211,10},{0x0842,12},{0x1087,13},{0x0018, 5}, + {0x0020, 6},{0x0001, 3},{0x0002, 3},{0x000E, 4}, + {0x000D, 4},{0x0007, 4},{0x0013, 5},{0x0025, 6}, + {0x005E, 7},{0x0043, 7},{0x00BE, 8},{0x0109, 9}, + {0x1086,13},{0x0841,12},{0x0840,12},{0x000F, 4}, + {0x0001, 4},{0x0011, 5},{0x0000, 5},{0x002E, 6}, + {0x0019, 5},{0x0001, 5},{0x0006, 4},{0x0016, 5} + }, + { + {0x0002, 3},{0x000F, 5},{0x006F, 7},{0x0061, 7}, + {0x0374,10},{0x1BA8,13},{0x3753,14},{0x0012, 5}, + {0x0036, 6},{0x0000, 3},{0x0001, 3},{0x000A, 4}, + {0x000B, 4},{0x001A, 5},{0x0031, 6},{0x0060, 7}, + {0x00DC, 8},{0x01BB, 9},{0x06EB,11},{0x1BAB,13}, + {0x3752,14},{0x3755,14},{0x3754,14},{0x000E, 4}, + {0x0006, 4},{0x0013, 5},{0x000E, 5},{0x003E, 6}, + {0x0008, 4},{0x001E, 5},{0x0019, 5},{0x003F, 6} + }, + { + {0x0003, 3},{0x001C, 5},{0x0025, 6},{0x0024, 6}, + {0x01DA, 9},{0x1DBD,13},{0x3B7C,14},{0x003C, 6}, + {0x003D, 6},{0x0000, 3},{0x0001, 3},{0x000B, 4}, + {0x000A, 4},{0x000B, 5},{0x0077, 7},{0x00EC, 8}, + {0x03B6,10},{0x076E,11},{0x1DBF,13},{0x76FB,15}, + {0x76FA,15},{0x3B79,14},{0x3B78,14},{0x000D, 4}, + {0x001F, 5},{0x0013, 5},{0x000A, 5},{0x0008, 5}, + {0x000C, 4},{0x0008, 4},{0x0009, 5},{0x003A, 6} + }, + { + {0x0005, 3},{0x0003, 4},{0x0004, 5},{0x0010, 5}, + {0x008F, 8},{0x0475,11},{0x11D1,13},{0x0079, 7}, + {0x0027, 6},{0x0002, 3},{0x0003, 3},{0x0001, 4}, + {0x0000, 4},{0x0026, 6},{0x0046, 7},{0x011C, 9}, + {0x0477,11},{0x08ED,12},{0x11D0,13},{0x11D3,13}, + {0x11D2,13},{0x11D9,13},{0x11D8,13},{0x000D, 4}, + {0x001F, 5},{0x0012, 5},{0x0005, 5},{0x003D, 6}, + {0x000C, 4},{0x000E, 4},{0x0022, 6},{0x0078, 7} + }, + { + {0x0005, 3},{0x000C, 4},{0x001B, 5},{0x0000, 4}, + {0x0006, 6},{0x03E2,10},{0x3E3D,14},{0x000F, 7}, + {0x0034, 6},{0x0003, 3},{0x0002, 3},{0x001E, 5}, + {0x001D, 5},{0x007D, 7},{0x01F0, 9},{0x07C6,11}, + {0x3E3C,14},{0x3E3F,14},{0x3E3E,14},{0x3E39,14}, + {0x3E38,14},{0x3E3B,14},{0x3E3A,14},{0x0008, 4}, + {0x001C, 5},{0x0002, 5},{0x003F, 6},{0x0035, 6}, + {0x0009, 4},{0x0001, 3},{0x000E, 7},{0x00F9, 8} + }, + { + {0x0004, 3},{0x000B, 4},{0x0001, 4},{0x000A, 4}, + {0x001E, 6},{0x00E0, 9},{0x0E1E,13},{0x0071, 8}, + {0x0039, 7},{0x0007, 3},{0x0006, 3},{0x000D, 5}, + {0x000C, 5},{0x0020, 7},{0x01C2,10},{0x1C3F,14}, + {0x1C3E,14},{0x0E19,13},{0x0E18,13},{0x0E1B,13}, + {0x0E1A,13},{0x0E1D,13},{0x0E1C,13},{0x0000, 4}, + {0x0009, 5},{0x001D, 6},{0x001F, 6},{0x0011, 6}, + {0x0005, 4},{0x0001, 3},{0x0043, 8},{0x0042, 8} + }, + { + {0x0004, 3},{0x000D, 4},{0x0007, 4},{0x0002, 3}, + {0x0014, 5},{0x016C, 9},{0x16D1,13},{0x02DF,10}, + {0x016E, 9},{0x0000, 2},{0x0007, 3},{0x002C, 6}, + {0x002B, 6},{0x02DE,10},{0x16D0,13},{0x16D3,13}, + {0x16D2,13},{0x2DB5,14},{0x2DB4,14},{0x2DB7,14}, + {0x2DB6,14},{0x16D9,13},{0x16D8,13},{0x000C, 5}, + {0x002A, 6},{0x005A, 7},{0x001B, 6},{0x001A, 6}, + {0x0017, 5},{0x000C, 4},{0x05B7,11},{0x05B5,11} + }, + { + {0x0002, 2},{0x000F, 4},{0x001C, 5},{0x000C, 4}, + {0x003B, 6},{0x01AC, 9},{0x1AD8,13},{0x35B3,14}, + {0x35B2,14},{0x0001, 2},{0x0000, 2},{0x0069, 7}, + {0x0068, 7},{0x35BD,14},{0x35BC,14},{0x35BF,14}, + {0x35BE,14},{0x35B9,14},{0x35B8,14},{0x35BB,14}, + {0x35BA,14},{0x35B5,14},{0x35B4,14},{0x01A9, 9}, + {0x01A8, 9},{0x035A,10},{0x00D7, 8},{0x00D5, 8}, + {0x003A, 6},{0x001B, 5},{0x35B7,14},{0x35B6,14} + }, + { + {0x0000, 3},{0x0010, 5},{0x0072, 7},{0x0071, 7}, + {0x0154, 9},{0x0AAB,12},{0x0AA8,12},{0x0014, 5}, + {0x0070, 7},{0x0002, 3},{0x0003, 3},{0x000C, 4}, + {0x000B, 4},{0x0003, 4},{0x0011, 5},{0x0073, 7}, + {0x0054, 7},{0x00AB, 8},{0x02AB,10},{0x1553,13}, + {0x1552,13},{0x1555,13},{0x1554,13},{0x000D, 4}, + {0x001E, 5},{0x0012, 5},{0x003E, 6},{0x002B, 6}, + {0x0002, 4},{0x003F, 6},{0x001D, 5},{0x0013, 5} + }, + { + {0x0003, 3},{0x001F, 5},{0x0029, 6},{0x003D, 6}, + {0x000C, 7},{0x0069,10},{0x0345,13},{0x0002, 5}, + {0x0028, 6},{0x0002, 3},{0x0001, 3},{0x000E, 4}, + {0x000C, 4},{0x0015, 5},{0x0007, 6},{0x001B, 8}, + {0x006B,10},{0x006A,10},{0x0344,13},{0x0347,13}, + {0x0346,13},{0x01A1,12},{0x01A0,12},{0x000B, 4}, + {0x001A, 5},{0x0012, 5},{0x0000, 5},{0x003C, 6}, + {0x0008, 4},{0x001B, 5},{0x0013, 5},{0x0001, 5} + }, + { + {0x0004, 3},{0x0004, 4},{0x003F, 6},{0x0014, 5}, + {0x0056, 7},{0x015C, 9},{0x15D5,13},{0x003C, 6}, + {0x002A, 6},{0x0000, 3},{0x0001, 3},{0x000E, 4}, + {0x000D, 4},{0x000C, 5},{0x00AF, 8},{0x02BB,10}, + {0x15D4,13},{0x15D7,13},{0x15D6,13},{0x15D1,13}, + {0x15D0,13},{0x15D3,13},{0x15D2,13},{0x000B, 4}, + {0x0019, 5},{0x000D, 5},{0x003E, 6},{0x0031, 6}, + {0x0007, 4},{0x0005, 4},{0x003D, 6},{0x0030, 6} + }, + { + {0x0005, 3},{0x0008, 4},{0x001A, 5},{0x0000, 4}, + {0x0036, 6},{0x0011, 8},{0x0106,12},{0x000A, 7}, + {0x006E, 7},{0x0002, 3},{0x0003, 3},{0x0003, 4}, + {0x0002, 4},{0x006F, 7},{0x0021, 9},{0x020F,13}, + {0x020E,13},{0x0101,12},{0x0100,12},{0x0103,12}, + {0x0102,12},{0x0105,12},{0x0104,12},{0x000C, 4}, + {0x001E, 5},{0x0003, 5},{0x003E, 6},{0x003F, 6}, + {0x0009, 4},{0x000E, 4},{0x000B, 7},{0x0009, 7} + }, + { + {0x0002, 3},{0x000E, 4},{0x001E, 5},{0x000C, 4}, + {0x001F, 5},{0x006E, 7},{0x00AD,10},{0x00AF,10}, + {0x0014, 7},{0x0004, 3},{0x0003, 3},{0x001A, 5}, + {0x0017, 5},{0x002A, 8},{0x0576,13},{0x0AEF,14}, + {0x0AEE,14},{0x0571,13},{0x0570,13},{0x0573,13}, + {0x0572,13},{0x0575,13},{0x0574,13},{0x0003, 4}, + {0x0016, 5},{0x0004, 5},{0x0036, 6},{0x000B, 6}, + {0x000A, 4},{0x0000, 3},{0x006F, 7},{0x00AC,10} + }, + { + {0x0004, 3},{0x0005, 4},{0x0003, 3},{0x0001, 3}, + {0x0004, 4},{0x002F, 6},{0x0526,11},{0x1495,13}, + {0x00A6, 8},{0x0007, 3},{0x0006, 3},{0x002D, 6}, + {0x002C, 6},{0x1494,13},{0x1497,13},{0x1496,13}, + {0x1491,13},{0x1490,13},{0x1493,13},{0x1492,13}, + {0x293D,14},{0x293C,14},{0x293F,14},{0x0000, 3}, + {0x0028, 6},{0x00A5, 8},{0x0148, 9},{0x00A7, 8}, + {0x002E, 6},{0x0015, 5},{0x0A4E,12},{0x293E,14} + }, + { + {0x0004, 3},{0x0005, 4},{0x0003, 3},{0x0001, 3}, + {0x0004, 4},{0x002F, 6},{0x0526,11},{0x1495,13}, + {0x00A6, 8},{0x0007, 3},{0x0006, 3},{0x002D, 6}, + {0x002C, 6},{0x1494,13},{0x1497,13},{0x1496,13}, + {0x1491,13},{0x1490,13},{0x1493,13},{0x1492,13}, + {0x293D,14},{0x293C,14},{0x293F,14},{0x0000, 3}, + {0x0028, 6},{0x00A5, 8},{0x0148, 9},{0x00A7, 8}, + {0x002E, 6},{0x0015, 5},{0x0A4E,12},{0x293E,14} + }, + { + {0x0004, 3},{0x0005, 4},{0x0003, 3},{0x0001, 3}, + {0x0004, 4},{0x002F, 6},{0x0526,11},{0x1495,13}, + {0x00A6, 8},{0x0007, 3},{0x0006, 3},{0x002D, 6}, + {0x002C, 6},{0x1494,13},{0x1497,13},{0x1496,13}, + {0x1491,13},{0x1490,13},{0x1493,13},{0x1492,13}, + {0x293D,14},{0x293C,14},{0x293F,14},{0x0000, 3}, + {0x0028, 6},{0x00A5, 8},{0x0148, 9},{0x00A7, 8}, + {0x002E, 6},{0x0015, 5},{0x0A4E,12},{0x293E,14} + }, + { + {0x0003, 3},{0x0011, 5},{0x0020, 6},{0x0074, 7}, + {0x010D, 9},{0x0863,12},{0x0860,12},{0x000A, 5}, + {0x0075, 7},{0x0001, 3},{0x0000, 3},{0x000B, 4}, + {0x000A, 4},{0x0018, 5},{0x0038, 6},{0x0042, 7}, + {0x010F, 9},{0x010E, 9},{0x0219,10},{0x10C3,13}, + {0x10C2,13},{0x10C5,13},{0x10C4,13},{0x000F, 4}, + {0x0004, 4},{0x0019, 5},{0x000B, 5},{0x0039, 6}, + {0x0009, 4},{0x001B, 5},{0x001A, 5},{0x003B, 6} + }, + { + {0x0005, 3},{0x0001, 4},{0x003E, 6},{0x0001, 5}, + {0x00E2, 8},{0x1C6F,13},{0x38D9,14},{0x0039, 6}, + {0x001F, 6},{0x0002, 3},{0x0001, 3},{0x0009, 4}, + {0x0008, 4},{0x0000, 5},{0x0070, 7},{0x01C7, 9}, + {0x038C,10},{0x071A,11},{0x38D8,14},{0x38DB,14}, + {0x38DA,14},{0x38DD,14},{0x38DC,14},{0x000D, 4}, + {0x001D, 5},{0x000E, 5},{0x003F, 6},{0x003C, 6}, + {0x000C, 4},{0x0006, 4},{0x003D, 6},{0x001E, 6} + }, + { + {0x0006, 3},{0x000B, 4},{0x0011, 5},{0x001E, 5}, + {0x0074, 7},{0x03AA,10},{0x1D5C,13},{0x0001, 6}, + {0x0021, 6},{0x0001, 3},{0x0002, 3},{0x0007, 4}, + {0x0006, 4},{0x003E, 6},{0x00EB, 8},{0x01D4, 9}, + {0x0EAF,12},{0x3ABB,14},{0x3ABA,14},{0x1D59,13}, + {0x1D58,13},{0x1D5B,13},{0x1D5A,13},{0x000A, 4}, + {0x001C, 5},{0x0001, 5},{0x003F, 6},{0x003B, 6}, + {0x0001, 4},{0x0009, 4},{0x0020, 6},{0x0000, 6} + }, + { + {0x0004, 3},{0x000A, 4},{0x0017, 5},{0x0004, 4}, + {0x0016, 6},{0x016A, 9},{0x16B1,13},{0x0017, 7}, + {0x005B, 7},{0x0006, 3},{0x0007, 3},{0x0001, 4}, + {0x0000, 4},{0x000A, 6},{0x02D7,10},{0x0B5A,12}, + {0x16B0,13},{0x16B3,13},{0x16B2,13},{0x2D6D,14}, + {0x2D6C,14},{0x2D6F,14},{0x2D6E,14},{0x0006, 4}, + {0x000A, 5},{0x0004, 5},{0x002C, 6},{0x0017, 6}, + {0x0003, 4},{0x0007, 4},{0x0016, 7},{0x00B4, 8} + }, + { + {0x0005, 3},{0x000D, 4},{0x0005, 4},{0x0009, 4}, + {0x0033, 6},{0x0193, 9},{0x192C,13},{0x0061, 8}, + {0x0031, 7},{0x0000, 2},{0x0007, 3},{0x0010, 5}, + {0x0011, 5},{0x00C8, 8},{0x192F,13},{0x325B,14}, + {0x325A,14},{0x1929,13},{0x1928,13},{0x192B,13}, + {0x192A,13},{0x325D,14},{0x325C,14},{0x0018, 5}, + {0x001A, 6},{0x001B, 6},{0x0065, 7},{0x0019, 6}, + {0x0004, 4},{0x0007, 4},{0x0060, 8},{0x0324,10} + }, + { + {0x0006, 3},{0x0000, 3},{0x0002, 4},{0x000F, 4}, + {0x0039, 6},{0x01D9, 9},{0x1D82,13},{0x0761,11}, + {0x03BE,10},{0x0001, 2},{0x0002, 2},{0x000F, 6}, + {0x000E, 6},{0x0762,11},{0x3B07,14},{0x3B06,14}, + {0x3B1D,14},{0x3B1C,14},{0x3B1F,14},{0x3B1E,14}, + {0x3B19,14},{0x3B18,14},{0x3B1B,14},{0x0038, 6}, + {0x01DE, 9},{0x00ED, 8},{0x03BF,10},{0x00EE, 8}, + {0x003A, 6},{0x0006, 5},{0x0EC0,12},{0x3B1A,14} + }, + { + {0x0000, 2},{0x0002, 3},{0x000F, 5},{0x0006, 4}, + {0x001C, 6},{0x01D0,10},{0x0E8C,13},{0x1D1B,14}, + {0x1D1A,14},{0x0003, 2},{0x0002, 2},{0x00EA, 9}, + {0x00E9, 9},{0x0E89,13},{0x0E88,13},{0x0E8B,13}, + {0x0E8A,13},{0x1D65,14},{0x1D64,14},{0x1D67,14}, + {0x1D66,14},{0x1D61,14},{0x1D60,14},{0x03AD,11}, + {0x1D63,14},{0x1D62,14},{0x1D1D,14},{0x1D1C,14}, + {0x003B, 7},{0x01D7,10},{0x1D1F,14},{0x1D1E,14} + }, + { + {0x0002, 2},{0x000F, 4},{0x001C, 5},{0x000C, 4}, + {0x003B, 6},{0x01AC, 9},{0x1AD8,13},{0x35B3,14}, + {0x35B2,14},{0x0001, 2},{0x0000, 2},{0x0069, 7}, + {0x0068, 7},{0x35BD,14},{0x35BC,14},{0x35BF,14}, + {0x35BE,14},{0x35B9,14},{0x35B8,14},{0x35BB,14}, + {0x35BA,14},{0x35B5,14},{0x35B4,14},{0x01A9, 9}, + {0x01A8, 9},{0x035A,10},{0x00D7, 8},{0x00D5, 8}, + {0x003A, 6},{0x001B, 5},{0x35B7,14},{0x35B6,14} + } +}; + + + +/*A description of a Huffman code value used when encoding the tree.*/ +typedef struct{ + /*The bit pattern, left-shifted so that the MSB of all patterns is + aligned.*/ + unsigned long pattern; + /*The amount the bit pattern was shifted.*/ + int shift; + /*The token this bit pattern represents.*/ + int token; +}th_huff_entry; + + + +/*Compares two th_huff_entry structures by their bit patterns. + _c1: The first entry to compare. + _c2: The second entry to compare. + Return: <0 if _c1<_c2, >0 if _c1>_c2.*/ +static int huff_entry_cmp(const void *_c1,const void *_c2){ + unsigned long b1; + unsigned long b2; + b1=((const th_huff_entry *)_c1)->pattern; + b2=((const th_huff_entry *)_c2)->pattern; + return b1b2?1:0; +} + +int th_huff_codes2latex(const theora_huff_code _codes[80][32]){ + int i; + printf("\\twocolumn\n"); + for(i=0;i<80;i++){ + th_huff_entry entries[32]; + int maxlen; + int mask; + int j; + /*First, find the maximum code length so we can align all the bit + patterns.*/ + maxlen=_codes[i][0].nbits; + for(j=1;j<32;j++)if(maxlen<_codes[i][j].nbits)maxlen=_codes[i][j].nbits; + mask=(1<entries[j].shift;){ + printf("%c",(int)(entries[j].pattern>>k&1)+'0'); + } + printf("}"); + for(;k>=0;k--)printf(" "); + printf(" & "); + if(entries[j].token<10)printf(" "); + printf("$%i$ \\\\\n",entries[j].token); + } + printf("\\bottomrule\n"); + printf("\\\\\n"); + printf("\\multicolumn{2}{c}{VP3.1 Huffman Table Number $%i$}\n",i); + printf("\\end{tabular}\n"); + printf("\\end{center}\n"); + printf("\\vfill\n"); + printf("\n"); + } + printf("\\onecolumn\n"); + return 0; +} + +int main(int _argc,char **_argv){ + th_huff_codes2latex(TH_VP31_HUFF_CODES); + return 0; +} diff --git a/cs/3rd party/libtheora/doc/spec/xifish.fig b/cs/3rd party/libtheora/doc/spec/xifish.fig new file mode 100644 index 000000000..f044a2b56 --- /dev/null +++ b/cs/3rd party/libtheora/doc/spec/xifish.fig @@ -0,0 +1,85 @@ +#FIG 3.2 +Landscape +Center +Inches +Letter +100.00 +Single +-2 +1200 2 +0 32 #496d9e +0 33 #304d71 +0 34 #8eb2cf +1 4 0 6 0 7 1 0 20 0.000 1 0.0000 1470 3255 270 270 1200 3255 1740 3255 +1 3 0 0 0 0 0 0 20 0.000 1 0.0000 1485 3255 75 75 1485 3255 1560 3255 +2 1 0 7 0 3 8 0 20 0.000 0 0 -1 0 0 6 + 2445 4140 2505 4350 2385 4425 2145 4425 2025 4380 1890 4320 +2 1 0 7 0 3 8 0 20 0.000 0 0 -1 0 0 20 + 2445 3480 2775 3450 2955 3390 3090 3315 3285 3285 3555 3285 + 3615 3390 3540 3675 3465 3720 3315 3765 3105 3810 3330 3765 + 3420 3825 3540 3900 3480 4260 3330 4320 3165 4305 2910 4260 + 2715 4185 2520 4185 +2 1 0 7 0 3 11 0 20 0.000 0 0 -1 0 0 9 + 1575 3150 1755 2985 2040 2820 2355 2760 2670 2850 2850 2985 + 3165 3270 3435 3420 2835 3780 +2 1 0 7 0 6 6 0 20 0.000 0 0 -1 0 0 15 + 900 3570 1020 3450 1095 3360 1395 3150 1545 3090 1725 3075 + 2025 3090 2205 3150 2295 3225 2385 3300 2445 3375 2550 3465 + 2655 3540 2775 3600 2865 3600 +2 1 0 7 0 3 4 0 20 0.000 0 0 -1 0 0 7 + 1515 4080 1770 4080 1875 3945 1965 3870 2025 3780 1995 3780 + 1665 3780 +2 1 0 0 -1 6 7 0 20 0.000 0 0 -1 0 0 11 + 2865 3615 2850 3735 2775 3945 2685 4080 2595 4155 2010 4185 + 1185 4170 1035 3990 1035 3870 975 3540 1155 3435 +2 1 0 0 0 3 5 0 20 0.000 0 0 -1 0 0 7 + 1035 3885 1005 4020 1095 4065 1245 4065 1245 3870 1050 3870 + 1065 3870 +2 1 0 7 0 3 0 0 20 0.000 0 0 -1 0 0 11 + 1245 3915 1245 3840 1170 3750 1005 3585 930 3510 750 3510 + 630 3600 645 3690 765 3780 885 3825 1035 3975 +2 1 0 7 0 3 0 0 20 0.000 0 0 -1 0 0 8 + 1095 3990 945 3990 855 4050 795 4140 885 4200 1095 4200 + 1155 4140 1245 4050 +2 1 0 7 0 6 6 0 20 0.000 0 0 -1 0 0 8 + 2685 4185 2400 4185 2220 4215 1920 4305 1695 4335 1485 4320 + 1245 4215 1155 4125 +2 2 0 0 0 0 3 0 20 0.000 0 0 0 0 0 5 + 2250 3900 2250 3825 2175 3825 2175 3900 2250 3900 +2 2 0 0 0 0 3 0 20 0.000 0 0 0 0 0 5 + 2250 3750 2250 3675 2175 3675 2175 3750 2250 3750 +2 1 0 0 -1 3 5 0 20 0.000 0 0 -1 0 0 9 + 1650 3780 1590 3975 1485 4035 1530 4080 1770 4065 1845 3960 + 1920 3900 1965 3795 1695 3780 +2 2 0 0 0 0 3 0 20 0.000 0 0 0 0 0 5 + 1950 3450 1950 3375 1875 3375 1875 3450 1950 3450 +2 2 0 0 0 0 3 0 20 0.000 0 0 0 0 0 5 + 2400 3900 2400 3825 2325 3825 2325 3900 2400 3900 +2 2 0 0 0 0 3 0 20 0.000 0 0 0 0 0 5 + 2550 3975 2550 3900 2475 3900 2475 3975 2550 3975 +2 2 0 0 0 0 3 0 20 0.000 0 0 0 0 0 5 + 2700 3900 2700 3825 2625 3825 2625 3900 2700 3900 +2 2 0 0 0 0 3 0 20 0.000 0 0 0 0 0 5 + 2700 3750 2700 3675 2625 3675 2625 3750 2700 3750 +2 2 0 0 0 0 3 0 20 0.000 0 0 0 0 0 5 + 2550 3675 2550 3600 2475 3600 2475 3675 2550 3675 +2 2 0 0 0 0 3 0 20 0.000 0 0 0 0 0 5 + 2400 3750 2400 3675 2325 3675 2325 3750 2400 3750 +2 2 0 0 0 0 3 0 20 0.000 0 0 0 0 0 5 + 2400 3600 2400 3525 2325 3525 2325 3600 2400 3600 +2 2 0 0 0 0 3 0 20 0.000 0 0 0 0 0 5 + 2250 3600 2250 3525 2175 3525 2175 3600 2250 3600 +2 2 0 0 0 0 3 0 20 0.000 0 0 0 0 0 5 + 2250 3450 2250 3375 2175 3375 2175 3450 2250 3450 +2 2 0 0 0 0 3 0 20 0.000 0 0 0 0 0 5 + 2100 3525 2100 3450 2025 3450 2025 3525 2100 3525 +2 2 0 0 0 0 3 0 20 0.000 0 0 0 0 0 5 + 2100 3375 2100 3300 2025 3300 2025 3375 2100 3375 +2 2 0 0 0 0 3 0 20 0.000 0 0 0 0 0 5 + 2550 3825 2550 3750 2475 3750 2475 3825 2550 3825 +2 3 0 0 -1 32 13 0 20 0.000 0 0 7 0 0 5 + 2160 2055 3810 3705 2160 5355 510 3705 2160 2055 +2 1 0 0 32 34 12 0 20 0.000 0 0 -1 0 0 3 + 2160 2055 2160 3705 510 3705 +2 1 0 0 32 33 12 0 20 0.000 0 0 -1 0 0 3 + 3810 3705 2160 3705 2160 5355 diff --git a/cs/3rd party/libtheora/doc/vp3-format.txt b/cs/3rd party/libtheora/doc/vp3-format.txt new file mode 100644 index 000000000..990f417c2 --- /dev/null +++ b/cs/3rd party/libtheora/doc/vp3-format.txt @@ -0,0 +1,1305 @@ +VP3 Bitstream Format and Decoding Process +by Mike Melanson (mike at multimedia.cx) +v0.5: December 8, 2004 + + +[December 8, 2004: Note that this document is not complete and likely +will never be completed. However, it helped form the basis of Theora I +specification available at + http://www.theora.org/doc/Theora_I_spec.pdf ] + + +Contents +-------- + * Introduction + * Underlying Coding Concepts + * VP3 Coding Overview + * VP3 Chunk Format + * Decoding The Frame Header + * Initializing The Quantization Matrices + * Hilbert Coding Pattern + * Unpacking The Block Coding Information + * Unpacking The Macroblock Coding Mode Information + * Unpacking The Macroblock Motion Vectors + * Unpacking The DCT Coefficients + * Reversing The DC Prediction + * Reconstructing The Frame + * Theora Specification + * Appendix A: Quantization Matrices And Scale Factors + * Appendix B: Macroblock Coding Mode Alphabets + * Appendix C: DCT Coefficient VLC Tables + * Appendix D: The VP3 IDCT + * Acknowledgements + * References + * Changelog + + +Introduction +------------ +A company named On2 (http://www.on2.com) created a video codec named +VP3. Eventually, they decided to open source it. Like any body of code +that was produced on a deadline, the source code was not particularly +clean or well-documented. This makes it difficult to understand the +fundamental operation of the codec. + +This document describes the VP3 bitstream format and decoding process at +a higher level than source code. + + +Underlying Coding Concepts +-------------------------- +In order to understand the VP3 coding method it is necessary to +understand the individual steps in the process. Like many multimedia +compression algorithms VP3 does not consist of a single coding method. +Rather, it uses a chain of methods to achieve compression. + +If you are acquainted with the MPEG video clique then many of VP3's +coding concepts should look familiar as well. What follows is a list of +the coding methods used in VP3 and a brief description of each. + +* Discrete Cosine Transform (DCT): This is a magical mathematical +function that takes a group of numbers and turns it into another group +of numbers. The transformed group of numbers exhibits some curious +properties. Notably, larger numbers are concentrated in certain areas of +the transformed group. + +A video codec like VP3 often operates on 8x8 blocks of numbers. When +these 8x8 blocks are transformed using a DCT the larger numbers occur +mostly in the up and left areas of the block with the largest number +occurring as the first in the block (up-left corner). This number is +called the DC coefficient. The other 63 numbers are called the AC +coefficients. + +The DCT and its opposite operation, the inverse DCT, require a lot of +multiplications. Much research and experimentation is focused of +optimizing this phase of the coding/decoding process. + +* Quantization: This coding step tosses out information by essentially +dividing a number to be coded by a factor and throwing away the +remainder. The inverse process (dequantization) involves multiplying by +the same factor to obtain a number that is close enough to the original. + +* Run Length Encoding (RLE): The concept behind RLE is to shorten runs +of numbers that are the same. For example, the string "88888" is encoded +as (5, 8), indicating a run of 5 '8' numbers. In VP3 (and MPEG/JPEG), +RLE is used to record the number of zero-value coefficients that occur +before a non-zero coefficient. For example: + + 0 0 0 0 5 0 2 0 0 0 9 + +is encoded as: + + (4, 5), (1, 2), (3, 9) + +This indicates that a run of 4 zeroes is followed by a coefficient of 5; +then a run of 1 zero is followed by 2; then a run of 3 zeroes is +followed by 9. + +* Zigzag Ordering: After transforming and quantizing a block of samples, +the samples are not in an optimal order for run length encoding. Zigzag +ordering rearranges the samples to put more zeros between non-zero +samples. + +* Differential (or Delta) Pulse Code Modulation (DPCM): 1 + 1 = 2. Got +that? Seriously, that is what DPCM means. Rather than encoding absolute +values, encode the differences between successive values. For example: + + 82 84 81 80 86 88 85 + +Can be delta-encoded as: + + 82 +2 -3 -1 +6 +2 -3 + +Most of the numbers turn into smaller numbers which require less +information to encode. + +* Motion Compensation: Simply, this coding method specifies that a block +from a certain position in the previous frame is to be copied into a new +position in the current frame. This technique is often combined with DCT +and DPCM coding, as well as fractional pixel motion. + +* Entropy Coding (a.k.a. Huffman Coding): This is the process of coding +frequently occurring symbols with fewer bits than symbols that are not +likely to occur as frequently. + +* Variable Length Run Length Booleans: An initial Boolean bit is +extracted from the bitstream. A variable length code (VLC) is extracted +from the bitstream and converted to a count. This count indicates that +the next (count) elements are to be set to the Boolean value. +Afterwards, the Boolean value is toggled, the next VLC is extracted and +converted to a count, and the process continues until all elements are +set to either 0 or 1. + +* YUV Colorspace: Like many modern video codecs, VP3 operates on a YUV +colorspace rather than a RGB colorspace. Specifically, VP3 uses YUV +4:2:0, alias YUV420P, YV12. Note: Throughout the course of this +document, the U and V planes (a.k.a., Cb and Cr planes) will be +collectively referred to as C planes (color or chrominance planes). + +* Frame Types: VP3 has intra-coded frames, a.k.a. intraframes, I-frames, +or keyframes. VP3 happens to call these golden frames. VP3 has +interframes, a.k.a. predicted frames or P-frames. These frames can use +information from either the previous interframe or from the previous +golden frame. + + +VP3 Overview +------------ +The first thing to understand about the VP3 coding method is that it +encodes all 3 planes upside down. That is, the data is encoded from +bottom-to-top rather than top-to-bottom as is done with many video +codecs. + +VP3 codes a video frame by first breaking each of the 3 planes (Y, U, +and V) into a series of 8x8 blocks called fragments. VP3 also has a +notion of superblocks. Superblocks encapsulate 16 fragments arranged in +a 4x4 matrix. Each plane has its own set of superblocks. Further, VP3 +also uses the notion of macroblocks which is the same as that found in +JPEG/MPEG. One macroblock encompasses 4 blocks from the Y plane arranged +in a 2x2 matrix, 1 block from the U plane, and 1 block from the V plane. +While a fragment or a superblock applies to 1 and only 1 plane, a +macroblock extends over all 3 planes. + +VP3 compresses golden frames by transforming each fragment with a +discrete cosine transform. Each transformed sample is then quantized and +the DC coefficient is reduced via DPCM using a combination of DC +coefficients from surrounding fragments as predictors. Then, each +fragment's DC coefficient is entropy-coded in the output bitstream, +followed by each fragment's first AC coefficient, then each second AC +coefficient, and so on. + +An interframe, naturally, is more complicated. While there is only one +coding mode available for a golden frame (intra coding), there are 8 +coding modes that the VP3 coder can choose from for interframe +macroblocks. Intra coding as seen in the keyframe is still available. +The rest of the modes involve encoding a fragment diff, either from the +previous frame or the golden frame, from the same coordinate or from the +same coordinate plus a motion vector. All of the macroblock coding modes +and motion vectors are encoded in an interframe bitstream. + + +VP3 Chunk Format +---------------- +The high-level format of a compressed VP3 frame is laid out as: + + * chunk header + * block coding information + * macroblock coding mode information + * motion vectors + * DC coefficients + * 1st AC coefficients + * 2nd AC coefficients + * ... + * 63rd AC coefficients + + +Decoding The Frame Header +------------------------- +The chunk header always contains at least 1 byte which has the following +format: + + bit 7: 0 = golden frame, 1 = interframe + bit 6: unused + bits 5-0: Quality index (0..63) + +Further, if the frame is a golden frame, there are 2 more bytes in the +header: + + byte 0: version byte 0 + byte 1: + bits 7-3: VP3 version number (stored) + bit 2: key frame coding method (0 = DCT key frame, only type + supported) + bits 1-0: unused, spare bits + +All frame headers are encoded with a quality index. This 6-bit value is +used to index into 2 dequantizer scaling tables, 1 for DC values and 1 +for AC values. Each of the 3 dequantization tables is modified per these +scaling values. + + +Initializing The Quantization Matrices +-------------------------------------- +VP3 has three static matrices for quantizing and dequantizing fragments. +One matrix is for quantizing golden frame Y fragments, one matrix is for +quantizing golden frame C fragments, and one matrix is for quantizing both +golden frame and interframe Y or C fragments. While these matrices are +static, they are adjusted according to quality index coded in the header. + +The quality index is an index into 2 64-element tables: +dc_scale_factor[] and ac_scale_factor[]. Each quantization factor from +each of the three quantization matrices is adjusted by the appropriate +scale factor according to this formula: + + base quantizer * scale factor + quantizer = ----------------------------- + 100 + + where scale factor = + dc_scale_factor[quality_index] for DC dequantizer + ac_scale_factor[quality_index] for AC dequantizer + +The quantization matrices need to be recalculated at the beginning of a +frame decode if the current frame's quality index is different from the +previous frame's quality index. + +See Appendix A for the complete VP3 quantization matrices and scale factor +tables. + +As an example, this is the base quantization matrix for golden frame Y +fragments: + + 16 11 10 16 24 40 51 61 + 12 12 14 19 26 58 60 55 + 14 13 16 24 40 57 69 56 + 14 17 22 29 51 87 80 62 + 18 22 37 58 68 109 103 77 + 24 35 55 64 81 104 113 92 + 49 64 78 87 103 121 120 101 + 72 92 95 98 112 100 103 99 + +If a particular coded frame specifies a quality index of 54. Element 54 +of the dc_scale_factor table is 20, thus: + + 16 * 20 + DC coefficient quantizer = ------- = 3 + 100 + +Element 54 of the ac_scale_factor table is 24. The AC coefficient +quantizers are each scaled using this factor, e.g.: + + 11 * 24 + ------- = 2 + 100 + + 100 * 24 + -------- = 24 + 100 + +[not complete; still need to explain how these quantizers are saturated +and scaled with respect to the DCT process] + + +Hilbert Coding Pattern +---------------------- +VP3 uses a Hilbert pattern to code fragments within a superblock. A +Hilbert pattern is a recursive pattern that can grow quite complicated. +The coding pattern that VP3 uses is restricted to this pattern subset, +where each fragment in a superblock is represented by a 'X': + + X -> X X -> X + | ^ + v | + X <- X X <- X + | ^ + v | + X X -> X X + | ^ | ^ + v | v | + X -> X X -> X + +As an example of this pattern, consider a plane that is 256 samples wide +and 64 samples high. Each fragment row will be 32 fragments wide. The +first superblock in the plane will be comprised of these 16 fragments: + + 0 1 2 3 ... 31 + 32 33 34 35 ... 63 + 64 65 66 67 ... 95 + 96 97 98 99 ... 127 + +The order in which these 16 fragments are coded is: + + 0 | 0 1 14 15 + 32 | 3 2 13 12 + 64 | 4 7 8 11 + 96 | 5 6 9 10 + +All of the image coding information, including the block coding status +and modes, the motion vectors, and the DCT coefficients, are all coded +and decoded using this pattern. Thus, it is rather critical to have the +pattern and all of its corner cases handled correctly. In the above +example, if the bottom row and left column were not present due to the +superblock being in a corner, the pattern proceeds as if the missing +fragments were present, but the missing fragments are omitted in the +final coding list. The coding order would be: + + 0, 1, 2, 3, 4, 7, 8, 13, 14 + + +Unpacking The Block Coding Information +-------------------------------------- +After unpacking the frame header, the decoder unpacks the block coding +information. The only information determined in this phase is whether a +particular superblock and its fragments are coded in the current frame +or unchanged from the previous frame. The actual coding method is +determined in the next phase. + +If the frame is a golden frame then every superblock, macroblock, and +fragment is marked as coded. + +If the frame is an interframe, then the block coding information must be +decoded. This is the phase where a decoder will build a list of coded +fragments for which coding mode, motion vector, and DCT coefficient data +must be decoded. + +First, a list of partially-coded superblocks is unpacked from the +stream. This list is coded as a series of variable-length run length +codes (VLRLC). First, the code is initialized by reading the next bit in +the stream. Then, while there are still superblocks remaining in the +list, fetch a VLC from the stream according to this table: + + Codeword Run Length + 0 1 + 10x 2-3 + 110x 4-5 + 1110xx 6-9 + 11110xxx 10-17 + 111110xxxx 18-33 + 111111xxxxxxxxxxxx 34-4129 + +For example, a VLC of 1101 represents a run length of 5. If the VLRLC +was initialized to 1, then the next 5 superblocks would be set to 1, +indicating that they are partially coded in the current frame. Then the +bit value is toggled to 0, another VLC is fetched from the stream and +the process continues until each superblock has been marked either +partially coded (1) or not (0). + +If any of the superblocks were marked as not partially coded in the +previous step, then a list of fully-coded superblocks is unpacked next +using the same VLRLC as the list of partially-coded superblocks. +Initialize the VLRLC with the next bit in the stream. For each +superblock that was not marked as partially coded, mark it with either a +0 or 1 according to the current VLRLC. By the end of this step, each +superblock will be marked as either not coded, partially coded, or fully +coded. + +Let's work through an example with an image frame that is 256x64 pixels. +This means that the Y plane contains 4x2 superblocks and each of the C +planes contains 2 superblocks each. The superblocks are numbered as +follows: + + Y: 0 1 2 3 U: 8 9 + 4 5 6 7 V: 10 11 + +This is the state of the bitstream: + + 1100011001101 + +Which is interpreted as: + + initial 2 1's 1 0 4 1's 5 0's + 1 100 0 1100 1101 + +Superblocks 0-1 and 3-6 are marked as partially coded. Since there were +blocks that were not marked, proceed to unpack the list of fully-coded +superblocks. This is the state of the bitstream: + + 1101101 + +Which is interpreted as: + + initial 3 1's 3 0's + 1 101 100 + +Superblocks 2, 7, and 8 are marked as fully coded while superblocks 9, +10, and 11 are marked as not coded. + +If any of the superblocks were marked as partially coded, the next data +in the bitstream will define which fragments inside each partially-coded +superblock are coded. This is the first place where the Hilbert pattern +comes into play. + +For each partially-coded superblock, iterate through each fragment +according to the Hilbert pattern. Use the VLRLC method, only with a +different table, to determine which fragments are coded. The VLRLC table +for fragment coding runs is: + + Codeword Run Length + 0x 1-2 + 10x 3-4 + 110x 5-6 + 1110xx 7-10 + 11110xx 11-14 + 11111xxxx 15-30 + +Continuing with the contrived example, superblocks 0 and 1 are both +partially coded. This is the state of the bitstream: + + 0011001111010001111010...(not complete) + +Which is interpreted as: + initial 2 0's 3 1's 13 0's 1 1 13 0's + 0 01 100 1111010 00 1111010 ... + +This indicates that fragments 2-4 in superblock 0 are coded, while +fragments 0, 1, and 5-15 are not. Note that the run of 12 0's cascades +over into the next fragment, indicating that fragment 0 of superblock 1 +is not coded. Fragment 1 of superblock 1 is coded, while the rest of the +superblock's fragments are not coded. The example ends there (a real +bitstream should have enough data to describe all of the partially-coded +superblocks). Superblock 2 is fully coded which means all 16 fragments +are coded. Thus, superblocks 0-2 have the following coded fragments: + + 0 | x x x x x x x x 0 1 14 15 + 32 | 3 2 x x x 2 x x 3 2 13 12 + 64 | 4 x x x x x x x 4 7 8 11 + 96 | x x x x x x x x 5 6 9 10 + +This is a good place to generate the list of coded fragment numbers for +this frame. In this case, the list will begin as: + + 33 32 64 37 8 9 41 40 72 104 105 73 ... + +and so on through the remaining 8 fragments of superblock 2 and onto the +fragments for the remaining superblocks that are either fully or +partially coded. + + +Unpacking The Macroblock Coding Mode Information +------------------------------------------------ +After unpacking the block coding information, the decoder unpacks the +macroblock coding mode information. This process is simple when +decoding a golden frame-- since the only possible decoding mode is INTRA, +no macroblock coding mode information is transmitted. However, in an +interframe, each coded macroblock is encoded with one of 8 methods: + +0, INTER_NO_MV: + current fragment = + (fragment from previous frame @ same coordinates) + + (DCT-encoded residual) + +1, INTRA: + current fragment = DCT-encoded block, just like in a golden frame + +2, INTER_PLUS_MV: + current fragment = + (fragment from previous frame @ (same coords + motion vector)) + + (DCT-encoded residual) + +3, INTER_LAST_MV: + same as INTER_PLUS_MV but using the last motion vector decoded from + the bitstream + +4, INTER_PRIOR_LAST; + same as INTER_PLUS_MV but using the second-to-last motion vector + decoded from the bitstream + +5, USING_GOLDEN: + same as INTER_NO_MV but referencing the golden frame instead of + previous interframe + +6, GOLDEN_MV: + same as INTER_PLUS_MV but referencing the golden frame instead of + previous interframe + +7, INTER_FOURMV: + same as INTER_PLUS_MV except that each of the 4 Y fragments gets its + own motion vector, and the U and V fragments share the same motion + vector which is the average of the 4 Y fragment vectors + +The MB coding mode information is encoded using one of 8 alphabets. The +first 3 bits of the MB coding mode stream indicate which of the 8 +alphabets, 0..7, to use to decode the MB coding information in this frame. +The reason for the different alphabets is to minimize the number of bits +needed to encode this section of information. Each alphabet arranges the +coding modes in a different order, indexing the 8 modes into 8 index +slots. Index 0 is encoded with 1 bit (0), index 1 is encoded with 2 bits +(10), index 2 is encoded with 3 bits (110), and so on up to indices 6 and +7 which are encoded with 6 bits each (1111110 and 1111111, respectively): + + index encoding + ----- -------- + 0 0 + 1 10 + 2 110 + 3 1110 + 4 11110 + 5 111110 + 6 1111110 + 7 1111111 + +For example, the coding modes are arranged in alphabet 1 as follows: + + index coding mode + ----- ----------- + 0 MODE_INTER_LAST_MV + 1 MODE_INTER_PRIOR_LAST + 2 MODE_INTER_PLUS_MV + 3 MODE_INTER_NO_MV + 4 MODE_INTRA + 5 MODE_USING_GOLDEN, + 6 MODE_GOLDEN_MV + 7 MODE_INTER_FOURMV + +This alphabet arrangement is designed for frames in which motion vectors +based off of the previous interframe dominate. + +When unpacking MB coding mode information for a frame, the decoder first +reads 3 bits from the stream to determine the alphabet. In this example, +the 3 bits would be 001 to indicate alphabet 1. Consider this contrived +bitstream following the alphabet number: + + 1010000011000011111110... + +The bits are read as follows: + + 10 10 0 0 0 0 110 0 0 0 1111111 0 + index: 1 1 0 0 0 0 2 0 0 0 7 0 + +This arrangement of indices translates to this series of coding modes: + + index coding mode + ----- ----------- + 1 MODE_INTER_PRIOR_LAST + 1 MODE_INTER_PRIOR_LAST + 0 MODE_INTER_LAST_MV + 0 MODE_INTER_LAST_MV + 0 MODE_INTER_LAST_MV + 0 MODE_INTER_LAST_MV + 2 MODE_INTER_PLUS_MV + 0 MODE_INTER_LAST_MV + 0 MODE_INTER_LAST_MV + 0 MODE_INTER_LAST_MV + 7 MODE_INTER_FOURMV + 0 MODE_INTER_LAST_MV + +There are 6 pre-defined alphabets. Consult Appendix B for the complete +alphabets. What happens if none of the 6 pre-defined alphabets fit? The +VP3 encoder can choose to use alphabet 0 which indicates a custom +alphabet. The 3-bit coding mode numbers for each index, 0..7, are stored +after the alphabet number in the bitstream. For example, the sequence: + + 000 111 110 101 100 011 010 001 000 + +would indicate coding alphabet 0 (custom alphabet), index 0 corresponds to +coding mode 7 (INTER_FOURMV), index 1 corresponds to coding mode 6 +(GOLDEN_MV), and so on down to index 7 which would correspond to coding +mode 0 (INTER_NO_MV). + +There is one more possible alphabet: Alphabet 7. This alphabet is +reserved for when there is such a mixture of coding modes used in a frame +that using any variable-length coding mode would result in more bits than +a fixed-length representation. When alphabet 7 is specified, the decoder +reads 3 bits at a time from the bitstream, and uses those directly as the +macroblock coding modes. + +To recap, this is the general algorithm for decoding macroblock coding +mode information: + + if (golden frame) + all frames are intracoded, there is no MB coding mode information + else + read 3 bits from bitstream to determine alphabet + if alphabet = 0 + this is a custom alphabet, populate index table with 8 3-bit coding + modes read from bitstream + foreach coded macroblock, unpack a coding mode: + if alphabet = 7 + read 3 bits from the bitstream as the coding mode for the + macroblock + else + read a VLC from the bitstream + use the decoded VLC value to index into the coding mode alphabet + selected for this frame and assign the indexed coding mode to + this macroblock + + +Unpacking The Macroblock Motion Vectors +--------------------------------------- +After unpacking the macroblock coding mode information, the decoder +unpacks the macroblock motion vectors. This phase essentially assigns a +motion vector to each of the 6 constituent fragments of any coded +macroblock that requires motion vectors. + +If the frame is a golden frame then there is no motion compensation and +no motion vectors are encoded in the bitstream. + +If the frame is an interframe, the next bit is read from the bitstream +to determine the vector entropy coding method used. If the coding method +is zero then all of the vectors will be unpacked using a VLC method. If +the coding method is 1 then all of the vectors will be unpacked using a +fixed length method. + +The VLC unpacking method reads 3 bits from the bitstream. These 3 bits +comprise a number ranging from 0..7 which indicate the next action: + +0, MV component = 0 +1, MV component = 1 +2, MV component = -1 +3, MV component = 2, read next bit for sign +4, MV component = 3, read next bit for sign +5, MV component = 4 + (read next 2 bits), read next bit for sign + range: (4..7, -4..-7) +6, MV component = 8 + (read next 3 bits), read next bit for sign + range: (8..15, -8..-15) +7, MV component = 16 + (read next 4 bits), read next bit for sign + range: (16..31, -16..-31) + +The fixed length vector unpacking method simply reads the next 5 bits +from the bitstream, reads the next bit for sign, and calls the whole +thing a motion vector component. This gives a range of (-31..31), which +is the same range as the VLC method. + +For example, consider the following contrived motion vector bitstream: + + 000001011011111000... + +The stream is read as: + + 0 (000 010) (110 111 1 100 0) + +The first bit indicates the entropy method which, in this example, is +variable length as opposed to fixed length. The next 3 bits are 0 which +indicate a X MV component of 0. The next 3 bits are 2 which indicate a Y +MV component of -1. The first motion vector encoded in this stream is +(0, -1). The next 3 bits are 6 which indicate 8 + next 3 bits (7) with +another bit indicating sign (1 in this case, which is negative). Thus, +the X MV component is -15. The next 3 bits are 4 which indicate a Y MV +component of 3 with one more bit for the sign (0 is positive). So the +second motion vector encoded in this stream is (-15, 3). + +As an example of the fixed-length entropy method, consider the following +contrived bitstream: + + 1010101101010... + +The stream is read as: + + 1 01010 1 10101 0 + +The first bit indicates the fixed length entropy method. The first 5 bits +are 10 followed by a negative sign bit. The next 5 bits are 21 followed by +a positive sign bit. The first motion vector in this stream is (-10, 21). + +During this phase of the decoding process, it is traditional to assign all +motion vectors for all coded macroblocks that require them, whether they +are unpacked from the motion vector bitstream or copied from previous +coded macroblocks. It is necessary to track the motion vectors for both +the previous macroblock as well as the next-to-last (prior) macroblock. +The general algorithm for this phase is as follows: + + foreach coded macroblock + last MV = 0 + prior last MV = 0 + if coding mode = MODE_INTER_PLUS_MV or MODE_GOLDEN_MV + read current MV pair from the bitstream and set all fragment motion + vectors to that pair + prior last MV = last MV + last MV = current MV + + if coding mode = MODE_INTER_FOURMV + read MV for first Y fragment in macroblock + read MV for second Y fragment in macroblock + read MV for third Y fragment in macroblock + read MV for fourth Y fragment in macroblock + set U & V fragment motion vectors to average of 4 Y vectors, + calculated as follows: + if sum of all 4 X motion components is positive, the X + motion component for the U & V fragments is (sum + 2) / 4, + otherwise, it is (sum - 2) / 4; repeat the same process for the + Y components + prior last MV = last MV + last MV = MV for fourth Y fragment from this macroblock + + if coding mode = MODE_INTER_LAST_MV + motion vectors for this macroblock are the same as last MV; note + that in this case, the last MV remains the last MV and the prior + last MV remains the prior last MV + + if coding mode = MODE_INTER_PRIOR_LAST + motion vectors for this macroblock are the same as prior last MV + prior last MV = last MV + last MV = current MV (effectively, swap last and prior last vectors) + + +Unpacking The DCT Coefficients +------------------------------ +After unpacking the macroblock motion vectors, the decoder unpacks the +fragment DCT coefficient data. Each coded fragment has 64 DCT +coefficients. Some of the coefficients will be non-zero. Many of the +coefficients will, or should be 0 as this is where the coding method +derives much of its compression. + +During this phase, the decoder will be unpacking DCT coefficients, zero +runs, and end-of-block (EOB) codes. The decoder unpacks the the DC +coefficients for all fragments, then all of the first AC coefficients, +and so on until all of the 64 DCT coefficients are unpacked from the +bitstream. + +To obtain the DCT coefficients, the decoder unpacks a series of VLCs +from the bitstream which turn into a series of tokens ranging from +0..31. Each of these tokens specifies which action to take next. VP3 +defines 80 different 32-element histograms for VLC decoding: + + 16 histograms for DC token decoding + 16 histograms for group 1 AC token decoding + 16 histograms for group 2 AC token decoding + 16 histograms for group 3 AC token decoding + 16 histograms for group 4 AC token decoding + +The decoder fetches 4 bits from the bitstream that will be used to +select a DC histogram and 4 bits that will be used to select 4 AC +histograms, one for each AC group. + +The meaning of each of the 32 possible tokens follows. 'EB' stands for +extra bits read from bitstream directly after the VLC token: + +0, DCT_EOB_TOKEN +set the current block to EOB, meaning that the block is marked as being +fully unpacked + +1, DCT_EOB_PAIR_TOKEN +set the next 2 blocks to EOB + +2. DCT_EOB_TRIPLE_TOKEN +set the next 3 blocks to EOB + +3, DCT_REPEAT_RUN_TOKEN +set the next (2 EBs + 4) blocks to EOB + +4, DCT_REPEAT_RUN2_TOKEN +set the next (3 EBs + 8) blocks to EOB + +5, DCT_REPEAT_RUN3_TOKEN +set the next (4 EBs + 16) blocks to EOB + +6, DCT_REPEAT_RUN4_TOKEN +set the next (12 EBs) blocks to EOB + +7, DCT_SHORT_ZRL_TOKEN +skip (3 EBs + 1) positions in the output matrix + +8, DCT_ZRL_TOKEN +skip (6 EBs + 1) positions in the output matrix + +9, ONE_TOKEN +output 1 as coefficient + +10, MINUS_ONE_TOKEN +output -1 as coefficient + +11, TWO_TOKEN +output 2 as coefficient + +12, MINUS_TWO_TOKEN +output -2 as coefficient + +13, 14, 15, 16, LOW_VAL_TOKENS +next EB determines coefficient sign; coeff = DCT_VAL_CAT2_MIN (3) + +(token - 13) (this gives a range of +/- 3..6) + +17, DCT_VAL_CATEGORY3 +next EB determines coefficient sign; coeff = DCT_VAL_CAT3_MIN (7) + next +EB (this gives a range of +/- 7..8) + +18, DCT_VAL_CATEGORY4 +next EB determines coefficient sign; coeff = DCT_VAL_CAT4_MIN (9) + next +2 EBs (this gives a range of +/- 9..12) + +19, DCT_VAL_CATEGORY5 +next EB determines coefficient sign; coeff = DCT_VAL_CAT5_MIN (13) + +next 3 EBs (this gives a range of +/- 13..20) + +20, DCT_VAL_CATEGORY6 +next EB determines coefficient sign; coeff = DCT_VAL_CAT6_MIN (21) + +next 4 EBs (this gives a range of +/- 21..36) + +21, DCT_VAL_CATEGORY7 +next EB determines coefficient sign; coeff = DCT_VAL_CAT7_MIN (37) + +next 5 EBs (this gives a range of +/- 37..68) + +22, DCT_VAL_CATEGORY8 +next EB determines coefficient sign; coeff = DCT_VAL_CAT8_MIN (69) + +next 9 EBs (this gives a range of +/- 69..580) + +23, 24, 25, 26, 27, DCT_RUN_CATEGORY1 +coefficient of +/- 1 preceded by a number of 0s; next EB determines sign +of coefficient; skip (token - 22) 0s in the output matrix before +placing the final coefficient (this gives a range of 1..5 0s) + +28, DCT_RUN_CATEGORY1B +coefficient of +/- 1 preceded by a number of 0s; next EB determines sign +of coefficient; skip (next 2 EBs + 6) 0s in the output matrix before +placing the final coefficient (this gives a range of 6..9 0s) + +29, DCT_RUN_CATEGORY1C +coefficient of +/- 1 preceded by a number of 0s; next EB determines sign +of coefficient; skip (next 3 EBs + 10) 0s in the output matrix before +placing the final coefficient (this gives a range of 10..17 0s) + +30, DCT_RUN_CATEGORY2 +coefficient of +/- 2..3 preceded by a single zero; next EB determines +sign of coefficient; coefficient = (next EB + 2) + +31, DCT_RUN_CATEGORY2B (not specifically named in VP3 source) +coefficient of +/- 2..3 preceded by 2 or 3 0s; next EB determines +sign of coefficient; coefficient = (next EB + 2); skip (next EB + 2) 0s +before placing coefficient in output matrix + +Note: EOB runs can, and often do, cross threshold stages and plane +boundaries. For example, a decoder may have decoded all of the AC #2 +coefficients for all fragments and still have an EOB run of 2. That +means that during the AC #3 decode process, the first 2 coded fragments +that are not already EOB will be set to EOB. + +Let's work through a highly contrived example to illustrate the +coefficient decoding process. + + + +[not finished] + + + + +When the decoder is finished unpacking the DCT coefficients, the entire +encoded VP3 frame bitstream should be consumed. + + +Reversing The DC Prediction +--------------------------- +Now that all of the DCT coefficient data has been unpacked, the DC +coefficients need to be fully reconstructed before the IDCT can be +performed. + +VP3 uses a somewhat involved process for DC prediction which uses up to +four DC coefficients from surrounding fragments. For each fragment to be +transformed with the IDCT, the DC coefficient is predicted from weighted +sum of the DC coefficients in the left (l), up-left (ul), up (u), and +up-right (ur) fragments, if they are coded (not unchanged from the +previous frame) in a compatible frame (current, previous, or golden). + +In a golden frame, the prediction is quite straightforward since all +fragments will be coded. A fragment's DC prediction will fall into 1 of +5 groups: + + abbbbbbbbb + cdddddddde + cdddddddde + cdddddddde + cdddddddde + +* Group a is the top left corner fragment. There is nothing to predict +from. This DC coefficient has a lot of energy and requires many bits to +code. + +* Group b is the remainder of the top row of fragments. These fragments +can only predict from the left fragment. + +* Group c is the left column of fragments, not including the top left +fragment. These fragments have the top and top-right fragments from +which to predict. + +* Group d is the main body of fragments. These fragments have access to +all 4 predictors. + +* Group e is the right column of fragments, not including the top right +fragment. These fragments can predict from the left, up-left and up +fragments. + +The process of reversing prediction for interframes grows more complex. +First, the decoder must evaluate which candidate fragments (l, ul, u, or +ur) are available for as predictors. Then, it can only use fragments +that are coded within the same frame (current, previous, or golden). +Further, there are auxiliary predictors for each frame type that are +initialized to 0 at the start of each video frame decode operation. The +decoder falls back on these auxiliary predictors when it can not find +any valid candidate predictors for the current fragment. + +To work through some examples, consider the following notation, e.g.: + + ul-C = up-left fragment, coded in the current frame + u-P = up fragment, coded as a motion residual from the previous frame + ur-C = up-right fragment, coded in the current frame + l-G = left fragment, coded as a motion residual from the golden frame + x-P = current fragment where DC prediction is being performed, coded + as a motion residual from the previous frame + +This is a simple case: + + ul-C u-C ur-C + l-C x-C + +The current fragment predicts from all four of the candidate fragments +since they are coded in the same frame. + + ul-P u-C ur-C + l-P x-P + +The current fragment predicts from the left and up-left fragments. + + ul-C u-P ur-G + l-P x-G + +The current fragment predicts from the up-right fragment. + + ul-C u-C ur-C + l-C x-G + +The current fragment does not predict from any of the candidate +fragments since the current fragment is a motion residual from the +golden frame. Rather, add the auxiliary golden frame predictor to the +current fragment's DC coefficient. Save the new DC coefficient as the +new golden frame auxiliary DC predictor. + +If the decoder only finds one valid candidate predictor, then it is used +by itself. When the decoder finds multiple valid candidate fragments +from which to predict DC, it applies a weighting function to the +surrounding fragments' DC coefficients. The following table presents all +16 possible combinations of available/not available predictors and what +to do in each case: + + ul u ur l + -- -- -- -- + 0 0 0 0 no predictors available: + use the last predictor saved for the frame type + (either intra, inter, or golden) + + 0 0 0 1 left predictor available: + pred = l.dc + + 0 0 1 0 up-right predictor available: + pred = ur.dc + + 0 0 1 1 up-right, left predictors available: + pred = (53 * ur.dc) + (75 * l.dc) + -------------------------- + 128 + + 0 1 0 0 up predictor available: + pred = u.dc + + 0 1 0 1 up, left predictors available: + pred = (u.dc + l.dc) + ------------- + 2 + + 0 1 1 0 up, up-right predictors available: + discard up-right predictor + pred = u.dc + + 0 1 1 1 up, up-right, left predictors available: + discard up predictor + pred = (53 * ur.dc) + (75 * l.dc) + -------------------------- + 128 + + 1 0 0 0 up-left predictor available: + pred = ul.dc + + 1 0 0 1 up-left, left predictors available: + discard up-left predictor + pred = l.dc + + 1 0 1 0 up-left, up-right predictors available: + pred = (ul.dc + ur.dc) + --------------- + 2 + + 1 0 1 1 up-left, up-right, left predictors available: + discard up-left predictor + pred = (53 * ur.dc) + (75 * l.dc) + -------------------------- + 128 + + 1 1 0 0 up-left, up predictors available: + discard up-left + pred = u.dc + + 1 1 0 1 up-left, up, left predictors available: + pred = (-26 * ul.dc + 29 * u.dc + 29 * l.dc) + ------------------------------------- + 32 + + 1 1 1 0 up-left, up, up-right predictors available: + pred = (3 * ul.dc + 10 * u.dc + 3 * ur.dc) + ----------------------------------- + 16 + + 1 1 1 1 all 4 predictors available: + discard up-right predictor + pred = (-26 * ul.dc + 29 * u.dc + 29 * l.dc) + ------------------------------------- + 32 + +Note that this final prediction case ([ul u l]) risks outranging. The +difference of the predicted DC is checked against u.dc, l.dc, and ul.dc, +in that order, and if the difference is greater than 128 in any case, +the predictor is assigned as that DC coefficient. In pseudocode: + + if (ABSOLUTE_VALUE(pred - u.dc) > 128) + pref = u.dc + else if (ABSOLUTE_VALUE(pred - l.dc) > 128) + pref = l.dc + else if (ABSOLUTE_VALUE(pred - ul.dc) > 128) + pref = ul.dc + +The predicted value is, at long last, added to the fragment's decoded DC +coefficient. Finally, the new DC coefficient is saved as the frame +type's auxiliary predictor. For example, if this fragment is coded as a +motion residual from the previous frame, save the fragment's DC +coefficient as the previous frame auxiliary predictor. + + +[still need to mention precise rounding considerations, a.k.a, the +HIGHTBITDUPPED() macro] + + + +Reconstructing The Frame +------------------------ +rough outline: + - foreach fragment: + - if motion vector + - copy motion fragment from appropriate frame into current frame + (don't forget to account for unrestricted motion vectors) + - dequantize fragment coefficients + - run coefficients through inverse DCT + - if INTRA coded fragment + - output transformed coefficients + - else + - apply transformed residual to motion fragment + +[not finished] + + +Theora Specification +-------------------- +The Theora project leverages the VP3 codec into a new video coding +system. The algorithm and bitstream format are the same as VP3 with a +few minor differences: + +1) The frame orientation is reversed-- VP3 is coded from bottom to top +while Theora video is coded from top to bottom. +[nope-- only true in the first few alpha releases; final Theora spec will +be upside-down, the same as VP3] + +2) Variable histograms-- VP3 uses a hardcoded set of histograms for DCT +coefficient coding (described in section "Unpacking The DCT +Coefficients"). Theora packs the histogram information in the header of +the transport format (which is meant to be Ogg, but can probably be +coerced into a variety of other multimedia container formats). + +3) Variable quantization-- As with the histograms, Theora codes the +quantization tables and quality thresholds (described in section +"Initializing The Quantization Matrices") into the header. + +4) [special VLRLC case for encoding unusually large runs of blocks; +necessary for HD resolutions] + +[still need coding format of histogram and quantizer information] + + +Appendix A: VP31 Quantization Matrices And Scale Factors +-------------------------------------------------------- +The following quantization matrices and scale factor tables are hardcoded +into the VP31 coding standard. These tables can vary according to the +setup information transported along with a Theora file. + +Base quantization matrix for golden frame Y fragments (note that this +is the same as JPEG): + + 16 11 10 16 24 40 51 61 + 12 12 14 19 26 58 60 55 + 14 13 16 24 40 57 69 56 + 14 17 22 29 51 87 80 62 + 18 22 37 58 68 109 103 77 + 24 35 55 64 81 104 113 92 + 49 64 78 87 103 121 120 101 + 72 92 95 98 112 100 103 99 + + +Base quantization matrix for golden frame C fragments (note that this +is the same as JPEG): + + 17 18 24 47 99 99 99 99 + 18 21 26 66 99 99 99 99 + 24 26 56 99 99 99 99 99 + 47 66 99 99 99 99 99 99 + 99 99 99 99 99 99 99 99 + 99 99 99 99 99 99 99 99 + 99 99 99 99 99 99 99 99 + 99 99 99 99 99 99 99 99 + + +Base quantization matrix for interframe Y and C fragments: + + 16 16 16 20 24 28 32 40 + 16 16 20 24 28 32 40 48 + 16 20 24 28 32 40 48 64 + 20 24 28 32 40 48 64 64 + 24 28 32 40 48 64 64 64 + 28 32 40 48 64 64 64 96 + 32 40 48 64 64 64 96 128 + 40 48 64 64 64 96 128 128 + + +DC coefficient scale factor table: + + 220 200 190 180 170 170 160 160 + 150 150 140 140 130 130 120 120 + 110 110 100 100 90 90 90 80 + 80 80 70 70 70 60 60 60 + 60 50 50 50 50 40 40 40 + 40 40 30 30 30 30 30 30 + 30 20 20 20 20 20 20 20 + 20 10 10 10 10 10 10 10 + + +AC coefficient scale factor table: + + 500 450 400 370 340 310 285 265 + 245 225 210 195 185 180 170 160 + 150 145 135 130 125 115 110 107 + 100 96 93 89 85 82 75 74 + 70 68 64 60 57 56 52 50 + 49 45 44 43 40 38 37 35 + 33 32 30 29 28 25 24 22 + 21 19 18 17 15 13 12 10 + + +Appendix B: Macroblock Coding Mode Alphabets +-------------------------------------------- +These are the 6 pre-defined alphabets used to decode macroblock coding +mode information: + +Alphabet 1: + index coding mode + ----- ----------- + 0 MODE_INTER_LAST_MV + 1 MODE_INTER_PRIOR_LAST + 2 MODE_INTER_PLUS_MV + 3 MODE_INTER_NO_MV + 4 MODE_INTRA + 5 MODE_USING_GOLDEN, + 6 MODE_GOLDEN_MV + 7 MODE_INTER_FOURMV + +Alphabet 2: + index coding mode + ----- ----------- + 0 MODE_INTER_LAST_MV + 1 MODE_INTER_PRIOR_LAST + 2 MODE_INTER_NO_MV + 3 MODE_INTER_PLUS_MV + 4 MODE_INTRA + 5 MODE_USING_GOLDEN + 6 MODE_GOLDEN_MV + 7 MODE_INTER_FOURMV + +Alphabet 3: + index coding mode + ----- ----------- + 0 MODE_INTER_LAST_MV + 1 MODE_INTER_PLUS_MV + 2 MODE_INTER_PRIOR_LAST + 3 MODE_INTER_NO_MV + 4 MODE_INTRA + 5 MODE_USING_GOLDEN + 6 MODE_GOLDEN_MV + 7 MODE_INTER_FOURMV + +Alphabet 4: + index coding mode + ----- ----------- + 0 MODE_INTER_LAST_MV + 1 MODE_INTER_PLUS_MV + 2 MODE_INTER_NO_MV + 3 MODE_INTER_PRIOR_LAST + 4 MODE_INTRA + 5 MODE_USING_GOLDEN + 6 MODE_GOLDEN_MV + 7 MODE_INTER_FOURMV + +Alphabet 5: + index coding mode + ----- ----------- + 0 MODE_INTER_NO_MV + 1 MODE_INTER_LAST_MV + 2 MODE_INTER_PRIOR_LAST + 3 MODE_INTER_PLUS_MV + 4 MODE_INTRA + 5 MODE_USING_GOLDEN + 6 MODE_GOLDEN_MV + 7 MODE_INTER_FOURMV + +Alphabet 6: + index coding mode + ----- ----------- + 0 MODE_INTER_NO_MV + 1 MODE_USING_GOLDEN + 2 MODE_INTER_LAST_MV + 3 MODE_INTER_PRIOR_LAST + 4 MODE_INTER_PLUS_MV + 5 MODE_INTRA + 6 MODE_GOLDEN_MV + 7 MODE_INTER_FOURMV + + +Appendix C: DCT Coefficient VLC Tables +-------------------------------------- +- VP31 tables are hardcoded +- Theora tables are transported with video stream + +[not finished] + + +Appendix D: The VP3 IDCT +------------------------ + +[not finished] + + +Acknowledgements +---------------- +Thanks to Michael Niedermayer (michaelni at gmx dot at) for peer review, +corrections, and recommendations for improvement. + +Dan Miller (dan at on2 dot com) for clarifications on pieces of the +format. + +Timothy B. Terriberry (tterribe at vt dot edu) for clarification about the +differences between VP3 and Theora, detailed explanation of motion +vector mechanics. + + +References +---------- +Tables necessary for decoding VP3: +http://mplayerhq.hu/cgi-bin/cvsweb.cgi/~checkout~/ffmpeg/libavcodec/vp3data.h?content-type=text/x-cvsweb-markup&cvsroot=FFMpeg + +Official VP3 site: +http://www.vp3.com/ + +Theora, based on VP3: +http://www.theora.org/ + +On2, creators of the VP3 format: +http://www.on2.com/ + + +ChangeLog +--------- +v0.5: December 8, 2004 +- reworked section "Reversing The DC Prediction" to include a tabular +representation of all 16 prediction modes + +v0.4: March 2, 2004 +- renamed and expanded section "Initializing The Quantization Matrices" +- outlined section "Reconstructing The Frame" +- moved Theora Differences Appendix to its own section entitled "Theora +Specification" +- added Appendix: Quantization Matrices And Scale Factors +- added Appendix: DCT Coefficient VLC Tables + +v0.3: February 29, 2004 +- expanded section "Unpacking The Macroblock Coding Mode Information" +- expanded section "Unpacking The Macroblock Motion Vectors" +- added Appendix: Macroblock Coding Mode Alphabets + +v0.2: October 9, 2003 +- expanded section "Reversing the DC Prediction" +- added Appendix: Theora Differences + +v0.1: June 17, 2003 +- initial release, nowhere near complete diff --git a/cs/3rd party/libtheora/examples/Makefile.am b/cs/3rd party/libtheora/examples/Makefile.am new file mode 100644 index 000000000..40c72f06d --- /dev/null +++ b/cs/3rd party/libtheora/examples/Makefile.am @@ -0,0 +1,48 @@ +## Process this file with automake to produce Makefile.in + +noinst_PROGRAMS = dump_video dump_psnr libtheora_info \ + $(BUILDABLE_EXAMPLES) + +# possible contents of BUILDABLE_EXAMPLES: +EXTRA_PROGRAMS = player_example encoder_example png2theora tiff2theora + +AM_CPPFLAGS = -I$(top_srcdir)/include +AM_CFLAGS = $(OGG_CFLAGS) +LDADD = ../lib/libtheora.la $(OGG_LIBS) +LDADDDEC = ../lib/libtheoradec.la $(OGG_LIBS) +LDADDENC = ../lib/libtheoraenc.la ../lib/libtheoradec.la $(OGG_LIBS) + +dump_video_SOURCES = dump_video.c +EXTRA_dump_video_SOURCES = getopt.c getopt1.c getopt.h +dump_video_LDADD = $(GETOPT_OBJS) $(LDADDDEC) $(COMPAT_LIBS) + +dump_psnr_SOURCES = dump_psnr.c +EXTRA_dump_psnr_SOURCES = getopt.c getopt1.c getopt.h +dump_psnr_LDADD = $(GETOPT_OBJS) $(LDADDDEC) -lm + +libtheora_info_SOURCES = libtheora_info.c +libtheora_info_LDADD = $(LDADDENC) + +player_example_SOURCES = player_example.c +player_example_CFLAGS = $(SDL_CFLAGS) $(OGG_CFLAGS) $(VORBIS_CFLAGS) +player_example_LDADD = $(LDADDDEC) $(SDL_LIBS) $(VORBIS_LIBS) $(OSS_LIBS) -lm + +encoder_example_SOURCES = encoder_example.c +EXTRA_encoder_example_SOURCES = getopt.c getopt1.c getopt.h +encoder_example_CFLAGS = $(OGG_CFLAGS) $(VORBIS_CFLAGS) +encoder_example_LDADD = $(GETOPT_OBJS) $(LDADDENC) $(VORBIS_LIBS) $(VORBISENC_LIBS) -lm + +png2theora_SOURCES = png2theora.c +png2theora_CFLAGS = $(OGG_CFLAGS) $(PNG_CFLAGS) +png2theora_LDADD = $(GETOPT_OBJS) $(LDADDENC) $(PNG_LIBS) -lm + +tiff2theora_SOURCES = tiff2theora.c +tiff2theora_CFLAGS = $(OGG_CFLAGS) $(TIFF_CFLAGS) +tiff2theora_LDADD = $(GETOPT_OBJS) $(LDADDENC) $(TIFF_LIBS) -lm + +debug: + $(MAKE) all CFLAGS="@DEBUG@" + +profile: + $(MAKE) all CFLAGS="@PROFILE@" + diff --git a/cs/3rd party/libtheora/examples/README_SPLAYER b/cs/3rd party/libtheora/examples/README_SPLAYER new file mode 100644 index 000000000..82314ab3f --- /dev/null +++ b/cs/3rd party/libtheora/examples/README_SPLAYER @@ -0,0 +1,21 @@ +06/09/03 - by mau (mauricio at xiph.org) + +The splayer example is a experimental simple Theora player using SDL and +Portaudio for cross platform compatibility. To build the windows version +please use the Visual C++ project available at the +win32/experimental/splayer directory. + +By default this sample will not be built on Linux, unless Portaudio is +properly installed. Follow these steps to install Portaudio: + +1) Get portaudio tar package from www.portaudio.com +2) Uncompress it to a local directory +3) Run './configure' in the portaudio directory +4) Run 'make install' + +This will install Portaudio libraries in /usr/local/lib, and the Portaudio +include file at /usr/local/include. On linux you may need to manually +execute 'ldconfig' to rebuild the library cache. + +Switch to theora's directory, re-run theora's autogen.sh script to +re-generate the appropriate makefiles, and 'make install' to build. diff --git a/cs/3rd party/libtheora/examples/dump_psnr.c b/cs/3rd party/libtheora/examples/dump_psnr.c new file mode 100644 index 000000000..7d67cba40 --- /dev/null +++ b/cs/3rd party/libtheora/examples/dump_psnr.c @@ -0,0 +1,1210 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggTheora SOFTWARE 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 Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 * + * by the Xiph.Org Foundation and contributors http://www.xiph.org/ * + * * + ******************************************************************** + + function: example dumpvid application; dumps Theora streams + last mod: $Id$ + + ********************************************************************/ + +#if !defined(_GNU_SOURCE) +#define _GNU_SOURCE +#endif +#if !defined(_LARGEFILE_SOURCE) +#define _LARGEFILE_SOURCE +#endif +#if !defined(_LARGEFILE64_SOURCE) +#define _LARGEFILE64_SOURCE +#endif +#if !defined(_FILE_OFFSET_BITS) +#define _FILE_OFFSET_BITS 64 +#endif + +#include +#if !defined(_WIN32) +#include +#include +#else +#include "getopt.h" +#endif +#include +#include +#include +#include +#include +/*Yes, yes, we're going to hell.*/ +#if defined(_WIN32) +#include +#endif +#include +#include +#include +#include "theora/theoradec.h" + +const char *optstring = "fsy"; +struct option options [] = { + {"frame-type",no_argument,NULL,'f'}, + {"summary",no_argument,NULL,'s'}, + {"luma-only",no_argument,NULL,'y'}, + {NULL,0,NULL,0} +}; + +static int show_frame_type; +static int summary_only; +static int luma_only; + +typedef struct y4m_input y4m_input; + +/*The function used to perform chroma conversion.*/ +typedef void (*y4m_convert_func)(y4m_input *_y4m, + unsigned char *_dst,unsigned char *_aux); + +struct y4m_input{ + int frame_w; + int frame_h; + int pic_w; + int pic_h; + int pic_x; + int pic_y; + int fps_n; + int fps_d; + int par_n; + int par_d; + char interlace; + int src_c_dec_h; + int src_c_dec_v; + int dst_c_dec_h; + int dst_c_dec_v; + char chroma_type[16]; + /*The size of each converted frame buffer.*/ + size_t dst_buf_sz; + /*The amount to read directly into the converted frame buffer.*/ + size_t dst_buf_read_sz; + /*The size of the auxilliary buffer.*/ + size_t aux_buf_sz; + /*The amount to read into the auxilliary buffer.*/ + size_t aux_buf_read_sz; + y4m_convert_func convert; + unsigned char *dst_buf; + unsigned char *aux_buf; +}; + + +static int y4m_parse_tags(y4m_input *_y4m,char *_tags){ + int got_w; + int got_h; + int got_fps; + int got_interlace; + int got_par; + int got_chroma; + char *p; + char *q; + got_w=got_h=got_fps=got_interlace=got_par=got_chroma=0; + for(p=_tags;;p=q){ + /*Skip any leading spaces.*/ + while(*p==' ')p++; + /*If that's all we have, stop.*/ + if(p[0]=='\0')break; + /*Find the end of this tag.*/ + for(q=p+1;*q!='\0'&&*q!=' ';q++); + /*Process the tag.*/ + switch(p[0]){ + case 'W':{ + if(sscanf(p+1,"%d",&_y4m->pic_w)!=1)return -1; + got_w=1; + }break; + case 'H':{ + if(sscanf(p+1,"%d",&_y4m->pic_h)!=1)return -1; + got_h=1; + }break; + case 'F':{ + if(sscanf(p+1,"%d:%d",&_y4m->fps_n,&_y4m->fps_d)!=2){ + return -1; + } + got_fps=1; + }break; + case 'I':{ + _y4m->interlace=p[1]; + got_interlace=1; + }break; + case 'A':{ + if(sscanf(p+1,"%d:%d",&_y4m->par_n,&_y4m->par_d)!=2){ + return -1; + } + got_par=1; + }break; + case 'C':{ + if(q-p>16)return -1; + memcpy(_y4m->chroma_type,p+1,q-p-1); + _y4m->chroma_type[q-p-1]='\0'; + got_chroma=1; + }break; + /*Ignore unknown tags.*/ + } + } + if(!got_w||!got_h||!got_fps||!got_interlace||!got_par)return -1; + /*Chroma-type is not specified in older files, e.g., those generated by + mplayer.*/ + if(!got_chroma)strcpy(_y4m->chroma_type,"420"); + return 0; +} + +/*All anti-aliasing filters in the following conversion functions are based on + one of two window functions: + The 6-tap Lanczos window (for down-sampling and shifts): + sinc(\pi*t)*sinc(\pi*t/3), |t|<3 (sinc(t)==sin(t)/t) + 0, |t|>=3 + The 4-tap Mitchell window (for up-sampling): + 7|t|^3-12|t|^2+16/3, |t|<1 + -(7/3)|x|^3+12|x|^2-20|x|+32/3, |t|<2 + 0, |t|>=2 + The number of taps is intentionally kept small to reduce computational + overhead and limit ringing. + + The taps from these filters are scaled so that their sum is 1, and the result + is scaled by 128 and rounded to integers to create a filter whose + intermediate values fit inside 16 bits. + Coefficients are rounded in such a way as to ensure their sum is still 128, + which is usually equivalent to normal rounding.*/ + +#define OC_MINI(_a,_b) ((_a)>(_b)?(_b):(_a)) +#define OC_MAXI(_a,_b) ((_a)<(_b)?(_b):(_a)) +#define OC_CLAMPI(_a,_b,_c) (OC_MAXI(_a,OC_MINI(_b,_c))) + +/*420jpeg chroma samples are sited like: + Y-------Y-------Y-------Y------- + | | | | + | BR | | BR | + | | | | + Y-------Y-------Y-------Y------- + | | | | + | | | | + | | | | + Y-------Y-------Y-------Y------- + | | | | + | BR | | BR | + | | | | + Y-------Y-------Y-------Y------- + | | | | + | | | | + | | | | + + 420mpeg2 chroma samples are sited like: + Y-------Y-------Y-------Y------- + | | | | + BR | BR | + | | | | + Y-------Y-------Y-------Y------- + | | | | + | | | | + | | | | + Y-------Y-------Y-------Y------- + | | | | + BR | BR | + | | | | + Y-------Y-------Y-------Y------- + | | | | + | | | | + | | | | + + We use a resampling filter to shift the site locations one quarter pixel (at + the chroma plane's resolution) to the right. + The 4:2:2 modes look exactly the same, except there are twice as many chroma + lines, and they are vertically co-sited with the luma samples in both the + mpeg2 and jpeg cases (thus requiring no vertical resampling).*/ +static void y4m_convert_42xmpeg2_42xjpeg(y4m_input *_y4m,unsigned char *_dst, + unsigned char *_aux){ + int c_w; + int c_h; + int pli; + int y; + int x; + /*Skip past the luma data.*/ + _dst+=_y4m->pic_w*_y4m->pic_h; + /*Compute the size of each chroma plane.*/ + c_w=(_y4m->pic_w+_y4m->dst_c_dec_h-1)/_y4m->dst_c_dec_h; + c_h=(_y4m->pic_h+_y4m->dst_c_dec_v-1)/_y4m->dst_c_dec_v; + for(pli=1;pli<3;pli++){ + for(y=0;y>7,255); + } + for(;x>7,255); + } + for(;x>7,255); + } + _dst+=c_w; + _aux+=c_w; + } + } +} + +/*This format is only used for interlaced content, but is included for + completeness. + + 420jpeg chroma samples are sited like: + Y-------Y-------Y-------Y------- + | | | | + | BR | | BR | + | | | | + Y-------Y-------Y-------Y------- + | | | | + | | | | + | | | | + Y-------Y-------Y-------Y------- + | | | | + | BR | | BR | + | | | | + Y-------Y-------Y-------Y------- + | | | | + | | | | + | | | | + + 420paldv chroma samples are sited like: + YR------Y-------YR------Y------- + | | | | + | | | | + | | | | + YB------Y-------YB------Y------- + | | | | + | | | | + | | | | + YR------Y-------YR------Y------- + | | | | + | | | | + | | | | + YB------Y-------YB------Y------- + | | | | + | | | | + | | | | + + We use a resampling filter to shift the site locations one quarter pixel (at + the chroma plane's resolution) to the right. + Then we use another filter to move the C_r location down one quarter pixel, + and the C_b location up one quarter pixel.*/ +static void y4m_convert_42xpaldv_42xjpeg(y4m_input *_y4m,unsigned char *_dst, + unsigned char *_aux){ + unsigned char *tmp; + int c_w; + int c_h; + int c_sz; + int pli; + int y; + int x; + /*Skip past the luma data.*/ + _dst+=_y4m->pic_w*_y4m->pic_h; + /*Compute the size of each chroma plane.*/ + c_w=(_y4m->pic_w+1)/2; + c_h=(_y4m->pic_h+_y4m->dst_c_dec_h-1)/_y4m->dst_c_dec_h; + c_sz=c_w*c_h; + /*First do the horizontal re-sampling. + This is the same as the mpeg2 case, except that after the horizontal case, + we need to apply a second vertical filter.*/ + tmp=_aux+2*c_sz; + for(pli=1;pli<3;pli++){ + for(y=0;y>7,255); + } + for(;x>7,255); + } + for(;x>7,255); + } + tmp+=c_w; + _aux+=c_w; + } + switch(pli){ + case 1:{ + tmp-=c_sz; + /*Slide C_b up a quarter-pel. + This is the same filter used above, but in the other order.*/ + for(x=0;x>7,255); + } + for(;y>7,255); + } + for(;y>7,255); + } + _dst++; + tmp++; + } + _dst+=c_sz-c_w; + tmp-=c_w; + }break; + case 2:{ + tmp-=c_sz; + /*Slide C_r down a quarter-pel. + This is the same as the horizontal filter.*/ + for(x=0;x>7,255); + } + for(;y>7,255); + } + for(;y>7,255); + } + _dst++; + tmp++; + } + }break; + } + /*For actual interlaced material, this would have to be done separately on + each field, and the shift amounts would be different. + C_r moves down 1/8, C_b up 3/8 in the top field, and C_r moves down 3/8, + C_b up 1/8 in the bottom field. + The corresponding filters would be: + Down 1/8 (reverse order for up): [3 -11 125 15 -4 0]/128 + Down 3/8 (reverse order for up): [4 -19 98 56 -13 2]/128*/ + } +} + +/*422jpeg chroma samples are sited like: + Y---BR--Y-------Y---BR--Y------- + | | | | + | | | | + | | | | + Y---BR--Y-------Y---BR--Y------- + | | | | + | | | | + | | | | + Y---BR--Y-------Y---BR--Y------- + | | | | + | | | | + | | | | + Y---BR--Y-------Y---BR--Y------- + | | | | + | | | | + | | | | + + 411 chroma samples are sited like: + YBR-----Y-------Y-------Y------- + | | | | + | | | | + | | | | + YBR-----Y-------Y-------Y------- + | | | | + | | | | + | | | | + YBR-----Y-------Y-------Y------- + | | | | + | | | | + | | | | + YBR-----Y-------Y-------Y------- + | | | | + | | | | + | | | | + + We use a filter to resample at site locations one eighth pixel (at the source + chroma plane's horizontal resolution) and five eighths of a pixel to the + right.*/ +static void y4m_convert_411_422jpeg(y4m_input *_y4m,unsigned char *_dst, + unsigned char *_aux){ + int c_w; + int dst_c_w; + int c_h; + int pli; + int y; + int x; + /*Skip past the luma data.*/ + _dst+=_y4m->pic_w*_y4m->pic_h; + /*Compute the size of each chroma plane.*/ + c_w=(_y4m->pic_w+_y4m->src_c_dec_h-1)/_y4m->src_c_dec_h; + dst_c_w=(_y4m->pic_w+_y4m->dst_c_dec_h-1)/_y4m->dst_c_dec_h; + c_h=(_y4m->pic_h+_y4m->dst_c_dec_v-1)/_y4m->dst_c_dec_v; + for(pli=1;pli<3;pli++){ + for(y=0;y>7,255); + _dst[x<<1|1]=(unsigned char)OC_CLAMPI(0,47*_aux[0]+ + 86*_aux[OC_MINI(1,c_w-1)]-5*_aux[OC_MINI(2,c_w-1)]+64>>7,255); + } + for(;x>7,255); + _dst[x<<1|1]=(unsigned char)OC_CLAMPI(0,-3*_aux[x-1]+50*_aux[x]+ + 86*_aux[x+1]-5*_aux[x+2]+64>>7,255); + } + for(;x>7,255); + if((x<<1|1)>7,255); + } + } + _dst+=dst_c_w; + _aux+=c_w; + } + } +} + +/*The image is padded with empty chroma components at 4:2:0. + This costs about 17 bits a frame to code.*/ +static void y4m_convert_mono_420jpeg(y4m_input *_y4m,unsigned char *_dst, + unsigned char *_aux){ + int c_sz; + _dst+=_y4m->pic_w*_y4m->pic_h; + c_sz=((_y4m->pic_w+_y4m->dst_c_dec_h-1)/_y4m->dst_c_dec_h)* + ((_y4m->pic_h+_y4m->dst_c_dec_v-1)/_y4m->dst_c_dec_v); + memset(_dst,128,c_sz*2); +} + +#if 0 +/*Right now just 444 to 420. + Not too hard to generalize.*/ +static void y4m_convert_4xxjpeg_42xjpeg(y4m_input *_y4m,unsigned char *_dst, + unsigned char *_aux){ + unsigned char *tmp; + int c_w; + int c_h; + int pic_sz; + int tmp_sz; + int c_sz; + int pli; + int y; + int x; + /*Compute the size of each chroma plane.*/ + c_w=(_y4m->pic_w+_y4m->dst_c_dec_h-1)/_y4m->dst_c_dec_h; + c_h=(_y4m->pic_h+_y4m->dst_c_dec_v-1)/_y4m->dst_c_dec_v; + pic_sz=_y4m->pic_w*_y4m->pic_h; + tmp_sz=c_w*_y4m->pic_h; + c_sz=c_w*c_h; + _dst+=pic_sz; + for(pli=1;pli<3;pli++){ + tmp=_aux+pic_sz; + /*In reality, the horizontal and vertical steps could be pipelined, for + less memory consumption and better cache performance, but we do them + separately for simplicity.*/ + /*First do horizontal filtering (convert to 4:2:2)*/ + /*Filter: [3 -17 78 78 -17 3]/128, derived from a 6-tap Lanczos window.*/ + for(y=0;y<_y4m->pic_h;y++){ + for(x=0;xpic_w,2);x+=2){ + tmp[x>>1]=OC_CLAMPI(0,64*_aux[0]+78*_aux[OC_MINI(1,_y4m->pic_w-1)] + -17*_aux[OC_MINI(2,_y4m->pic_w-1)] + +3*_aux[OC_MINI(3,_y4m->pic_w-1)]+64>>7,255); + } + for(;x<_y4m->pic_w-3;x+=2){ + tmp[x>>1]=OC_CLAMPI(0,3*(_aux[x-2]+_aux[x+3])-17*(_aux[x-1]+_aux[x+2])+ + 78*(_aux[x]+_aux[x+1])+64>>7,255); + } + for(;x<_y4m->pic_w;x+=2){ + tmp[x>>1]=OC_CLAMPI(0,3*(_aux[x-2]+_aux[_y4m->pic_w-1])- + 17*(_aux[x-1]+_aux[OC_MINI(x+2,_y4m->pic_w-1)])+ + 78*(_aux[x]+_aux[OC_MINI(x+1,_y4m->pic_w-1)])+64>>7,255); + } + tmp+=c_w; + _aux+=_y4m->pic_w; + } + _aux-=pic_sz; + tmp-=tmp_sz; + /*Now do the vertical filtering.*/ + for(x=0;xpic_h,2);y+=2){ + _dst[(y>>1)*c_w]=OC_CLAMPI(0,64*tmp[0] + +78*tmp[OC_MINI(1,_y4m->pic_h-1)*c_w] + -17*tmp[OC_MINI(2,_y4m->pic_h-1)*c_w] + +3*tmp[OC_MINI(3,_y4m->pic_h-1)*c_w]+64>>7,255); + } + for(;y<_y4m->pic_h-3;y+=2){ + _dst[(y>>1)*c_w]=OC_CLAMPI(0,3*(tmp[(y-2)*c_w]+tmp[(y+3)*c_w])- + 17*(tmp[(y-1)*c_w]+tmp[(y+2)*c_w])+78*(tmp[y*c_w]+tmp[(y+1)*c_w])+ + 64>>7,255); + } + for(;y<_y4m->pic_h;y+=2){ + _dst[(y>>1)*c_w]=OC_CLAMPI(0,3*(tmp[(y-2)*c_w] + +tmp[(_y4m->pic_h-1)*c_w])-17*(tmp[(y-1)*c_w] + +tmp[OC_MINI(y+2,_y4m->pic_h-1)*c_w]) + +78*(tmp[y*c_w]+tmp[OC_MINI(y+1,_y4m->pic_h-1)*c_w])+64>>7,255); + } + tmp++; + _dst++; + } + _dst-=c_w; + } +} +#endif + +/*No conversion function needed.*/ +static void y4m_convert_null(y4m_input *_y4m,unsigned char *_dst, + unsigned char *_aux){ +} + +static int y4m_input_open(y4m_input *_y4m,FILE *_fin,char *_skip,int _nskip){ + char buffer[80]; + int ret; + int i; + /*Read until newline, or 80 cols, whichever happens first.*/ + for(i=0;i<79;i++){ + if(_nskip>0){ + buffer[i]=*_skip++; + _nskip--; + } + else{ + ret=fread(buffer+i,1,1,_fin); + if(ret<1)return -1; + } + if(buffer[i]=='\n')break; + } + /*We skipped too much header data.*/ + if(_nskip>0)return -1; + if(i==79){ + fprintf(stderr,"Error parsing header; not a YUV2MPEG2 file?\n"); + return -1; + } + buffer[i]='\0'; + if(memcmp(buffer,"YUV4MPEG",8)){ + fprintf(stderr,"Incomplete magic for YUV4MPEG file.\n"); + return -1; + } + if(buffer[8]!='2'){ + fprintf(stderr,"Incorrect YUV input file version; YUV4MPEG2 required.\n"); + } + ret=y4m_parse_tags(_y4m,buffer+5); + if(ret<0){ + fprintf(stderr,"Error parsing YUV4MPEG2 header.\n"); + return ret; + } + if(_y4m->interlace!='p'){ + fprintf(stderr,"Input video is interlaced; " + "Theora only handles progressive scan.\n"); + return -1; + } + if(strcmp(_y4m->chroma_type,"420")==0|| + strcmp(_y4m->chroma_type,"420jpeg")==0){ + _y4m->src_c_dec_h=_y4m->dst_c_dec_h=_y4m->src_c_dec_v=_y4m->dst_c_dec_v=2; + _y4m->dst_buf_read_sz=_y4m->pic_w*_y4m->pic_h + +2*((_y4m->pic_w+1)/2)*((_y4m->pic_h+1)/2); + /*Natively supported: no conversion required.*/ + _y4m->aux_buf_sz=_y4m->aux_buf_read_sz=0; + _y4m->convert=y4m_convert_null; + } + else if(strcmp(_y4m->chroma_type,"420mpeg2")==0){ + _y4m->src_c_dec_h=_y4m->dst_c_dec_h=_y4m->src_c_dec_v=_y4m->dst_c_dec_v=2; + _y4m->dst_buf_read_sz=_y4m->pic_w*_y4m->pic_h; + /*Chroma filter required: read into the aux buf first.*/ + _y4m->aux_buf_sz=_y4m->aux_buf_read_sz= + 2*((_y4m->pic_w+1)/2)*((_y4m->pic_h+1)/2); + _y4m->convert=y4m_convert_42xmpeg2_42xjpeg; + } + else if(strcmp(_y4m->chroma_type,"420paldv")==0){ + _y4m->src_c_dec_h=_y4m->dst_c_dec_h=_y4m->src_c_dec_v=_y4m->dst_c_dec_v=2; + _y4m->dst_buf_read_sz=_y4m->pic_w*_y4m->pic_h; + /*Chroma filter required: read into the aux buf first. + We need to make two filter passes, so we need some extra space in the + aux buffer.*/ + _y4m->aux_buf_sz=3*((_y4m->pic_w+1)/2)*((_y4m->pic_h+1)/2); + _y4m->aux_buf_read_sz=2*((_y4m->pic_w+1)/2)*((_y4m->pic_h+1)/2); + _y4m->convert=y4m_convert_42xpaldv_42xjpeg; + } + else if(strcmp(_y4m->chroma_type,"422")==0){ + _y4m->src_c_dec_h=_y4m->dst_c_dec_h=2; + _y4m->src_c_dec_v=_y4m->dst_c_dec_v=1; + _y4m->dst_buf_read_sz=_y4m->pic_w*_y4m->pic_h; + /*Chroma filter required: read into the aux buf first.*/ + _y4m->aux_buf_sz=_y4m->aux_buf_read_sz=2*((_y4m->pic_w+1)/2)*_y4m->pic_h; + _y4m->convert=y4m_convert_42xmpeg2_42xjpeg; + } + else if(strcmp(_y4m->chroma_type,"422jpeg")==0){ + _y4m->src_c_dec_h=_y4m->dst_c_dec_h=2; + _y4m->src_c_dec_v=_y4m->dst_c_dec_v=1; + _y4m->dst_buf_read_sz=_y4m->pic_w*_y4m->pic_h + +2*((_y4m->pic_w+1)/2)*_y4m->pic_h; + /*Natively supported: no conversion required.*/ + _y4m->aux_buf_sz=_y4m->aux_buf_read_sz=0; + _y4m->convert=y4m_convert_null; + } + else if(strcmp(_y4m->chroma_type,"411")==0){ + _y4m->src_c_dec_h=4; + /*We don't want to introduce any additional sub-sampling, so we + promote 4:1:1 material to 4:2:2, as the closest format Theora can + handle.*/ + _y4m->dst_c_dec_h=2; + _y4m->src_c_dec_v=_y4m->dst_c_dec_v=1; + _y4m->dst_buf_read_sz=_y4m->pic_w*_y4m->pic_h; + /*Chroma filter required: read into the aux buf first.*/ + _y4m->aux_buf_sz=_y4m->aux_buf_read_sz=2*((_y4m->pic_w+3)/4)*_y4m->pic_h; + _y4m->convert=y4m_convert_411_422jpeg; + } + else if(strcmp(_y4m->chroma_type,"444")==0){ + _y4m->src_c_dec_h=_y4m->dst_c_dec_h=_y4m->src_c_dec_v=_y4m->dst_c_dec_v=1; + _y4m->dst_buf_read_sz=_y4m->pic_w*_y4m->pic_h*3; + /*Natively supported: no conversion required.*/ + _y4m->aux_buf_sz=_y4m->aux_buf_read_sz=0; + _y4m->convert=y4m_convert_null; + } + else if(strcmp(_y4m->chroma_type,"444alpha")==0){ + _y4m->src_c_dec_h=_y4m->dst_c_dec_h=_y4m->src_c_dec_v=_y4m->dst_c_dec_v=1; + _y4m->dst_buf_read_sz=_y4m->pic_w*_y4m->pic_h*3; + /*Read the extra alpha plane into the aux buf. + It will be discarded.*/ + _y4m->aux_buf_sz=_y4m->aux_buf_read_sz=_y4m->pic_w*_y4m->pic_h; + _y4m->convert=y4m_convert_null; + } + else if(strcmp(_y4m->chroma_type,"mono")==0){ + _y4m->src_c_dec_h=_y4m->src_c_dec_v=0; + _y4m->dst_c_dec_h=_y4m->dst_c_dec_v=2; + _y4m->dst_buf_read_sz=_y4m->pic_w*_y4m->pic_h; + /*No extra space required, but we need to clear the chroma planes.*/ + _y4m->aux_buf_sz=_y4m->aux_buf_read_sz=0; + _y4m->convert=y4m_convert_mono_420jpeg; + } + else{ + fprintf(stderr,"Unknown chroma sampling type: %s\n",_y4m->chroma_type); + return -1; + } + /*The size of the final frame buffers is always computed from the + destination chroma decimation type.*/ + _y4m->dst_buf_sz=_y4m->pic_w*_y4m->pic_h + +2*((_y4m->pic_w+_y4m->dst_c_dec_h-1)/_y4m->dst_c_dec_h)* + ((_y4m->pic_h+_y4m->dst_c_dec_v-1)/_y4m->dst_c_dec_v); + /*Scale the picture size up to a multiple of 16.*/ + _y4m->frame_w=_y4m->pic_w+15&~0xF; + _y4m->frame_h=_y4m->pic_h+15&~0xF; + /*Force the offsets to be even so that chroma samples line up like we + expect.*/ + _y4m->pic_x=_y4m->frame_w-_y4m->pic_w>>1&~1; + _y4m->pic_y=_y4m->frame_h-_y4m->pic_h>>1&~1; + _y4m->dst_buf=(unsigned char *)malloc(_y4m->dst_buf_sz); + _y4m->aux_buf=(unsigned char *)malloc(_y4m->aux_buf_sz); + return 0; +} + +static void y4m_input_get_info(y4m_input *_y4m,th_info *_ti){ + _ti->frame_width=_y4m->frame_w; + _ti->frame_height=_y4m->frame_h; + _ti->pic_width=_y4m->pic_w; + _ti->pic_height=_y4m->pic_h; + _ti->pic_x=_y4m->pic_x; + _ti->pic_y=_y4m->pic_y; + _ti->fps_numerator=_y4m->fps_n; + _ti->fps_denominator=_y4m->fps_d; + _ti->aspect_numerator=_y4m->par_n; + _ti->aspect_denominator=_y4m->par_d; + _ti->pixel_fmt=_y4m->dst_c_dec_h==2? + (_y4m->dst_c_dec_v==2?TH_PF_420:TH_PF_422):TH_PF_444; +} + +static int y4m_input_fetch_frame(y4m_input *_y4m,FILE *_fin, + th_ycbcr_buffer _ycbcr){ + char frame[6]; + int pic_sz; + int frame_c_w; + int frame_c_h; + int c_w; + int c_h; + int c_sz; + int ret; + pic_sz=_y4m->pic_w*_y4m->pic_h; + frame_c_w=_y4m->frame_w/_y4m->dst_c_dec_h; + frame_c_h=_y4m->frame_h/_y4m->dst_c_dec_v; + c_w=(_y4m->pic_w+_y4m->dst_c_dec_h-1)/_y4m->dst_c_dec_h; + c_h=(_y4m->pic_h+_y4m->dst_c_dec_v-1)/_y4m->dst_c_dec_v; + c_sz=c_w*c_h; + /*Read and skip the frame header.*/ + ret=fread(frame,1,6,_fin); + if(ret<6)return 0; + if(memcmp(frame,"FRAME",5)){ + fprintf(stderr,"Loss of framing in YUV input data\n"); + exit(1); + } + if(frame[5]!='\n'){ + char c; + int j; + for(j=0;j<79&&fread(&c,1,1,_fin)&&c!='\n';j++); + if(j==79){ + fprintf(stderr,"Error parsing YUV frame header\n"); + return -1; + } + } + /*Read the frame data that needs no conversion.*/ + if(fread(_y4m->dst_buf,1,_y4m->dst_buf_read_sz,_fin)!=_y4m->dst_buf_read_sz){ + fprintf(stderr,"Error reading YUV frame data.\n"); + return -1; + } + /*Read the frame data that does need conversion.*/ + if(fread(_y4m->aux_buf,1,_y4m->aux_buf_read_sz,_fin)!=_y4m->aux_buf_read_sz){ + fprintf(stderr,"Error reading YUV frame data.\n"); + return -1; + } + /*Now convert the just read frame.*/ + (*_y4m->convert)(_y4m,_y4m->dst_buf,_y4m->aux_buf); + /*Fill in the frame buffer pointers.*/ + _ycbcr[0].width=_y4m->frame_w; + _ycbcr[0].height=_y4m->frame_h; + _ycbcr[0].stride=_y4m->pic_w; + _ycbcr[0].data=_y4m->dst_buf-_y4m->pic_x-_y4m->pic_y*_y4m->pic_w; + _ycbcr[1].width=frame_c_w; + _ycbcr[1].height=frame_c_h; + _ycbcr[1].stride=c_w; + _ycbcr[1].data=_y4m->dst_buf+pic_sz-(_y4m->pic_x/_y4m->dst_c_dec_h)- + (_y4m->pic_y/_y4m->dst_c_dec_v)*c_w; + _ycbcr[2].width=frame_c_w; + _ycbcr[2].height=frame_c_h; + _ycbcr[2].stride=c_w; + _ycbcr[2].data=_ycbcr[1].data+c_sz; + return 1; +} + +static void y4m_input_close(y4m_input *_y4m){ + free(_y4m->dst_buf); + free(_y4m->aux_buf); +} + + + +typedef struct th_input th_input; + +struct th_input{ + ogg_sync_state oy; + int theora_p; + ogg_stream_state to; + th_info ti; + th_comment tc; + th_dec_ctx *td; +}; + + + +/*Grab some more compressed bitstream and sync it for page extraction.*/ +static int th_input_buffer_data(th_input *_th,FILE *_fin){ + char *buffer; + int bytes; + buffer=ogg_sync_buffer(&_th->oy,4096); + bytes=fread(buffer,1,4096,_fin); + ogg_sync_wrote(&_th->oy,bytes); + return bytes; +} + +/*Push a page into the appropriate steam. + This can be done blindly; a stream won't accept a page that doesn't belong to + it.*/ +static void th_input_queue_page(th_input *_th,ogg_page *_og){ + if(_th->theora_p)ogg_stream_pagein(&_th->to,_og); +} + +static int th_input_open_impl(th_input *_th,th_setup_info **_ts,FILE *_fin, + char *_sig,int _nsig){ + ogg_packet op; + ogg_page og; + int nheaders_left; + int done_headers; + ogg_sync_init(&_th->oy); + th_info_init(&_th->ti); + th_comment_init(&_th->tc); + *_ts=NULL; + /*Buffer any initial data read for file ID.*/ + if(_nsig>0){ + char *buffer; + buffer=ogg_sync_buffer(&_th->oy,_nsig); + memcpy(buffer,_sig,_nsig); + ogg_sync_wrote(&_th->oy,_nsig); + } + _th->theora_p=0; + nheaders_left=0; + for(done_headers=0;!done_headers;){ + if(th_input_buffer_data(_th,_fin)==0)break; + while(ogg_sync_pageout(&_th->oy,&og)>0){ + ogg_stream_state test; + /*Is this a mandated initial header? + If not, stop parsing.*/ + if(!ogg_page_bos(&og)){ + /*Don't leak the page; get it into the appropriate stream.*/ + th_input_queue_page(_th,&og); + done_headers=1; + break; + } + ogg_stream_init(&test,ogg_page_serialno(&og)); + ogg_stream_pagein(&test,&og); + ogg_stream_packetpeek(&test,&op); + /*Identify the codec: try Theora.*/ + if(!_th->theora_p){ + nheaders_left=th_decode_headerin(&_th->ti,&_th->tc,_ts,&op); + if(nheaders_left>=0){ + /*It is Theora.*/ + memcpy(&_th->to,&test,sizeof(test)); + _th->theora_p=1; + /*Advance past the successfully processed header.*/ + if(nheaders_left>0)ogg_stream_packetout(&_th->to,NULL); + continue; + } + } + /*Whatever it is, we don't care about it.*/ + ogg_stream_clear(&test); + } + } + /*We're expecting more header packets.*/ + while(_th->theora_p&&nheaders_left>0){ + int ret; + while(nheaders_left>0){ + ret=ogg_stream_packetpeek(&_th->to,&op); + if(ret==0)break; + if(ret<0)continue; + nheaders_left=th_decode_headerin(&_th->ti,&_th->tc,_ts,&op); + if(nheaders_left<0){ + fprintf(stderr,"Error parsing Theora stream headers; " + "corrupt stream?\n"); + return -1; + } + /*Advance past the successfully processed header.*/ + else if(nheaders_left>0)ogg_stream_packetout(&_th->to,NULL); + _th->theora_p++; + } + /*Stop now so we don't fail if there aren't enough pages in a short + stream.*/ + if(!(_th->theora_p&&nheaders_left>0))break; + /*The header pages/packets will arrive before anything else we care + about, or the stream is not obeying spec.*/ + if(ogg_sync_pageout(&_th->oy,&og)>0)th_input_queue_page(_th,&og); + /*We need more data.*/ + else if(th_input_buffer_data(_th,_fin)==0){ + fprintf(stderr,"End of file while searching for codec headers.\n"); + return -1; + } + } + /*And now we have it all. + Initialize the decoder.*/ + if(_th->theora_p){ + _th->td=th_decode_alloc(&_th->ti,*_ts); + if(_th->td!=NULL){ + fprintf(stderr,"Ogg logical stream %lx is Theora %ix%i %.02f fps video.\n" + "Encoded frame content is %ix%i with %ix%i offset.\n", + _th->to.serialno,_th->ti.frame_width,_th->ti.frame_height, + (double)_th->ti.fps_numerator/_th->ti.fps_denominator, + _th->ti.pic_width,_th->ti.pic_height,_th->ti.pic_x,_th->ti.pic_y); + return 1; + } + } + return -1; +} + +static void th_input_close(th_input *_th){ + if(_th->theora_p){ + ogg_stream_clear(&_th->to); + th_decode_free(_th->td); + } + th_comment_clear(&_th->tc); + th_info_clear(&_th->ti); + ogg_sync_clear(&_th->oy); +} + +static int th_input_open(th_input *_th,FILE *_fin,char *_sig,int _nsig){ + th_input th; + th_setup_info *ts; + int ret; + ret=th_input_open_impl(&th,&ts,_fin,_sig,_nsig); + th_setup_free(ts); + /*Clean up on failure.*/ + if(ret<0)th_input_close(&th); + else memcpy(_th,&th,sizeof(th)); + return ret; +} + +static void th_input_get_info(th_input *_th,th_info *_ti){ + memcpy(_ti,&_th->ti,sizeof(*_ti)); +} + +static int th_input_fetch_frame(th_input *_th,FILE *_fin, + th_ycbcr_buffer _ycbcr){ + for(;;){ + ogg_page og; + ogg_packet op; + if(ogg_stream_packetout(&_th->to,&op)>0){ + if(th_decode_packetin(_th->td,&op,NULL)>=0){ + th_decode_ycbcr_out(_th->td,_ycbcr); + if(!summary_only&&show_frame_type){ + printf("%c",th_packet_iskeyframe(&op)?'K':'D'); + if(op.bytes>0)printf("%02i ",op.packet[0]&0x3F); + else printf("-- "); + } + return 1; + } + else return -1; + } + while(ogg_sync_pageout(&_th->oy,&og)<=0){ + if(th_input_buffer_data(_th,_fin)==0)return feof(_fin)?0:-1; + } + th_input_queue_page(_th,&og); + } +} + + + +typedef struct video_input video_input; +typedef void (*video_input_get_info_func)(void *_ctx,th_info *_ti); +typedef int (*video_input_fetch_frame_func)(void *_ctx,FILE *_fin, + th_ycbcr_buffer _ycbcr); +typedef void (*video_input_close_func)(void *_ctx); + +struct video_input{ + FILE *fin; + video_input_get_info_func get_info; + video_input_fetch_frame_func fetch_frame; + video_input_close_func close; + union{ + y4m_input y4m; + th_input th; + }ctx; +}; + +static int video_input_open(video_input *_vid,FILE *_fin){ + char buffer[4]; + int ret; + /* look for magic */ + ret=fread(buffer,1,4,_fin); + if(ret<4)fprintf(stderr,"EOF determining file type of file.\n"); + else{ + if(!memcmp(buffer,"YUV4",4)){ + if(y4m_input_open(&_vid->ctx.y4m,_fin,buffer,4)>=0){ + /*fprintf(stderr,"Original %s is %dx%d %.02f fps %s video.\n", + f,_y4m->pic_w,_y4m->pic_h,(double)_y4m->fps_n/_y4m->fps_d,_y4m->chroma_type);*/ + _vid->fin=_fin; + _vid->get_info=(video_input_get_info_func)y4m_input_get_info; + _vid->fetch_frame=(video_input_fetch_frame_func)y4m_input_fetch_frame; + _vid->close=(video_input_close_func)y4m_input_close; + return 0; + } + } + else if(!memcmp(buffer,"OggS",4)){ + if(th_input_open(&_vid->ctx.th,_fin,buffer,4)>=0){ + _vid->fin=_fin; + _vid->get_info=(video_input_get_info_func)th_input_get_info; + _vid->fetch_frame=(video_input_fetch_frame_func)th_input_fetch_frame; + _vid->close=(video_input_close_func)th_input_close; + return 0; + } + } + else fprintf(stderr,"Unknown file type.\n"); + } + return -1; +} + +static void video_input_get_info(video_input *_vid,th_info *_ti){ + (*_vid->get_info)(&_vid->ctx,_ti); +} + +static int video_input_fetch_frame(video_input *_vid,th_ycbcr_buffer _ycbcr){ + return (*_vid->fetch_frame)(&_vid->ctx,_vid->fin,_ycbcr); +} + +static void video_input_close(video_input *_vid){ + (*_vid->close)(&_vid->ctx); + fclose(_vid->fin); +} + + + +static void usage(char *_argv[]){ + fprintf(stderr,"Usage: %s [options] \n" + " and may be either YUV4MPEG or Ogg Theora files.\n\n" + " Options:\n\n" + " -f --frame-type Show frame type and QI value for each Theora frame.\n" + " -s --summary Only output the summary line.\n" + " -y --luma-only Only output values for the luma channel.\n",_argv[0]); +} + +int main(int _argc,char *_argv[]){ + video_input vid1; + th_info ti1; + video_input vid2; + th_info ti2; + ogg_int64_t gsqerr; + ogg_int64_t gnpixels; + ogg_int64_t gplsqerr[3]; + ogg_int64_t gplnpixels[3]; + int frameno; + FILE *fin; + int long_option_index; + int c; +#ifdef _WIN32 + /*We need to set stdin/stdout to binary mode on windows. + Beware the evil ifdef. + We avoid these where we can, but this one we cannot. + Don't add any more, you'll probably go to hell if you do.*/ + _setmode(_fileno(stdin),_O_BINARY); +#endif + /*Process option arguments.*/ + while((c=getopt_long(_argc,_argv,optstring,options,&long_option_index))!=EOF){ + switch(c){ + case 'f':show_frame_type=1;break; + case 's':summary_only=1;break; + case 'y':luma_only=1;break; + default:usage(_argv);break; + } + } + if(optind+2!=_argc){ + usage(_argv); + exit(1); + } + fin=strcmp(_argv[optind],"-")==0?stdin:fopen(_argv[optind],"rb"); + if(fin==NULL){ + fprintf(stderr,"Unable to open '%s' for extraction.\n",_argv[optind]); + exit(1); + } + fprintf(stderr,"Opening %s...\n",_argv[optind]); + if(video_input_open(&vid1,fin)<0)exit(1); + video_input_get_info(&vid1,&ti1); + fin=strcmp(_argv[optind+1],"-")==0?stdin:fopen(_argv[optind+1],"rb"); + if(fin==NULL){ + fprintf(stderr,"Unable to open '%s' for extraction.\n",_argv[optind+1]); + exit(1); + } + fprintf(stderr,"Opening %s...\n",_argv[optind+1]); + if(video_input_open(&vid2,fin)<0)exit(1); + video_input_get_info(&vid2,&ti2); + /*Check to make sure these videos are compatible.*/ + if(ti1.pic_width!=ti2.pic_width||ti1.pic_height!=ti2.pic_height){ + fprintf(stderr,"Video resolution does not match.\n"); + exit(1); + } + if(ti1.pixel_fmt!=ti2.pixel_fmt){ + fprintf(stderr,"Pixel formats do not match.\n"); + exit(1); + } + if((ti1.pic_x&!(ti1.pixel_fmt&1))!=(ti2.pic_x&!(ti2.pixel_fmt&1))|| + (ti1.pic_y&!(ti1.pixel_fmt&2))!=(ti2.pic_y&!(ti2.pixel_fmt&2))){ + fprintf(stderr,"Chroma subsampling offsets do not match.\n"); + exit(1); + } + if(ti1.fps_numerator*(ogg_int64_t)ti2.fps_denominator!= + ti2.fps_numerator*(ogg_int64_t)ti1.fps_denominator){ + fprintf(stderr,"Warning: framerates do not match.\n"); + } + if(ti1.aspect_numerator*(ogg_int64_t)ti2.aspect_denominator!= + ti2.aspect_numerator*(ogg_int64_t)ti1.aspect_denominator){ + fprintf(stderr,"Warning: aspect ratios do not match.\n"); + } + gsqerr=gplsqerr[0]=gplsqerr[1]=gplsqerr[2]=0; + gnpixels=gplnpixels[0]=gplnpixels[1]=gplnpixels[2]=0; + for(frameno=0;;frameno++){ + th_ycbcr_buffer f1; + th_ycbcr_buffer f2; + ogg_int64_t plsqerr[3]; + long plnpixels[3]; + ogg_int64_t sqerr; + long npixels; + int ret1; + int ret2; + int pli; + ret1=video_input_fetch_frame(&vid1,f1); + ret2=video_input_fetch_frame(&vid2,f2); + if(ret1==0&&ret2==0)break; + else if(ret1<0||ret2<0)break; + else if(ret1==0){ + fprintf(stderr,"%s ended before %s.\n", + _argv[optind],_argv[optind+1]); + break; + } + else if(ret2==0){ + fprintf(stderr,"%s ended before %s.\n", + _argv[optind+1],_argv[optind]); + break; + } + /*Okay, we got one frame from each.*/ + sqerr=0; + npixels=0; + for(pli=0;pli<3;pli++){ + int xdec; + int ydec; + int y1; + int y2; + xdec=pli&&!(ti1.pixel_fmt&1); + ydec=pli&&!(ti1.pixel_fmt&2); + plsqerr[pli]=0; + plnpixels[pli]=0; + for(y1=ti1.pic_y>>ydec,y2=ti2.pic_y>>ydec; + y1>ydec;y1++,y2++){ + int x1; + int x2; + for(x1=ti1.pic_x>>xdec,x2=ti2.pic_x>>xdec; + x1>xdec;x1++,x2++){ + int d; + d=*(f1[pli].data+y1*f1[pli].stride+x1)- + *(f2[pli].data+y2*f2[pli].stride+x2); + plsqerr[pli]+=d*d; + plnpixels[pli]++; + } + } + sqerr+=plsqerr[pli]; + gplsqerr[pli]+=plsqerr[pli]; + npixels+=plnpixels[pli]; + gplnpixels[pli]+=plnpixels[pli]; + } + if(!summary_only){ + if(!luma_only){ + printf("%08i: %-7lG (Y': %-7lG Cb: %-7lG Cr: %-7lG)\n",frameno, + 10*(log10(255*255)+log10(npixels)-log10(sqerr)), + 10*(log10(255*255)+log10(plnpixels[0])-log10(plsqerr[0])), + 10*(log10(255*255)+log10(plnpixels[1])-log10(plsqerr[1])), + 10*(log10(255*255)+log10(plnpixels[2])-log10(plsqerr[2]))); + } + else{ + printf("%08i: %-7lG\n",frameno, + 10*(log10(255*255)+log10(plnpixels[0])-log10(plsqerr[0]))); + } + } + gsqerr+=sqerr; + gnpixels+=npixels; + } + if(!luma_only){ + printf("Total: %-7lG (Y': %-7lG Cb: %-7lG Cr: %-7lG)\n", + 10*(log10(255*255)+log10(gnpixels)-log10(gsqerr)), + 10*(log10(255*255)+log10(gplnpixels[0])-log10(gplsqerr[0])), + 10*(log10(255*255)+log10(gplnpixels[1])-log10(gplsqerr[1])), + 10*(log10(255*255)+log10(gplnpixels[2])-log10(gplsqerr[2]))); + } + else{ + printf("Total: %-7lG\n", + 10*(log10(255*255)+log10(gplnpixels[0])-log10(gplsqerr[0]))); + } + video_input_close(&vid1); + video_input_close(&vid2); + return 0; +} diff --git a/cs/3rd party/libtheora/examples/dump_video.c b/cs/3rd party/libtheora/examples/dump_video.c new file mode 100644 index 000000000..a596cb940 --- /dev/null +++ b/cs/3rd party/libtheora/examples/dump_video.c @@ -0,0 +1,565 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggTheora SOFTWARE 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 Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: example dumpvid application; dumps Theora streams + last mod: $Id: dump_video.c,v 1.2 2004/03/24 19:12:42 derf Exp $ + + ********************************************************************/ + +/* By Mauricio Piacentini (mauricio at xiph.org) */ +/* simply dump decoded YUV data, for verification of theora bitstream */ + +#if !defined(_REENTRANT) +#define _REENTRANT +#endif +#if !defined(_GNU_SOURCE) +#define _GNU_SOURCE +#endif +#if !defined(_LARGEFILE_SOURCE) +#define _LARGEFILE_SOURCE +#endif +#if !defined(_LARGEFILE64_SOURCE) +#define _LARGEFILE64_SOURCE +#endif +#if !defined(_FILE_OFFSET_BITS) +#define _FILE_OFFSET_BITS 64 +#endif + +#include +#include +#include +#include +#include +#include +/*Yes, yes, we're going to hell.*/ +#if defined(_WIN32) +#include +#endif +#include +#include +#include +#include +#include "getopt.h" +#include "theora/theoradec.h" + +const char *optstring = "o:crf"; +struct option options [] = { + {"output",required_argument,NULL,'o'}, + {"crop",no_argument,NULL,'c'}, /*Crop down to the picture size.*/ + {"raw",no_argument, NULL,'r'}, /*Disable YUV4MPEG2 headers:*/ + {"fps-only",no_argument, NULL, 'f'}, /* Only interested in fps of decode loop */ + {NULL,0,NULL,0} +}; + +/* Helper; just grab some more compressed bitstream and sync it for + page extraction */ +int buffer_data(FILE *in,ogg_sync_state *oy){ + char *buffer=ogg_sync_buffer(oy,4096); + int bytes=fread(buffer,1,4096,in); + ogg_sync_wrote(oy,bytes); + return(bytes); +} + +/* never forget that globals are a one-way ticket to Hell */ +/* Ogg and codec state for demux/decode */ +ogg_sync_state oy; +ogg_page og; +ogg_stream_state vo; +ogg_stream_state to; +th_info ti; +th_comment tc; +th_setup_info *ts=NULL; +th_dec_ctx *td=NULL; + +int theora_p=0; +int theora_processing_headers; +int stateflag=0; + +/* single frame video buffering */ +int videobuf_ready=0; +ogg_int64_t videobuf_granulepos=-1; +double videobuf_time=0; +int raw=0; +int crop=0; + +FILE* outfile = NULL; + +int got_sigint=0; +static void sigint_handler (int signal) { + got_sigint = 1; +} + +static th_ycbcr_buffer ycbcr; + +static void stripe_decoded(th_ycbcr_buffer _dst,th_ycbcr_buffer _src, + int _fragy0,int _fragy_end){ + int pli; + for(pli=0;pli<3;pli++){ + int yshift; + int y_end; + int y; + yshift=pli!=0&&!(ti.pixel_fmt&2); + y_end=_fragy_end<<3-yshift; + /*An implemention intending to display this data would need to check the + crop rectangle before proceeding.*/ + for(y=_fragy0<<3-yshift;y>xshift)*(ti.frame_height>>yshift)* + sizeof(*ycbcr[pli].data)); + ycbcr[pli].stride=ti.frame_width>>xshift; + ycbcr[pli].width=ti.frame_width>>xshift; + ycbcr[pli].height=ti.frame_height>>yshift; + } + /*Similarly, since ycbcr is a global, there's no real reason to pass it as + the context. + In a more object-oriented decoder, we could pass the "this" pointer + instead (though in C++, platform-dependent calling convention differences + prevent us from using a real member function pointer).*/ + cb.ctx=ycbcr; + cb.stripe_decoded=(th_stripe_decoded_func)stripe_decoded; + th_decode_ctl(td,TH_DECCTL_SET_STRIPE_CB,&cb,sizeof(cb)); +} + +/*Write out the planar YUV frame, uncropped.*/ +static void video_write(void){ + int pli; + int i; + /*Uncomment the following to do normal, non-striped decoding. + th_ycbcr_buffer ycbcr; + th_decode_ycbcr_out(td,ycbcr);*/ + if(outfile){ + int x0; + int y0; + int xend; + int yend; + int hdec; + int vdec; + if(crop){ + x0=ti.pic_x; + y0=ti.pic_y; + xend=x0+ti.pic_width; + yend=y0+ti.pic_height; + } + else{ + x0=y0=0; + xend=ti.frame_width; + yend=ti.frame_height; + } + hdec=vdec=0; + if(!raw)fprintf(outfile, "FRAME\n"); + for(pli=0;pli<3;pli++){ + for(i=y0>>vdec;i<(yend+vdec>>vdec);i++){ + fwrite(ycbcr[pli].data+ycbcr[pli].stride*i+(x0>>hdec), 1, + (xend+hdec>>hdec)-(x0>>hdec), outfile); + } + hdec=!(ti.pixel_fmt&1); + vdec=!(ti.pixel_fmt&2); + } + } +} + +/* dump the theora comment header */ +static int dump_comments(th_comment *_tc){ + int i; + int len; + FILE *out; + out=stderr; + fprintf(out,"Encoded by %s\n",_tc->vendor); + if(_tc->comments){ + fprintf(out,"theora comment header:\n"); + for(i=0;i<_tc->comments;i++){ + if(_tc->user_comments[i]){ + len=_tc->comment_lengths[i]comment_lengths[i]:INT_MAX; + fprintf(out,"\t%.*s\n",len,_tc->user_comments[i]); + } + } + } + return 0; +} + +/* helper: push a page into the appropriate steam */ +/* this can be done blindly; a stream won't accept a page + that doesn't belong to it */ +static int queue_page(ogg_page *page){ + if(theora_p)ogg_stream_pagein(&to,page); + return 0; +} + +static void usage(void){ + fprintf(stderr, + "Usage: dumpvid [options] [] [-o ]\n\n" + "If no input file is given, stdin is used.\n" + "Options:\n\n" + " -o --output File name for decoded output. If\n" + " this option is not given, the\n" + " decompressed data is sent to stdout.\n" + " -c --crop Crop the output to the picture region.\n" + " By default, the entire encoded frame\n" + " is output, including the padding\n" + " require to make the image dimensions\n" + " a multiple of 16.\n" + " -r --raw Output raw YUV with no framing instead\n" + " of YUV4MPEG2 (the default).\n" + " -f --fps-only Only report the decoding frame rate.\n"); + exit(1); +} + +int main(int argc,char *argv[]){ + + ogg_packet op; + + int long_option_index; + int c; + + struct timeb start; + struct timeb after; + struct timeb last; + int fps_only=0; + int frames = 0; + + FILE *infile = stdin; + outfile = stdout; + +#ifdef _WIN32 /* We need to set stdin/stdout to binary mode on windows. */ + /* Beware the evil ifdef. We avoid these where we can, but this one we + cannot. Don't add any more, you'll probably go to hell if you do. */ + _setmode( _fileno( stdin ), _O_BINARY ); + _setmode( _fileno( stdout ), _O_BINARY ); +#endif + + /* Process option arguments. */ + while((c=getopt_long(argc,argv,optstring,options,&long_option_index))!=EOF){ + switch(c){ + case 'o': + if(strcmp(optarg,"-")!=0){ + outfile=fopen(optarg,"wb"); + if(outfile==NULL){ + fprintf(stderr,"Unable to open output file '%s'\n", optarg); + exit(1); + } + }else{ + outfile=stdout; + } + break; + + case 'c': + crop=1; + break; + + case 'r': + raw=1; + break; + + case 'f': + fps_only = 1; + outfile = NULL; + break; + + default: + usage(); + } + } + if(optind0){ + int got_packet; + ogg_stream_state test; + + /* is this a mandated initial header? If not, stop parsing */ + if(!ogg_page_bos(&og)){ + /* don't leak the page; get it into the appropriate stream */ + queue_page(&og); + stateflag=1; + break; + } + + ogg_stream_init(&test,ogg_page_serialno(&og)); + ogg_stream_pagein(&test,&og); + got_packet = ogg_stream_packetpeek(&test,&op); + + /* identify the codec: try theora */ + if((got_packet==1) && !theora_p && (theora_processing_headers= + th_decode_headerin(&ti,&tc,&ts,&op))>=0){ + /* it is theora -- save this stream state */ + memcpy(&to,&test,sizeof(test)); + theora_p=1; + /*Advance past the successfully processed header.*/ + if(theora_processing_headers)ogg_stream_packetout(&to,NULL); + }else{ + /* whatever it is, we don't care about it */ + ogg_stream_clear(&test); + } + } + /* fall through to non-bos page parsing */ + } + + /* we're expecting more header packets. */ + while(theora_p && theora_processing_headers){ + int ret; + + /* look for further theora headers */ + while(theora_processing_headers&&(ret=ogg_stream_packetpeek(&to,&op))){ + if(ret<0)continue; + theora_processing_headers=th_decode_headerin(&ti,&tc,&ts,&op); + if(theora_processing_headers<0){ + fprintf(stderr,"Error parsing Theora stream headers; " + "corrupt stream?\n"); + exit(1); + } + else if(theora_processing_headers>0){ + /*Advance past the successfully processed header.*/ + ogg_stream_packetout(&to,NULL); + } + theora_p++; + } + + /*Stop now so we don't fail if there aren't enough pages in a short + stream.*/ + if(!(theora_p && theora_processing_headers))break; + + /* The header pages/packets will arrive before anything else we + care about, or the stream is not obeying spec */ + + if(ogg_sync_pageout(&oy,&og)>0){ + queue_page(&og); /* demux into the appropriate stream */ + }else{ + int ret=buffer_data(infile,&oy); /* someone needs more data */ + if(ret==0){ + fprintf(stderr,"End of file while searching for codec headers.\n"); + exit(1); + } + } + } + + /* and now we have it all. initialize decoders */ + if(theora_p){ + dump_comments(&tc); + td=th_decode_alloc(&ti,ts); + fprintf(stderr,"Ogg logical stream %lx is Theora %dx%d %.02f fps video\n" + "Encoded frame content is %dx%d with %dx%d offset\n", + to.serialno,ti.frame_width,ti.frame_height, + (double)ti.fps_numerator/ti.fps_denominator, + ti.pic_width,ti.pic_height,ti.pic_x,ti.pic_y); + + /*{ + int arg = 0xffff; + th_decode_ctl(td,TH_DECCTL_SET_TELEMETRY_MBMODE,&arg,sizeof(arg)); + th_decode_ctl(td,TH_DECCTL_SET_TELEMETRY_MV,&arg,sizeof(arg)); + th_decode_ctl(td,TH_DECCTL_SET_TELEMETRY_QI,&arg,sizeof(arg)); + arg=10; + th_decode_ctl(td,TH_DECCTL_SET_TELEMETRY_BITS,&arg,sizeof(arg)); + }*/ + }else{ + /* tear down the partial theora setup */ + th_info_clear(&ti); + th_comment_clear(&tc); + } + /*Either way, we're done with the codec setup data.*/ + th_setup_free(ts); + + /* open video */ + if(theora_p)open_video(); + + if(!raw && outfile){ + static const char *CHROMA_TYPES[4]={"420jpeg",NULL,"422jpeg","444"}; + int width; + int height; + if(ti.pixel_fmt>=4||ti.pixel_fmt==TH_PF_RSVD){ + fprintf(stderr,"Unknown pixel format: %i\n",ti.pixel_fmt); + exit(1); + } + if(crop){ + int hdec; + int vdec; + hdec=!(ti.pixel_fmt&1); + vdec=!(ti.pixel_fmt&2); + if((ti.pic_x&hdec)||(ti.pic_width&hdec) + ||(ti.pic_y&vdec)||(ti.pic_height&vdec)){ + fprintf(stderr, + "Error: Cropped images with odd offsets/sizes and chroma subsampling\n" + "cannot be output to YUV4MPEG2. Remove the --crop flag or add the\n" + "--raw flag.\n"); + exit(1); + } + width=ti.pic_width; + height=ti.pic_height; + } + else{ + width=ti.frame_width; + height=ti.frame_height; + } + fprintf(outfile,"YUV4MPEG2 C%s W%d H%d F%d:%d I%c A%d:%d\n", + CHROMA_TYPES[ti.pixel_fmt],width,height, + ti.fps_numerator,ti.fps_denominator,'p', + ti.aspect_numerator,ti.aspect_denominator); + } + + /* install signal handler */ + signal (SIGINT, sigint_handler); + + /*Finally the main decode loop. + + It's one Theora packet per frame, so this is pretty straightforward if + we're not trying to maintain sync with other multiplexed streams. + + The videobuf_ready flag is used to maintain the input buffer in the libogg + stream state. + If there's no output frame available at the end of the decode step, we must + need more input data. + We could simplify this by just using the return code on + ogg_page_packetout(), but the flag system extends easily to the case where + you care about more than one multiplexed stream (like with audio + playback). + In that case, just maintain a flag for each decoder you care about, and + pull data when any one of them stalls. + + videobuf_time holds the presentation time of the currently buffered video + frame. + We ignore this value.*/ + + stateflag=0; /* playback has not begun */ + /* queue any remaining pages from data we buffered but that did not + contain headers */ + while(ogg_sync_pageout(&oy,&og)>0){ + queue_page(&og); + } + + if(fps_only){ + ftime(&start); + ftime(&last); + } + + while(!got_sigint){ + + while(theora_p && !videobuf_ready){ + /* theora is one in, one out... */ + if(ogg_stream_packetout(&to,&op)>0){ + + if(th_decode_packetin(td,&op,&videobuf_granulepos)>=0){ + videobuf_time=th_granule_time(td,videobuf_granulepos); + videobuf_ready=1; + frames++; + if(fps_only) + ftime(&after); + } + + }else + break; + } + + if(fps_only && (videobuf_ready || fps_only==2)){ + long ms = + after.time*1000.+after.millitm- + (last.time*1000.+last.millitm); + + if(ms>500 || fps_only==1 || + (feof(infile) && !videobuf_ready)){ + float file_fps = (float)ti.fps_numerator/ti.fps_denominator; + fps_only=2; + + ms = after.time*1000.+after.millitm- + (start.time*1000.+start.millitm); + + fprintf(stderr,"\rframe:%d rate:%.2fx ", + frames, + frames*1000./(ms*file_fps)); + memcpy(&last,&after,sizeof(last)); + } + } + + if(!videobuf_ready && feof(infile))break; + + if(!videobuf_ready){ + /* no data yet for somebody. Grab another page */ + buffer_data(infile,&oy); + while(ogg_sync_pageout(&oy,&og)>0){ + queue_page(&og); + } + } + /* dumpvideo frame, and get new one */ + else if(outfile)video_write(); + + videobuf_ready=0; + } + + /* end of decoder loop -- close everything */ + + if(theora_p){ + ogg_stream_clear(&to); + th_decode_free(td); + th_comment_clear(&tc); + th_info_clear(&ti); + } + ogg_sync_clear(&oy); + + if(infile && infile!=stdin)fclose(infile); + if(outfile && outfile!=stdout)fclose(outfile); + + fprintf(stderr, "\n\n%d frames\n", frames); + fprintf(stderr, "\nDone.\n"); + + return(0); + +} diff --git a/cs/3rd party/libtheora/examples/encoder_example.c b/cs/3rd party/libtheora/examples/encoder_example.c new file mode 100644 index 000000000..90833924f --- /dev/null +++ b/cs/3rd party/libtheora/examples/encoder_example.c @@ -0,0 +1,1889 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggTheora SOFTWARE 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 Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 * + * by the Xiph.Org Foundation and contributors http://www.xiph.org/ * + * * + ******************************************************************** + + function: example encoder application; makes an Ogg Theora/Vorbis + file from YUV4MPEG2 and WAV input + last mod: $Id$ + + ********************************************************************/ + +#if !defined(_REENTRANT) +#define _REENTRANT +#endif +#if !defined(_GNU_SOURCE) +#define _GNU_SOURCE +#endif +#if !defined(_LARGEFILE_SOURCE) +#define _LARGEFILE_SOURCE +#endif +#if !defined(_LARGEFILE64_SOURCE) +#define _LARGEFILE64_SOURCE +#endif +#if !defined(_FILE_OFFSET_BITS) +#define _FILE_OFFSET_BITS 64 +#endif +/*#define OC_COLLECT_METRICS*/ + +#include +#if !defined(_WIN32) +#include +#include +#else +#include "getopt.h" +#endif +#include +#include +#include +#include +#include "theora/theoraenc.h" +#include "vorbis/codec.h" +#include "vorbis/vorbisenc.h" + +#ifdef _WIN32 +/*supply missing headers and functions to Win32. going to hell, I know*/ +#include +#include + +static double rint(double x) +{ + if (x < 0.0) + return (double)(int)(x - 0.5); + else + return (double)(int)(x + 0.5); +} +#endif + +#if defined(OC_COLLECT_METRICS) +# define TH_ENCCTL_SET_METRICS_FILE (0x8000) +#endif + +const char *optstring = "b:e:o:a:A:v:V:s:S:f:F:qck:d:z:\1\2\3\4" +#if defined(OC_COLLECT_METRICS) + "m:" +#endif + ; +struct option options [] = { + {"begin-time",required_argument,NULL,'b'}, + {"end-time",required_argument,NULL,'e'}, + {"output",required_argument,NULL,'o'}, + {"audio-rate-target",required_argument,NULL,'A'}, + {"video-rate-target",required_argument,NULL,'V'}, + {"audio-quality",required_argument,NULL,'a'}, + {"video-quality",required_argument,NULL,'v'}, + {"aspect-numerator",required_argument,NULL,'s'}, + {"aspect-denominator",required_argument,NULL,'S'}, + {"framerate-numerator",required_argument,NULL,'f'}, + {"framerate-denominator",required_argument,NULL,'F'}, + {"quiet",no_argument,NULL,'q'}, + {"vp3-compatible",no_argument,NULL,'c'}, + {"speed",required_argument,NULL,'z'}, + {"soft-target",no_argument,NULL,'\1'}, + {"keyframe-freq",required_argument,NULL,'k'}, + {"buf-delay",required_argument,NULL,'d'}, + {"two-pass",no_argument,NULL,'\2'}, + {"first-pass",required_argument,NULL,'\3'}, + {"second-pass",required_argument,NULL,'\4'}, +#if defined(OC_COLLECT_METRICS) + {"metrics-file",required_argument,NULL,'m'}, +#endif + {NULL,0,NULL,0} +}; + +/* You'll go to Hell for using globals. */ + +FILE *audio=NULL; +FILE *video=NULL; + +int audio_ch=0; +int audio_hz=0; + +float audio_q=.1f; +int audio_r=-1; +int vp3_compatible=0; + +int quiet=0; + +int frame_w=0; +int frame_h=0; +int pic_w=0; +int pic_h=0; +int pic_x=0; +int pic_y=0; +int video_fps_n=-1; +int video_fps_d=-1; +int video_par_n=-1; +int video_par_d=-1; +char interlace; +int src_c_dec_h=2; +int src_c_dec_v=2; +int dst_c_dec_h=2; +int dst_c_dec_v=2; +char chroma_type[16]; + +/*The size of each converted frame buffer.*/ +size_t y4m_dst_buf_sz; +/*The amount to read directly into the converted frame buffer.*/ +size_t y4m_dst_buf_read_sz; +/*The size of the auxilliary buffer.*/ +size_t y4m_aux_buf_sz; +/*The amount to read into the auxilliary buffer.*/ +size_t y4m_aux_buf_read_sz; + +/*The function used to perform chroma conversion.*/ +typedef void (*y4m_convert_func)(unsigned char *_dst,unsigned char *_aux); + +y4m_convert_func y4m_convert=NULL; + +int video_r=-1; +int video_q=-1; +ogg_uint32_t keyframe_frequency=0; +int buf_delay=-1; + +long begin_sec=-1; +long begin_usec=0; +long end_sec=-1; +long end_usec=0; + +static void usage(void){ + fprintf(stderr, + "Usage: encoder_example [options] [audio_file] video_file\n\n" + "Options: \n\n" + " -o --output file name for encoded output;\n" + " If this option is not given, the\n" + " compressed data is sent to stdout.\n\n" + " -A --audio-rate-target bitrate target for Vorbis audio;\n" + " use -a and not -A if at all possible,\n" + " as -a gives higher quality for a given\n" + " bitrate.\n\n" + " -V --video-rate-target bitrate target for Theora video\n\n" + " --soft-target Use a large reservoir and treat the rate\n" + " as a soft target; rate control is less\n" + " strict but resulting quality is usually\n" + " higher/smoother overall. Soft target also\n" + " allows an optional -v setting to specify\n" + " a minimum allowed quality.\n\n" + " --two-pass Compress input using two-pass rate control\n" + " This option requires that the input to the\n" + " to the encoder is seekable and performs\n" + " both passes automatically.\n\n" + " --first-pass Perform first-pass of a two-pass rate\n" + " controlled encoding, saving pass data to\n" + " for a later second pass\n\n" + " --second-pass Perform second-pass of a two-pass rate\n" + " controlled encoding, reading first-pass\n" + " data from . The first pass\n" + " data must come from a first encoding pass\n" + " using identical input video to work\n" + " properly.\n\n" + " -a --audio-quality Vorbis quality selector from -1 to 10\n" + " (-1 yields smallest files but lowest\n" + " fidelity; 10 yields highest fidelity\n" + " but large files. '2' is a reasonable\n" + " default).\n\n" + " -v --video-quality Theora quality selector from 0 to 10\n" + " (0 yields smallest files but lowest\n" + " video quality. 10 yields highest\n" + " fidelity but large files).\n\n" + " -s --aspect-numerator Aspect ratio numerator, default is 0\n" + " or extracted from YUV input file\n" + " -S --aspect-denominator Aspect ratio denominator, default is 0\n" + " or extracted from YUV input file\n" + " -f --framerate-numerator Frame rate numerator, can be extracted\n" + " from YUV input file. ex: 30000000\n" + " -F --framerate-denominator Frame rate denominator, can be extracted\n" + " from YUV input file. ex: 1000000\n" + " The frame rate nominator divided by this\n" + " determinates the frame rate in units per tick\n" + " -k --keyframe-freq Keyframe frequency\n" + " -z --speed Sets the encoder speed level. Higher speed\n" + " levels favor quicker encoding over better\n" + " quality per bit. Depending on the encoding\n" + " mode, and the internal algorithms used,\n" + " quality may actually improve with higher\n" + " speeds, but in this case bitrate will also\n" + " likely increase. The maximum value, and the\n" + " meaning of each value, are implementation-\n" + " specific and may change depending on the\n" + " current encoding mode (rate constrained,\n" + " two-pass, etc.).\n" + " -d --buf-delay Buffer delay (in frames). Longer delays\n" + " allow smoother rate adaptation and provide\n" + " better overall quality, but require more\n" + " client side buffering and add latency. The\n" + " default value is the keyframe interval for\n" + " one-pass encoding (or somewhat larger if\n" + " --soft-target is used) and infinite for\n" + " two-pass encoding.\n" + " -b --begin-time Begin encoding at offset into input\n" + " -e --end-time End encoding at offset into input\n\n" + " -q --quiet Don't print progress information.\n\n" +#if defined(OC_COLLECT_METRICS) + " -m --metrics-filename File in which to accumulate mode decision\n" + " metrics. Statistics from the current\n" + " encode will be merged with those already\n" + " in the file if it exists.\n\n" +#endif + "encoder_example accepts only uncompressed RIFF WAV format audio and\n" + "YUV4MPEG2 uncompressed video.\n\n"); + exit(1); +} + +static int y4m_parse_tags(char *_tags){ + int got_w; + int got_h; + int got_fps; + int got_interlace; + int got_par; + int got_chroma; + int tmp_video_fps_n; + int tmp_video_fps_d; + int tmp_video_par_n; + int tmp_video_par_d; + char *p; + char *q; + got_w=got_h=got_fps=got_interlace=got_par=got_chroma=0; + for(p=_tags;;p=q){ + /*Skip any leading spaces.*/ + while(*p==' ')p++; + /*If that's all we have, stop.*/ + if(p[0]=='\0')break; + /*Find the end of this tag.*/ + for(q=p+1;*q!='\0'&&*q!=' ';q++); + /*Process the tag.*/ + switch(p[0]){ + case 'W':{ + if(sscanf(p+1,"%d",&pic_w)!=1)return -1; + got_w=1; + }break; + case 'H':{ + if(sscanf(p+1,"%d",&pic_h)!=1)return -1; + got_h=1; + }break; + case 'F':{ + if(sscanf(p+1,"%d:%d",&tmp_video_fps_n,&tmp_video_fps_d)!=2)return -1; + got_fps=1; + }break; + case 'I':{ + interlace=p[1]; + got_interlace=1; + }break; + case 'A':{ + if(sscanf(p+1,"%d:%d",&tmp_video_par_n,&tmp_video_par_d)!=2)return -1; + got_par=1; + }break; + case 'C':{ + if(q-p>16)return -1; + memcpy(chroma_type,p+1,q-p-1); + chroma_type[q-p-1]='\0'; + got_chroma=1; + }break; + /*Ignore unknown tags.*/ + } + } + if(!got_w||!got_h||!got_fps||!got_interlace||!got_par)return -1; + /*Chroma-type is not specified in older files, e.g., those generated by + mplayer.*/ + if(!got_chroma)strcpy(chroma_type,"420"); + /*Update fps and aspect ratio globals if not specified in the command line.*/ + if(video_fps_n==-1)video_fps_n=tmp_video_fps_n; + if(video_fps_d==-1)video_fps_d=tmp_video_fps_d; + if(video_par_n==-1)video_par_n=tmp_video_par_n; + if(video_par_d==-1)video_par_d=tmp_video_par_d; + return 0; +} + +/*All anti-aliasing filters in the following conversion functions are based on + one of two window functions: + The 6-tap Lanczos window (for down-sampling and shifts): + sinc(\pi*t)*sinc(\pi*t/3), |t|<3 (sinc(t)==sin(t)/t) + 0, |t|>=3 + The 4-tap Mitchell window (for up-sampling): + 7|t|^3-12|t|^2+16/3, |t|<1 + -(7/3)|x|^3+12|x|^2-20|x|+32/3, |t|<2 + 0, |t|>=2 + The number of taps is intentionally kept small to reduce computational + overhead and limit ringing. + + The taps from these filters are scaled so that their sum is 1, and the result + is scaled by 128 and rounded to integers to create a filter whose + intermediate values fit inside 16 bits. + Coefficients are rounded in such a way as to ensure their sum is still 128, + which is usually equivalent to normal rounding.*/ + +#define OC_MINI(_a,_b) ((_a)>(_b)?(_b):(_a)) +#define OC_MAXI(_a,_b) ((_a)<(_b)?(_b):(_a)) +#define OC_CLAMPI(_a,_b,_c) (OC_MAXI(_a,OC_MINI(_b,_c))) + +/*420jpeg chroma samples are sited like: + Y-------Y-------Y-------Y------- + | | | | + | BR | | BR | + | | | | + Y-------Y-------Y-------Y------- + | | | | + | | | | + | | | | + Y-------Y-------Y-------Y------- + | | | | + | BR | | BR | + | | | | + Y-------Y-------Y-------Y------- + | | | | + | | | | + | | | | + + 420mpeg2 chroma samples are sited like: + Y-------Y-------Y-------Y------- + | | | | + BR | BR | + | | | | + Y-------Y-------Y-------Y------- + | | | | + | | | | + | | | | + Y-------Y-------Y-------Y------- + | | | | + BR | BR | + | | | | + Y-------Y-------Y-------Y------- + | | | | + | | | | + | | | | + + We use a resampling filter to shift the site locations one quarter pixel (at + the chroma plane's resolution) to the right. + The 4:2:2 modes look exactly the same, except there are twice as many chroma + lines, and they are vertically co-sited with the luma samples in both the + mpeg2 and jpeg cases (thus requiring no vertical resampling).*/ +static void y4m_convert_42xmpeg2_42xjpeg(unsigned char *_dst, + unsigned char *_aux){ + int c_w; + int c_h; + int pli; + int y; + int x; + /*Skip past the luma data.*/ + _dst+=pic_w*pic_h; + /*Compute the size of each chroma plane.*/ + c_w=(pic_w+dst_c_dec_h-1)/dst_c_dec_h; + c_h=(pic_h+dst_c_dec_v-1)/dst_c_dec_v; + for(pli=1;pli<3;pli++){ + for(y=0;y>7,255); + } + for(;x>7,255); + } + for(;x>7,255); + } + _dst+=c_w; + _aux+=c_w; + } + } +} + +/*This format is only used for interlaced content, but is included for + completeness. + + 420jpeg chroma samples are sited like: + Y-------Y-------Y-------Y------- + | | | | + | BR | | BR | + | | | | + Y-------Y-------Y-------Y------- + | | | | + | | | | + | | | | + Y-------Y-------Y-------Y------- + | | | | + | BR | | BR | + | | | | + Y-------Y-------Y-------Y------- + | | | | + | | | | + | | | | + + 420paldv chroma samples are sited like: + YR------Y-------YR------Y------- + | | | | + | | | | + | | | | + YB------Y-------YB------Y------- + | | | | + | | | | + | | | | + YR------Y-------YR------Y------- + | | | | + | | | | + | | | | + YB------Y-------YB------Y------- + | | | | + | | | | + | | | | + + We use a resampling filter to shift the site locations one quarter pixel (at + the chroma plane's resolution) to the right. + Then we use another filter to move the C_r location down one quarter pixel, + and the C_b location up one quarter pixel.*/ +static void y4m_convert_42xpaldv_42xjpeg(unsigned char *_dst, + unsigned char *_aux){ + unsigned char *tmp; + int c_w; + int c_h; + int c_sz; + int pli; + int y; + int x; + /*Skip past the luma data.*/ + _dst+=pic_w*pic_h; + /*Compute the size of each chroma plane.*/ + c_w=(pic_w+1)/2; + c_h=(pic_h+dst_c_dec_h-1)/dst_c_dec_h; + c_sz=c_w*c_h; + /*First do the horizontal re-sampling. + This is the same as the mpeg2 case, except that after the horizontal case, + we need to apply a second vertical filter.*/ + tmp=_aux+2*c_sz; + for(pli=1;pli<3;pli++){ + for(y=0;y>7,255); + } + for(;x>7,255); + } + for(;x>7,255); + } + tmp+=c_w; + _aux+=c_w; + } + switch(pli){ + case 1:{ + tmp-=c_sz; + /*Slide C_b up a quarter-pel. + This is the same filter used above, but in the other order.*/ + for(x=0;x>7,255); + } + for(;y>7,255); + } + for(;y>7,255); + } + _dst++; + tmp++; + } + _dst+=c_sz-c_w; + tmp-=c_w; + }break; + case 2:{ + tmp-=c_sz; + /*Slide C_r down a quarter-pel. + This is the same as the horizontal filter.*/ + for(x=0;x>7,255); + } + for(;y>7,255); + } + for(;y>7,255); + } + _dst++; + tmp++; + } + }break; + } + /*For actual interlaced material, this would have to be done separately on + each field, and the shift amounts would be different. + C_r moves down 1/8, C_b up 3/8 in the top field, and C_r moves down 3/8, + C_b up 1/8 in the bottom field. + The corresponding filters would be: + Down 1/8 (reverse order for up): [3 -11 125 15 -4 0]/128 + Down 3/8 (reverse order for up): [4 -19 98 56 -13 2]/128*/ + } +} + +/*422jpeg chroma samples are sited like: + Y---BR--Y-------Y---BR--Y------- + | | | | + | | | | + | | | | + Y---BR--Y-------Y---BR--Y------- + | | | | + | | | | + | | | | + Y---BR--Y-------Y---BR--Y------- + | | | | + | | | | + | | | | + Y---BR--Y-------Y---BR--Y------- + | | | | + | | | | + | | | | + + 411 chroma samples are sited like: + YBR-----Y-------Y-------Y------- + | | | | + | | | | + | | | | + YBR-----Y-------Y-------Y------- + | | | | + | | | | + | | | | + YBR-----Y-------Y-------Y------- + | | | | + | | | | + | | | | + YBR-----Y-------Y-------Y------- + | | | | + | | | | + | | | | + + We use a filter to resample at site locations one eighth pixel (at the source + chroma plane's horizontal resolution) and five eighths of a pixel to the + right.*/ +static void y4m_convert_411_422jpeg(unsigned char *_dst, + unsigned char *_aux){ + int c_w; + int dst_c_w; + int c_h; + int pli; + int y; + int x; + /*Skip past the luma data.*/ + _dst+=pic_w*pic_h; + /*Compute the size of each chroma plane.*/ + c_w=(pic_w+src_c_dec_h-1)/src_c_dec_h; + dst_c_w=(pic_w+dst_c_dec_h-1)/dst_c_dec_h; + c_h=(pic_h+dst_c_dec_v-1)/dst_c_dec_v; + for(pli=1;pli<3;pli++){ + for(y=0;y>7,255); + _dst[x<<1|1]=(unsigned char)OC_CLAMPI(0,47*_aux[0]+ + 86*_aux[OC_MINI(1,c_w-1)]-5*_aux[OC_MINI(2,c_w-1)]+64>>7,255); + } + for(;x>7,255); + _dst[x<<1|1]=(unsigned char)OC_CLAMPI(0,-3*_aux[x-1]+50*_aux[x]+ + 86*_aux[x+1]-5*_aux[x+2]+64>>7,255); + } + for(;x>7,255); + if((x<<1|1)>7,255); + } + } + _dst+=dst_c_w; + _aux+=c_w; + } + } +} + +/*The image is padded with empty chroma components at 4:2:0. + This costs about 17 bits a frame to code.*/ +static void y4m_convert_mono_420jpeg(unsigned char *_dst, + unsigned char *_aux){ + int c_sz; + _dst+=pic_w*pic_h; + c_sz=((pic_w+dst_c_dec_h-1)/dst_c_dec_h)*((pic_h+dst_c_dec_v-1)/dst_c_dec_v); + memset(_dst,128,c_sz*2); +} + +#if 0 +/*Right now just 444 to 420. + Not too hard to generalize.*/ +static void y4m_convert_4xxjpeg_42xjpeg(unsigned char *_dst, + unsigned char *_aux){ + unsigned char *tmp; + int c_w; + int c_h; + int pic_sz; + int tmp_sz; + int c_sz; + int pli; + int y; + int x; + /*Compute the size of each chroma plane.*/ + c_w=(pic_w+dst_c_dec_h-1)/dst_c_dec_h; + c_h=(pic_h+dst_c_dec_v-1)/dst_c_dec_v; + pic_sz=pic_w*pic_h; + tmp_sz=c_w*pic_h; + c_sz=c_w*c_h; + _dst+=pic_sz; + for(pli=1;pli<3;pli++){ + tmp=_aux+pic_sz; + /*In reality, the horizontal and vertical steps could be pipelined, for + less memory consumption and better cache performance, but we do them + separately for simplicity.*/ + /*First do horizontal filtering (convert to 4:2:2)*/ + /*Filter: [3 -17 78 78 -17 3]/128, derived from a 6-tap Lanczos window.*/ + for(y=0;y>1]=OC_CLAMPI(0,64*_aux[0]+78*_aux[OC_MINI(1,pic_w-1)]- + 17*_aux[OC_MINI(2,pic_w-1)]+3*_aux[OC_MINI(3,pic_w-1)]+64>>7,255); + } + for(;x>1]=OC_CLAMPI(0,3*(_aux[x-2]+_aux[x+3])-17*(_aux[x-1]+_aux[x+2])+ + 78*(_aux[x]+_aux[x+1])+64>>7,255); + } + for(;x>1]=OC_CLAMPI(0,3*(_aux[x-2]+_aux[pic_w-1])- + 17*(_aux[x-1]+_aux[OC_MINI(x+2,pic_w-1)])+ + 78*(_aux[x]+_aux[OC_MINI(x+1,pic_w-1)])+64>>7,255); + } + tmp+=c_w; + _aux+=pic_w; + } + _aux-=pic_sz; + tmp-=tmp_sz; + /*Now do the vertical filtering.*/ + for(x=0;x>1)*c_w]=OC_CLAMPI(0,64*tmp[0]+78*tmp[OC_MINI(1,pic_h-1)*c_w]- + 17*tmp[OC_MINI(2,pic_h-1)*c_w]+3*tmp[OC_MINI(3,pic_h-1)*c_w]+ + 64>>7,255); + } + for(;y>1)*c_w]=OC_CLAMPI(0,3*(tmp[(y-2)*c_w]+tmp[(y+3)*c_w])- + 17*(tmp[(y-1)*c_w]+tmp[(y+2)*c_w])+78*(tmp[y*c_w]+tmp[(y+1)*c_w])+ + 64>>7,255); + } + for(;y>1)*c_w]=OC_CLAMPI(0,3*(tmp[(y-2)*c_w]+tmp[(pic_h-1)*c_w])- + 17*(tmp[(y-1)*c_w]+tmp[OC_MINI(y+2,pic_h-1)*c_w])+ + 78*(tmp[y*c_w]+tmp[OC_MINI(y+1,pic_h-1)*c_w])+64>>7,255); + } + tmp++; + _dst++; + } + _dst-=c_w; + } +} +#endif + + +/*No conversion function needed.*/ +static void y4m_convert_null(unsigned char *_dst, + unsigned char *_aux){ +} + +static void id_file(char *f){ + FILE *test; + unsigned char buffer[80]; + int ret; + + /* open it, look for magic */ + + if(!strcmp(f,"-")){ + /* stdin */ + test=stdin; + }else{ + test=fopen(f,"rb"); + if(!test){ + fprintf(stderr,"Unable to open file %s.\n",f); + exit(1); + } + } + + ret=fread(buffer,1,4,test); + if(ret<4){ + fprintf(stderr,"EOF determining file type of file %s.\n",f); + exit(1); + } + + if(!memcmp(buffer,"RIFF",4)){ + /* possible WAV file */ + + if(audio){ + /* umm, we already have one */ + fprintf(stderr,"Multiple RIFF WAVE files specified on command line.\n"); + exit(1); + } + + /* Parse the rest of the header */ + + ret=fread(buffer,1,8,test); + if(ret<8)goto riff_err; + if(!memcmp(buffer+4,"WAVE",4)){ + + while(!feof(test)){ + ret=fread(buffer,1,4,test); + if(ret<4)goto riff_err; + if(!memcmp("fmt",buffer,3)){ + + /* OK, this is our audio specs chunk. Slurp it up. */ + + ret=fread(buffer,1,20,test); + if(ret<20)goto riff_err; + + if(memcmp(buffer+4,"\001\000",2)){ + fprintf(stderr,"The WAV file %s is in a compressed format; " + "can't read it.\n",f); + exit(1); + } + + audio=test; + audio_ch=buffer[6]+(buffer[7]<<8); + audio_hz=buffer[8]+(buffer[9]<<8)+ + (buffer[10]<<16)+(buffer[11]<<24); + + if(buffer[18]+(buffer[19]<<8)!=16){ + fprintf(stderr,"Can only read 16 bit WAV files for now.\n"); + exit(1); + } + + /* Now, align things to the beginning of the data */ + /* Look for 'dataxxxx' */ + while(!feof(test)){ + ret=fread(buffer,1,4,test); + if(ret<4)goto riff_err; + if(!memcmp("data",buffer,4)){ + /* We're there. Ignore the declared size for now. */ + ret=fread(buffer,1,4,test); + if(ret<4)goto riff_err; + + if(!quiet){ + fprintf(stderr,"File %s is 16 bit %d channel %d Hz RIFF WAV audio.\n", + f,audio_ch,audio_hz); + } + + return; + } + } + } + } + } + + fprintf(stderr,"Couldn't find WAVE data in RIFF file %s.\n",f); + exit(1); + + } + if(!memcmp(buffer,"YUV4",4)){ + /* possible YUV2MPEG2 format file */ + /* read until newline, or 80 cols, whichever happens first */ + int i; + for(i=0;i<79;i++){ + ret=fread(buffer+i,1,1,test); + if(ret<1)goto yuv_err; + if(buffer[i]=='\n')break; + } + if(i==79){ + fprintf(stderr,"Error parsing %s header; not a YUV2MPEG2 file?\n",f); + } + buffer[i]='\0'; + + if(!memcmp(buffer,"MPEG",4)){ + + if(video){ + /* umm, we already have one */ + fprintf(stderr,"Multiple video files specified on command line.\n"); + exit(1); + } + + if(buffer[4]!='2'){ + fprintf(stderr,"Incorrect YUV input file version; YUV4MPEG2 required.\n"); + } + + ret=y4m_parse_tags((char *)buffer+5); + if(ret<0){ + fprintf(stderr,"Error parsing YUV4MPEG2 header in file %s.\n",f); + exit(1); + } + + if(interlace!='p'){ + fprintf(stderr,"Input video is interlaced; Theora handles only progressive scan\n"); + exit(1); + } + + if(strcmp(chroma_type,"420")==0||strcmp(chroma_type,"420jpeg")==0){ + src_c_dec_h=dst_c_dec_h=src_c_dec_v=dst_c_dec_v=2; + y4m_dst_buf_read_sz=pic_w*pic_h+2*((pic_w+1)/2)*((pic_h+1)/2); + /*Natively supported: no conversion required.*/ + y4m_aux_buf_sz=y4m_aux_buf_read_sz=0; + y4m_convert=y4m_convert_null; + } + else if(strcmp(chroma_type,"420mpeg2")==0){ + src_c_dec_h=dst_c_dec_h=src_c_dec_v=dst_c_dec_v=2; + y4m_dst_buf_read_sz=pic_w*pic_h; + /*Chroma filter required: read into the aux buf first.*/ + y4m_aux_buf_sz=y4m_aux_buf_read_sz=2*((pic_w+1)/2)*((pic_h+1)/2); + y4m_convert=y4m_convert_42xmpeg2_42xjpeg; + } + else if(strcmp(chroma_type,"420paldv")==0){ + src_c_dec_h=dst_c_dec_h=src_c_dec_v=dst_c_dec_v=2; + y4m_dst_buf_read_sz=pic_w*pic_h; + /*Chroma filter required: read into the aux buf first. + We need to make two filter passes, so we need some extra space in the + aux buffer.*/ + y4m_aux_buf_sz=3*((pic_w+1)/2)*((pic_h+1)/2); + y4m_aux_buf_read_sz=2*((pic_w+1)/2)*((pic_h+1)/2); + y4m_convert=y4m_convert_42xpaldv_42xjpeg; + } + else if(strcmp(chroma_type,"422")==0){ + src_c_dec_h=dst_c_dec_h=2; + src_c_dec_v=dst_c_dec_v=1; + y4m_dst_buf_read_sz=pic_w*pic_h; + /*Chroma filter required: read into the aux buf first.*/ + y4m_aux_buf_sz=y4m_aux_buf_read_sz=2*((pic_w+1)/2)*pic_h; + y4m_convert=y4m_convert_42xmpeg2_42xjpeg; + } + else if(strcmp(chroma_type,"422jpeg")==0){ + src_c_dec_h=dst_c_dec_h=2; + src_c_dec_v=dst_c_dec_v=1; + y4m_dst_buf_read_sz=pic_w*pic_h+2*((pic_w+1)/2)*pic_h; + /*Natively supported: no conversion required.*/ + y4m_aux_buf_sz=y4m_aux_buf_read_sz=0; + y4m_convert=y4m_convert_null; + } + else if(strcmp(chroma_type,"411")==0){ + src_c_dec_h=4; + /*We don't want to introduce any additional sub-sampling, so we + promote 4:1:1 material to 4:2:2, as the closest format Theora can + handle.*/ + dst_c_dec_h=2; + src_c_dec_v=dst_c_dec_v=1; + y4m_dst_buf_read_sz=pic_w*pic_h; + /*Chroma filter required: read into the aux buf first.*/ + y4m_aux_buf_sz=y4m_aux_buf_read_sz=2*((pic_w+3)/4)*pic_h; + y4m_convert=y4m_convert_411_422jpeg; + } + else if(strcmp(chroma_type,"444")==0){ + src_c_dec_h=dst_c_dec_h=src_c_dec_v=dst_c_dec_v=1; + y4m_dst_buf_read_sz=pic_w*pic_h*3; + y4m_aux_buf_sz=y4m_aux_buf_read_sz=0; + y4m_convert=y4m_convert_null; + } + else if(strcmp(chroma_type,"444alpha")==0){ + src_c_dec_h=dst_c_dec_h=src_c_dec_v=dst_c_dec_v=1; + y4m_dst_buf_read_sz=pic_w*pic_h*3; + /*Read the extra alpha plane into the aux buf. + It will be discarded.*/ + y4m_aux_buf_sz=y4m_aux_buf_read_sz=pic_w*pic_h; + y4m_convert=y4m_convert_null; + } + else if(strcmp(chroma_type,"mono")==0){ + src_c_dec_h=src_c_dec_v=0; + dst_c_dec_h=dst_c_dec_v=2; + y4m_dst_buf_read_sz=pic_w*pic_h; + y4m_aux_buf_sz=y4m_aux_buf_read_sz=0; + y4m_convert=y4m_convert_mono_420jpeg; + } + else{ + fprintf(stderr,"Unknown chroma sampling type: %s\n",chroma_type); + exit(1); + } + /*The size of the final frame buffers is always computed from the + destination chroma decimation type.*/ + y4m_dst_buf_sz=pic_w*pic_h+2*((pic_w+dst_c_dec_h-1)/dst_c_dec_h)* + ((pic_h+dst_c_dec_v-1)/dst_c_dec_v); + + video=test; + + if(!quiet){ + fprintf(stderr,"File %s is %dx%d %.02f fps %s video.\n", + f,pic_w,pic_h,(double)video_fps_n/video_fps_d,chroma_type); + } + + return; + } + } + fprintf(stderr,"Input file %s is neither a WAV nor YUV4MPEG2 file.\n",f); + exit(1); + + riff_err: + fprintf(stderr,"EOF parsing RIFF file %s.\n",f); + exit(1); + yuv_err: + fprintf(stderr,"EOF parsing YUV4MPEG2 file %s.\n",f); + exit(1); + +} + +int spinner=0; +char *spinascii="|/-\\"; +void spinnit(void){ + if(quiet){ + return; + } + spinner++; + if(spinner==4)spinner=0; + fprintf(stderr,"\r%c",spinascii[spinner]); +} + +int fetch_and_process_audio(FILE *audio,ogg_page *audiopage, + ogg_stream_state *vo, + vorbis_dsp_state *vd, + vorbis_block *vb, + int audioflag){ + static ogg_int64_t samples_sofar=0; + ogg_packet op; + int i,j; + ogg_int64_t beginsample = audio_hz*(begin_sec+begin_usec*.000001); + ogg_int64_t endsample = audio_hz*(end_sec+end_usec*.000001); + + while(audio && !audioflag){ + /* process any audio already buffered */ + spinnit(); + if(ogg_stream_pageout(vo,audiopage)>0) return 1; + if(ogg_stream_eos(vo))return 0; + + { + /* read and process more audio */ + signed char readbuffer[4096]; + signed char *readptr=readbuffer; + int toread=4096/2/audio_ch; + int bytesread=fread(readbuffer,1,toread*2*audio_ch,audio); + int sampread=bytesread/2/audio_ch; + float **vorbis_buffer; + int count=0; + + if(bytesread<=0 || + (samples_sofar>=endsample && endsample>0)){ + /* end of file. this can be done implicitly, but it's + easier to see here in non-clever fashion. Tell the + library we're at end of stream so that it can handle the + last frame and mark end of stream in the output properly */ + vorbis_analysis_wrote(vd,0); + }else{ + if(samples_sofar < beginsample){ + if(samples_sofar+sampread > beginsample){ + readptr += (beginsample-samples_sofar)*2*audio_ch; + sampread += samples_sofar-beginsample; + samples_sofar = sampread+beginsample; + }else{ + samples_sofar += sampread; + sampread = 0; + } + }else{ + samples_sofar += sampread; + } + + if(samples_sofar > endsample && endsample > 0) + sampread-= (samples_sofar - endsample); + + if(sampread>0){ + + vorbis_buffer=vorbis_analysis_buffer(vd,sampread); + /* uninterleave samples */ + for(i=0;i=beginframe) + frame_state++; + } + /* check to see if there are dupes to flush */ + if(th_encode_packetout(td,frame_state<1,op)>0)return 1; + if(frame_state<1){ + /* can't get here unless YUV4MPEG stream has no video */ + fprintf(stderr,"Video input contains no frames.\n"); + exit(1); + } + /* Theora is a one-frame-in,one-frame-out system; submit a frame + for compression and pull out the packet */ + /* in two-pass mode's second pass, we need to submit first-pass data */ + if(passno==2){ + for(;;){ + static unsigned char buffer[80]; + static int buf_pos; + int bytes; + /*Ask the encoder how many bytes it would like.*/ + bytes=th_encode_ctl(td,TH_ENCCTL_2PASS_IN,NULL,0); + if(bytes<0){ + fprintf(stderr,"Error submitting pass data in second pass.\n"); + exit(1); + } + /*If it's got enough, stop.*/ + if(bytes==0)break; + /*Read in some more bytes, if necessary.*/ + if(bytes>80-buf_pos)bytes=80-buf_pos; + if(bytes>0&&fread(buffer+buf_pos,1,bytes,twopass_file)=bytes)buf_pos=0; + /*Otherwise remember how much it used.*/ + else buf_pos+=ret; + } + } + /*We submit the buffer using the size of the picture region. + libtheora will pad the picture region out to the full frame size for us, + whether we pass in a full frame or not.*/ + ycbcr[0].width=pic_w; + ycbcr[0].height=pic_h; + ycbcr[0].stride=pic_w; + ycbcr[0].data=yuvframe[0]; + ycbcr[1].width=c_w; + ycbcr[1].height=c_h; + ycbcr[1].stride=c_w; + ycbcr[1].data=yuvframe[0]+pic_sz; + ycbcr[2].width=c_w; + ycbcr[2].height=c_h; + ycbcr[2].stride=c_w; + ycbcr[2].data=yuvframe[0]+pic_sz+c_sz; + th_encode_ycbcr_in(td,ycbcr); + { + unsigned char *temp=yuvframe[0]; + yuvframe[0]=yuvframe[1]; + yuvframe[1]=temp; + frame_state--; + } + /* in two-pass mode's first pass we need to extract and save the pass data */ + if(passno==1){ + unsigned char *buffer; + int bytes = th_encode_ctl(td, TH_ENCCTL_2PASS_OUT, &buffer, sizeof(buffer)); + if(bytes<0){ + fprintf(stderr,"Could not read two-pass data from encoder.\n"); + exit(1); + } + if(fwrite(buffer,1,bytes,twopass_file)0) return 1; + if(ogg_stream_eos(to)) return 0; + ret=fetch_and_process_video_packet(video,twopass_file,passno,td,&op); + if(ret<=0)return 0; + ogg_stream_packetin(to,&op); + } + return videoflag; +} + +static int ilog(unsigned _v){ + int ret; + for(ret=0;_v;ret++)_v>>=1; + return ret; +} + +static int parse_time(long *_sec,long *_usec,const char *_optarg){ + double secf; + long secl; + const char *pos; + char *end; + int err; + err=0; + secl=0; + pos=strchr(_optarg,':'); + if(pos!=NULL){ + char *pos2; + secl=strtol(_optarg,&end,10)*60; + err|=pos!=end; + pos2=strchr(++pos,':'); + if(pos2!=NULL){ + secl=(secl+strtol(pos,&end,10))*60; + err|=pos2!=end; + pos=pos2+1; + } + } + else pos=_optarg; + secf=strtod(pos,&end); + if(err||*end!='\0')return -1; + *_sec=secl+(long)floor(secf); + *_usec=(long)((secf-floor(secf))*1E6+0.5); + return 0; +} + +int main(int argc,char *argv[]){ + int c,long_option_index,ret; + + ogg_stream_state to; /* take physical pages, weld into a logical + stream of packets */ + ogg_stream_state vo; /* take physical pages, weld into a logical + stream of packets */ + ogg_page og; /* one Ogg bitstream page. Vorbis packets are inside */ + ogg_packet op; /* one raw packet of data for decode */ + + th_enc_ctx *td; + th_info ti; + th_comment tc; + + vorbis_info vi; /* struct that stores all the static vorbis bitstream + settings */ + vorbis_comment vc; /* struct that stores all the user comments */ + + vorbis_dsp_state vd; /* central working state for the packet->PCM decoder */ + vorbis_block vb; /* local working space for packet->PCM decode */ + + int speed=-1; + int audioflag=0; + int videoflag=0; + int akbps=0; + int vkbps=0; + int soft_target=0; + + ogg_int64_t audio_bytesout=0; + ogg_int64_t video_bytesout=0; + double timebase; + + FILE *outfile = stdout; + + FILE *twopass_file = NULL; + fpos_t video_rewind_pos; + int twopass=0; + int passno; + + clock_t clock_start=clock(); + clock_t clock_end; + double elapsed; + +#ifdef _WIN32 /* We need to set stdin/stdout to binary mode. Damn windows. */ + /* if we were reading/writing a file, it would also need to in + binary mode, eg, fopen("file.wav","wb"); */ + /* Beware the evil ifdef. We avoid these where we can, but this one we + cannot. Don't add any more, you'll probably go to hell if you do. */ + _setmode( _fileno( stdin ), _O_BINARY ); + _setmode( _fileno( stdout ), _O_BINARY ); +#endif + + while((c=getopt_long(argc,argv,optstring,options,&long_option_index))!=EOF){ + switch(c){ + case 'o': + outfile=fopen(optarg,"wb"); + if(outfile==NULL){ + fprintf(stderr,"Unable to open output file '%s'\n", optarg); + exit(1); + } + break;; + + case 'a': + audio_q=(float)(atof(optarg)*.099); + if(audio_q<-.1 || audio_q>1){ + fprintf(stderr,"Illegal audio quality (choose -1 through 10)\n"); + exit(1); + } + audio_r=-1; + break; + + case 'v': + video_q=(int)rint(6.3*atof(optarg)); + if(video_q<0 || video_q>63){ + fprintf(stderr,"Illegal video quality (choose 0 through 10)\n"); + exit(1); + } + break; + + case 'A': + audio_r=(int)(atof(optarg)*1000); + if(audio_q<0){ + fprintf(stderr,"Illegal audio quality (choose > 0 please)\n"); + exit(1); + } + audio_q=-99; + break; + + case 'V': + video_r=(int)rint(atof(optarg)*1000); + if(video_r<1){ + fprintf(stderr,"Illegal video bitrate (choose > 0 please)\n"); + exit(1); + } + break; + + case '\1': + soft_target=1; + break; + + case 's': + video_par_n=(int)rint(atof(optarg)); + break; + + case 'S': + video_par_d=(int)rint(atof(optarg)); + break; + + case 'f': + video_fps_n=(int)rint(atof(optarg)); + break; + + case 'F': + video_fps_d=(int)rint(atof(optarg)); + break; + + case 'q': + quiet=1; + break; + + case 'c': + vp3_compatible=1; + break; + + case 'k': + keyframe_frequency=rint(atof(optarg)); + if(keyframe_frequency<1 || keyframe_frequency>2147483647){ + fprintf(stderr,"Illegal keyframe frequency\n"); + exit(1); + } + break; + + case 'd': + buf_delay=atoi(optarg); + if(buf_delay<=0){ + fprintf(stderr,"Illegal buffer delay\n"); + exit(1); + } + break; + + case 'z': + speed=atoi(optarg); + if(speed<0){ + fprintf(stderr,"Illegal speed level\n"); + exit(1); + } + break; + + case 'b': + { + if(parse_time(&begin_sec,&begin_usec,optarg)<0){ + fprintf(stderr,"Error parsing begin time '%s'.\n",optarg); + exit(1); + } + } + break; + case 'e': + { + if(parse_time(&end_sec,&end_usec,optarg)<0){ + fprintf(stderr,"Error parsing end time '%s'.\n",optarg); + exit(1); + } + } + break; + case '\2': + twopass=3; /* perform both passes */ + twopass_file=tmpfile(); + if(!twopass_file){ + fprintf(stderr,"Unable to open temporary file for twopass data\n"); + exit(1); + } + break; + case '\3': + twopass=1; /* perform first pass */ + twopass_file=fopen(optarg,"wb"); + if(!twopass_file){ + fprintf(stderr,"Unable to open \'%s\' for twopass data\n",optarg); + exit(1); + } + break; + case '\4': + twopass=2; /* perform second pass */ + twopass_file=fopen(optarg,"rb"); + if(!twopass_file){ + fprintf(stderr,"Unable to open twopass data file \'%s\'",optarg); + exit(1); + } + break; +#if defined(OC_COLLECT_METRICS) + case 'm': + if(th_encode_ctl(NULL,TH_ENCCTL_SET_METRICS_FILE, + optarg,strlen(optarg)+1)){ + fprintf(stderr,"Unable to set metrics collection file name.\n"); + fprintf(stderr,"libtheora not compiled with OC_COLLECT_METRICS?\n"); + exit(1); + } + break; +#endif + + default: + usage(); + } + } + + if(soft_target){ + if(video_r<=0){ + fprintf(stderr,"Soft rate target (--soft-target) requested without a bitrate (-V).\n"); + exit(1); + } + if(video_q==-1) + video_q=0; + }else{ + if(video_q==-1){ + if(video_r>0) + video_q=0; + else + video_q=48; + } + } + + if(keyframe_frequency<=0){ + /*Use a default keyframe frequency of 64 for 1-pass (streaming) mode, and + 256 for two-pass mode.*/ + keyframe_frequency=twopass?256:64; + } + + while(optind-99) + ret = vorbis_encode_init_vbr(&vi,audio_ch,audio_hz,audio_q); + else + ret = vorbis_encode_init(&vi,audio_ch,audio_hz,-1, + (int)(64870*(ogg_int64_t)audio_r>>16),-1); + if(ret){ + fprintf(stderr,"The Vorbis encoder could not set up a mode according to\n" + "the requested quality or bitrate.\n\n"); + exit(1); + } + + vorbis_comment_init(&vc); + vorbis_analysis_init(&vd,&vi); + vorbis_block_init(&vd,&vb); + } + + for(passno=(twopass==3?1:twopass);passno<=(twopass==3?2:twopass);passno++){ + /* Set up Theora encoder */ + if(!video){ + fprintf(stderr,"No video files submitted for compression?\n"); + exit(1); + } + /* Theora has a divisible-by-sixteen restriction for the encoded frame size */ + /* scale the picture size up to the nearest /16 and calculate offsets */ + frame_w=pic_w+15&~0xF; + frame_h=pic_h+15&~0xF; + /*Force the offsets to be even so that chroma samples line up like we + expect.*/ + pic_x=frame_w-pic_w>>1&~1; + pic_y=frame_h-pic_h>>1&~1; + th_info_init(&ti); + ti.frame_width=frame_w; + ti.frame_height=frame_h; + ti.pic_width=pic_w; + ti.pic_height=pic_h; + ti.pic_x=pic_x; + ti.pic_y=pic_y; + ti.fps_numerator=video_fps_n; + ti.fps_denominator=video_fps_d; + ti.aspect_numerator=video_par_n; + ti.aspect_denominator=video_par_d; + ti.colorspace=TH_CS_UNSPECIFIED; + /*Account for the Ogg page overhead. + This is 1 byte per 255 for lacing values, plus 26 bytes per 4096 bytes for + the page header, plus approximately 1/2 byte per packet (not accounted for + here).*/ + ti.target_bitrate=(int)(64870*(ogg_int64_t)video_r>>16); + ti.quality=video_q; + ti.keyframe_granule_shift=ilog(keyframe_frequency-1); + if(dst_c_dec_h==2){ + if(dst_c_dec_v==2)ti.pixel_fmt=TH_PF_420; + else ti.pixel_fmt=TH_PF_422; + } + else ti.pixel_fmt=TH_PF_444; + td=th_encode_alloc(&ti); + th_info_clear(&ti); + if(td==NULL){ + fprintf(stderr,"Error: Could not create an encoder instance.\n"); + fprintf(stderr,"Check that video parameters are valid.\n"); + exit(1); + } + /* setting just the granule shift only allows power-of-two keyframe + spacing. Set the actual requested spacing. */ + ret=th_encode_ctl(td,TH_ENCCTL_SET_KEYFRAME_FREQUENCY_FORCE, + &keyframe_frequency,sizeof(keyframe_frequency-1)); + if(ret<0){ + fprintf(stderr,"Could not set keyframe interval to %d.\n",(int)keyframe_frequency); + } + if(vp3_compatible){ + ret=th_encode_ctl(td,TH_ENCCTL_SET_VP3_COMPATIBLE,&vp3_compatible, + sizeof(vp3_compatible)); + if(ret<0||!vp3_compatible){ + fprintf(stderr,"Could not enable strict VP3 compatibility.\n"); + if(ret>=0){ + fprintf(stderr,"Ensure your source format is supported by VP3.\n"); + fprintf(stderr, + "(4:2:0 pixel format, width and height multiples of 16).\n"); + } + } + } + if(soft_target){ + /* reverse the rate control flags to favor a 'long time' strategy */ + int arg = TH_RATECTL_CAP_UNDERFLOW; + ret=th_encode_ctl(td,TH_ENCCTL_SET_RATE_FLAGS,&arg,sizeof(arg)); + if(ret<0) + fprintf(stderr,"Could not set encoder flags for --soft-target\n"); + /* Default buffer control is overridden on two-pass */ + if(!twopass&&buf_delay<0){ + if((keyframe_frequency*7>>1) > 5*video_fps_n/video_fps_d) + arg=keyframe_frequency*7>>1; + else + arg=5*video_fps_n/video_fps_d; + ret=th_encode_ctl(td,TH_ENCCTL_SET_RATE_BUFFER,&arg,sizeof(arg)); + if(ret<0) + fprintf(stderr,"Could not set rate control buffer for --soft-target\n"); + } + } + /* set up two-pass if needed */ + if(passno==1){ + unsigned char *buffer; + int bytes; + bytes=th_encode_ctl(td,TH_ENCCTL_2PASS_OUT,&buffer,sizeof(buffer)); + if(bytes<0){ + fprintf(stderr,"Could not set up the first pass of two-pass mode.\n"); + fprintf(stderr,"Did you remember to specify an estimated bitrate?\n"); + exit(1); + } + /*Perform a seek test to ensure we can overwrite this placeholder data at + the end; this is better than letting the user sit through a whole + encode only to find out their pass 1 file is useless at the end.*/ + if(fseek(twopass_file,0,SEEK_SET)<0){ + fprintf(stderr,"Unable to seek in two-pass data file.\n"); + exit(1); + } + if(fwrite(buffer,1,bytes,twopass_file)=0){ + ret=th_encode_ctl(td,TH_ENCCTL_SET_RATE_BUFFER, + &buf_delay,sizeof(buf_delay)); + if(ret<0){ + fprintf(stderr,"Warning: could not set desired buffer delay.\n"); + } + } + /*Speed should also be set after the current encoder mode is established, + since the available speed levels may change depending.*/ + if(speed>=0){ + int speed_max; + int ret; + ret=th_encode_ctl(td,TH_ENCCTL_GET_SPLEVEL_MAX, + &speed_max,sizeof(speed_max)); + if(ret<0){ + fprintf(stderr,"Warning: could not determine maximum speed level.\n"); + speed_max=0; + } + ret=th_encode_ctl(td,TH_ENCCTL_SET_SPLEVEL,&speed,sizeof(speed)); + if(ret<0){ + fprintf(stderr,"Warning: could not set speed level to %i of %i\n", + speed,speed_max); + if(speed>speed_max){ + fprintf(stderr,"Setting it to %i instead\n",speed_max); + } + ret=th_encode_ctl(td,TH_ENCCTL_SET_SPLEVEL, + &speed_max,sizeof(speed_max)); + if(ret<0){ + fprintf(stderr,"Warning: could not set speed level to %i of %i\n", + speed_max,speed_max); + } + } + } + /* write the bitstream header packets with proper page interleave */ + th_comment_init(&tc); + /* first packet will get its own page automatically */ + if(th_encode_flushheader(td,&tc,&op)<=0){ + fprintf(stderr,"Internal Theora library error.\n"); + exit(1); + } + if(passno!=1){ + ogg_stream_packetin(&to,&op); + if(ogg_stream_pageout(&to,&og)!=1){ + fprintf(stderr,"Internal Ogg library error.\n"); + exit(1); + } + fwrite(og.header,1,og.header_len,outfile); + fwrite(og.body,1,og.body_len,outfile); + } + /* create the remaining theora headers */ + for(;;){ + ret=th_encode_flushheader(td,&tc,&op); + if(ret<0){ + fprintf(stderr,"Internal Theora library error.\n"); + exit(1); + } + else if(!ret)break; + if(passno!=1)ogg_stream_packetin(&to,&op); + } + if(audio && passno!=1){ + ogg_packet header; + ogg_packet header_comm; + ogg_packet header_code; + vorbis_analysis_headerout(&vd,&vc,&header,&header_comm,&header_code); + ogg_stream_packetin(&vo,&header); /* automatically placed in its own + page */ + if(ogg_stream_pageout(&vo,&og)!=1){ + fprintf(stderr,"Internal Ogg library error.\n"); + exit(1); + } + fwrite(og.header,1,og.header_len,outfile); + fwrite(og.body,1,og.body_len,outfile); + /* remaining vorbis header packets */ + ogg_stream_packetin(&vo,&header_comm); + ogg_stream_packetin(&vo,&header_code); + } + /* Flush the rest of our headers. This ensures + the actual data in each stream will start + on a new page, as per spec. */ + if(passno!=1){ + for(;;){ + int result = ogg_stream_flush(&to,&og); + if(result<0){ + /* can't get here */ + fprintf(stderr,"Internal Ogg library error.\n"); + exit(1); + } + if(result==0)break; + fwrite(og.header,1,og.header_len,outfile); + fwrite(og.body,1,og.body_len,outfile); + } + } + if(audio && passno!=1){ + for(;;){ + int result=ogg_stream_flush(&vo,&og); + if(result<0){ + /* can't get here */ + fprintf(stderr,"Internal Ogg library error.\n"); + exit(1); + } + if(result==0)break; + fwrite(og.header,1,og.header_len,outfile); + fwrite(og.body,1,og.body_len,outfile); + } + } + /* setup complete. Raw processing loop */ + if(!quiet){ + switch(passno){ + case 0: case 2: + fprintf(stderr,"\rCompressing.... \n"); + break; + case 1: + fprintf(stderr,"\rScanning first pass.... \n"); + break; + } + } + for(;;){ + int audio_or_video=-1; + if(passno==1){ + ogg_packet op; + int ret=fetch_and_process_video_packet(video,twopass_file,passno,td,&op); + if(ret<0)break; + if(op.e_o_s)break; /* end of stream */ + timebase=th_granule_time(td,op.granulepos); + audio_or_video=1; + }else{ + double audiotime; + double videotime; + ogg_page audiopage; + ogg_page videopage; + /* is there an audio page flushed? If not, fetch one if possible */ + audioflag=fetch_and_process_audio(audio,&audiopage,&vo,&vd,&vb,audioflag); + /* is there a video page flushed? If not, fetch one if possible */ + videoflag=fetch_and_process_video(video,&videopage,&to,td,twopass_file,passno,videoflag); + /* no pages of either? Must be end of stream. */ + if(!audioflag && !videoflag)break; + /* which is earlier; the end of the audio page or the end of the + video page? Flush the earlier to stream */ + audiotime= + audioflag?vorbis_granule_time(&vd,ogg_page_granulepos(&audiopage)):-1; + videotime= + videoflag?th_granule_time(td,ogg_page_granulepos(&videopage)):-1; + if(!audioflag){ + audio_or_video=1; + } else if(!videoflag) { + audio_or_video=0; + } else { + if(audiotime0){ + int hundredths=(int)(timebase*100-(long)timebase*100); + int seconds=(long)timebase%60; + int minutes=((long)timebase/60)%60; + int hours=(long)timebase/3600; + if(audio_or_video)vkbps=(int)rint(video_bytesout*8./timebase*.001); + else akbps=(int)rint(audio_bytesout*8./timebase*.001); + fprintf(stderr, + "\r %d:%02d:%02d.%02d audio: %dkbps video: %dkbps ", + hours,minutes,seconds,hundredths,akbps,vkbps); + } + } + if(video)th_encode_free(td); + } + + /* clear out state */ + if(audio && twopass!=1){ + ogg_stream_clear(&vo); + vorbis_block_clear(&vb); + vorbis_dsp_clear(&vd); + vorbis_comment_clear(&vc); + vorbis_info_clear(&vi); + if(audio!=stdin)fclose(audio); + } + if(video){ + ogg_stream_clear(&to); + th_comment_clear(&tc); + if(video!=stdin)fclose(video); + } + + if(outfile && outfile!=stdout)fclose(outfile); + if(twopass_file)fclose(twopass_file); + + clock_end=clock(); + elapsed=(clock_end-clock_start)/(double)CLOCKS_PER_SEC; + + if(!quiet){ + fprintf(stderr,"\r \n"); + fprintf(stderr," %lld frames in %.3lf seconds: %.3lf Mpixel/s", + (long long)frames,elapsed, + (double)1e-6*frames*frame_w*frame_h/elapsed); + fprintf(stderr," %.2lfx", + (double)frames*video_fps_d/(elapsed*video_fps_n)); + fprintf(stderr,"\ndone.\n\n"); + } + + return(0); + +} diff --git a/cs/3rd party/libtheora/examples/getopt.c b/cs/3rd party/libtheora/examples/getopt.c new file mode 100644 index 000000000..9bafa453c --- /dev/null +++ b/cs/3rd party/libtheora/examples/getopt.c @@ -0,0 +1,1055 @@ +/* Getopt for GNU. + NOTE: getopt is now part of the C library, so if you don't know what + "Keep this file name-space clean" means, talk to drepper@gnu.org + before changing it! + Copyright (C) 1987,88,89,90,91,92,93,94,95,96,98,99,2000,2001 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library 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. + + The GNU C Library is distributed in the hope that 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 the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +/* This tells Alpha OSF/1 not to define a getopt prototype in . + Ditto for AIX 3.2 and . */ +#ifndef _NO_PROTO +# define _NO_PROTO +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#if !defined __STDC__ || !__STDC__ +/* This is a separate conditional since some stdc systems + reject `defined (const)'. */ +# ifndef const +# define const +# endif +#endif + +#include + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#define GETOPT_INTERFACE_VERSION 2 +#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 +# include +# if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION +# define ELIDE_CODE +# endif +#endif + +#ifndef ELIDE_CODE + + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +/* Don't include stdlib.h for non-GNU C libraries because some of them + contain conflicting prototypes for getopt. */ +# include +# include +#endif /* GNU C library. */ + +#ifdef VMS +# include +# if HAVE_STRING_H - 0 +# include +# endif +#endif + +#ifndef _ +/* This is for other GNU distributions with internationalized messages. */ +# if defined HAVE_LIBINTL_H || defined _LIBC +# include +# ifndef _ +# define _(msgid) gettext (msgid) +# endif +# else +# define _(msgid) (msgid) +# endif +#endif + +/* This version of `getopt' appears to the caller like standard Unix `getopt' + but it behaves differently for the user, since it allows the user + to intersperse the options with the other arguments. + + As `getopt' works, it permutes the elements of ARGV so that, + when it is done, all the options precede everything else. Thus + all application programs are extended to handle flexible argument order. + + Setting the environment variable POSIXLY_CORRECT disables permutation. + Then the behavior is completely standard. + + GNU application programs can use a third alternative mode in which + they can distinguish the relative order of options and other arguments. */ + +#include "getopt.h" + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +/* 1003.2 says this must be 1 before any call. */ +int optind = 1; + +/* Formerly, initialization of getopt depended on optind==0, which + causes problems with re-calling getopt as programs generally don't + know that. */ + +int __getopt_initialized; + +/* The next char to be scanned in the option-element + in which the last option character we returned was found. + This allows us to pick up the scan where we left off. + + If this is zero, or a null string, it means resume the scan + by advancing to the next ARGV-element. */ + +static char *nextchar; + +/* Callers store zero here to inhibit the error message + for unrecognized options. */ + +int opterr = 1; + +/* Set to an option character which was unrecognized. + This must be initialized on some systems to avoid linking in the + system's own getopt implementation. */ + +int optopt = '?'; + +/* Describe how to deal with options that follow non-option ARGV-elements. + + If the caller did not specify anything, + the default is REQUIRE_ORDER if the environment variable + POSIXLY_CORRECT is defined, PERMUTE otherwise. + + REQUIRE_ORDER means don't recognize them as options; + stop option processing when the first non-option is seen. + This is what Unix does. + This mode of operation is selected by either setting the environment + variable POSIXLY_CORRECT, or using `+' as the first character + of the list of option characters. + + PERMUTE is the default. We permute the contents of ARGV as we scan, + so that eventually all the non-options are at the end. This allows options + to be given in any order, even with programs that were not written to + expect this. + + RETURN_IN_ORDER is an option available to programs that were written + to expect options and other ARGV-elements in any order and that care about + the ordering of the two. We describe each non-option ARGV-element + as if it were the argument of an option with character code 1. + Using `-' as the first character of the list of option characters + selects this mode of operation. + + The special argument `--' forces an end of option-scanning regardless + of the value of `ordering'. In the case of RETURN_IN_ORDER, only + `--' can cause `getopt' to return -1 with `optind' != ARGC. */ + +static enum +{ + REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER +} ordering; + +/* Value of POSIXLY_CORRECT environment variable. */ +static char *posixly_correct; + +#ifdef __GNU_LIBRARY__ +/* We want to avoid inclusion of string.h with non-GNU libraries + because there are many ways it can cause trouble. + On some systems, it contains special magic macros that don't work + in GCC. */ +# include +# define my_index strchr +#else + +# if HAVE_STRING_H +# include +# else +# include +# endif + +/* Avoid depending on library functions or files + whose names are inconsistent. */ + +#ifndef getenv +extern char *getenv (); +#endif + +static char * +my_index (str, chr) + const char *str; + int chr; +{ + while (*str) + { + if (*str == chr) + return (char *) str; + str++; + } + return 0; +} + +/* If using GCC, we can safely declare strlen this way. + If not using GCC, it is ok not to declare it. */ +#ifdef __GNUC__ +/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. + That was relevant to code that was here before. */ +# if (!defined __STDC__ || !__STDC__) && !defined strlen +/* gcc with -traditional declares the built-in strlen to return int, + and has done so at least since version 2.4.5. -- rms. */ +extern int strlen (const char *); +# endif /* not __STDC__ */ +#endif /* __GNUC__ */ + +#endif /* not __GNU_LIBRARY__ */ + +/* Handle permutation of arguments. */ + +/* Describe the part of ARGV that contains non-options that have + been skipped. `first_nonopt' is the index in ARGV of the first of them; + `last_nonopt' is the index after the last of them. */ + +static int first_nonopt; +static int last_nonopt; + +#ifdef _LIBC +/* Stored original parameters. + XXX This is no good solution. We should rather copy the args so + that we can compare them later. But we must not use malloc(3). */ +extern int __libc_argc; +extern char **__libc_argv; + +/* Bash 2.0 gives us an environment variable containing flags + indicating ARGV elements that should not be considered arguments. */ + +# ifdef USE_NONOPTION_FLAGS +/* Defined in getopt_init.c */ +extern char *__getopt_nonoption_flags; + +static int nonoption_flags_max_len; +static int nonoption_flags_len; +# endif + +# ifdef USE_NONOPTION_FLAGS +# define SWAP_FLAGS(ch1, ch2) \ + if (nonoption_flags_len > 0) \ + { \ + char __tmp = __getopt_nonoption_flags[ch1]; \ + __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ + __getopt_nonoption_flags[ch2] = __tmp; \ + } +# else +# define SWAP_FLAGS(ch1, ch2) +# endif +#else /* !_LIBC */ +# define SWAP_FLAGS(ch1, ch2) +#endif /* _LIBC */ + +/* Exchange two adjacent subsequences of ARGV. + One subsequence is elements [first_nonopt,last_nonopt) + which contains all the non-options that have been skipped so far. + The other is elements [last_nonopt,optind), which contains all + the options processed since those non-options were skipped. + + `first_nonopt' and `last_nonopt' are relocated so that they describe + the new indices of the non-options in ARGV after they are moved. */ + +#if defined __STDC__ && __STDC__ +static void exchange (char **); +#endif + +static void +exchange (argv) + char **argv; +{ + int bottom = first_nonopt; + int middle = last_nonopt; + int top = optind; + char *tem; + + /* Exchange the shorter segment with the far end of the longer segment. + That puts the shorter segment into the right place. + It leaves the longer segment in the right place overall, + but it consists of two parts that need to be swapped next. */ + +#if defined _LIBC && defined USE_NONOPTION_FLAGS + /* First make sure the handling of the `__getopt_nonoption_flags' + string can work normally. Our top argument must be in the range + of the string. */ + if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len) + { + /* We must extend the array. The user plays games with us and + presents new arguments. */ + char *new_str = malloc (top + 1); + if (new_str == NULL) + nonoption_flags_len = nonoption_flags_max_len = 0; + else + { + memset (__mempcpy (new_str, __getopt_nonoption_flags, + nonoption_flags_max_len), + '\0', top + 1 - nonoption_flags_max_len); + nonoption_flags_max_len = top + 1; + __getopt_nonoption_flags = new_str; + } + } +#endif + + while (top > middle && middle > bottom) + { + if (top - middle > middle - bottom) + { + /* Bottom segment is the short one. */ + int len = middle - bottom; + register int i; + + /* Swap it with the top part of the top segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[top - (middle - bottom) + i]; + argv[top - (middle - bottom) + i] = tem; + SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); + } + /* Exclude the moved bottom segment from further swapping. */ + top -= len; + } + else + { + /* Top segment is the short one. */ + int len = top - middle; + register int i; + + /* Swap it with the bottom part of the bottom segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[middle + i]; + argv[middle + i] = tem; + SWAP_FLAGS (bottom + i, middle + i); + } + /* Exclude the moved top segment from further swapping. */ + bottom += len; + } + } + + /* Update records for the slots the non-options now occupy. */ + + first_nonopt += (optind - last_nonopt); + last_nonopt = optind; +} + +/* Initialize the internal data when the first call is made. */ + +#if defined __STDC__ && __STDC__ +static const char *_getopt_initialize (int, char *const *, const char *); +#endif +static const char * +_getopt_initialize (argc, argv, optstring) + int argc; + char *const *argv; + const char *optstring; +{ + /* Start processing options with ARGV-element 1 (since ARGV-element 0 + is the program name); the sequence of previously skipped + non-option ARGV-elements is empty. */ + + first_nonopt = last_nonopt = optind; + + nextchar = NULL; + + posixly_correct = getenv ("POSIXLY_CORRECT"); + + /* Determine how to handle the ordering of options and nonoptions. */ + + if (optstring[0] == '-') + { + ordering = RETURN_IN_ORDER; + ++optstring; + } + else if (optstring[0] == '+') + { + ordering = REQUIRE_ORDER; + ++optstring; + } + else if (posixly_correct != NULL) + ordering = REQUIRE_ORDER; + else + ordering = PERMUTE; + +#if defined _LIBC && defined USE_NONOPTION_FLAGS + if (posixly_correct == NULL + && argc == __libc_argc && argv == __libc_argv) + { + if (nonoption_flags_max_len == 0) + { + if (__getopt_nonoption_flags == NULL + || __getopt_nonoption_flags[0] == '\0') + nonoption_flags_max_len = -1; + else + { + const char *orig_str = __getopt_nonoption_flags; + int len = nonoption_flags_max_len = strlen (orig_str); + if (nonoption_flags_max_len < argc) + nonoption_flags_max_len = argc; + __getopt_nonoption_flags = + (char *) malloc (nonoption_flags_max_len); + if (__getopt_nonoption_flags == NULL) + nonoption_flags_max_len = -1; + else + memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), + '\0', nonoption_flags_max_len - len); + } + } + nonoption_flags_len = nonoption_flags_max_len; + } + else + nonoption_flags_len = 0; +#endif + + return optstring; +} + +/* Scan elements of ARGV (whose length is ARGC) for option characters + given in OPTSTRING. + + If an element of ARGV starts with '-', and is not exactly "-" or "--", + then it is an option element. The characters of this element + (aside from the initial '-') are option characters. If `getopt' + is called repeatedly, it returns successively each of the option characters + from each of the option elements. + + If `getopt' finds another option character, it returns that character, + updating `optind' and `nextchar' so that the next call to `getopt' can + resume the scan with the following option character or ARGV-element. + + If there are no more option characters, `getopt' returns -1. + Then `optind' is the index in ARGV of the first ARGV-element + that is not an option. (The ARGV-elements have been permuted + so that those that are not options now come last.) + + OPTSTRING is a string containing the legitimate option characters. + If an option character is seen that is not listed in OPTSTRING, + return '?' after printing an error message. If you set `opterr' to + zero, the error message is suppressed but we still return '?'. + + If a char in OPTSTRING is followed by a colon, that means it wants an arg, + so the following text in the same ARGV-element, or the text of the following + ARGV-element, is returned in `optarg'. Two colons mean an option that + wants an optional arg; if there is text in the current ARGV-element, + it is returned in `optarg', otherwise `optarg' is set to zero. + + If OPTSTRING starts with `-' or `+', it requests different methods of + handling the non-option ARGV-elements. + See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. + + Long-named options begin with `--' instead of `-'. + Their names may be abbreviated as long as the abbreviation is unique + or is an exact match for some defined option. If they have an + argument, it follows the option name in the same ARGV-element, separated + from the option name by a `=', or else the in next ARGV-element. + When `getopt' finds a long-named option, it returns 0 if that option's + `flag' field is nonzero, the value of the option's `val' field + if the `flag' field is zero. + + The elements of ARGV aren't really const, because we permute them. + But we pretend they're const in the prototype to be compatible + with other systems. + + LONGOPTS is a vector of `struct option' terminated by an + element containing a name which is zero. + + LONGIND returns the index in LONGOPT of the long-named option found. + It is only valid when a long-named option has been found by the most + recent call. + + If LONG_ONLY is nonzero, '-' as well as '--' can introduce + long-named options. */ + +int +_getopt_internal (argc, argv, optstring, longopts, longind, long_only) + int argc; + char *const *argv; + const char *optstring; + const struct option *longopts; + int *longind; + int long_only; +{ + int print_errors = opterr; + if (optstring[0] == ':') + print_errors = 0; + + if (argc < 1) + return -1; + + optarg = NULL; + + if (optind == 0 || !__getopt_initialized) + { + if (optind == 0) + optind = 1; /* Don't scan ARGV[0], the program name. */ + optstring = _getopt_initialize (argc, argv, optstring); + __getopt_initialized = 1; + } + + /* Test whether ARGV[optind] points to a non-option argument. + Either it does not have option syntax, or there is an environment flag + from the shell indicating it is not an option. The later information + is only used when the used in the GNU libc. */ +#if defined _LIBC && defined USE_NONOPTION_FLAGS +# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ + || (optind < nonoption_flags_len \ + && __getopt_nonoption_flags[optind] == '1')) +#else +# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') +#endif + + if (nextchar == NULL || *nextchar == '\0') + { + /* Advance to the next ARGV-element. */ + + /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been + moved back by the user (who may also have changed the arguments). */ + if (last_nonopt > optind) + last_nonopt = optind; + if (first_nonopt > optind) + first_nonopt = optind; + + if (ordering == PERMUTE) + { + /* If we have just processed some options following some non-options, + exchange them so that the options come first. */ + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (last_nonopt != optind) + first_nonopt = optind; + + /* Skip any additional non-options + and extend the range of non-options previously skipped. */ + + while (optind < argc && NONOPTION_P) + optind++; + last_nonopt = optind; + } + + /* The special ARGV-element `--' means premature end of options. + Skip it like a null option, + then exchange with previous non-options as if it were an option, + then skip everything else like a non-option. */ + + if (optind != argc && !strcmp (argv[optind], "--")) + { + optind++; + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (first_nonopt == last_nonopt) + first_nonopt = optind; + last_nonopt = argc; + + optind = argc; + } + + /* If we have done all the ARGV-elements, stop the scan + and back over any non-options that we skipped and permuted. */ + + if (optind == argc) + { + /* Set the next-arg-index to point at the non-options + that we previously skipped, so the caller will digest them. */ + if (first_nonopt != last_nonopt) + optind = first_nonopt; + return -1; + } + + /* If we have come to a non-option and did not permute it, + either stop the scan or describe it to the caller and pass it by. */ + + if (NONOPTION_P) + { + if (ordering == REQUIRE_ORDER) + return -1; + optarg = argv[optind++]; + return 1; + } + + /* We have found another option-ARGV-element. + Skip the initial punctuation. */ + + nextchar = (argv[optind] + 1 + + (longopts != NULL && argv[optind][1] == '-')); + } + + /* Decode the current option-ARGV-element. */ + + /* Check whether the ARGV-element is a long option. + + If long_only and the ARGV-element has the form "-f", where f is + a valid short option, don't consider it an abbreviated form of + a long option that starts with f. Otherwise there would be no + way to give the -f short option. + + On the other hand, if there's a long option "fubar" and + the ARGV-element is "-fu", do consider that an abbreviation of + the long option, just like "--fu", and not "-f" with arg "u". + + This distinction seems to be the most useful approach. */ + + if (longopts != NULL + && (argv[optind][1] == '-' + || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = -1; + int option_index; + + for (nameend = nextchar; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, nextchar, nameend - nextchar)) + { + if ((unsigned int) (nameend - nextchar) + == (unsigned int) strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else if (long_only + || pfound->has_arg != p->has_arg + || pfound->flag != p->flag + || pfound->val != p->val) + /* Second or later nonexact match found. */ + ambig = 1; + } + + if (ambig && !exact) + { + if (print_errors) + fprintf (stderr, _("%s: option `%s' is ambiguous\n"), + argv[0], argv[optind]); + nextchar += strlen (nextchar); + optind++; + optopt = 0; + return '?'; + } + + if (pfound != NULL) + { + option_index = indfound; + optind++; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + optarg = nameend + 1; + else + { + if (print_errors) + { + if (argv[optind - 1][1] == '-') + /* --option */ + fprintf (stderr, + _("%s: option `--%s' doesn't allow an argument\n"), + argv[0], pfound->name); + else + /* +option or -option */ + fprintf (stderr, + _("%s: option `%c%s' doesn't allow an argument\n"), + argv[0], argv[optind - 1][0], pfound->name); + } + + nextchar += strlen (nextchar); + + optopt = pfound->val; + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (optind < argc) + optarg = argv[optind++]; + else + { + if (print_errors) + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[optind - 1]); + nextchar += strlen (nextchar); + optopt = pfound->val; + return optstring[0] == ':' ? ':' : '?'; + } + } + nextchar += strlen (nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + + /* Can't find it as a long option. If this is not getopt_long_only, + or the option starts with '--' or is not a valid short + option, then it's an error. + Otherwise interpret it as a short option. */ + if (!long_only || argv[optind][1] == '-' + || my_index (optstring, *nextchar) == NULL) + { + if (print_errors) + { + if (argv[optind][1] == '-') + /* --option */ + fprintf (stderr, _("%s: unrecognized option `--%s'\n"), + argv[0], nextchar); + else + /* +option or -option */ + fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), + argv[0], argv[optind][0], nextchar); + } + nextchar = (char *) ""; + optind++; + optopt = 0; + return '?'; + } + } + + /* Look at and handle the next short option-character. */ + + { + char c = *nextchar++; + char *temp = my_index (optstring, c); + + /* Increment `optind' when we start to process its last character. */ + if (*nextchar == '\0') + ++optind; + + if (temp == NULL || c == ':') + { + if (print_errors) + { + if (posixly_correct) + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, _("%s: illegal option -- %c\n"), + argv[0], c); + else + fprintf (stderr, _("%s: invalid option -- %c\n"), + argv[0], c); + } + optopt = c; + return '?'; + } + /* Convenience. Treat POSIX -W foo same as long option --foo */ + if (temp[0] == 'W' && temp[1] == ';') + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = 0; + int option_index; + + /* This is an option that requires an argument. */ + if (*nextchar != '\0') + { + optarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + optind++; + } + else if (optind == argc) + { + if (print_errors) + { + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, _("%s: option requires an argument -- %c\n"), + argv[0], c); + } + optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + return c; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + + /* optarg is now the argument, see if it's in the + table of longopts. */ + + for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, nextchar, nameend - nextchar)) + { + if ((unsigned int) (nameend - nextchar) == strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else + /* Second or later nonexact match found. */ + ambig = 1; + } + if (ambig && !exact) + { + if (print_errors) + fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), + argv[0], argv[optind]); + nextchar += strlen (nextchar); + optind++; + return '?'; + } + if (pfound != NULL) + { + option_index = indfound; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + optarg = nameend + 1; + else + { + if (print_errors) + fprintf (stderr, _("\ +%s: option `-W %s' doesn't allow an argument\n"), + argv[0], pfound->name); + + nextchar += strlen (nextchar); + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (optind < argc) + optarg = argv[optind++]; + else + { + if (print_errors) + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[optind - 1]); + nextchar += strlen (nextchar); + return optstring[0] == ':' ? ':' : '?'; + } + } + nextchar += strlen (nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + nextchar = NULL; + return 'W'; /* Let the application handle it. */ + } + if (temp[1] == ':') + { + if (temp[2] == ':') + { + /* This is an option that accepts an argument optionally. */ + if (*nextchar != '\0') + { + optarg = nextchar; + optind++; + } + else + optarg = NULL; + nextchar = NULL; + } + else + { + /* This is an option that requires an argument. */ + if (*nextchar != '\0') + { + optarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + optind++; + } + else if (optind == argc) + { + if (print_errors) + { + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, + _("%s: option requires an argument -- %c\n"), + argv[0], c); + } + optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + nextchar = NULL; + } + } + return c; + } +} + +int +getopt (argc, argv, optstring) + int argc; + char *const *argv; + const char *optstring; +{ + return _getopt_internal (argc, argv, optstring, + (const struct option *) 0, + (int *) 0, + 0); +} + +#endif /* Not ELIDE_CODE. */ + +#ifdef TEST + +/* Compile with -DTEST to make an executable for use in testing + the above definition of `getopt'. */ + +int +main (argc, argv) + int argc; + char **argv; +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + + c = getopt (argc, argv, "abc:d:0123456789"); + if (c == -1) + break; + + switch (c) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case '?': + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif /* TEST */ diff --git a/cs/3rd party/libtheora/examples/getopt.h b/cs/3rd party/libtheora/examples/getopt.h new file mode 100644 index 000000000..a1b8dd665 --- /dev/null +++ b/cs/3rd party/libtheora/examples/getopt.h @@ -0,0 +1,180 @@ +/* Declarations for getopt. + Copyright (C) 1989-1994, 1996-1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library 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. + + The GNU C Library is distributed in the hope that 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 the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _GETOPT_H + +#ifndef __need_getopt +# define _GETOPT_H 1 +#endif + +/* If __GNU_LIBRARY__ is not already defined, either we are being used + standalone, or this is the first header included in the source file. + If we are being used with glibc, we need to include , but + that does not exist if we are standalone. So: if __GNU_LIBRARY__ is + not defined, include , which will pull in for us + if it's from glibc. (Why ctype.h? It's guaranteed to exist and it + doesn't flood the namespace with stuff the way some other headers do.) */ +#if !defined __GNU_LIBRARY__ +# include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +extern char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +extern int optind; + +/* Callers store zero here to inhibit the error message `getopt' prints + for unrecognized options. */ + +extern int opterr; + +/* Set to an option character which was unrecognized. */ + +extern int optopt; + +#ifndef __need_getopt +/* Describe the long-named options requested by the application. + The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector + of `struct option' terminated by an element containing a name which is + zero. + + The field `has_arg' is: + no_argument (or 0) if the option does not take an argument, + required_argument (or 1) if the option requires an argument, + optional_argument (or 2) if the option takes an optional argument. + + If the field `flag' is not NULL, it points to a variable that is set + to the value given in the field `val' when the option is found, but + left unchanged if the option is not found. + + To have a long-named option do something other than set an `int' to + a compiled-in constant, such as set a value from `optarg', set the + option's `flag' field to zero and its `val' field to a nonzero + value (the equivalent single-letter option character, if there is + one). For long options that have a zero `flag' field, `getopt' + returns the contents of the `val' field. */ + +struct option +{ +# if (defined __STDC__ && __STDC__) || defined __cplusplus + const char *name; +# else + char *name; +# endif + /* has_arg can't be an enum because some compilers complain about + type mismatches in all the code that assumes it is an int. */ + int has_arg; + int *flag; + int val; +}; + +/* Names for the values of the `has_arg' field of `struct option'. */ + +# define no_argument 0 +# define required_argument 1 +# define optional_argument 2 +#endif /* need getopt */ + + +/* Get definitions and prototypes for functions to process the + arguments in ARGV (ARGC of them, minus the program name) for + options given in OPTS. + + Return the option character from OPTS just read. Return -1 when + there are no more options. For unrecognized options, or options + missing arguments, `optopt' is set to the option letter, and '?' is + returned. + + The OPTS string is a list of characters which are recognized option + letters, optionally followed by colons, specifying that that letter + takes an argument, to be placed in `optarg'. + + If a letter in OPTS is followed by two colons, its argument is + optional. This behavior is specific to the GNU `getopt'. + + The argument `--' causes premature termination of argument + scanning, explicitly telling `getopt' that there are no more + options. + + If OPTS begins with `--', then non-option arguments are treated as + arguments to the option '\0'. This behavior is specific to the GNU + `getopt'. */ + +#if (defined __STDC__ && __STDC__) || defined __cplusplus +# ifdef __GNU_LIBRARY__ +/* Many other libraries have conflicting prototypes for getopt, with + differences in the consts, in stdlib.h. To avoid compilation + errors, only prototype getopt for the GNU C library. */ +extern int getopt (int __argc, char *const *__argv, const char *__shortopts); +# else /* not __GNU_LIBRARY__ */ +extern int getopt (); +# endif /* __GNU_LIBRARY__ */ + +# ifndef __need_getopt +extern int getopt_long (int __argc, char *const *__argv, const char *__shortopts, + const struct option *__longopts, int *__longind); +extern int getopt_long_only (int __argc, char *const *__argv, + const char *__shortopts, + const struct option *__longopts, int *__longind); + +/* Internal only. Users should not call this directly. */ +extern int _getopt_internal (int __argc, char *const *__argv, + const char *__shortopts, + const struct option *__longopts, int *__longind, + int __long_only); +# endif +#else /* not __STDC__ */ +extern int getopt (); +# ifndef __need_getopt +extern int getopt_long (); +extern int getopt_long_only (); + +extern int _getopt_internal (); +# endif +#endif /* __STDC__ */ + +#ifdef __cplusplus +} +#endif + +/* Make sure we later can get all the definitions and declarations. */ +#undef __need_getopt + +#endif /* getopt.h */ diff --git a/cs/3rd party/libtheora/examples/getopt1.c b/cs/3rd party/libtheora/examples/getopt1.c new file mode 100644 index 000000000..22a7efbdd --- /dev/null +++ b/cs/3rd party/libtheora/examples/getopt1.c @@ -0,0 +1,188 @@ +/* getopt_long and getopt_long_only entry points for GNU getopt. + Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library 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. + + The GNU C Library is distributed in the hope that 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 the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "getopt.h" + +#if !defined __STDC__ || !__STDC__ +/* This is a separate conditional since some stdc systems + reject `defined (const)'. */ +#ifndef const +#define const +#endif +#endif + +#include + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#define GETOPT_INTERFACE_VERSION 2 +#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 +#include +#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION +#define ELIDE_CODE +#endif +#endif + +#ifndef ELIDE_CODE + + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +#include +#endif + +#ifndef NULL +#define NULL 0 +#endif + +int +getopt_long (argc, argv, options, long_options, opt_index) + int argc; + char *const *argv; + const char *options; + const struct option *long_options; + int *opt_index; +{ + return _getopt_internal (argc, argv, options, long_options, opt_index, 0); +} + +/* Like getopt_long, but '-' as well as '--' can indicate a long option. + If an option that starts with '-' (not '--') doesn't match a long option, + but does match a short option, it is parsed as a short option + instead. */ + +int +getopt_long_only (argc, argv, options, long_options, opt_index) + int argc; + char *const *argv; + const char *options; + const struct option *long_options; + int *opt_index; +{ + return _getopt_internal (argc, argv, options, long_options, opt_index, 1); +} + + +#endif /* Not ELIDE_CODE. */ + +#ifdef TEST + +#include + +int +main (argc, argv) + int argc; + char **argv; +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + int option_index = 0; + static struct option long_options[] = + { + {"add", 1, 0, 0}, + {"append", 0, 0, 0}, + {"delete", 1, 0, 0}, + {"verbose", 0, 0, 0}, + {"create", 0, 0, 0}, + {"file", 1, 0, 0}, + {0, 0, 0, 0} + }; + + c = getopt_long (argc, argv, "abc:d:0123456789", + long_options, &option_index); + if (c == -1) + break; + + switch (c) + { + case 0: + printf ("option %s", long_options[option_index].name); + if (optarg) + printf (" with arg %s", optarg); + printf ("\n"); + break; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case 'd': + printf ("option d with value `%s'\n", optarg); + break; + + case '?': + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif /* TEST */ diff --git a/cs/3rd party/libtheora/examples/libtheora_info.c b/cs/3rd party/libtheora/examples/libtheora_info.c new file mode 100644 index 000000000..86593ff11 --- /dev/null +++ b/cs/3rd party/libtheora/examples/libtheora_info.c @@ -0,0 +1,141 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggTheora SOFTWARE 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 Theora SOURCE CODE IS COPYRIGHT (C) 2002-2010 * + * by the Xiph.Org Foundation and contributors http://www.xiph.org/ * + * * + ******************************************************************** + + function: example of querying various library parameters. + last mod: $Id$ + + ********************************************************************/ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include "theora/theoraenc.h" + + +/* Print the library's bitstream version number + This is the highest supported bitstream version number, + not the version number of the implementation itself. */ +int print_version(void) +{ + unsigned version = th_version_number(); + + fprintf(stdout, "Bitstream: %d.%d.%d (0x%06X)\n", + (version >> 16) & 0xff, (version >> 8) & 0xff, (version) & 0xff, + version); + + return 0; +} + +/* Print the library's own version string + This is generally the same at the vendor string embedded + in encoded files. */ +int print_version_string(void) +{ + const char *version = th_version_string(); + + if (version == NULL) { + fprintf(stderr, "Error querying libtheora version string.\n"); + return -1; + } + + fprintf(stdout, "Version: %s\n", version); + + return 0; +} + +/* Generate a dummy encoder context for use in th_encode_ctl queries */ +th_enc_ctx *dummy_encode_ctx(void) +{ + th_enc_ctx *ctx; + th_info info; + + /* set the minimal video parameters */ + th_info_init(&info); + info.frame_width=320; + info.frame_height=240; + info.fps_numerator=1; + info.fps_denominator=1; + + /* allocate and initialize a context object */ + ctx = th_encode_alloc(&info); + if (ctx == NULL) { + fprintf(stderr, "Error allocating encoder context.\n"); + } + + /* clear the info struct */ + th_info_clear(&info); + + return ctx; +} + +/* Query the current and maximum values for the 'speed level' setting. + This can be used to ask the encoder to trade off encoding quality + vs. performance cost, for example to adapt to realtime constraints. */ +int check_speed_level(th_enc_ctx *ctx, int *current, int *max) +{ + int ret; + + /* query the current speed level */ + ret = th_encode_ctl(ctx, TH_ENCCTL_GET_SPLEVEL, current, sizeof(int)); + if (ret) { + fprintf(stderr, "Error %d getting current speed level.\n", ret); + return ret; + } + /* query the maximum speed level, which varies by encoder version */ + ret = th_encode_ctl(ctx, TH_ENCCTL_GET_SPLEVEL_MAX, max, sizeof(int)); + if (ret) { + fprintf(stderr, "Error %d getting max speed level.\n", ret); + return ret; + } + + return 0; +} + +/* Print the current and maximum speed level settings */ +int print_speed_level(th_enc_ctx *ctx) +{ + int current = -1; + int max = -1; + int ret; + + ret = check_speed_level(ctx, ¤t, &max); + if (ret == 0) { + fprintf(stdout, "Default speed level: %d\n", current); + fprintf(stdout, "Maximum speed level: %d\n", max); + } + + return ret; +} + +int main(int argc, char **argv) { + th_enc_ctx *ctx; + + /* print versioning */ + print_version_string(); + print_version(); + + /* allocate a generic context for queries that require it */ + ctx = dummy_encode_ctx(); + if (ctx != NULL) { + /* dump the speed level setting */ + print_speed_level(ctx); + /* clean up */ + th_encode_free(ctx); + } + + return 0; +} + diff --git a/cs/3rd party/libtheora/examples/player_example.c b/cs/3rd party/libtheora/examples/player_example.c new file mode 100644 index 000000000..18fbdd1f7 --- /dev/null +++ b/cs/3rd party/libtheora/examples/player_example.c @@ -0,0 +1,887 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggTheora SOFTWARE 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 Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 * + * by the Xiph.Org Foundation and contributors http://www.xiph.org/ * + * * + ******************************************************************** + + function: example SDL player application; plays Ogg Theora files (with + optional Vorbis audio second stream) + last mod: $Id$ + + ********************************************************************/ + +/* far more complex than most Ogg 'example' programs. The complexity + of maintaining A/V sync is pretty much unavoidable. It's necessary + to actually have audio/video playback to make the hard audio clock + sync actually work. If there's audio playback, there might as well + be simple video playback as well... + + A simple 'demux and write back streams' would have been easier, + it's true. */ + +#if !defined(_GNU_SOURCE) +#define _GNU_SOURCE +#endif +#if !defined(_LARGEFILE_SOURCE) +#define _LARGEFILE_SOURCE +#endif +#if !defined(_LARGEFILE64_SOURCE) +#define _LARGEFILE64_SOURCE +#endif +#if !defined(_FILE_OFFSET_BITS) +#define _FILE_OFFSET_BITS 64 +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#ifndef _REENTRANT +# define _REENTRANT +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "theora/theoradec.h" +#include "vorbis/codec.h" +#include + +/* yes, this makes us OSS-specific for now. None of SDL, libao, libao2 + give us any way to determine hardware timing, and since the + hard/kernel buffer is going to be most of or > a second, that's + just a little bit important */ +#if defined(__FreeBSD__) +#include +#define AUDIO_DEVICE "/dev/audio" +#elif defined(__NetBSD__) || defined(__OpenBSD__) +#include +#define AUDIO_DEVICE "/dev/audio" +#else +#include +#define AUDIO_DEVICE "/dev/dsp" +#endif +#include + +/* Helper; just grab some more compressed bitstream and sync it for + page extraction */ +int buffer_data(FILE *in,ogg_sync_state *oy){ + char *buffer=ogg_sync_buffer(oy,4096); + int bytes=fread(buffer,1,4096,in); + ogg_sync_wrote(oy,bytes); + return(bytes); +} + +/* never forget that globals are a one-way ticket to Hell */ +/* Ogg and codec state for demux/decode */ +ogg_sync_state oy; +ogg_page og; +ogg_stream_state vo; +ogg_stream_state to; +th_info ti; +th_comment tc; +th_dec_ctx *td = NULL; +th_setup_info *ts = NULL; +vorbis_info vi; +vorbis_dsp_state vd; +vorbis_block vb; +vorbis_comment vc; +th_pixel_fmt px_fmt; + +int theora_p=0; +int vorbis_p=0; +int stateflag=0; + +/* SDL Video playback structures */ +SDL_Surface *screen; +SDL_Overlay *yuv_overlay; +SDL_Rect rect; +unsigned char *RGBbuffer; + +#define OC_CLAMP255(_x) ((unsigned char)((((_x)<0)-1)&((_x)|-((_x)>255)))) + +/* single frame video buffering */ +int videobuf_ready=0; +ogg_int64_t videobuf_granulepos=-1; +double videobuf_time=0; + +/* single audio fragment audio buffering */ +int audiobuf_fill=0; +int audiobuf_ready=0; +ogg_int16_t *audiobuf; +ogg_int64_t audiobuf_granulepos=0; /* time position of last sample */ + +/* audio / video synchronization tracking: + +Since this will make it to Google at some point and lots of people +search for how to do this, a quick rundown of a practical A/V sync +strategy under Linux [the UNIX where Everything Is Hard]. Naturally, +this works on other platforms using OSS for sound as well. + +In OSS, we don't have reliable access to any precise information on +the exact current playback position (that, of course would have been +too easy; the kernel folks like to keep us app people working hard +doing simple things that should have been solved once and abstracted +long ago). Hopefully ALSA solves this a little better; we'll probably +use that once ALSA is the standard in the stable kernel. + +We can't use the system clock for a/v sync because audio is hard +synced to its own clock, and both the system and audio clocks suffer +from wobble, drift, and a lack of accuracy that can be guaranteed to +add a reliable percent or so of error. After ten seconds, that's +100ms. We can't drift by half a second every minute. + +Although OSS can't generally tell us where the audio playback pointer +is, we do know that if we work in complete audio fragments and keep +the kernel buffer full, a blocking select on the audio buffer will +give us a writable fragment immediately after playback finishes with +it. We assume at that point that we know the exact number of bytes in +the kernel buffer that have not been played (total fragments minus +one) and calculate clock drift between audio and system then (and only +then). Damp the sync correction fraction, apply, and walla: A +reliable A/V clock that even works if it's interrupted. */ + +long audiofd_totalsize=-1; +int audiofd_fragsize; /* read and write only complete fragments + so that SNDCTL_DSP_GETOSPACE is + accurate immediately after a bank + switch */ +int audiofd=-1; +ogg_int64_t audiofd_timer_calibrate=-1; + + +static void open_audio(){ + audio_buf_info info; + int format=AFMT_S16_NE; /* host endian */ + int channels=vi.channels; + int rate=vi.rate; + int ret; + + audiofd=open(AUDIO_DEVICE,O_RDWR); + if(audiofd<0){ + fprintf(stderr,"Could not open audio device " AUDIO_DEVICE ".\n"); + exit(1); + } + + ret=ioctl(audiofd,SNDCTL_DSP_SETFMT,&format); + if(ret){ + fprintf(stderr,"Could not set 16 bit host-endian playback\n"); + exit(1); + } + + ret=ioctl(audiofd,SNDCTL_DSP_CHANNELS,&channels); + if(ret){ + fprintf(stderr,"Could not set %d channel playback\n",channels); + exit(1); + } + + ret=ioctl(audiofd,SNDCTL_DSP_SPEED,&rate); + if(ret){ + fprintf(stderr,"Could not set %d Hz playback\n",rate); + exit(1); + } + + ioctl(audiofd,SNDCTL_DSP_GETOSPACE,&info); + audiofd_fragsize=info.fragsize; + audiofd_totalsize=info.fragstotal*info.fragsize; + + audiobuf=malloc(audiofd_fragsize); +} + +static void audio_close(void){ + if(audiofd>-1){ + ioctl(audiofd,SNDCTL_DSP_RESET,NULL); + close(audiofd); + free(audiobuf); + } +} + +/* call this only immediately after unblocking from a full kernel + having a newly empty fragment or at the point of DMA restart */ +void audio_calibrate_timer(int restart){ + struct timeval tv; + ogg_int64_t current_sample; + ogg_int64_t new_time; + + gettimeofday(&tv,0); + new_time=tv.tv_sec*1000+tv.tv_usec/1000; + + if(restart){ + current_sample=audiobuf_granulepos-audiobuf_fill/2/vi.channels; + }else + current_sample=audiobuf_granulepos- + (audiobuf_fill+audiofd_totalsize-audiofd_fragsize)/2/vi.channels; + + new_time-=1000*current_sample/vi.rate; + + audiofd_timer_calibrate=new_time; +} + +/* get relative time since beginning playback, compensating for A/V + drift */ +double get_time(){ + static ogg_int64_t last=0; + static ogg_int64_t up=0; + ogg_int64_t now; + struct timeval tv; + + gettimeofday(&tv,0); + now=tv.tv_sec*1000+tv.tv_usec/1000; + + if(audiofd_timer_calibrate==-1)audiofd_timer_calibrate=last=now; + + if(audiofd<0){ + /* no audio timer to worry about, we can just use the system clock */ + /* only one complication: If the process is suspended, we should + reset timing to account for the gap in play time. Do it the + easy/hack way */ + if(now-last>1000)audiofd_timer_calibrate+=(now-last); + last=now; + } + + if(now-up>200){ + double timebase=(now-audiofd_timer_calibrate)*.001; + int hundredths=timebase*100-(long)timebase*100; + int seconds=(long)timebase%60; + int minutes=((long)timebase/60)%60; + int hours=(long)timebase/3600; + + fprintf(stderr," Playing: %d:%02d:%02d.%02d \r", + hours,minutes,seconds,hundredths); + up=now; + } + + return (now-audiofd_timer_calibrate)*.001; + +} + +/* write a fragment to the OSS kernel audio API, but only if we can + stuff in a whole fragment without blocking */ +void audio_write_nonblocking(void){ + + if(audiobuf_ready){ + audio_buf_info info; + long bytes; + + ioctl(audiofd,SNDCTL_DSP_GETOSPACE,&info); + bytes=info.bytes; + if(bytes>=audiofd_fragsize){ + if(bytes==audiofd_totalsize)audio_calibrate_timer(1); + + while(1){ + bytes=write(audiofd,audiobuf+(audiofd_fragsize-audiobuf_fill), + audiofd_fragsize); + + if(bytes>0){ + + if(bytes!=audiobuf_fill){ + /* shouldn't actually be possible... but eh */ + audiobuf_fill-=bytes; + }else + break; + } + } + + audiobuf_fill=0; + audiobuf_ready=0; + + } + } +} + +/* clean quit on Ctrl-C for SDL and thread shutdown as per SDL example + (we don't use any threads, but libSDL does) */ +int got_sigint=0; +static void sigint_handler (int signal) { + got_sigint = 1; +} + +static void open_video(void){ + int w; + int h; + w=(ti.pic_x+ti.pic_width+1&~1)-(ti.pic_x&~1); + h=(ti.pic_y+ti.pic_height+1&~1)-(ti.pic_y&~1); + if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) { + fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError()); + exit(1); + } + + screen = SDL_SetVideoMode(w, h, 0, SDL_SWSURFACE); + if ( screen == NULL ) { + fprintf(stderr, "Unable to set %dx%d video: %s\n", + w,h,SDL_GetError()); + exit(1); + } + + if (px_fmt==TH_PF_422) + yuv_overlay = SDL_CreateYUVOverlay(w, h, + SDL_YUY2_OVERLAY, + screen); + else if (px_fmt==TH_PF_444) { + RGBbuffer = calloc(w*h*4,sizeof(*RGBbuffer)); + fprintf(stderr,"warning: SDL does not support YUV 4:4:4, using slow software conversion.\n"); + } else + yuv_overlay = SDL_CreateYUVOverlay(w, h, + SDL_YV12_OVERLAY, + screen); + + if ( (yuv_overlay == NULL && px_fmt!=TH_PF_444) || (screen == NULL && px_fmt==TH_PF_444) ) { + fprintf(stderr, "SDL: xCouldn't create SDL_yuv_overlay: %s\n", + SDL_GetError()); + exit(1); + } + rect.x = 0; + rect.y = 0; + rect.w = w; + rect.h = h; + + if (px_fmt!=TH_PF_444) + SDL_DisplayYUVOverlay(yuv_overlay, &rect); +} + +static void video_write(void){ + int i; + th_ycbcr_buffer yuv; + int y_offset, uv_offset; + th_decode_ycbcr_out(td,yuv); + /* Lock SDL_yuv_overlay */ + if ( SDL_MUSTLOCK(screen) ) { + if ( SDL_LockSurface(screen) < 0 ) return; + } + if (px_fmt!=TH_PF_444 && SDL_LockYUVOverlay(yuv_overlay) < 0) return; + + /* let's draw the data on a SDL screen (*screen) */ + /* deal with border stride */ + /* reverse u and v for SDL */ + /* and crop input properly, respecting the encoded frame rect */ + /* problems may exist for odd frame rect for some encodings */ + + y_offset=(ti.pic_x&~1)+yuv[0].stride*(ti.pic_y&~1); + + if (px_fmt==TH_PF_422) { + uv_offset=(ti.pic_x/2)+(yuv[1].stride)*(ti.pic_y); + /* SDL doesn't have a planar 4:2:2 */ + for(i=0;ih;i++) { + int j; + char *in_y = (char *)yuv[0].data+y_offset+yuv[0].stride*i; + char *out = (char *)(yuv_overlay->pixels[0]+yuv_overlay->pitches[0]*i); + for (j=0;jw;j++) + out[j*2] = in_y[j]; + char *in_u = (char *)yuv[1].data+uv_offset+yuv[1].stride*i; + char *in_v = (char *)yuv[2].data+uv_offset+yuv[2].stride*i; + for (j=0;jw>>1;j++) { + out[j*4+1] = in_u[j]; + out[j*4+3] = in_v[j]; + } + } + } else if (px_fmt==TH_PF_444){ + SDL_Surface *output; + for(i=0;ih;i++) { + int j; + unsigned char *in_y = (unsigned char *)yuv[0].data+y_offset+yuv[0].stride*i; + unsigned char *in_u = (unsigned char *)yuv[1].data+y_offset+yuv[1].stride*i; + unsigned char *in_v = (unsigned char *)yuv[2].data+y_offset+yuv[2].stride*i; + unsigned char *out = RGBbuffer+(screen->w*i*4); + for (j=0;jw;j++) { + int r, g, b; + r=(1904000*in_y[j]+2609823*in_v[j]-363703744)/1635200; + g=(3827562*in_y[j]-1287801*in_u[j] + -2672387*in_v[j]+447306710)/3287200; + b=(952000*in_y[j]+1649289*in_u[j]-225932192)/817600; + out[4*j+0]=OC_CLAMP255(b); + out[4*j+1]=OC_CLAMP255(g); + out[4*j+2]=OC_CLAMP255(r); + } + output=SDL_CreateRGBSurfaceFrom(RGBbuffer,screen->w,screen->h,32,4*screen->w,0,0,0,0); + SDL_BlitSurface(output,NULL,screen,NULL); + } + } else { + uv_offset=(ti.pic_x/2)+(yuv[1].stride)*(ti.pic_y/2); + for(i=0;ih;i++) + memcpy(yuv_overlay->pixels[0]+yuv_overlay->pitches[0]*i, + yuv[0].data+y_offset+yuv[0].stride*i, + yuv_overlay->w); + for(i=0;ih/2;i++){ + memcpy(yuv_overlay->pixels[1]+yuv_overlay->pitches[1]*i, + yuv[2].data+uv_offset+yuv[2].stride*i, + yuv_overlay->w/2); + memcpy(yuv_overlay->pixels[2]+yuv_overlay->pitches[2]*i, + yuv[1].data+uv_offset+yuv[1].stride*i, + yuv_overlay->w/2); + } + } + + /* Unlock SDL_yuv_overlay */ + if ( SDL_MUSTLOCK(screen) ) { + SDL_UnlockSurface(screen); + } + if (px_fmt!=TH_PF_444) { + SDL_UnlockYUVOverlay(yuv_overlay); + /* Show, baby, show! */ + SDL_DisplayYUVOverlay(yuv_overlay, &rect); + } else { + SDL_Flip(screen); + } +} +/* dump the theora (or vorbis) comment header */ +static int dump_comments(th_comment *tc){ + int i, len; + char *value; + FILE *out=stdout; + + fprintf(out,"Encoded by %s\n",tc->vendor); + if(tc->comments){ + fprintf(out, "theora comment header:\n"); + for(i=0;icomments;i++){ + if(tc->user_comments[i]){ + len=tc->comment_lengths[i]; + value=malloc(len+1); + memcpy(value,tc->user_comments[i],len); + value[len]='\0'; + fprintf(out, "\t%s\n", value); + free(value); + } + } + } + return(0); +} + +/* Report the encoder-specified colorspace for the video, if any. + We don't actually make use of the information in this example; + a real player should attempt to perform color correction for + whatever display device it supports. */ +static void report_colorspace(th_info *ti) +{ + switch(ti->colorspace){ + case TH_CS_UNSPECIFIED: + /* nothing to report */ + break;; + case TH_CS_ITU_REC_470M: + fprintf(stderr," encoder specified ITU Rec 470M (NTSC) color.\n"); + break;; + case TH_CS_ITU_REC_470BG: + fprintf(stderr," encoder specified ITU Rec 470BG (PAL) color.\n"); + break;; + default: + fprintf(stderr,"warning: encoder specified unknown colorspace (%d).\n", + ti->colorspace); + break;; + } +} + +/* helper: push a page into the appropriate steam */ +/* this can be done blindly; a stream won't accept a page + that doesn't belong to it */ +static int queue_page(ogg_page *page){ + if(theora_p)ogg_stream_pagein(&to,page); + if(vorbis_p)ogg_stream_pagein(&vo,page); + return 0; +} + +static void usage(void){ + fprintf(stderr, + "Usage: player_example \n" + "input is read from stdin if no file is passed on the command line\n" + "\n" + ); +} + +int main(int argc,char *const *argv){ + + int pp_level_max; + int pp_level; + int pp_inc; + int i,j; + ogg_packet op; + + FILE *infile = stdin; + + int frames = 0; + int dropped = 0; + +#ifdef _WIN32 /* We need to set stdin/stdout to binary mode. Damn windows. */ + /* Beware the evil ifdef. We avoid these where we can, but this one we + cannot. Don't add any more, you'll probably go to hell if you do. */ + _setmode( _fileno( stdin ), _O_BINARY ); +#endif + + /* open the input file if any */ + if(argc==2){ + infile=fopen(argv[1],"rb"); + if(infile==NULL){ + fprintf(stderr,"Unable to open '%s' for playback.\n", argv[1]); + exit(1); + } + } + if(argc>2){ + usage(); + exit(1); + } + + /* start up Ogg stream synchronization layer */ + ogg_sync_init(&oy); + + /* init supporting Vorbis structures needed in header parsing */ + vorbis_info_init(&vi); + vorbis_comment_init(&vc); + + /* init supporting Theora structures needed in header parsing */ + th_comment_init(&tc); + th_info_init(&ti); + + /* Ogg file open; parse the headers */ + /* Only interested in Vorbis/Theora streams */ + while(!stateflag){ + int ret=buffer_data(infile,&oy); + if(ret==0)break; + while(ogg_sync_pageout(&oy,&og)>0){ + ogg_stream_state test; + + /* is this a mandated initial header? If not, stop parsing */ + if(!ogg_page_bos(&og)){ + /* don't leak the page; get it into the appropriate stream */ + queue_page(&og); + stateflag=1; + break; + } + + ogg_stream_init(&test,ogg_page_serialno(&og)); + ogg_stream_pagein(&test,&og); + ogg_stream_packetout(&test,&op); + + + /* identify the codec: try theora */ + if(!theora_p && th_decode_headerin(&ti,&tc,&ts,&op)>=0){ + /* it is theora */ + memcpy(&to,&test,sizeof(test)); + theora_p=1; + }else if(!vorbis_p && vorbis_synthesis_headerin(&vi,&vc,&op)>=0){ + /* it is vorbis */ + memcpy(&vo,&test,sizeof(test)); + vorbis_p=1; + }else{ + /* whatever it is, we don't care about it */ + ogg_stream_clear(&test); + } + } + /* fall through to non-bos page parsing */ + } + + /* we're expecting more header packets. */ + while((theora_p && theora_p<3) || (vorbis_p && vorbis_p<3)){ + int ret; + + /* look for further theora headers */ + while(theora_p && (theora_p<3) && (ret=ogg_stream_packetout(&to,&op))){ + if(ret<0){ + fprintf(stderr,"Error parsing Theora stream headers; " + "corrupt stream?\n"); + exit(1); + } + if(!th_decode_headerin(&ti,&tc,&ts,&op)){ + fprintf(stderr,"Error parsing Theora stream headers; " + "corrupt stream?\n"); + exit(1); + } + theora_p++; + } + + /* look for more vorbis header packets */ + while(vorbis_p && (vorbis_p<3) && (ret=ogg_stream_packetout(&vo,&op))){ + if(ret<0){ + fprintf(stderr,"Error parsing Vorbis stream headers; corrupt stream?\n"); + exit(1); + } + if(vorbis_synthesis_headerin(&vi,&vc,&op)){ + fprintf(stderr,"Error parsing Vorbis stream headers; corrupt stream?\n"); + exit(1); + } + vorbis_p++; + if(vorbis_p==3)break; + } + + /* The header pages/packets will arrive before anything else we + care about, or the stream is not obeying spec */ + + if(ogg_sync_pageout(&oy,&og)>0){ + queue_page(&og); /* demux into the appropriate stream */ + }else{ + int ret=buffer_data(infile,&oy); /* someone needs more data */ + if(ret==0){ + fprintf(stderr,"End of file while searching for codec headers.\n"); + exit(1); + } + } + } + + /* and now we have it all. initialize decoders */ + if(theora_p){ + td=th_decode_alloc(&ti,ts); + printf("Ogg logical stream %lx is Theora %dx%d %.02f fps", + to.serialno,ti.pic_width,ti.pic_height, + (double)ti.fps_numerator/ti.fps_denominator); + px_fmt=ti.pixel_fmt; + switch(ti.pixel_fmt){ + case TH_PF_420: printf(" 4:2:0 video\n"); break; + case TH_PF_422: printf(" 4:2:2 video\n"); break; + case TH_PF_444: printf(" 4:4:4 video\n"); break; + case TH_PF_RSVD: + default: + printf(" video\n (UNKNOWN Chroma sampling!)\n"); + break; + } + if(ti.pic_width!=ti.frame_width || ti.pic_height!=ti.frame_height) + printf(" Frame content is %dx%d with offset (%d,%d).\n", + ti.frame_width, ti.frame_height, ti.pic_x, ti.pic_y); + report_colorspace(&ti); + dump_comments(&tc); + th_decode_ctl(td,TH_DECCTL_GET_PPLEVEL_MAX,&pp_level_max, + sizeof(pp_level_max)); + pp_level=pp_level_max; + th_decode_ctl(td,TH_DECCTL_SET_PPLEVEL,&pp_level,sizeof(pp_level)); + pp_inc=0; + + /*{ + int arg = 0xffff; + th_decode_ctl(td,TH_DECCTL_SET_TELEMETRY_MBMODE,&arg,sizeof(arg)); + th_decode_ctl(td,TH_DECCTL_SET_TELEMETRY_MV,&arg,sizeof(arg)); + th_decode_ctl(td,TH_DECCTL_SET_TELEMETRY_QI,&arg,sizeof(arg)); + arg=10; + th_decode_ctl(td,TH_DECCTL_SET_TELEMETRY_BITS,&arg,sizeof(arg)); + }*/ + }else{ + /* tear down the partial theora setup */ + th_info_clear(&ti); + th_comment_clear(&tc); + } + + th_setup_free(ts); + + if(vorbis_p){ + vorbis_synthesis_init(&vd,&vi); + vorbis_block_init(&vd,&vb); + fprintf(stderr,"Ogg logical stream %lx is Vorbis %d channel %ld Hz audio.\n", + vo.serialno,vi.channels,vi.rate); + }else{ + /* tear down the partial vorbis setup */ + vorbis_info_clear(&vi); + vorbis_comment_clear(&vc); + } + + /* open audio */ + if(vorbis_p)open_audio(); + + /* open video */ + if(theora_p)open_video(); + + /* install signal handler as SDL clobbered the default */ + signal (SIGINT, sigint_handler); + + /* on to the main decode loop. We assume in this example that audio + and video start roughly together, and don't begin playback until + we have a start frame for both. This is not necessarily a valid + assumption in Ogg A/V streams! It will always be true of the + example_encoder (and most streams) though. */ + + stateflag=0; /* playback has not begun */ + while(!got_sigint){ + + /* we want a video and audio frame ready to go at all times. If + we have to buffer incoming, buffer the compressed data (ie, let + ogg do the buffering) */ + while(vorbis_p && !audiobuf_ready){ + int ret; + float **pcm; + + /* if there's pending, decoded audio, grab it */ + if((ret=vorbis_synthesis_pcmout(&vd,&pcm))>0){ + int count=audiobuf_fill/2; + int maxsamples=(audiofd_fragsize-audiobuf_fill)/2/vi.channels; + for(i=0;i32767)val=32767; + if(val<-32768)val=-32768; + audiobuf[count++]=val; + } + vorbis_synthesis_read(&vd,i); + audiobuf_fill+=i*vi.channels*2; + if(audiobuf_fill==audiofd_fragsize)audiobuf_ready=1; + if(vd.granulepos>=0) + audiobuf_granulepos=vd.granulepos-ret+i; + else + audiobuf_granulepos+=i; + + }else{ + + /* no pending audio; is there a pending packet to decode? */ + if(ogg_stream_packetout(&vo,&op)>0){ + if(vorbis_synthesis(&vb,&op)==0) /* test for success! */ + vorbis_synthesis_blockin(&vd,&vb); + }else /* we need more data; break out to suck in another page */ + break; + } + } + + while(theora_p && !videobuf_ready){ + /* theora is one in, one out... */ + if(ogg_stream_packetout(&to,&op)>0){ + + if(pp_inc){ + pp_level+=pp_inc; + th_decode_ctl(td,TH_DECCTL_SET_PPLEVEL,&pp_level, + sizeof(pp_level)); + pp_inc=0; + } + /*HACK: This should be set after a seek or a gap, but we might not have + a granulepos for the first packet (we only have them for the last + packet on a page), so we just set it as often as we get it. + To do this right, we should back-track from the last packet on the + page and compute the correct granulepos for the first packet after + a seek or a gap.*/ + if(op.granulepos>=0){ + th_decode_ctl(td,TH_DECCTL_SET_GRANPOS,&op.granulepos, + sizeof(op.granulepos)); + } + if(th_decode_packetin(td,&op,&videobuf_granulepos)==0){ + videobuf_time=th_granule_time(td,videobuf_granulepos); + frames++; + + /* is it already too old to be useful? This is only actually + useful cosmetically after a SIGSTOP. Note that we have to + decode the frame even if we don't show it (for now) due to + keyframing. Soon enough libtheora will be able to deal + with non-keyframe seeks. */ + + if(videobuf_time>=get_time()) + videobuf_ready=1; + else{ + /*If we are too slow, reduce the pp level.*/ + pp_inc=pp_level>0?-1:0; + dropped++; + } + } + + }else + break; + } + + if(!videobuf_ready && !audiobuf_ready && feof(infile))break; + + if(!videobuf_ready || !audiobuf_ready){ + /* no data yet for somebody. Grab another page */ + buffer_data(infile,&oy); + while(ogg_sync_pageout(&oy,&og)>0){ + queue_page(&og); + } + } + + /* If playback has begun, top audio buffer off immediately. */ + if(stateflag) audio_write_nonblocking(); + + /* are we at or past time for this video frame? */ + if(stateflag && videobuf_ready && videobuf_time<=get_time()){ + video_write(); + videobuf_ready=0; + } + + if(stateflag && + (audiobuf_ready || !vorbis_p) && + (videobuf_ready || !theora_p) && + !got_sigint){ + /* we have an audio frame ready (which means the audio buffer is + full), it's not time to play video, so wait until one of the + audio buffer is ready or it's near time to play video */ + + /* set up select wait on the audiobuffer and a timeout for video */ + struct timeval timeout; + fd_set writefs; + fd_set empty; + int n=0; + + FD_ZERO(&writefs); + FD_ZERO(&empty); + if(audiofd>=0){ + FD_SET(audiofd,&writefs); + n=audiofd+1; + } + + if(theora_p){ + double tdiff; + long milliseconds; + tdiff=videobuf_time-get_time(); + /*If we have lots of extra time, increase the post-processing level.*/ + if(tdiff>ti.fps_denominator*0.25/ti.fps_numerator){ + pp_inc=pp_level0?-1:0; + } + milliseconds=tdiff*1000-5; + if(milliseconds>500)milliseconds=500; + if(milliseconds>0){ + timeout.tv_sec=milliseconds/1000; + timeout.tv_usec=(milliseconds%1000)*1000; + + n=select(n,&empty,&writefs,&empty,&timeout); + if(n)audio_calibrate_timer(0); + } + }else{ + select(n,&empty,&writefs,&empty,NULL); + } + } + + /* if our buffers either don't exist or are ready to go, + we can begin playback */ + if((!theora_p || videobuf_ready) && + (!vorbis_p || audiobuf_ready))stateflag=1; + /* same if we've run out of input */ + if(feof(infile))stateflag=1; + + } + + /* tear it all down */ + + audio_close(); + SDL_Quit(); + + if(vorbis_p){ + ogg_stream_clear(&vo); + vorbis_block_clear(&vb); + vorbis_dsp_clear(&vd); + vorbis_comment_clear(&vc); + vorbis_info_clear(&vi); + } + if(theora_p){ + ogg_stream_clear(&to); + th_decode_free(td); + th_comment_clear(&tc); + th_info_clear(&ti); + } + ogg_sync_clear(&oy); + + if(infile && infile!=stdin)fclose(infile); + + fprintf(stderr, + "\r \r"); + fprintf(stderr, "%d frames", frames); + if (dropped) fprintf(stderr, " (%d dropped)", dropped); + fprintf(stderr, "\n"); + fprintf(stderr, "\nDone.\n"); + + return(0); + +} diff --git a/cs/3rd party/libtheora/examples/png2theora.c b/cs/3rd party/libtheora/examples/png2theora.c new file mode 100644 index 000000000..7a8334cfd --- /dev/null +++ b/cs/3rd party/libtheora/examples/png2theora.c @@ -0,0 +1,942 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggTheora SOFTWARE 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 Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009,2009 * + * by the Xiph.Org Foundation and contributors http://www.xiph.org/ * + * * + ******************************************************************** + + function: example encoder application; makes an Ogg Theora + file from a sequence of png images + last mod: $Id$ + based on code from Vegard Nossum + + ********************************************************************/ + +#define _FILE_OFFSET_BITS 64 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include "theora/theoraenc.h" + +#define PROGRAM_NAME "png2theora" +#define PROGRAM_VERSION "1.1" + +static const char *option_output = NULL; +static int video_fps_numerator = 24; +static int video_fps_denominator = 1; +static int video_aspect_numerator = 0; +static int video_aspect_denominator = 0; +static int video_rate = -1; +static int video_quality = -1; +ogg_uint32_t keyframe_frequency=0; +int buf_delay=-1; +int vp3_compatible=0; +static int chroma_format = TH_PF_420; + +static FILE *twopass_file = NULL; +static int twopass=0; +static int passno; + +static FILE *ogg_fp = NULL; +static ogg_stream_state ogg_os; +static ogg_packet op; +static ogg_page og; + +static th_enc_ctx *td = NULL; +static th_info ti; + +static char *input_filter = NULL; + +const char *optstring = "o:hv:\4:\2:V:s:S:f:F:ck:d:\1\2\3\4\5\6"; +struct option options [] = { + {"output",required_argument,NULL,'o'}, + {"help",no_argument,NULL,'h'}, + {"chroma-444",no_argument,NULL,'\5'}, + {"chroma-422",no_argument,NULL,'\6'}, + {"video-rate-target",required_argument,NULL,'V'}, + {"video-quality",required_argument,NULL,'v'}, + {"aspect-numerator",required_argument,NULL,'s'}, + {"aspect-denominator",required_argument,NULL,'S'}, + {"framerate-numerator",required_argument,NULL,'f'}, + {"framerate-denominator",required_argument,NULL,'F'}, + {"vp3-compatible",no_argument,NULL,'c'}, + {"soft-target",no_argument,NULL,'\1'}, + {"keyframe-freq",required_argument,NULL,'k'}, + {"buf-delay",required_argument,NULL,'d'}, + {"two-pass",no_argument,NULL,'\2'}, + {"first-pass",required_argument,NULL,'\3'}, + {"second-pass",required_argument,NULL,'\4'}, + {NULL,0,NULL,0} +}; + +static void usage(void){ + fprintf(stderr, + "%s %s\n" + "Usage: %s [options] \n\n" + "The input argument uses C printf format to represent a list of files,\n" + " i.e. file-%%06d.png to look for files file000001.png to file9999999.png \n\n" + "Options: \n\n" + " -o --output file name for encoded output (required);\n" + " -v --video-quality Theora quality selector fro 0 to 10\n" + " (0 yields smallest files but lowest\n" + " video quality. 10 yields highest\n" + " fidelity but large files)\n\n" + " -V --video-rate-target bitrate target for Theora video\n\n" + " --soft-target Use a large reservoir and treat the rate\n" + " as a soft target; rate control is less\n" + " strict but resulting quality is usually\n" + " higher/smoother overall. Soft target also\n" + " allows an optional -v setting to specify\n" + " a minimum allowed quality.\n\n" + " --two-pass Compress input using two-pass rate control\n" + " This option performs both passes automatically.\n\n" + " --first-pass Perform first-pass of a two-pass rate\n" + " controlled encoding, saving pass data to\n" + " for a later second pass\n\n" + " --second-pass Perform second-pass of a two-pass rate\n" + " controlled encoding, reading first-pass\n" + " data from . The first pass\n" + " data must come from a first encoding pass\n" + " using identical input video to work\n" + " properly.\n\n" + " -k --keyframe-freq Keyframe frequency\n" + " -d --buf-delay Buffer delay (in frames). Longer delays\n" + " allow smoother rate adaptation and provide\n" + " better overall quality, but require more\n" + " client side buffering and add latency. The\n" + " default value is the keyframe interval for\n" + " one-pass encoding (or somewhat larger if\n" + " --soft-target is used) and infinite for\n" + " two-pass encoding.\n" + " --chroma-444 Use 4:4:4 chroma subsampling\n" + " --chroma-422 Use 4:2:2 chroma subsampling\n" + " (4:2:0 is default)\n\n" + " -s --aspect-numerator Aspect ratio numerator, default is 0\n" + " -S --aspect-denominator Aspect ratio denominator, default is 0\n" + " -f --framerate-numerator Frame rate numerator\n" + " -F --framerate-denominator Frame rate denominator\n" + " The frame rate nominator divided by this\n" + " determines the frame rate in units per tick\n" + ,PROGRAM_NAME, PROGRAM_VERSION, PROGRAM_NAME + ); + exit(0); +} + +#ifdef WIN32 +int +alphasort (const void *a, const void *b) +{ + return strcoll ((*(const struct dirent **) a)->d_name, + (*(const struct dirent **) b)->d_name); +} + +int +scandir (const char *dir, struct dirent ***namelist, + int (*select)(const struct dirent *), int (*compar)(const void *, const void *)) +{ + DIR *d; + struct dirent *entry; + register int i=0; + size_t entrysize; + + if ((d=opendir(dir)) == NULL) + return(-1); + + *namelist=NULL; + while ((entry=readdir(d)) != NULL) + { + if (select == NULL || (select != NULL && (*select)(entry))) + { + *namelist=(struct dirent **)realloc((void *)(*namelist), + (size_t)((i+1)*sizeof(struct dirent *))); + if (*namelist == NULL) return(-1); + entrysize=sizeof(struct dirent)-sizeof(entry->d_name)+strlen(entry->d_name)+1; + (*namelist)[i]=(struct dirent *)malloc(entrysize); + if ((*namelist)[i] == NULL) return(-1); + memcpy((*namelist)[i], entry, entrysize); + i++; + } + } + if (closedir(d)) return(-1); + if (i == 0) return(-1); + if (compar != NULL) + qsort((void *)(*namelist), (size_t)i, sizeof(struct dirent *), compar); + + return(i); +} +#endif + +static int +theora_write_frame(th_ycbcr_buffer ycbcr, int last) +{ + ogg_packet op; + ogg_page og; + + /* Theora is a one-frame-in,one-frame-out system; submit a frame + for compression and pull out the packet */ + /* in two-pass mode's second pass, we need to submit first-pass data */ + if(passno==2){ + int ret; + for(;;){ + static unsigned char buffer[80]; + static int buf_pos; + int bytes; + /*Ask the encoder how many bytes it would like.*/ + bytes=th_encode_ctl(td,TH_ENCCTL_2PASS_IN,NULL,0); + if(bytes<0){ + fprintf(stderr,"Error submitting pass data in second pass.\n"); + exit(1); + } + /*If it's got enough, stop.*/ + if(bytes==0)break; + /*Read in some more bytes, if necessary.*/ + if(bytes>80-buf_pos)bytes=80-buf_pos; + if(bytes>0&&fread(buffer+buf_pos,1,bytes,twopass_file)=bytes)buf_pos=0; + /*Otherwise remember how much it used.*/ + else buf_pos+=ret; + } + } + + if(th_encode_ycbcr_in(td, ycbcr)) { + fprintf(stderr, "%s: error: could not encode frame\n", + option_output); + return 1; + } + + /* in two-pass mode's first pass we need to extract and save the pass data */ + if(passno==1){ + unsigned char *buffer; + int bytes = th_encode_ctl(td, TH_ENCCTL_2PASS_OUT, &buffer, sizeof(buffer)); + if(bytes<0){ + fprintf(stderr,"Could not read two-pass data from encoder.\n"); + exit(1); + } + if(fwrite(buffer,1,bytes,twopass_file) 255) + return 255; + + return d; +} + +static void +rgb_to_yuv(png_bytep *png, + th_ycbcr_buffer ycbcr, + unsigned int w, unsigned int h) +{ + unsigned int x; + unsigned int y; + + unsigned int x1; + unsigned int y1; + + unsigned long yuv_w; + + unsigned char *yuv_y; + unsigned char *yuv_u; + unsigned char *yuv_v; + + yuv_w = ycbcr[0].width; + + yuv_y = ycbcr[0].data; + yuv_u = ycbcr[1].data; + yuv_v = ycbcr[2].data; + + /*This ignores gamma and RGB primary/whitepoint differences. + It also isn't terribly fast (though a decent compiler will + strength-reduce the division to a multiplication).*/ + + if (chroma_format == TH_PF_420) { + for(y = 0; y < h; y += 2) { + y1=y+(y+1> 1) + (y >> 1) * ycbcr[1].stride] = + clamp( ((-33488*r0-65744*g0+99232*b0+29032005)/4 + + (-33488*r1-65744*g1+99232*b1+29032005)/4 + + (-33488*r2-65744*g2+99232*b2+29032005)/4 + + (-33488*r3-65744*g3+99232*b3+29032005)/4)/225930); + yuv_v[(x >> 1) + (y >> 1) * ycbcr[2].stride] = + clamp( ((157024*r0-131488*g0-25536*b0+45940035)/4 + + (157024*r1-131488*g1-25536*b1+45940035)/4 + + (157024*r2-131488*g2-25536*b2+45940035)/4 + + (157024*r3-131488*g3-25536*b3+45940035)/4)/357510); + } + } + } else if (chroma_format == TH_PF_444) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + png_byte r = png[y][3 * x + 0]; + png_byte g = png[y][3 * x + 1]; + png_byte b = png[y][3 * x + 2]; + + yuv_y[x + y * yuv_w] = clamp((65481*r+128553*g+24966*b+4207500)/255000); + yuv_u[x + y * yuv_w] = clamp((-33488*r-65744*g+99232*b+29032005)/225930); + yuv_v[x + y * yuv_w] = clamp((157024*r-131488*g-25536*b+45940035)/357510); + } + } + } else { /* TH_PF_422 */ + for(y = 0; y < h; y += 1) { + for(x = 0; x < w; x += 2) { + x1=x+(x+1> 1) + y * ycbcr[1].stride] = + clamp( ((-33488*r0-65744*g0+99232*b0+29032005)/2 + + (-33488*r1-65744*g1+99232*b1+29032005)/2)/225930); + yuv_v[(x >> 1) + y * ycbcr[2].stride] = + clamp( ((157024*r0-131488*g0-25536*b0+45940035)/2 + + (157024*r1-131488*g1-25536*b1+45940035)/2)/357510); + } + } + } + +} + +static int +png_read(const char *pathname, unsigned int *w, unsigned int *h, th_ycbcr_buffer ycbcr) +{ + FILE *fp; + unsigned char header[8]; + png_structp png_ptr; + png_infop info_ptr; + png_infop end_ptr; + png_bytep row_data; + png_bytep *row_pointers; + png_color_16p bkgd; + png_uint_32 width; + png_uint_32 height; + unsigned long yuv_w; + unsigned long yuv_h; + int bit_depth; + int color_type; + int interlace_type; + int compression_type; + int filter_method; + png_uint_32 y; + + fp = fopen(pathname, "rb"); + if(!fp) { + fprintf(stderr, "%s: error: %s\n", + pathname, strerror(errno)); + return 1; + } + + fread(header, 1, 8, fp); + if(png_sig_cmp(header, 0, 8)) { + fprintf(stderr, "%s: error: %s\n", + pathname, "not a PNG"); + fclose(fp); + return 1; + } + + png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, + NULL, NULL, NULL); + if(!png_ptr) { + fprintf(stderr, "%s: error: %s\n", + pathname, "couldn't create png read structure"); + fclose(fp); + return 1; + } + + info_ptr = png_create_info_struct(png_ptr); + if(!info_ptr) { + fprintf(stderr, "%s: error: %s\n", + pathname, "couldn't create png info structure"); + png_destroy_read_struct(&png_ptr, NULL, NULL); + fclose(fp); + return 1; + } + + end_ptr = png_create_info_struct(png_ptr); + if(!end_ptr) { + fprintf(stderr, "%s: error: %s\n", + pathname, "couldn't create png info structure"); + png_destroy_read_struct(&png_ptr, &info_ptr, NULL); + fclose(fp); + return 1; + } + + png_init_io(png_ptr, fp); + png_set_sig_bytes(png_ptr, 8); + png_read_info(png_ptr, info_ptr); + png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, + &interlace_type, &compression_type, &filter_method); + png_set_expand(png_ptr); + if(bit_depth<8)png_set_packing(png_ptr); + if(bit_depth==16)png_set_strip_16(png_ptr); + if(!(color_type&PNG_COLOR_MASK_COLOR))png_set_gray_to_rgb(png_ptr); + if(png_get_bKGD(png_ptr, info_ptr, &bkgd)){ + png_set_background(png_ptr, bkgd, PNG_BACKGROUND_GAMMA_FILE, 1, 1.0); + } + /*Note that color_type 2 and 3 can also have alpha, despite not setting the + PNG_COLOR_MASK_ALPHA bit. + We always strip it to prevent libpng from overrunning our buffer.*/ + png_set_strip_alpha(png_ptr); + + row_data = (png_bytep)png_malloc(png_ptr, + 3*height*width*sizeof(*row_data)); + row_pointers = (png_bytep *)png_malloc(png_ptr, + height*sizeof(*row_pointers)); + for(y = 0; y < height; y++) { + row_pointers[y] = row_data + y*(3*width); + } + png_read_image(png_ptr, row_pointers); + png_read_end(png_ptr, end_ptr); + + *w = width; + *h = height; + /* Must hold: yuv_w >= w */ + yuv_w = (*w + 15) & ~15; + /* Must hold: yuv_h >= h */ + yuv_h = (*h + 15) & ~15; + + /* Do we need to allocate a buffer */ + if (!ycbcr[0].data){ + ycbcr[0].width = yuv_w; + ycbcr[0].height = yuv_h; + ycbcr[0].stride = yuv_w; + ycbcr[1].width = (chroma_format == TH_PF_444) ? yuv_w : (yuv_w >> 1); + ycbcr[1].stride = ycbcr[1].width; + ycbcr[1].height = (chroma_format == TH_PF_420) ? (yuv_h >> 1) : yuv_h; + ycbcr[2].width = ycbcr[1].width; + ycbcr[2].stride = ycbcr[1].stride; + ycbcr[2].height = ycbcr[1].height; + + ycbcr[0].data = malloc(ycbcr[0].stride * ycbcr[0].height); + ycbcr[1].data = malloc(ycbcr[1].stride * ycbcr[1].height); + ycbcr[2].data = malloc(ycbcr[2].stride * ycbcr[2].height); + } else { + if ((ycbcr[0].width != yuv_w) || (ycbcr[0].height != yuv_h)){ + fprintf(stderr, "Input size %lux%lu does not match %dx%d\n", yuv_w,yuv_h,ycbcr[0].width,ycbcr[0].height); + exit(1); + } + } + + rgb_to_yuv(row_pointers, ycbcr, *w, *h); + + png_free(png_ptr, row_pointers); + png_free(png_ptr, row_data); + png_destroy_read_struct(&png_ptr, &info_ptr, &end_ptr); + + fclose(fp); + return 0; +} + +static int include_files (const struct dirent *de) +{ + char name[1024]; + int number = -1; + sscanf(de->d_name, input_filter, &number); + sprintf(name, input_filter, number); + return !strcmp(name, de->d_name); +} + +static int ilog(unsigned _v){ + int ret; + for(ret=0;_v;ret++)_v>>=1; + return ret; +} + +int +main(int argc, char *argv[]) +{ + int c,long_option_index; + int i, n; + char *input_mask; + char *input_directory; + char *scratch; + th_comment tc; + struct dirent **png_files; + int soft_target=0; + int ret; + + while(1) { + + c=getopt_long(argc,argv,optstring,options,&long_option_index); + if(c == EOF) + break; + + switch(c) { + case 'h': + usage(); + break; + case 'o': + option_output = optarg; + break;; + case 'v': + video_quality=rint(atof(optarg)*6.3); + if(video_quality<0 || video_quality>63){ + fprintf(stderr,"Illegal video quality (choose 0 through 10)\n"); + exit(1); + } + video_rate=0; + break; + case 'V': + video_rate=rint(atof(optarg)*1000); + if(video_rate<1){ + fprintf(stderr,"Illegal video bitrate (choose > 0 please)\n"); + exit(1); + } + video_quality=0; + break; + case '\1': + soft_target=1; + break; + case 'c': + vp3_compatible=1; + break; + case 'k': + keyframe_frequency=rint(atof(optarg)); + if(keyframe_frequency<1 || keyframe_frequency>2147483647){ + fprintf(stderr,"Illegal keyframe frequency\n"); + exit(1); + } + break; + + case 'd': + buf_delay=atoi(optarg); + if(buf_delay<=0){ + fprintf(stderr,"Illegal buffer delay\n"); + exit(1); + } + break; + case 's': + video_aspect_numerator=rint(atof(optarg)); + break; + case 'S': + video_aspect_denominator=rint(atof(optarg)); + break; + case 'f': + video_fps_numerator=rint(atof(optarg)); + break; + case 'F': + video_fps_denominator=rint(atof(optarg)); + break; + case '\5': + chroma_format=TH_PF_444; + break; + case '\6': + chroma_format=TH_PF_422; + break; + case '\2': + twopass=3; /* perform both passes */ + twopass_file=tmpfile(); + if(!twopass_file){ + fprintf(stderr,"Unable to open temporary file for twopass data\n"); + exit(1); + } + break; + case '\3': + twopass=1; /* perform first pass */ + twopass_file=fopen(optarg,"wb"); + if(!twopass_file){ + fprintf(stderr,"Unable to open \'%s\' for twopass data\n",optarg); + exit(1); + } + break; + case '\4': + twopass=2; /* perform second pass */ + twopass_file=fopen(optarg,"rb"); + if(!twopass_file){ + fprintf(stderr,"Unable to open twopass data file \'%s\'",optarg); + exit(1); + } + break; + default: + usage(); + break; + } + } + + if(argc < 3) { + usage(); + } + + if(soft_target){ + if(video_rate<=0){ + fprintf(stderr,"Soft rate target (--soft-target) requested without a bitrate (-V).\n"); + exit(1); + } + if(video_quality==-1) + video_quality=0; + }else{ + if(video_rate>0) + video_quality=0; + if(video_quality==-1) + video_quality=48; + } + + if(keyframe_frequency<=0){ + /*Use a default keyframe frequency of 64 for 1-pass (streaming) mode, and + 256 for two-pass mode.*/ + keyframe_frequency=twopass?256:64; + } + + input_mask = argv[optind]; + if (!input_mask) { + fprintf(stderr, "no input files specified; run with -h for help.\n"); + exit(1); + } + /* dirname and basename must operate on scratch strings */ + scratch = strdup(input_mask); + input_directory = strdup(dirname(scratch)); + free(scratch); + scratch = strdup(input_mask); + input_filter = strdup(basename(scratch)); + free(scratch); + +#ifdef DEBUG + fprintf(stderr, "scanning %s with filter '%s'\n", + input_directory, input_filter); +#endif + n = scandir (input_directory, &png_files, include_files, alphasort); + + if (!n) { + fprintf(stderr, "no input files found; run with -h for help.\n"); + exit(1); + } + + ogg_fp = fopen(option_output, "wb"); + if(!ogg_fp) { + fprintf(stderr, "%s: error: %s\n", + option_output, "couldn't open output file"); + return 1; + } + + srand(time(NULL)); + if(ogg_stream_init(&ogg_os, rand())) { + fprintf(stderr, "%s: error: %s\n", + option_output, "couldn't create ogg stream state"); + return 1; + } + + for(passno=(twopass==3?1:twopass);passno<=(twopass==3?2:twopass);passno++){ + unsigned int w; + unsigned int h; + char input_png[1024]; + th_ycbcr_buffer ycbcr; + + ycbcr[0].data = 0; + int last = 0; + + snprintf(input_png, 1023,"%s/%s", input_directory, png_files[0]->d_name); + if(png_read(input_png, &w, &h, ycbcr)) { + fprintf(stderr, "could not read %s\n", input_png); + exit(1); + } + + if (passno!=2) fprintf(stderr,"%d frames, %dx%d\n",n,w,h); + + /* setup complete. Raw processing loop */ + switch(passno){ + case 0: case 2: + fprintf(stderr,"\rCompressing.... \n"); + break; + case 1: + fprintf(stderr,"\rScanning first pass.... \n"); + break; + } + + fprintf(stderr, "%s\n", input_png); + + th_info_init(&ti); + ti.frame_width = ((w + 15) >>4)<<4; + ti.frame_height = ((h + 15)>>4)<<4; + ti.pic_width = w; + ti.pic_height = h; + ti.pic_x = 0; + ti.pic_y = 0; + ti.fps_numerator = video_fps_numerator; + ti.fps_denominator = video_fps_denominator; + ti.aspect_numerator = video_aspect_numerator; + ti.aspect_denominator = video_aspect_denominator; + ti.colorspace = TH_CS_UNSPECIFIED; + ti.pixel_fmt = chroma_format; + ti.target_bitrate = video_rate; + ti.quality = video_quality; + ti.keyframe_granule_shift=ilog(keyframe_frequency-1); + + td=th_encode_alloc(&ti); + th_info_clear(&ti); + /* setting just the granule shift only allows power-of-two keyframe + spacing. Set the actual requested spacing. */ + ret=th_encode_ctl(td,TH_ENCCTL_SET_KEYFRAME_FREQUENCY_FORCE, + &keyframe_frequency,sizeof(keyframe_frequency-1)); + if(ret<0){ + fprintf(stderr,"Could not set keyframe interval to %d.\n",(int)keyframe_frequency); + } + if(vp3_compatible){ + ret=th_encode_ctl(td,TH_ENCCTL_SET_VP3_COMPATIBLE,&vp3_compatible, + sizeof(vp3_compatible)); + if(ret<0||!vp3_compatible){ + fprintf(stderr,"Could not enable strict VP3 compatibility.\n"); + if(ret>=0){ + fprintf(stderr,"Ensure your source format is supported by VP3.\n"); + fprintf(stderr, + "(4:2:0 pixel format, width and height multiples of 16).\n"); + } + } + } + if(soft_target){ + /* reverse the rate control flags to favor a 'long time' strategy */ + int arg = TH_RATECTL_CAP_UNDERFLOW; + ret=th_encode_ctl(td,TH_ENCCTL_SET_RATE_FLAGS,&arg,sizeof(arg)); + if(ret<0) + fprintf(stderr,"Could not set encoder flags for --soft-target\n"); + /* Default buffer control is overridden on two-pass */ + if(!twopass&&buf_delay<0){ + if((keyframe_frequency*7>>1) > 5*video_fps_numerator/video_fps_denominator) + arg=keyframe_frequency*7>>1; + else + arg=5*video_fps_numerator/video_fps_denominator; + ret=th_encode_ctl(td,TH_ENCCTL_SET_RATE_BUFFER,&arg,sizeof(arg)); + if(ret<0) + fprintf(stderr,"Could not set rate control buffer for --soft-target\n"); + } + } + /* set up two-pass if needed */ + if(passno==1){ + unsigned char *buffer; + int bytes; + bytes=th_encode_ctl(td,TH_ENCCTL_2PASS_OUT,&buffer,sizeof(buffer)); + if(bytes<0){ + fprintf(stderr,"Could not set up the first pass of two-pass mode.\n"); + fprintf(stderr,"Did you remember to specify an estimated bitrate?\n"); + exit(1); + } + /*Perform a seek test to ensure we can overwrite this placeholder data at + the end; this is better than letting the user sit through a whole + encode only to find out their pass 1 file is useless at the end.*/ + if(fseek(twopass_file,0,SEEK_SET)<0){ + fprintf(stderr,"Unable to seek in two-pass data file.\n"); + exit(1); + } + if(fwrite(buffer,1,bytes,twopass_file)=0){ + ret=th_encode_ctl(td,TH_ENCCTL_SET_RATE_BUFFER, + &buf_delay,sizeof(buf_delay)); + if(ret<0){ + fprintf(stderr,"Warning: could not set desired buffer delay.\n"); + } + } + /* write the bitstream header packets with proper page interleave */ + th_comment_init(&tc); + /* first packet will get its own page automatically */ + if(th_encode_flushheader(td,&tc,&op)<=0){ + fprintf(stderr,"Internal Theora library error.\n"); + exit(1); + } + th_comment_clear(&tc); + if(passno!=1){ + ogg_stream_packetin(&ogg_os,&op); + if(ogg_stream_pageout(&ogg_os,&og)!=1){ + fprintf(stderr,"Internal Ogg library error.\n"); + exit(1); + } + fwrite(og.header,1,og.header_len,ogg_fp); + fwrite(og.body,1,og.body_len,ogg_fp); + } + /* create the remaining theora headers */ + for(;;){ + ret=th_encode_flushheader(td,&tc,&op); + if(ret<0){ + fprintf(stderr,"Internal Theora library error.\n"); + exit(1); + } + else if(!ret)break; + if(passno!=1)ogg_stream_packetin(&ogg_os,&op); + } + /* Flush the rest of our headers. This ensures + the actual data in each stream will start + on a new page, as per spec. */ + if(passno!=1){ + for(;;){ + int result = ogg_stream_flush(&ogg_os,&og); + if(result<0){ + /* can't get here */ + fprintf(stderr,"Internal Ogg library error.\n"); + exit(1); + } + if(result==0)break; + fwrite(og.header,1,og.header_len,ogg_fp); + fwrite(og.body,1,og.body_len,ogg_fp); + } + } + + i=0; last=0; + do { + if(i >= n-1) last = 1; + if(theora_write_frame(ycbcr, last)) { + fprintf(stderr,"Encoding error.\n"); + exit(1); + } + + i++; + if (!last) { + snprintf(input_png, 1023,"%s/%s", input_directory, png_files[i]->d_name); + if(png_read(input_png, &w, &h, ycbcr)) { + fprintf(stderr, "could not read %s\n", input_png); + exit(1); + } + fprintf(stderr, "%s\n", input_png); + } + } while (!last); + + if(passno==1){ + /* need to read the final (summary) packet */ + unsigned char *buffer; + int bytes = th_encode_ctl(td, TH_ENCCTL_2PASS_OUT, &buffer, sizeof(buffer)); + if(bytes<0){ + fprintf(stderr,"Could not read two-pass summary data from encoder.\n"); + exit(1); + } + if(fseek(twopass_file,0,SEEK_SET)<0){ + fprintf(stderr,"Unable to seek in two-pass data file.\n"); + exit(1); + } + if(fwrite(buffer,1,bytes,twopass_file) +#endif + +#include +#include +#include +#include +#include +#include +#include "theora/theora.h" +#include "vorbis/codec.h" + +#ifdef WIN32 +#include +#include +#endif + +#include +#include + +/* for portaudio */ +#define FRAMES_PER_BUFFER (256) + +/*start of portaudio helper functions, extracted from pablio directory*/ + +/* Pa_streamio routines modified by mauricio at xiph.org + * Modified version of Portable Audio Blocking read/write utility. + * from the original PABLIO files + * Modified to support only playback buffers, direct access + * to the underlying stream time and remove blocking operations*/ + +/* PortAudio copyright notice follows */ + +/* + * Author: Phil Burk, http://www.softsynth.com + * + * This program uses the PortAudio Portable Audio Library. + * For more information see: http://www.audiomulch.com/portaudio/ + * Copyright (c) 1999-2000 Ross Bencina and Phil Burk + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + */ + +typedef struct +{ + long bufferSize; /* Number of bytes in FIFO. Power of 2. Set by RingBuffer_Init. */ +/* These are declared volatile because they are written by a different thread than the reader. */ + volatile long writeIndex; /* Index of next writable byte. Set by RingBuffer_AdvanceWriteIndex. */ + volatile long readIndex; /* Index of next readable byte. Set by RingBuffer_AdvanceReadIndex. */ + long bigMask; /* Used for wrapping indices with extra bit to distinguish full/empty. */ + long smallMask; /* Used for fitting indices to buffer. */ + char *buffer; +} +RingBuffer; + +typedef struct +{ + RingBuffer outFIFO; + PortAudioStream *stream; + int bytesPerFrame; + int samplesPerFrame; +} +PASTREAMIO_Stream; + +/* Values for flags for OpenAudioStream(). */ +/* Keep PABLIO ones*/ + +#define PASTREAMIO_READ (1<<0) +#define PASTREAMIO_WRITE (1<<1) +#define PASTREAMIO_READ_WRITE (PABLIO_READ|PABLIO_WRITE) +#define PASTREAMIO_MONO (1<<2) +#define PASTREAMIO_STEREO (1<<3) + +/*************************************************************************** +** Helper function added to report stream time. */ + +PaTimestamp GetAudioStreamTime( PASTREAMIO_Stream *aStream ){ + return Pa_StreamTime( aStream->stream ) ; +} + + /*************************************************************************** +** Clear buffer. Should only be called when buffer is NOT being read. */ +void RingBuffer_Flush( RingBuffer *rbuf ) +{ + rbuf->writeIndex = rbuf->readIndex = 0; +} + +/*************************************************************************** + * Initialize FIFO. + * numBytes must be power of 2, returns -1 if not. + */ +long RingBuffer_Init( RingBuffer *rbuf, long numBytes, void *dataPtr ) +{ + if( ((numBytes-1) & numBytes) != 0) return -1; /* Not Power of two. */ + rbuf->bufferSize = numBytes; + rbuf->buffer = (char *)dataPtr; + RingBuffer_Flush( rbuf ); + rbuf->bigMask = (numBytes*2)-1; + rbuf->smallMask = (numBytes)-1; + return 0; +} +/*************************************************************************** +** Return number of bytes available for reading. */ +long RingBuffer_GetReadAvailable( RingBuffer *rbuf ) +{ + return ( (rbuf->writeIndex - rbuf->readIndex) & rbuf->bigMask ); +} +/*************************************************************************** +** Return number of bytes available for writing. */ +long RingBuffer_GetWriteAvailable( RingBuffer *rbuf ) +{ + return ( rbuf->bufferSize - RingBuffer_GetReadAvailable(rbuf)); +} + + +/*************************************************************************** +** Get address of region(s) to which we can write data. +** If the region is contiguous, size2 will be zero. +** If non-contiguous, size2 will be the size of second region. +** Returns room available to be written or numBytes, whichever is smaller. +*/ +long RingBuffer_GetWriteRegions( RingBuffer *rbuf, long numBytes, + void **dataPtr1, long *sizePtr1, + void **dataPtr2, long *sizePtr2 ) +{ + long index; + long available = RingBuffer_GetWriteAvailable( rbuf ); + if( numBytes > available ) numBytes = available; + /* Check to see if write is not contiguous. */ + index = rbuf->writeIndex & rbuf->smallMask; + if( (index + numBytes) > rbuf->bufferSize ) + { + /* Write data in two blocks that wrap the buffer. */ + long firstHalf = rbuf->bufferSize - index; + *dataPtr1 = &rbuf->buffer[index]; + *sizePtr1 = firstHalf; + *dataPtr2 = &rbuf->buffer[0]; + *sizePtr2 = numBytes - firstHalf; + } + else + { + *dataPtr1 = &rbuf->buffer[index]; + *sizePtr1 = numBytes; + *dataPtr2 = NULL; + *sizePtr2 = 0; + } + return numBytes; +} + + +/*************************************************************************** +*/ +long RingBuffer_AdvanceWriteIndex( RingBuffer *rbuf, long numBytes ) +{ + return rbuf->writeIndex = (rbuf->writeIndex + numBytes) & rbuf->bigMask; +} + +/*************************************************************************** +** Get address of region(s) from which we can read data. +** If the region is contiguous, size2 will be zero. +** If non-contiguous, size2 will be the size of second region. +** Returns room available to be written or numBytes, whichever is smaller. +*/ +long RingBuffer_GetReadRegions( RingBuffer *rbuf, long numBytes, + void **dataPtr1, long *sizePtr1, + void **dataPtr2, long *sizePtr2 ) +{ + long index; + long available = RingBuffer_GetReadAvailable( rbuf ); + if( numBytes > available ) numBytes = available; + /* Check to see if read is not contiguous. */ + index = rbuf->readIndex & rbuf->smallMask; + if( (index + numBytes) > rbuf->bufferSize ) + { + /* Write data in two blocks that wrap the buffer. */ + long firstHalf = rbuf->bufferSize - index; + *dataPtr1 = &rbuf->buffer[index]; + *sizePtr1 = firstHalf; + *dataPtr2 = &rbuf->buffer[0]; + *sizePtr2 = numBytes - firstHalf; + } + else + { + *dataPtr1 = &rbuf->buffer[index]; + *sizePtr1 = numBytes; + *dataPtr2 = NULL; + *sizePtr2 = 0; + } + return numBytes; +} +/*************************************************************************** +*/ +long RingBuffer_AdvanceReadIndex( RingBuffer *rbuf, long numBytes ) +{ + return rbuf->readIndex = (rbuf->readIndex + numBytes) & rbuf->bigMask; +} + +/*************************************************************************** +** Return bytes written. */ +long RingBuffer_Write( RingBuffer *rbuf, void *data, long numBytes ) +{ + long size1, size2, numWritten; + void *data1, *data2; + numWritten = RingBuffer_GetWriteRegions( rbuf, numBytes, &data1, &size1, &data2, &size2 ); + if( size2 > 0 ) + { + + memcpy( data1, data, size1 ); + data = ((char *)data) + size1; + memcpy( data2, data, size2 ); + } + else + { + memcpy( data1, data, size1 ); + } + RingBuffer_AdvanceWriteIndex( rbuf, numWritten ); + return numWritten; +} + +/*************************************************************************** +** Return bytes read. */ +long RingBuffer_Read( RingBuffer *rbuf, void *data, long numBytes ) +{ + long size1, size2, numRead; + void *data1, *data2; + numRead = RingBuffer_GetReadRegions( rbuf, numBytes, &data1, &size1, &data2, &size2 ); + if( size2 > 0 ) + { + memcpy( data, data1, size1 ); + data = ((char *)data) + size1; + memcpy( data, data2, size2 ); + } + else + { + memcpy( data, data1, size1 ); + } + RingBuffer_AdvanceReadIndex( rbuf, numRead ); + return numRead; +} + + +/************************************************************************/ +/******** Functions *****************************************************/ +/************************************************************************/ + +/* Called from PortAudio. + * Read and write data only if there is room in FIFOs. + */ +static int audioIOCallback( void *inputBuffer, void *outputBuffer, + unsigned long framesPerBuffer, + PaTimestamp outTime, void *userData ) +{ + PASTREAMIO_Stream *data = (PASTREAMIO_Stream*)userData; + long numBytes = data->bytesPerFrame * framesPerBuffer; + (void) outTime; + (void) inputBuffer; + + if( outputBuffer != NULL ) + { + int i; + int numRead = RingBuffer_Read( &data->outFIFO, outputBuffer, numBytes ); + /* Zero out remainder of buffer if we run out of data. */ + for( i=numRead; ibuffer ) free( rbuf->buffer ); + rbuf->buffer = NULL; + return paNoError; +} + +/************************************************************ + * Write data to ring buffer. + * Will not return until all the data has been written. + */ +long WriteAudioStream( PASTREAMIO_Stream *aStream, void *data, long numFrames ) +{ + long bytesWritten; + char *p = (char *) data; + long numBytes = aStream->bytesPerFrame * numFrames; + while( numBytes > 0) + { + bytesWritten = RingBuffer_Write( &aStream->outFIFO, p, numBytes ); + numBytes -= bytesWritten; + p += bytesWritten; + if( numBytes > 0) Pa_Sleep(10); + } + return numFrames; +} + + +/************************************************************ + * Return the number of frames that could be written to the stream without + * having to wait. + */ +long GetAudioStreamWriteable( PASTREAMIO_Stream *aStream ) +{ + int bytesEmpty = RingBuffer_GetWriteAvailable( &aStream->outFIFO ); + return bytesEmpty / aStream->bytesPerFrame; +} + + + +/************************************************************/ +unsigned long RoundUpToNextPowerOf2( unsigned long n ) +{ + long numBits = 0; + if( ((n-1) & n) == 0) return n; /* Already Power of two. */ + while( n > 0 ) + { + n= n>>1; + numBits++; + } + return (1<samplesPerFrame = ((flags&PASTREAMIO_MONO) != 0) ? 1 : 2; + aStream->bytesPerFrame = bytesPerSample * aStream->samplesPerFrame; + + /* Initialize PortAudio */ + err = Pa_Initialize(); + if( err != paNoError ) goto error; + + /* Warning: numFrames must be larger than amount of data processed per interrupt + * inside PA to prevent glitches. Just to be safe, adjust size upwards. + */ + minNumBuffers = 2 * Pa_GetMinNumBuffers( FRAMES_PER_BUFFER, sampleRate ); + numFrames = minNumBuffers * FRAMES_PER_BUFFER; + numFrames = RoundUpToNextPowerOf2( numFrames ); + + /* Initialize Ring Buffer */ + doWrite = ((flags & PASTREAMIO_WRITE) != 0); + + if(doWrite) + { + err = PASTREAMIO_InitFIFO( &aStream->outFIFO, numFrames, aStream->bytesPerFrame ); + if( err != paNoError ) goto error; + /* Make Write FIFO appear full initially. + numBytes = RingBuffer_GetWriteAvailable( &aStream->outFIFO ); + RingBuffer_AdvanceWriteIndex( &aStream->outFIFO, numBytes );*/ + } + + /* Open a PortAudio stream that we will use to communicate with the underlying + * audio drivers. */ + err = Pa_OpenStream( + &aStream->stream, + paNoDevice, + 0 , + format, + NULL, + Pa_GetDefaultOutputDeviceID() , + aStream->samplesPerFrame , + format, + NULL, + sampleRate, + FRAMES_PER_BUFFER, + minNumBuffers, + paClipOff, /* we won't output out of range samples so don't bother clipping them */ + audioIOCallback, + aStream ); + if( err != paNoError ) goto error; + + *rwblPtr = aStream; + return paNoError; + +error: + CloseAudioStream( aStream ); + *rwblPtr = NULL; + return err; +} + +PaError StartAudioStream( PASTREAMIO_Stream *aStream) +{ + PaError err; + err = Pa_StartStream( aStream->stream ); + if( err != paNoError ) goto error; + + return paNoError; +error: + CloseAudioStream( aStream ); + return err; +} + + +/************************************************************/ +PaError CloseAudioStream( PASTREAMIO_Stream *aStream ) +{ + PaError err; + int bytesEmpty; + int byteSize = aStream->outFIFO.bufferSize; + + /* If we are writing data, make sure we play everything written. */ + if( byteSize > 0 ) + { + bytesEmpty = RingBuffer_GetWriteAvailable( &aStream->outFIFO ); + while( bytesEmpty < byteSize ) + { + Pa_Sleep( 10 ); + bytesEmpty = RingBuffer_GetWriteAvailable( &aStream->outFIFO ); + } + } + + err = Pa_StopStream( aStream->stream ); + if( err != paNoError ) goto error; + err = Pa_CloseStream( aStream->stream ); + if( err != paNoError ) goto error; + Pa_Terminate(); + +error: + PASTREAMIO_TermFIFO( &aStream->outFIFO ); + free( aStream ); + return err; +} + +/* -- end of portaudio specific routines --*/ + +/* portaudio related global types */ +#define PA_SAMPLE_TYPE paInt16 +typedef short SAMPLE; +#define SAMPLE_SILENCE (0) + +PASTREAMIO_Stream *aOutStream; /* our modified stream buffer*/ +SAMPLE *samples; /*local buffer for samples*/ +double latency_sec = 0; + +/* ticks information to be used if the audio stream is not present */ +int currentTicks = -1; + +/* initial state of the audio stream */ +int isPlaying = 0; +PaError err; + +/* Ogg and codec state for demux/decode */ +ogg_sync_state oy; +ogg_page og; +ogg_stream_state vo; +ogg_stream_state to; +theora_info ti; +theora_comment tc; +theora_state td; +vorbis_info vi; +vorbis_dsp_state vd; +vorbis_block vb; +vorbis_comment vc; + +int theora_p=0; +int vorbis_p=0; +int stateflag=0; + +FILE * infile = NULL; + +/* SDL Video playback structures */ +SDL_Surface *screen; +SDL_Overlay *yuv_overlay; +SDL_Rect rect; + +/* single frame video buffering */ +int videobuf_ready=0; +ogg_int64_t videobuf_granulepos=-1; +double videobuf_time=0; + +int audiobuf_ready=0; +ogg_int64_t audiobuf_granulepos=0; /* time position of last sample */ + +static int open_audio(){ + /* this will open one circular audio stream */ + /* build on top of portaudio routines */ + /* implementation based on file pastreamio.c */ + + int numSamples; + int numBytes; + + int minNumBuffers; + int numFrames; + + minNumBuffers = 2 * Pa_GetMinNumBuffers( FRAMES_PER_BUFFER, vi.rate ); + numFrames = minNumBuffers * FRAMES_PER_BUFFER; + numFrames = RoundUpToNextPowerOf2( numFrames ); + + numSamples = numFrames * vi.channels; + numBytes = numSamples * sizeof(SAMPLE); + + samples = (SAMPLE *) malloc( numBytes ); + + /* store our latency calculation here */ + latency_sec = (double) numFrames / vi.rate / vi.channels; + printf( "Latency: %.04f\n", latency_sec ); + + err = OpenAudioStream( &aOutStream, vi.rate, PA_SAMPLE_TYPE, + (PASTREAMIO_WRITE | PASTREAMIO_STEREO) ); + if( err != paNoError ) goto error; + return err; +error: + CloseAudioStream( aOutStream ); + printf( "An error occured while opening the portaudio stream\n" ); + printf( "Error number: %d\n", err ); + printf( "Error message: %s\n", Pa_GetErrorText( err ) ); + return err; + +} + +static int start_audio(){ + err = StartAudioStream(aOutStream); + if( err != paNoError ) goto error; + + return err; +error: + CloseAudioStream( aOutStream ); + printf( "An error occured while opening the portaudio stream\n" ); + printf( "Error number: %d\n", err ); + printf( "Error message: %s\n", Pa_GetErrorText( err ) ); + return err; +} + +static int audio_close(void){ + err = CloseAudioStream( aOutStream ); + if( err != paNoError ) goto error; + + free(samples); + return err; +error: + Pa_Terminate(); + printf( "An error occured while closing the portaudio stream\n" ); + printf( "Error number: %d\n", err ); + printf( "Error message: %s\n", Pa_GetErrorText( err ) ); + return err; +} + + +double get_time() { + static Uint32 startticks = 0; + double curtime; + if (vorbis_p) { + /* not entirely accurate with the WAVE OUT device, but good enough + at this stage. Needs to be reworked to account for blank audio + data written to the stream... */ + curtime = (double) (GetAudioStreamTime( aOutStream ) / vi.rate) - latency_sec; + if (curtime<0.0) curtime = 0.0; + } else { + /* initialize timer variable if not set yet */ + if (startticks==0) + startticks = SDL_GetTicks(); + curtime = 1.0e-3 * (double)(SDL_GetTicks() - startticks); + } + return curtime; +} + + +static void open_video(void){ + /* taken from player_sample.c test file for theora alpha */ + + if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) { + printf("Unable to initialize SDL: %s\n", SDL_GetError()); + exit(1); + } + + screen = SDL_SetVideoMode(ti.frame_width, ti.frame_height, 0, SDL_SWSURFACE); + if ( screen == NULL ) { + printf("Unable to set %dx%d video mode: %s\n", + ti.frame_width,ti.frame_height,SDL_GetError()); + exit(1); + } + + yuv_overlay = SDL_CreateYUVOverlay(ti.frame_width, ti.frame_height, + SDL_YV12_OVERLAY, + screen); + if ( yuv_overlay == NULL ) { + printf("SDL: Couldn't create SDL_yuv_overlay: %s\n", + SDL_GetError()); + exit(1); + } + rect.x = 0; + rect.y = 0; + rect.w = ti.frame_width; + rect.h = ti.frame_height; + + SDL_DisplayYUVOverlay(yuv_overlay, &rect); +} + +static void video_write(void){ + /* taken from player_sample.c test file for theora alpha */ + int i; + yuv_buffer yuv; + int crop_offset; + theora_decode_YUVout(&td,&yuv); + + /* Lock SDL_yuv_overlay */ + if ( SDL_MUSTLOCK(screen) ) { + if ( SDL_LockSurface(screen) < 0 ) return; + } + if (SDL_LockYUVOverlay(yuv_overlay) < 0) return; + + /* let's draw the data (*yuv[3]) on a SDL screen (*screen) */ + /* deal with border stride */ + /* reverse u and v for SDL */ + /* and crop input properly, respecting the encoded frame rect */ + crop_offset=ti.offset_x+yuv.y_stride*ti.offset_y; + for(i=0;ih;i++) + memcpy(yuv_overlay->pixels[0]+yuv_overlay->pitches[0]*i, + yuv.y+crop_offset+yuv.y_stride*i, + yuv_overlay->w); + crop_offset=(ti.offset_x/2)+(yuv.uv_stride)*(ti.offset_y/2); + for(i=0;ih/2;i++){ + memcpy(yuv_overlay->pixels[1]+yuv_overlay->pitches[1]*i, + yuv.v+crop_offset+yuv.uv_stride*i, + yuv_overlay->w/2); + memcpy(yuv_overlay->pixels[2]+yuv_overlay->pitches[2]*i, + yuv.u+crop_offset+yuv.uv_stride*i, + yuv_overlay->w/2); + } + + /* Unlock SDL_yuv_overlay */ + SDL_UnlockYUVOverlay(yuv_overlay); + if ( SDL_MUSTLOCK(screen) ) { + SDL_UnlockSurface(screen); + } + + /* Show, baby, show! */ + SDL_DisplayYUVOverlay(yuv_overlay, &rect); +} + +static void usage(void){ + printf("Usage: splayer \n" +#ifdef WIN32 + "\n" + "or drag and drop an ogg file over the .exe\n\n" +#endif + ); +} + +/* dump the theora (or vorbis) comment header */ +static int dump_comments(theora_comment *tc){ + int i, len; + char *value; + + printf("Encoded by %s\n",tc->vendor); + if(tc->comments){ + printf("theora comment header:\n"); + for(i=0;icomments;i++){ + if(tc->user_comments[i]){ + len=tc->comment_lengths[i]; + value=malloc(len+1); + memcpy(value,tc->user_comments[i],len); + value[len]='\0'; + printf("\t%s\n", value); + free(value); + } + } + } + return(0); +} + +/* Report the encoder-specified colorspace for the video, if any. + We don't actually make use of the information in this example; + a real player should attempt to perform color correction for + whatever display device it supports. */ +static void report_colorspace(theora_info *ti) +{ + switch(ti->colorspace){ + case OC_CS_UNSPECIFIED: + /* nothing to report */ + break;; + case OC_CS_ITU_REC_470M: + fprintf(stderr," encoder specified ITU Rec 470M color.\n"); + break;; + case OC_CS_ITU_REC_470BG: + fprintf(stderr," encoder specified ITU Rec 470BG color.\n"); + break;; + default: + fprintf(stderr,"warning: encoder specified unknown colorspace (%d).\n", + ti->colorspace); + break;; + } +} + +/* Helper; just grab some more compressed bitstream and sync it for + page extraction */ +int buffer_data(ogg_sync_state *oy){ + char *buffer=ogg_sync_buffer(oy,4096); + int bytes=fread(buffer,1,4096,infile); + ogg_sync_wrote(oy,bytes); + return(bytes); +} + +/* helper: push a page into the appropriate stream */ +/* this can be done blindly; a stream won't accept a page + that doesn't belong to it */ +static int queue_page(ogg_page *page){ + if(theora_p)ogg_stream_pagein(&to,page); + if(vorbis_p)ogg_stream_pagein(&vo,page); + return 0; +} + +void parseHeaders(){ + /* extracted from player_sample.c test file for theora alpha */ + ogg_packet op; + /* Parse the headers */ + /* Only interested in Vorbis/Theora streams */ + while(!stateflag){ + int ret=buffer_data(&oy); + if(ret==0)break; + while(ogg_sync_pageout(&oy,&og)>0){ + ogg_stream_state test; + + /* is this a mandated initial header? If not, stop parsing */ + if(!ogg_page_bos(&og)){ + /* don't leak the page; get it into the appropriate stream */ + queue_page(&og); + stateflag=1; + break; + } + + ogg_stream_init(&test,ogg_page_serialno(&og)); + ogg_stream_pagein(&test,&og); + ogg_stream_packetout(&test,&op); + + /* identify the codec: try theora */ + if(!theora_p && theora_decode_header(&ti,&tc,&op)>=0){ + /* it is theora */ + memcpy(&to,&test,sizeof(test)); + theora_p=1; + }else if(!vorbis_p && vorbis_synthesis_headerin(&vi,&vc,&op)>=0){ + /* it is vorbis */ + memcpy(&vo,&test,sizeof(test)); + vorbis_p=1; + }else{ + /* whatever it is, we don't care about it */ + ogg_stream_clear(&test); + } + } + } + + /* we've now identified all the bitstreams. parse the secondary header packets. */ + while((theora_p && theora_p<3) || (vorbis_p && vorbis_p<3)){ + int ret; + + /* look for further theora headers */ + while(theora_p && (theora_p<3) && (ret=ogg_stream_packetout(&to,&op))){ + if(ret<0){ + printf("Error parsing Theora stream headers; corrupt stream?\n"); + exit(1); + } + if(theora_decode_header(&ti,&tc,&op)){ + printf("Error parsing Theora stream headers; corrupt stream?\n"); + exit(1); + } + theora_p++; + if(theora_p==3)break; + } + + /* look for more vorbis header packets */ + while(vorbis_p && (vorbis_p<3) && (ret=ogg_stream_packetout(&vo,&op))){ + if(ret<0){ + printf("Error parsing Vorbis stream headers; corrupt stream?\n"); + exit(1); + } + if(vorbis_synthesis_headerin(&vi,&vc,&op)){ + printf("Error parsing Vorbis stream headers; corrupt stream?\n"); + exit(1); + } + vorbis_p++; + if(vorbis_p==3)break; + } + + /* The header pages/packets will arrive before anything else we + care about, or the stream is not obeying spec */ + + if(ogg_sync_pageout(&oy,&og)>0){ + queue_page(&og); /* demux into the appropriate stream */ + }else{ + int ret=buffer_data(&oy); + if(ret==0){ + fprintf(stderr,"End of file while searching for codec headers.\n"); + exit(1); + } + } + } +} + +int main( int argc, char* argv[] ){ + + int i,j; + ogg_packet op; + SDL_Event event; + int hasdatatobuffer = 1; + int playbackdone = 0; + double now, delay, last_frame_time = 0; + + int frameNum=0; + int skipNum=0; + + /* takes first argument as file to play */ + /* this works better on Windows and is more convenient + for drag and drop ogg files over the .exe */ + + if( argc != 2 ) + { + usage(); + exit(0); + } + + infile = fopen( argv[1], "rb" ); + + /* start up Ogg stream synchronization layer */ + ogg_sync_init(&oy); + + /* init supporting Vorbis structures needed in header parsing */ + vorbis_info_init(&vi); + vorbis_comment_init(&vc); + + /* init supporting Theora structures needed in header parsing */ + theora_comment_init(&tc); + theora_info_init(&ti); + + parseHeaders(); + + /* force audio off */ + /* vorbis_p = 0; */ + + /* initialize decoders */ + if(theora_p){ + theora_decode_init(&td,&ti); + printf("Ogg logical stream %x is Theora %dx%d %.02f fps video\n" + " Frame content is %dx%d with offset (%d,%d).\n", + to.serialno,ti.width,ti.height, (double)ti.fps_numerator/ti.fps_denominator, + ti.frame_width, ti.frame_height, ti.offset_x, ti.offset_y); + report_colorspace(&ti); + dump_comments(&tc); + }else{ + /* tear down the partial theora setup */ + theora_info_clear(&ti); + theora_comment_clear(&tc); + } + if(vorbis_p){ + vorbis_synthesis_init(&vd,&vi); + vorbis_block_init(&vd,&vb); + printf("Ogg logical stream %x is Vorbis %d channel %d Hz audio.\n", + vo.serialno,vi.channels,vi.rate); + }else{ + /* tear down the partial vorbis setup */ + vorbis_info_clear(&vi); + vorbis_comment_clear(&vc); + } + /* open audio */ + if(vorbis_p)open_audio(); + /* open video */ + if(theora_p)open_video(); + + /* our main loop */ + while(!playbackdone){ + + /* break out on SDL quit event */ + if ( SDL_PollEvent ( &event ) ) + { + if ( event.type == SDL_QUIT ) break ; + } + + /* get some audio data */ + while(vorbis_p && !audiobuf_ready){ + int ret; + float **pcm; + int count = 0; + int maxBytesToWrite; + + /* is there pending audio? does it fit our circular buffer without blocking? */ + ret=vorbis_synthesis_pcmout(&vd,&pcm); + maxBytesToWrite = GetAudioStreamWriteable(aOutStream); + + if (maxBytesToWrite<=FRAMES_PER_BUFFER){ + /* break out until there is a significant amount of + data to avoid a series of small write operations. */ + break; + } + /* if there's pending, decoded audio, grab it */ + if((ret>0)&&(maxBytesToWrite>0)){ + + for(i=0;i32767)val=32767; + if(val<-32768)val=-32768; + samples[count]=val; + count++; + } + if(WriteAudioStream( aOutStream, samples, i )) { + if(count==maxBytesToWrite){ + audiobuf_ready=1; + } + } + vorbis_synthesis_read(&vd,i); + + if(vd.granulepos>=0) + audiobuf_granulepos=vd.granulepos-ret+i; + else + audiobuf_granulepos+=i; + + }else{ + + /* no pending audio; is there a pending packet to decode? */ + if(ogg_stream_packetout(&vo,&op)>0){ + if(vorbis_synthesis(&vb,&op)==0) /* test for success! */ + vorbis_synthesis_blockin(&vd,&vb); + }else /* we need more data; break out to suck in another page */ + break; + } + } /* end audio cycle */ + + while(theora_p && !videobuf_ready){ + /* get one video packet... */ + if(ogg_stream_packetout(&to,&op)>0){ + + theora_decode_packetin(&td,&op); + + videobuf_granulepos=td.granulepos; + videobuf_time=theora_granule_time(&td,videobuf_granulepos); + /* update the frame counter */ + frameNum++; + + /* check if this frame time has not passed yet. + If the frame is late we need to decode additonal + ones and keep looping, since theora at this stage + needs to decode all frames */ + now=get_time(); + delay=videobuf_time-now; + if(delay>=0.0){ + /* got a good frame, not late, ready to break out */ + videobuf_ready=1; + }else if(now-last_frame_time>=1.0){ + /* display at least one frame per second, regardless */ + videobuf_ready=1; + }else{ + fprintf(stderr, "dropping frame %d (%.3fs behind)\n", + frameNum, -delay); + } + }else{ + /* need more data */ + break; + } + } + + if(!hasdatatobuffer && !videobuf_ready && !audiobuf_ready){ + isPlaying = 0; + playbackdone = 1; + } + + /* if we're set for the next frame, sleep */ + if((!theora_p || videobuf_ready) && + (!vorbis_p || audiobuf_ready)){ + int ticks = 1.0e3*(videobuf_time-get_time()); + if(ticks>0) + SDL_Delay(ticks); + } + + if(videobuf_ready){ + /* time to write our cached frame */ + video_write(); + videobuf_ready=0; + last_frame_time=get_time(); + + /* if audio has not started (first frame) then start it */ + if ((!isPlaying)&&(vorbis_p)){ + start_audio(); + isPlaying = 1; + } + } + + /* HACK: always look for more audio data */ + audiobuf_ready=0; + + /* buffer compressed data every loop */ + if(hasdatatobuffer){ + hasdatatobuffer=buffer_data(&oy); + if(hasdatatobuffer==0){ + printf("Ogg buffering stopped, end of file reached.\n"); + } + } + + if (ogg_sync_pageout(&oy,&og)>0){ + queue_page(&og); + } + + } /* playbackdone */ + + /* show number of video frames decoded */ + printf( "\n"); + printf( "Frames decoded: %d", frameNum ); + if(skipNum) + printf( " (only %d shown)", frameNum-skipNum); + printf( "\n" ); + + /* tear it all down */ + fclose( infile ); + + if(vorbis_p){ + audio_close(); + + ogg_stream_clear(&vo); + vorbis_block_clear(&vb); + vorbis_dsp_clear(&vd); + vorbis_comment_clear(&vc); + vorbis_info_clear(&vi); + } + if(theora_p){ + ogg_stream_clear(&to); + theora_clear(&td); + theora_comment_clear(&tc); + theora_info_clear(&ti); + } + ogg_sync_clear(&oy); + + printf("\r " + "\nDone.\n"); + + SDL_Quit(); + + return(0); + +} diff --git a/cs/3rd party/libtheora/examples/tiff2theora.c b/cs/3rd party/libtheora/examples/tiff2theora.c new file mode 100644 index 000000000..685f940e2 --- /dev/null +++ b/cs/3rd party/libtheora/examples/tiff2theora.c @@ -0,0 +1,885 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggTheora SOFTWARE 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 Theora SOURCE CODE IS COPYRIGHT (C) 2002-2011 * + * by the Xiph.Org Foundation and contributors http://www.xiph.org/ * + * * + ******************************************************************** + + function: example encoder application; makes an Ogg Theora + file from a sequence of tiff images + last mod: $Id$ + based on png2theora + + ********************************************************************/ + +#define _FILE_OFFSET_BITS 64 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include "theora/theoraenc.h" + +#define PROGRAM_NAME "tiff2theora" +#define PROGRAM_VERSION "1.1" + +static const char *option_output = NULL; +static int video_fps_numerator = 24; +static int video_fps_denominator = 1; +static int video_aspect_numerator = 0; +static int video_aspect_denominator = 0; +static int video_rate = -1; +static int video_quality = -1; +ogg_uint32_t keyframe_frequency=0; +int buf_delay=-1; +int vp3_compatible=0; +static int chroma_format = TH_PF_420; + +static FILE *twopass_file = NULL; +static int twopass=0; +static int passno; + +static FILE *ogg_fp = NULL; +static ogg_stream_state ogg_os; +static ogg_packet op; +static ogg_page og; + +static th_enc_ctx *td = NULL; +static th_info ti; + +static char *input_filter = NULL; + +const char *optstring = "o:hv:\4:\2:V:s:S:f:F:ck:d:\1\2\3\4\5\6"; +struct option options [] = { + {"output",required_argument,NULL,'o'}, + {"help",no_argument,NULL,'h'}, + {"chroma-444",no_argument,NULL,'\5'}, + {"chroma-422",no_argument,NULL,'\6'}, + {"video-rate-target",required_argument,NULL,'V'}, + {"video-quality",required_argument,NULL,'v'}, + {"aspect-numerator",required_argument,NULL,'s'}, + {"aspect-denominator",required_argument,NULL,'S'}, + {"framerate-numerator",required_argument,NULL,'f'}, + {"framerate-denominator",required_argument,NULL,'F'}, + {"vp3-compatible",no_argument,NULL,'c'}, + {"soft-target",no_argument,NULL,'\1'}, + {"keyframe-freq",required_argument,NULL,'k'}, + {"buf-delay",required_argument,NULL,'d'}, + {"two-pass",no_argument,NULL,'\2'}, + {"first-pass",required_argument,NULL,'\3'}, + {"second-pass",required_argument,NULL,'\4'}, + {NULL,0,NULL,0} +}; + +static void usage(void){ + fprintf(stderr, + "%s %s\n" + "Usage: %s [options] \n\n" + "The input argument uses C printf format to represent a list of files,\n" + " i.e. file-%%06d.tiff to look for files file000001.tiff to file9999999.tiff \n\n" + "Options: \n\n" + " -o --output file name for encoded output (required);\n" + " -v --video-quality Theora quality selector fro 0 to 10\n" + " (0 yields smallest files but lowest\n" + " video quality. 10 yields highest\n" + " fidelity but large files)\n\n" + " -V --video-rate-target bitrate target for Theora video\n\n" + " --soft-target Use a large reservoir and treat the rate\n" + " as a soft target; rate control is less\n" + " strict but resulting quality is usually\n" + " higher/smoother overall. Soft target also\n" + " allows an optional -v setting to specify\n" + " a minimum allowed quality.\n\n" + " --two-pass Compress input using two-pass rate control\n" + " This option performs both passes automatically.\n\n" + " --first-pass Perform first-pass of a two-pass rate\n" + " controlled encoding, saving pass data to\n" + " for a later second pass\n\n" + " --second-pass Perform second-pass of a two-pass rate\n" + " controlled encoding, reading first-pass\n" + " data from . The first pass\n" + " data must come from a first encoding pass\n" + " using identical input video to work\n" + " properly.\n\n" + " -k --keyframe-freq Keyframe frequency\n" + " -d --buf-delay Buffer delay (in frames). Longer delays\n" + " allow smoother rate adaptation and provide\n" + " better overall quality, but require more\n" + " client side buffering and add latency. The\n" + " default value is the keyframe interval for\n" + " one-pass encoding (or somewhat larger if\n" + " --soft-target is used) and infinite for\n" + " two-pass encoding.\n" + " --chroma-444 Use 4:4:4 chroma subsampling\n" + " --chroma-422 Use 4:2:2 chroma subsampling\n" + " (4:2:0 is default)\n\n" + " -s --aspect-numerator Aspect ratio numerator, default is 0\n" + " -S --aspect-denominator Aspect ratio denominator, default is 0\n" + " -f --framerate-numerator Frame rate numerator\n" + " -F --framerate-denominator Frame rate denominator\n" + " The frame rate nominator divided by this\n" + " determines the frame rate in units per tick\n" + ,PROGRAM_NAME, PROGRAM_VERSION, PROGRAM_NAME + ); + exit(0); +} + +#ifdef WIN32 +int +alphasort (const void *a, const void *b) +{ + return strcoll ((*(const struct dirent **) a)->d_name, + (*(const struct dirent **) b)->d_name); +} + +int +scandir (const char *dir, struct dirent ***namelist, + int (*select)(const struct dirent *), int (*compar)(const void *, const void *)) +{ + DIR *d; + struct dirent *entry; + register int i=0; + size_t entrysize; + + if ((d=opendir(dir)) == NULL) + return(-1); + + *namelist=NULL; + while ((entry=readdir(d)) != NULL) + { + if (select == NULL || (select != NULL && (*select)(entry))) + { + *namelist=(struct dirent **)realloc((void *)(*namelist), + (size_t)((i+1)*sizeof(struct dirent *))); + if (*namelist == NULL) return(-1); + entrysize=sizeof(struct dirent)-sizeof(entry->d_name)+strlen(entry->d_name)+1; + (*namelist)[i]=(struct dirent *)malloc(entrysize); + if ((*namelist)[i] == NULL) return(-1); + memcpy((*namelist)[i], entry, entrysize); + i++; + } + } + if (closedir(d)) return(-1); + if (i == 0) return(-1); + if (compar != NULL) + qsort((void *)(*namelist), (size_t)i, sizeof(struct dirent *), compar); + + return(i); +} +#endif + +static int +theora_write_frame(th_ycbcr_buffer ycbcr, int last) +{ + ogg_packet op; + ogg_page og; + + /* Theora is a one-frame-in,one-frame-out system; submit a frame + for compression and pull out the packet */ + /* in two-pass mode's second pass, we need to submit first-pass data */ + if(passno==2){ + int ret; + for(;;){ + static unsigned char buffer[80]; + static int buf_pos; + int bytes; + /*Ask the encoder how many bytes it would like.*/ + bytes=th_encode_ctl(td,TH_ENCCTL_2PASS_IN,NULL,0); + if(bytes<0){ + fprintf(stderr,"Error submitting pass data in second pass.\n"); + exit(1); + } + /*If it's got enough, stop.*/ + if(bytes==0)break; + /*Read in some more bytes, if necessary.*/ + if(bytes>80-buf_pos)bytes=80-buf_pos; + if(bytes>0&&fread(buffer+buf_pos,1,bytes,twopass_file)=bytes)buf_pos=0; + /*Otherwise remember how much it used.*/ + else buf_pos+=ret; + } + } + + if(th_encode_ycbcr_in(td, ycbcr)) { + fprintf(stderr, "%s: error: could not encode frame\n", + option_output); + return 1; + } + + /* in two-pass mode's first pass we need to extract and save the pass data */ + if(passno==1){ + unsigned char *buffer; + int bytes = th_encode_ctl(td, TH_ENCCTL_2PASS_OUT, &buffer, sizeof(buffer)); + if(bytes<0){ + fprintf(stderr,"Could not read two-pass data from encoder.\n"); + exit(1); + } + if(fwrite(buffer,1,bytes,twopass_file) 255) + return 255; + + return d; +} + +static void +rgb_to_yuv(uint32 *raster, + th_ycbcr_buffer ycbcr, + unsigned int w, unsigned int h) +{ + unsigned int x; + unsigned int y; + + unsigned int x1; + unsigned int y1; + + unsigned long yuv_w; + + unsigned char *yuv_y; + unsigned char *yuv_u; + unsigned char *yuv_v; + + yuv_w = ycbcr[0].width; + + yuv_y = ycbcr[0].data; + yuv_u = ycbcr[1].data; + yuv_v = ycbcr[2].data; + + /*This ignores gamma and RGB primary/whitepoint differences. + It also isn't terribly fast (though a decent compiler will + strength-reduce the division to a multiplication).*/ + /*TIFF is upside down relative to the libtheora api*/ + if (chroma_format == TH_PF_420) { + for(y = 0; y < h; y += 2) { + y1=y+(y+1> 1) + (y >> 1) * ycbcr[1].stride] = + clamp( ((-33488*r0-65744*g0+99232*b0+29032005)/4 + + (-33488*r0-65744*g0+99232*b0+29032005)/4 + + (-33488*r2-65744*g2+99232*b2+29032005)/4 + + (-33488*r3-65744*g3+99232*b3+29032005)/4)/225930); + yuv_v[(x >> 1) + (y >> 1) * ycbcr[2].stride] = + clamp( ((157024*r0-131488*g0-25536*b0+45940035)/4 + + (157024*r1-131488*g1-25536*b1+45940035)/4 + + (157024*r2-131488*g2-25536*b2+45940035)/4 + + (157024*r3-131488*g3-25536*b3+45940035)/4)/357510); + } + } + } else if (chroma_format == TH_PF_444) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + uint8 r = TIFFGetR(raster[(h-y)*w + x]); + uint8 g = TIFFGetG(raster[(h-y)*w + x]); + uint8 b = TIFFGetB(raster[(h-y)*w + x]); + + yuv_y[x + y * yuv_w] = clamp((65481*r+128553*g+24966*b+4207500)/255000); + yuv_u[x + y * yuv_w] = clamp((-33488*r-65744*g+99232*b+29032005)/225930); + yuv_v[x + y * yuv_w] = clamp((157024*r-131488*g-25536*b+45940035)/357510); + } + } + } else { /* TH_PF_422 */ + for(y = 0; y < h; y += 1) { + for(x = 0; x < w; x += 2) { + x1=x+(x+1> 1) + y * ycbcr[1].stride] = + clamp( ((-33488*r0-65744*g0+99232*b0+29032005)/2 + + (-33488*r1-65744*g1+99232*b1+29032005)/2)/225930); + yuv_v[(x >> 1) + y * ycbcr[2].stride] = + clamp( ((157024*r0-131488*g0-25536*b0+45940035)/2 + + (157024*r1-131488*g1-25536*b1+45940035)/2)/357510); + } + } + } + +} + +static int +tiff_read(const char *pathname, + unsigned int *w, unsigned int *h, th_ycbcr_buffer ycbcr) +{ + TIFF *tiff; + uint32 width; + uint32 height; + size_t pixels; + uint32 *raster; + unsigned long yuv_w; + unsigned long yuv_h; + + tiff = TIFFOpen(pathname, "r"); + if(!tiff) { + fprintf(stderr, "%s: error: couldn't open as a tiff file.\n", + pathname); + return 1; + } + + TIFFGetField(tiff, TIFFTAG_IMAGEWIDTH, &width); + TIFFGetField(tiff, TIFFTAG_IMAGELENGTH, &height); + pixels = width*height; + raster = malloc(pixels*sizeof(uint32)); + if(!raster) { + fprintf(stderr, "%s: error: couldn't allocate storage for tiff raster.\n", + pathname); + TIFFClose(tiff); + return 1; + } + if(!TIFFReadRGBAImage(tiff, width, height, raster, 1)) { + fprintf(stderr, "%s: error: couldn't read tiff data.\n", pathname); + free(raster); + TIFFClose(tiff); + return 1; + } + + *w = width; + *h = height; + /* Must hold: yuv_w >= w */ + yuv_w = (*w + 15) & ~15; + /* Must hold: yuv_h >= h */ + yuv_h = (*h + 15) & ~15; + + /* Do we need to allocate a buffer */ + if (!ycbcr[0].data){ + ycbcr[0].width = yuv_w; + ycbcr[0].height = yuv_h; + ycbcr[0].stride = yuv_w; + ycbcr[1].width = (chroma_format == TH_PF_444) ? yuv_w : (yuv_w >> 1); + ycbcr[1].stride = ycbcr[1].width; + ycbcr[1].height = (chroma_format == TH_PF_420) ? (yuv_h >> 1) : yuv_h; + ycbcr[2].width = ycbcr[1].width; + ycbcr[2].stride = ycbcr[1].stride; + ycbcr[2].height = ycbcr[1].height; + + ycbcr[0].data = malloc(ycbcr[0].stride * ycbcr[0].height); + ycbcr[1].data = malloc(ycbcr[1].stride * ycbcr[1].height); + ycbcr[2].data = malloc(ycbcr[2].stride * ycbcr[2].height); + } else { + if ((ycbcr[0].width != yuv_w) || (ycbcr[0].height != yuv_h)){ + fprintf(stderr, "Input size %lux%lu does not match %dx%d\n", yuv_w,yuv_h,ycbcr[0].width,ycbcr[0].height); + exit(1); + } + } + + rgb_to_yuv(raster, ycbcr, *w, *h); + + _TIFFfree(raster); + TIFFClose(tiff); + + return 0; +} + +static int include_files (const struct dirent *de) +{ + char name[1024]; + int number = -1; + sscanf(de->d_name, input_filter, &number); + sprintf(name, input_filter, number); + return !strcmp(name, de->d_name); +} + +static int ilog(unsigned _v){ + int ret; + for(ret=0;_v;ret++)_v>>=1; + return ret; +} + +int +main(int argc, char *argv[]) +{ + int c,long_option_index; + int i, n; + char *input_mask; + char *input_directory; + char *scratch; + th_comment tc; + struct dirent **files; + int soft_target=0; + int ret; + + while(1) { + + c=getopt_long(argc,argv,optstring,options,&long_option_index); + if(c == EOF) + break; + + switch(c) { + case 'h': + usage(); + break; + case 'o': + option_output = optarg; + break;; + case 'v': + video_quality=rint(atof(optarg)*6.3); + if(video_quality<0 || video_quality>63){ + fprintf(stderr,"Illegal video quality (choose 0 through 10)\n"); + exit(1); + } + video_rate=0; + break; + case 'V': + video_rate=rint(atof(optarg)*1000); + if(video_rate<1){ + fprintf(stderr,"Illegal video bitrate (choose > 0 please)\n"); + exit(1); + } + video_quality=0; + break; + case '\1': + soft_target=1; + break; + case 'c': + vp3_compatible=1; + break; + case 'k': + keyframe_frequency=rint(atof(optarg)); + if(keyframe_frequency<1 || keyframe_frequency>2147483647){ + fprintf(stderr,"Illegal keyframe frequency\n"); + exit(1); + } + break; + + case 'd': + buf_delay=atoi(optarg); + if(buf_delay<=0){ + fprintf(stderr,"Illegal buffer delay\n"); + exit(1); + } + break; + case 's': + video_aspect_numerator=rint(atof(optarg)); + break; + case 'S': + video_aspect_denominator=rint(atof(optarg)); + break; + case 'f': + video_fps_numerator=rint(atof(optarg)); + break; + case 'F': + video_fps_denominator=rint(atof(optarg)); + break; + case '\5': + chroma_format=TH_PF_444; + break; + case '\6': + chroma_format=TH_PF_422; + break; + case '\2': + twopass=3; /* perform both passes */ + twopass_file=tmpfile(); + if(!twopass_file){ + fprintf(stderr,"Unable to open temporary file for twopass data\n"); + exit(1); + } + break; + case '\3': + twopass=1; /* perform first pass */ + twopass_file=fopen(optarg,"wb"); + if(!twopass_file){ + fprintf(stderr,"Unable to open \'%s\' for twopass data\n",optarg); + exit(1); + } + break; + case '\4': + twopass=2; /* perform second pass */ + twopass_file=fopen(optarg,"rb"); + if(!twopass_file){ + fprintf(stderr,"Unable to open twopass data file \'%s\'",optarg); + exit(1); + } + break; + default: + usage(); + break; + } + } + + if(argc < 3) { + usage(); + } + + if(soft_target){ + if(video_rate<=0){ + fprintf(stderr,"Soft rate target (--soft-target) requested without a bitrate (-V).\n"); + exit(1); + } + if(video_quality==-1) + video_quality=0; + }else{ + if(video_rate>0) + video_quality=0; + if(video_quality==-1) + video_quality=48; + } + + if(keyframe_frequency<=0){ + /*Use a default keyframe frequency of 64 for 1-pass (streaming) mode, and + 256 for two-pass mode.*/ + keyframe_frequency=twopass?256:64; + } + + input_mask = argv[optind]; + if (!input_mask) { + fprintf(stderr, "no input files specified; run with -h for help.\n"); + exit(1); + } + /* dirname and basename must operate on scratch strings */ + scratch = strdup(input_mask); + input_directory = strdup(dirname(scratch)); + free(scratch); + scratch = strdup(input_mask); + input_filter = strdup(basename(scratch)); + free(scratch); + +#ifdef DEBUG + fprintf(stderr, "scanning %s with filter '%s'\n", + input_directory, input_filter); +#endif + n = scandir (input_directory, &files, include_files, alphasort); + + if (!n) { + fprintf(stderr, "no input files found; run with -h for help.\n"); + exit(1); + } + + ogg_fp = fopen(option_output, "wb"); + if(!ogg_fp) { + fprintf(stderr, "%s: error: %s\n", + option_output, "couldn't open output file"); + return 1; + } + + srand(time(NULL)); + if(ogg_stream_init(&ogg_os, rand())) { + fprintf(stderr, "%s: error: %s\n", + option_output, "couldn't create ogg stream state"); + return 1; + } + + for(passno=(twopass==3?1:twopass);passno<=(twopass==3?2:twopass);passno++){ + unsigned int w; + unsigned int h; + char input_path[1024]; + th_ycbcr_buffer ycbcr; + + ycbcr[0].data = 0; + int last = 0; + + snprintf(input_path, 1023,"%s/%s", input_directory, files[0]->d_name); + if(tiff_read(input_path, &w, &h, ycbcr)) { + fprintf(stderr, "could not read %s\n", input_path); + exit(1); + } + + if (passno!=2) fprintf(stderr,"%d frames, %dx%d\n",n,w,h); + + /* setup complete. Raw processing loop */ + switch(passno){ + case 0: case 2: + fprintf(stderr,"\rCompressing.... \n"); + break; + case 1: + fprintf(stderr,"\rScanning first pass.... \n"); + break; + } + + fprintf(stderr, "%s\n", input_path); + + th_info_init(&ti); + ti.frame_width = ((w + 15) >>4)<<4; + ti.frame_height = ((h + 15)>>4)<<4; + ti.pic_width = w; + ti.pic_height = h; + ti.pic_x = 0; + ti.pic_y = 0; + ti.fps_numerator = video_fps_numerator; + ti.fps_denominator = video_fps_denominator; + ti.aspect_numerator = video_aspect_numerator; + ti.aspect_denominator = video_aspect_denominator; + ti.colorspace = TH_CS_UNSPECIFIED; + ti.pixel_fmt = chroma_format; + ti.target_bitrate = video_rate; + ti.quality = video_quality; + ti.keyframe_granule_shift=ilog(keyframe_frequency-1); + + td=th_encode_alloc(&ti); + th_info_clear(&ti); + /* setting just the granule shift only allows power-of-two keyframe + spacing. Set the actual requested spacing. */ + ret=th_encode_ctl(td,TH_ENCCTL_SET_KEYFRAME_FREQUENCY_FORCE, + &keyframe_frequency,sizeof(keyframe_frequency-1)); + if(ret<0){ + fprintf(stderr,"Could not set keyframe interval to %d.\n",(int)keyframe_frequency); + } + if(vp3_compatible){ + ret=th_encode_ctl(td,TH_ENCCTL_SET_VP3_COMPATIBLE,&vp3_compatible, + sizeof(vp3_compatible)); + if(ret<0||!vp3_compatible){ + fprintf(stderr,"Could not enable strict VP3 compatibility.\n"); + if(ret>=0){ + fprintf(stderr,"Ensure your source format is supported by VP3.\n"); + fprintf(stderr, + "(4:2:0 pixel format, width and height multiples of 16).\n"); + } + } + } + if(soft_target){ + /* reverse the rate control flags to favor a 'long time' strategy */ + int arg = TH_RATECTL_CAP_UNDERFLOW; + ret=th_encode_ctl(td,TH_ENCCTL_SET_RATE_FLAGS,&arg,sizeof(arg)); + if(ret<0) + fprintf(stderr,"Could not set encoder flags for --soft-target\n"); + /* Default buffer control is overridden on two-pass */ + if(!twopass&&buf_delay<0){ + if((keyframe_frequency*7>>1) > 5*video_fps_numerator/video_fps_denominator) + arg=keyframe_frequency*7>>1; + else + arg=5*video_fps_numerator/video_fps_denominator; + ret=th_encode_ctl(td,TH_ENCCTL_SET_RATE_BUFFER,&arg,sizeof(arg)); + if(ret<0) + fprintf(stderr,"Could not set rate control buffer for --soft-target\n"); + } + } + /* set up two-pass if needed */ + if(passno==1){ + unsigned char *buffer; + int bytes; + bytes=th_encode_ctl(td,TH_ENCCTL_2PASS_OUT,&buffer,sizeof(buffer)); + if(bytes<0){ + fprintf(stderr,"Could not set up the first pass of two-pass mode.\n"); + fprintf(stderr,"Did you remember to specify an estimated bitrate?\n"); + exit(1); + } + /*Perform a seek test to ensure we can overwrite this placeholder data at + the end; this is better than letting the user sit through a whole + encode only to find out their pass 1 file is useless at the end.*/ + if(fseek(twopass_file,0,SEEK_SET)<0){ + fprintf(stderr,"Unable to seek in two-pass data file.\n"); + exit(1); + } + if(fwrite(buffer,1,bytes,twopass_file)=0){ + ret=th_encode_ctl(td,TH_ENCCTL_SET_RATE_BUFFER, + &buf_delay,sizeof(buf_delay)); + if(ret<0){ + fprintf(stderr,"Warning: could not set desired buffer delay.\n"); + } + } + /* write the bitstream header packets with proper page interleave */ + th_comment_init(&tc); + /* first packet will get its own page automatically */ + if(th_encode_flushheader(td,&tc,&op)<=0){ + fprintf(stderr,"Internal Theora library error.\n"); + exit(1); + } + th_comment_clear(&tc); + if(passno!=1){ + ogg_stream_packetin(&ogg_os,&op); + if(ogg_stream_pageout(&ogg_os,&og)!=1){ + fprintf(stderr,"Internal Ogg library error.\n"); + exit(1); + } + fwrite(og.header,1,og.header_len,ogg_fp); + fwrite(og.body,1,og.body_len,ogg_fp); + } + /* create the remaining theora headers */ + for(;;){ + ret=th_encode_flushheader(td,&tc,&op); + if(ret<0){ + fprintf(stderr,"Internal Theora library error.\n"); + exit(1); + } + else if(!ret)break; + if(passno!=1)ogg_stream_packetin(&ogg_os,&op); + } + /* Flush the rest of our headers. This ensures + the actual data in each stream will start + on a new page, as per spec. */ + if(passno!=1){ + for(;;){ + int result = ogg_stream_flush(&ogg_os,&og); + if(result<0){ + /* can't get here */ + fprintf(stderr,"Internal Ogg library error.\n"); + exit(1); + } + if(result==0)break; + fwrite(og.header,1,og.header_len,ogg_fp); + fwrite(og.body,1,og.body_len,ogg_fp); + } + } + + i=0; last=0; + do { + if(i >= n-1) last = 1; + if(theora_write_frame(ycbcr, last)) { + fprintf(stderr,"Encoding error.\n"); + exit(1); + } + + i++; + if (!last) { + snprintf(input_path, 1023,"%s/%s", input_directory, files[i]->d_name); + if(tiff_read(input_path, &w, &h, ycbcr)) { + fprintf(stderr, "could not read %s\n", input_path); + exit(1); + } + fprintf(stderr, "%s\n", input_path); + } + } while (!last); + + if(passno==1){ + /* need to read the final (summary) packet */ + unsigned char *buffer; + int bytes = th_encode_ctl(td, TH_ENCCTL_2PASS_OUT, &buffer, sizeof(buffer)); + if(bytes<0){ + fprintf(stderr,"Could not read two-pass summary data from encoder.\n"); + exit(1); + } + if(fseek(twopass_file,0,SEEK_SET)<0){ + fprintf(stderr,"Unable to seek in two-pass data file.\n"); + exit(1); + } + if(fwrite(buffer,1,bytes,twopass_file)libtheora C API. + * + * The \c libtheora package is the current reference + * implementation for Theora, a free, + * patent-unencumbered video codec. + * Theora is derived from On2's VP3 codec with additional features and + * integration with Ogg multimedia formats by + * the Xiph.Org Foundation. + * Complete documentation of the format itself is available in + * the Theora + * specification. + * + * \section Organization + * + * The functions documented here are divided between two + * separate libraries: + * - \c libtheoraenc contains the encoder interface, + * described in \ref encfuncs. + * - \c libtheoradec contains the decoder interface, + * described in \ref decfuncs, \n + * and additional \ref basefuncs. + * + * New code should link to \c libtheoradec. If using encoder + * features, it must also link to \c libtheoraenc. + * + * During initial development, prior to the 1.0 release, + * \c libtheora exported a different \ref oldfuncs which + * combined both encode and decode functions. + * In general, legacy API symbols can be indentified + * by their \c theora_ or \c OC_ namespace prefixes. + * The current API uses \c th_ or \c TH_ instead. + * + * While deprecated, \c libtheoraenc and \c libtheoradec + * together export the legacy api as well at the one documented above. + * Likewise, the legacy \c libtheora included with this package + * exports the new 1.x API. Older code and build scripts can therefore + * but updated independently to the current scheme. + */ + +/**\file + * The shared libtheoradec and libtheoraenc C API. + * You don't need to include this directly.*/ + +#if !defined(_O_THEORA_CODEC_H_) +# define _O_THEORA_CODEC_H_ (1) +# include + +#if defined(__cplusplus) +extern "C" { +#endif + + + +/**\name Return codes*/ +/*@{*/ +/**An invalid pointer was provided.*/ +#define TH_EFAULT (-1) +/**An invalid argument was provided.*/ +#define TH_EINVAL (-10) +/**The contents of the header were incomplete, invalid, or unexpected.*/ +#define TH_EBADHEADER (-20) +/**The header does not belong to a Theora stream.*/ +#define TH_ENOTFORMAT (-21) +/**The bitstream version is too high.*/ +#define TH_EVERSION (-22) +/**The specified function is not implemented.*/ +#define TH_EIMPL (-23) +/**There were errors in the video data packet.*/ +#define TH_EBADPACKET (-24) +/**The decoded packet represented a dropped frame. + The player can continue to display the current frame, as the contents of the + decoded frame buffer have not changed.*/ +#define TH_DUPFRAME (1) +/*@}*/ + +/**The currently defined color space tags. + * See the Theora + * specification, Chapter 4, for exact details on the meaning + * of each of these color spaces.*/ +typedef enum{ + /**The color space was not specified at the encoder. + It may be conveyed by an external means.*/ + TH_CS_UNSPECIFIED, + /**A color space designed for NTSC content.*/ + TH_CS_ITU_REC_470M, + /**A color space designed for PAL/SECAM content.*/ + TH_CS_ITU_REC_470BG, + /**The total number of currently defined color spaces.*/ + TH_CS_NSPACES +}th_colorspace; + +/**The currently defined pixel format tags. + * See the Theora + * specification, Section 4.4, for details on the precise sample + * locations.*/ +typedef enum{ + /**Chroma decimation by 2 in both the X and Y directions (4:2:0). + The Cb and Cr chroma planes are half the width and half the + height of the luma plane.*/ + TH_PF_420, + /**Currently reserved.*/ + TH_PF_RSVD, + /**Chroma decimation by 2 in the X direction (4:2:2). + The Cb and Cr chroma planes are half the width of the luma plane, but full + height.*/ + TH_PF_422, + /**No chroma decimation (4:4:4). + The Cb and Cr chroma planes are full width and full height.*/ + TH_PF_444, + /**The total number of currently defined pixel formats.*/ + TH_PF_NFORMATS +}th_pixel_fmt; + + + +/**A buffer for a single color plane in an uncompressed image. + * This contains the image data in a left-to-right, top-down format. + * Each row of pixels is stored contiguously in memory, but successive + * rows need not be. + * Use \a stride to compute the offset of the next row. + * The encoder accepts both positive \a stride values (top-down in memory) + * and negative (bottom-up in memory). + * The decoder currently always generates images with positive strides.*/ +typedef struct{ + /**The width of this plane.*/ + int width; + /**The height of this plane.*/ + int height; + /**The offset in bytes between successive rows.*/ + int stride; + /**A pointer to the beginning of the first row.*/ + unsigned char *data; +}th_img_plane; + +/**A complete image buffer for an uncompressed frame. + * The chroma planes may be decimated by a factor of two in either + * direction, as indicated by th_info#pixel_fmt. + * The width and height of the Y' plane must be multiples of 16. + * They may need to be cropped for display, using the rectangle + * specified by th_info#pic_x, th_info#pic_y, th_info#pic_width, + * and th_info#pic_height. + * All samples are 8 bits. + * \note The term YUV often used to describe a colorspace is ambiguous. + * The exact parameters of the RGB to YUV conversion process aside, in + * many contexts the U and V channels actually have opposite meanings. + * To avoid this confusion, we are explicit: the name of the color + * channels are Y'CbCr, and they appear in that order, always. + * The prime symbol denotes that the Y channel is non-linear. + * Cb and Cr stand for "Chroma blue" and "Chroma red", respectively.*/ +typedef th_img_plane th_ycbcr_buffer[3]; + +/**Theora bitstream information. + * This contains the basic playback parameters for a stream, and corresponds to + * the initial 'info' header packet. + * To initialize an encoder, the application fills in this structure and + * passes it to th_encode_alloc(). + * A default encoding mode is chosen based on the values of the #quality and + * #target_bitrate fields. + * On decode, it is filled in by th_decode_headerin(), and then passed to + * th_decode_alloc(). + * + * Encoded Theora frames must be a multiple of 16 in size; + * this is what the #frame_width and #frame_height members represent. + * To handle arbitrary picture sizes, a crop rectangle is specified in the + * #pic_x, #pic_y, #pic_width and #pic_height members. + * + * All frame buffers contain pointers to the full, padded frame. + * However, the current encoder will not reference pixels outside of + * the cropped picture region, and the application does not need to fill them + * in. + * The decoder will allocate storage for a full frame, but the + * application should not rely on the padding containing sensible + * data. + * + * It is also generally recommended that the offsets and sizes should still be + * multiples of 2 to avoid chroma sampling shifts when chroma is sub-sampled. + * See the Theora + * specification, Section 4.4, for more details. + * + * Frame rate, in frames per second, is stored as a rational fraction, as is + * the pixel aspect ratio. + * Note that this refers to the aspect ratio of the individual pixels, not of + * the overall frame itself. + * The frame aspect ratio can be computed from pixel aspect ratio using the + * image dimensions.*/ +typedef struct{ + /**\name Theora version + * Bitstream version information.*/ + /*@{*/ + unsigned char version_major; + unsigned char version_minor; + unsigned char version_subminor; + /*@}*/ + /**The encoded frame width. + * This must be a multiple of 16, and less than 1048576.*/ + ogg_uint32_t frame_width; + /**The encoded frame height. + * This must be a multiple of 16, and less than 1048576.*/ + ogg_uint32_t frame_height; + /**The displayed picture width. + * This must be no larger than width.*/ + ogg_uint32_t pic_width; + /**The displayed picture height. + * This must be no larger than height.*/ + ogg_uint32_t pic_height; + /**The X offset of the displayed picture. + * This must be no larger than #frame_width-#pic_width or 255, whichever is + * smaller.*/ + ogg_uint32_t pic_x; + /**The Y offset of the displayed picture. + * This must be no larger than #frame_height-#pic_height, and + * #frame_height-#pic_height-#pic_y must be no larger than 255. + * This slightly funny restriction is due to the fact that the offset is + * specified from the top of the image for consistency with the standard + * graphics left-handed coordinate system used throughout this API, while + * it is stored in the encoded stream as an offset from the bottom.*/ + ogg_uint32_t pic_y; + /**\name Frame rate + * The frame rate, as a fraction. + * If either is 0, the frame rate is undefined.*/ + /*@{*/ + ogg_uint32_t fps_numerator; + ogg_uint32_t fps_denominator; + /*@}*/ + /**\name Aspect ratio + * The aspect ratio of the pixels. + * If either value is zero, the aspect ratio is undefined. + * If not specified by any external means, 1:1 should be assumed. + * The aspect ratio of the full picture can be computed as + * \code + * aspect_numerator*pic_width/(aspect_denominator*pic_height). + * \endcode */ + /*@{*/ + ogg_uint32_t aspect_numerator; + ogg_uint32_t aspect_denominator; + /*@}*/ + /**The color space.*/ + th_colorspace colorspace; + /**The pixel format.*/ + th_pixel_fmt pixel_fmt; + /**The target bit-rate in bits per second. + If initializing an encoder with this struct, set this field to a non-zero + value to activate CBR encoding by default.*/ + int target_bitrate; + /**The target quality level. + Valid values range from 0 to 63, inclusive, with higher values giving + higher quality. + If initializing an encoder with this struct, and #target_bitrate is set + to zero, VBR encoding at this quality will be activated by default.*/ + /*Currently this is set so that a qi of 0 corresponds to distortions of 24 + times the JND, and each increase by 16 halves that value. + This gives us fine discrimination at low qualities, yet effective rate + control at high qualities. + The qi value 63 is special, however. + For this, the highest quality, we use one half of a JND for our threshold. + Due to the lower bounds placed on allowable quantizers in Theora, we will + not actually be able to achieve quality this good, but this should + provide as close to visually lossless quality as Theora is capable of. + We could lift the quantizer restrictions without breaking VP3.1 + compatibility, but this would result in quantized coefficients that are + too large for the current bitstream to be able to store. + We'd have to redesign the token syntax to store these large coefficients, + which would make transcoding complex.*/ + int quality; + /**The amount to shift to extract the last keyframe number from the granule + * position. + * This can be at most 31. + * th_info_init() will set this to a default value (currently 6, + * which is good for streaming applications), but you can set it to 0 to + * make every frame a keyframe. + * The maximum distance between key frames is + * 1<<#keyframe_granule_shift. + * The keyframe frequency can be more finely controlled with + * #TH_ENCCTL_SET_KEYFRAME_FREQUENCY_FORCE, which can also be adjusted + * during encoding (for example, to force the next frame to be a keyframe), + * but it cannot be set larger than the amount permitted by this field after + * the headers have been output.*/ + int keyframe_granule_shift; +}th_info; + +/**The comment information. + * + * This structure holds the in-stream metadata corresponding to + * the 'comment' header packet. + * The comment header is meant to be used much like someone jotting a quick + * note on the label of a video. + * It should be a short, to the point text note that can be more than a couple + * words, but not more than a short paragraph. + * + * The metadata is stored as a series of (tag, value) pairs, in + * length-encoded string vectors. + * The first occurrence of the '=' character delimits the tag and value. + * A particular tag may occur more than once, and order is significant. + * The character set encoding for the strings is always UTF-8, but the tag + * names are limited to ASCII, and treated as case-insensitive. + * See the Theora + * specification, Section 6.3.3 for details. + * + * In filling in this structure, th_decode_headerin() will null-terminate + * the user_comment strings for safety. + * However, the bitstream format itself treats them as 8-bit clean vectors, + * possibly containing null characters, so the length array should be + * treated as their authoritative length. + */ +typedef struct th_comment{ + /**The array of comment string vectors.*/ + char **user_comments; + /**An array of the corresponding length of each vector, in bytes.*/ + int *comment_lengths; + /**The total number of comment strings.*/ + int comments; + /**The null-terminated vendor string. + This identifies the software used to encode the stream.*/ + char *vendor; +}th_comment; + + + +/**A single base matrix.*/ +typedef unsigned char th_quant_base[64]; + +/**A set of \a qi ranges.*/ +typedef struct{ + /**The number of ranges in the set.*/ + int nranges; + /**The size of each of the #nranges ranges. + These must sum to 63.*/ + const int *sizes; + /**#nranges +1 base matrices. + Matrices \a i and i+1 form the endpoints of range \a i.*/ + const th_quant_base *base_matrices; +}th_quant_ranges; + +/**A complete set of quantization parameters. + The quantizer for each coefficient is calculated as: + \code + Q=MAX(MIN(qmin[qti][ci!=0],scale[ci!=0][qi]*base[qti][pli][qi][ci]/100), + 1024). + \endcode + + \a qti is the quantization type index: 0 for intra, 1 for inter. + ci!=0 is 0 for the DC coefficient and 1 for AC coefficients. + \a qi is the quality index, ranging between 0 (low quality) and 63 (high + quality). + \a pli is the color plane index: 0 for Y', 1 for Cb, 2 for Cr. + \a ci is the DCT coefficient index. + Coefficient indices correspond to the normal 2D DCT block + ordering--row-major with low frequencies first--\em not zig-zag order. + + Minimum quantizers are constant, and are given by: + \code + qmin[2][2]={{4,2},{8,4}}. + \endcode + + Parameters that can be stored in the bitstream are as follows: + - The two scale matrices ac_scale and dc_scale. + \code + scale[2][64]={dc_scale,ac_scale}. + \endcode + - The base matrices for each \a qi, \a qti and \a pli (up to 384 in all). + In order to avoid storing a full 384 base matrices, only a sparse set of + matrices are stored, and the rest are linearly interpolated. + This is done as follows. + For each \a qti and \a pli, a series of \a n \a qi ranges is defined. + The size of each \a qi range can vary arbitrarily, but they must sum to + 63. + Then, n+1 matrices are specified, one for each endpoint of the + ranges. + For interpolation purposes, each range's endpoints are the first \a qi + value it contains and one past the last \a qi value it contains. + Fractional values are rounded to the nearest integer, with ties rounded + away from zero. + + Base matrices are stored by reference, so if the same matrices are used + multiple times, they will only appear once in the bitstream. + The bitstream is also capable of omitting an entire set of ranges and + its associated matrices if they are the same as either the previous + set (indexed in row-major order) or if the inter set is the same as the + intra set. + + - Loop filter limit values. + The same limits are used for the loop filter in all color planes, despite + potentially differing levels of quantization in each. + + For the current encoder, scale[ci!=0][qi] must be no greater + than scale[ci!=0][qi-1] and base[qti][pli][qi][ci] must + be no greater than base[qti][pli][qi-1][ci]. + These two conditions ensure that the actual quantizer for a given \a qti, + \a pli, and \a ci does not increase as \a qi increases. + This is not required by the decoder.*/ +typedef struct{ + /**The DC scaling factors.*/ + ogg_uint16_t dc_scale[64]; + /**The AC scaling factors.*/ + ogg_uint16_t ac_scale[64]; + /**The loop filter limit values.*/ + unsigned char loop_filter_limits[64]; + /**The \a qi ranges for each \a ci and \a pli.*/ + th_quant_ranges qi_ranges[2][3]; +}th_quant_info; + + + +/**The number of Huffman tables used by Theora.*/ +#define TH_NHUFFMAN_TABLES (80) +/**The number of DCT token values in each table.*/ +#define TH_NDCT_TOKENS (32) + +/**A Huffman code for a Theora DCT token. + * Each set of Huffman codes in a given table must form a complete, prefix-free + * code. + * There is no requirement that all the tokens in a table have a valid code, + * but the current encoder is not optimized to take advantage of this. + * If each of the five grouops of 16 tables does not contain at least one table + * with a code for every token, then the encoder may fail to encode certain + * frames. + * The complete table in the first group of 16 does not have to be in the same + * place as the complete table in the other groups, but the complete tables in + * the remaining four groups must all be in the same place.*/ +typedef struct{ + /**The bit pattern for the code, with the LSbit of the pattern aligned in + * the LSbit of the word.*/ + ogg_uint32_t pattern; + /**The number of bits in the code. + * This must be between 0 and 32, inclusive.*/ + int nbits; +}th_huff_code; + + + +/**\defgroup basefuncs Functions Shared by Encode and Decode*/ +/*@{*/ +/**\name Basic shared functions + * These functions return information about the library itself, + * or provide high-level information about codec state + * and packet type. + * + * You must link to \c libtheoradec if you use any of the + * functions in this section.*/ +/*@{*/ +/**Retrieves a human-readable string to identify the library vendor and + * version. + * \return the version string.*/ +extern const char *th_version_string(void); +/**Retrieves the library version number. + * This is the highest bitstream version that the encoder library will produce, + * or that the decoder library can decode. + * This number is composed of a 16-bit major version, 8-bit minor version + * and 8 bit sub-version, composed as follows: + * \code + * (VERSION_MAJOR<<16)+(VERSION_MINOR<<8)+(VERSION_SUBMINOR) + * \endcode + * \return the version number.*/ +extern ogg_uint32_t th_version_number(void); +/**Converts a granule position to an absolute frame index, starting at + * 0. + * The granule position is interpreted in the context of a given + * #th_enc_ctx or #th_dec_ctx handle (either will suffice). + * \param _encdec A previously allocated #th_enc_ctx or #th_dec_ctx + * handle. + * \param _granpos The granule position to convert. + * \returns The absolute frame index corresponding to \a _granpos. + * \retval -1 The given granule position was invalid (i.e. negative).*/ +extern ogg_int64_t th_granule_frame(void *_encdec,ogg_int64_t _granpos); +/**Converts a granule position to an absolute time in seconds. + * The granule position is interpreted in the context of a given + * #th_enc_ctx or #th_dec_ctx handle (either will suffice). + * \param _encdec A previously allocated #th_enc_ctx or #th_dec_ctx + * handle. + * \param _granpos The granule position to convert. + * \return The absolute time in seconds corresponding to \a _granpos. + * This is the "end time" for the frame, or the latest time it should + * be displayed. + * It is not the presentation time. + * \retval -1 The given granule position was invalid (i.e. negative).*/ +extern double th_granule_time(void *_encdec,ogg_int64_t _granpos); +/**Determines whether a Theora packet is a header or not. + * This function does no verification beyond checking the packet type bit, so + * it should not be used for bitstream identification; use + * th_decode_headerin() for that. + * As per the Theora specification, an empty (0-byte) packet is treated as a + * data packet (a delta frame with no coded blocks). + * \param _op An ogg_packet containing encoded Theora data. + * \retval 1 The packet is a header packet + * \retval 0 The packet is a video data packet.*/ +extern int th_packet_isheader(ogg_packet *_op); +/**Determines whether a theora packet is a key frame or not. + * This function does no verification beyond checking the packet type and + * key frame bits, so it should not be used for bitstream identification; use + * th_decode_headerin() for that. + * As per the Theora specification, an empty (0-byte) packet is treated as a + * delta frame (with no coded blocks). + * \param _op An ogg_packet containing encoded Theora data. + * \retval 1 The packet contains a key frame. + * \retval 0 The packet contains a delta frame. + * \retval -1 The packet is not a video data packet.*/ +extern int th_packet_iskeyframe(ogg_packet *_op); +/*@}*/ + + +/**\name Functions for manipulating header data + * These functions manipulate the #th_info and #th_comment structures + * which describe video parameters and key-value metadata, respectively. + * + * You must link to \c libtheoradec if you use any of the + * functions in this section.*/ +/*@{*/ +/**Initializes a th_info structure. + * This should be called on a freshly allocated #th_info structure before + * attempting to use it. + * \param _info The #th_info struct to initialize.*/ +extern void th_info_init(th_info *_info); +/**Clears a #th_info structure. + * This should be called on a #th_info structure after it is no longer + * needed. + * \param _info The #th_info struct to clear.*/ +extern void th_info_clear(th_info *_info); + +/**Initialize a #th_comment structure. + * This should be called on a freshly allocated #th_comment structure + * before attempting to use it. + * \param _tc The #th_comment struct to initialize.*/ +extern void th_comment_init(th_comment *_tc); +/**Add a comment to an initialized #th_comment structure. + * \note Neither th_comment_add() nor th_comment_add_tag() support + * comments containing null values, although the bitstream format does + * support them. + * To add such comments you will need to manipulate the #th_comment + * structure directly. + * \param _tc The #th_comment struct to add the comment to. + * \param _comment Must be a null-terminated UTF-8 string containing the + * comment in "TAG=the value" form.*/ +extern void th_comment_add(th_comment *_tc,const char *_comment); +/**Add a comment to an initialized #th_comment structure. + * \note Neither th_comment_add() nor th_comment_add_tag() support + * comments containing null values, although the bitstream format does + * support them. + * To add such comments you will need to manipulate the #th_comment + * structure directly. + * \param _tc The #th_comment struct to add the comment to. + * \param _tag A null-terminated string containing the tag associated with + * the comment. + * \param _val The corresponding value as a null-terminated string.*/ +extern void th_comment_add_tag(th_comment *_tc,const char *_tag, + const char *_val); +/**Look up a comment value by its tag. + * \param _tc An initialized #th_comment structure. + * \param _tag The tag to look up. + * \param _count The instance of the tag. + * The same tag can appear multiple times, each with a distinct + * value, so an index is required to retrieve them all. + * The order in which these values appear is significant and + * should be preserved. + * Use th_comment_query_count() to get the legal range for + * the \a _count parameter. + * \return A pointer to the queried tag's value. + * This points directly to data in the #th_comment structure. + * It should not be modified or freed by the application, and + * modifications to the structure may invalidate the pointer. + * \retval NULL If no matching tag is found.*/ +extern char *th_comment_query(th_comment *_tc,const char *_tag,int _count); +/**Look up the number of instances of a tag. + * Call this first when querying for a specific tag and then iterate over the + * number of instances with separate calls to th_comment_query() to + * retrieve all the values for that tag in order. + * \param _tc An initialized #th_comment structure. + * \param _tag The tag to look up. + * \return The number of instances of this particular tag.*/ +extern int th_comment_query_count(th_comment *_tc,const char *_tag); +/**Clears a #th_comment structure. + * This should be called on a #th_comment structure after it is no longer + * needed. + * It will free all memory used by the structure members. + * \param _tc The #th_comment struct to clear.*/ +extern void th_comment_clear(th_comment *_tc); +/*@}*/ +/*@}*/ + + + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/cs/3rd party/libtheora/include/theora/theora.h b/cs/3rd party/libtheora/include/theora/theora.h new file mode 100644 index 000000000..a729a7689 --- /dev/null +++ b/cs/3rd party/libtheora/include/theora/theora.h @@ -0,0 +1,786 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggTheora SOFTWARE 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 Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: + last mod: $Id: theora.h,v 1.17 2003/12/06 18:06:19 arc Exp $ + + ********************************************************************/ + +#ifndef _O_THEORA_H_ +#define _O_THEORA_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +#include /* for size_t */ + +#include + +/** \file + * The libtheora pre-1.0 legacy C API. + * + * \ingroup oldfuncs + * + * \section intro Introduction + * + * This is the documentation for the libtheora legacy C API, declared in + * the theora.h header, which describes the old interface used before + * the 1.0 release. This API was widely deployed for several years and + * remains supported, but for new code we recommend the cleaner API + * declared in theoradec.h and theoraenc.h. + * + * libtheora is the reference implementation for + * Theora, a free video codec. + * Theora is derived from On2's VP3 codec with improved integration with + * Ogg multimedia formats by Xiph.Org. + * + * \section overview Overview + * + * This library will both decode and encode theora packets to/from raw YUV + * frames. In either case, the packets will most likely either come from or + * need to be embedded in an Ogg stream. Use + * libogg or + * liboggz + * to extract/package these packets. + * + * \section decoding Decoding Process + * + * Decoding can be separated into the following steps: + * -# initialise theora_info and theora_comment structures using + * theora_info_init() and theora_comment_init(): + \verbatim + theora_info info; + theora_comment comment; + + theora_info_init(&info); + theora_comment_init(&comment); + \endverbatim + * -# retrieve header packets from Ogg stream (there should be 3) and decode + * into theora_info and theora_comment structures using + * theora_decode_header(). See \ref identification for more information on + * identifying which packets are theora packets. + \verbatim + int i; + for (i = 0; i < 3; i++) + { + (get a theora packet "op" from the Ogg stream) + theora_decode_header(&info, &comment, op); + } + \endverbatim + * -# initialise the decoder based on the information retrieved into the + * theora_info struct by theora_decode_header(). You will need a + * theora_state struct. + \verbatim + theora_state state; + + theora_decode_init(&state, &info); + \endverbatim + * -# pass in packets and retrieve decoded frames! See the yuv_buffer + * documentation for information on how to retrieve raw YUV data. + \verbatim + yuf_buffer buffer; + while (last packet was not e_o_s) { + (get a theora packet "op" from the Ogg stream) + theora_decode_packetin(&state, op); + theora_decode_YUVout(&state, &buffer); + } + \endverbatim + * + * + * \subsection identification Identifying Theora Packets + * + * All streams inside an Ogg file have a unique serial_no attached to the + * stream. Typically, you will want to + * - retrieve the serial_no for each b_o_s (beginning of stream) page + * encountered within the Ogg file; + * - test the first (only) packet on that page to determine if it is a theora + * packet; + * - once you have found a theora b_o_s page then use the retrieved serial_no + * to identify future packets belonging to the same theora stream. + * + * Note that you \e cannot use theora_packet_isheader() to determine if a + * packet is a theora packet or not, as this function does not perform any + * checking beyond whether a header bit is present. Instead, use the + * theora_decode_header() function and check the return value; or examine the + * header bytes at the beginning of the Ogg page. + */ + + +/** \defgroup oldfuncs Legacy pre-1.0 C API */ +/* @{ */ + +/** + * A YUV buffer for passing uncompressed frames to and from the codec. + * This holds a Y'CbCr frame in planar format. The CbCr planes can be + * subsampled and have their own separate dimensions and row stride + * offsets. Note that the strides may be negative in some + * configurations. For theora the width and height of the largest plane + * must be a multiple of 16. The actual meaningful picture size and + * offset are stored in the theora_info structure; frames returned by + * the decoder may need to be cropped for display. + * + * All samples are 8 bits. Within each plane samples are ordered by + * row from the top of the frame to the bottom. Within each row samples + * are ordered from left to right. + * + * During decode, the yuv_buffer struct is allocated by the user, but all + * fields (including luma and chroma pointers) are filled by the library. + * These pointers address library-internal memory and their contents should + * not be modified. + * + * Conversely, during encode the user allocates the struct and fills out all + * fields. The user also manages the data addressed by the luma and chroma + * pointers. See the encoder_example.c and dump_video.c example files in + * theora/examples/ for more information. + */ +typedef struct { + int y_width; /**< Width of the Y' luminance plane */ + int y_height; /**< Height of the luminance plane */ + int y_stride; /**< Offset in bytes between successive rows */ + + int uv_width; /**< Width of the Cb and Cr chroma planes */ + int uv_height; /**< Height of the chroma planes */ + int uv_stride; /**< Offset between successive chroma rows */ + unsigned char *y; /**< Pointer to start of luminance data */ + unsigned char *u; /**< Pointer to start of Cb data */ + unsigned char *v; /**< Pointer to start of Cr data */ + +} yuv_buffer; + +/** + * A Colorspace. + */ +typedef enum { + OC_CS_UNSPECIFIED, /**< The colorspace is unknown or unspecified */ + OC_CS_ITU_REC_470M, /**< This is the best option for 'NTSC' content */ + OC_CS_ITU_REC_470BG, /**< This is the best option for 'PAL' content */ + OC_CS_NSPACES /**< This marks the end of the defined colorspaces */ +} theora_colorspace; + +/** + * A Chroma subsampling + * + * These enumerate the available chroma subsampling options supported + * by the theora format. See Section 4.4 of the specification for + * exact definitions. + */ +typedef enum { + OC_PF_420, /**< Chroma subsampling by 2 in each direction (4:2:0) */ + OC_PF_RSVD, /**< Reserved value */ + OC_PF_422, /**< Horizonatal chroma subsampling by 2 (4:2:2) */ + OC_PF_444 /**< No chroma subsampling at all (4:4:4) */ +} theora_pixelformat; + +/** + * Theora bitstream info. + * Contains the basic playback parameters for a stream, + * corresponding to the initial 'info' header packet. + * + * Encoded theora frames must be a multiple of 16 in width and height. + * To handle other frame sizes, a crop rectangle is specified in + * frame_height and frame_width, offset_x and * offset_y. The offset + * and size should still be a multiple of 2 to avoid chroma sampling + * shifts. Offset values in this structure are measured from the + * upper left of the image. + * + * Frame rate, in frames per second, is stored as a rational + * fraction. Aspect ratio is also stored as a rational fraction, and + * refers to the aspect ratio of the frame pixels, not of the + * overall frame itself. + * + * See + * examples/encoder_example.c for usage examples of the + * other parameters and good default settings for the encoder parameters. + */ +typedef struct { + ogg_uint32_t width; /**< encoded frame width */ + ogg_uint32_t height; /**< encoded frame height */ + ogg_uint32_t frame_width; /**< display frame width */ + ogg_uint32_t frame_height; /**< display frame height */ + ogg_uint32_t offset_x; /**< horizontal offset of the displayed frame */ + ogg_uint32_t offset_y; /**< vertical offset of the displayed frame */ + ogg_uint32_t fps_numerator; /**< frame rate numerator **/ + ogg_uint32_t fps_denominator; /**< frame rate denominator **/ + ogg_uint32_t aspect_numerator; /**< pixel aspect ratio numerator */ + ogg_uint32_t aspect_denominator; /**< pixel aspect ratio denominator */ + theora_colorspace colorspace; /**< colorspace */ + int target_bitrate; /**< nominal bitrate in bits per second */ + int quality; /**< Nominal quality setting, 0-63 */ + int quick_p; /**< Quick encode/decode */ + + /* decode only */ + unsigned char version_major; + unsigned char version_minor; + unsigned char version_subminor; + + void *codec_setup; + + /* encode only */ + int dropframes_p; + int keyframe_auto_p; + ogg_uint32_t keyframe_frequency; + ogg_uint32_t keyframe_frequency_force; /* also used for decode init to + get granpos shift correct */ + ogg_uint32_t keyframe_data_target_bitrate; + ogg_int32_t keyframe_auto_threshold; + ogg_uint32_t keyframe_mindistance; + ogg_int32_t noise_sensitivity; + ogg_int32_t sharpness; + + theora_pixelformat pixelformat; /**< chroma subsampling mode to expect */ + +} theora_info; + +/** Codec internal state and context. + */ +typedef struct{ + theora_info *i; + ogg_int64_t granulepos; + + void *internal_encode; + void *internal_decode; + +} theora_state; + +/** + * Comment header metadata. + * + * This structure holds the in-stream metadata corresponding to + * the 'comment' header packet. + * + * Meta data is stored as a series of (tag, value) pairs, in + * length-encoded string vectors. The first occurence of the + * '=' character delimits the tag and value. A particular tag + * may occur more than once. The character set encoding for + * the strings is always UTF-8, but the tag names are limited + * to case-insensitive ASCII. See the spec for details. + * + * In filling in this structure, theora_decode_header() will + * null-terminate the user_comment strings for safety. However, + * the bitstream format itself treats them as 8-bit clean, + * and so the length array should be treated as authoritative + * for their length. + */ +typedef struct theora_comment{ + char **user_comments; /**< An array of comment string vectors */ + int *comment_lengths; /**< An array of corresponding string vector lengths in bytes */ + int comments; /**< The total number of comment string vectors */ + char *vendor; /**< The vendor string identifying the encoder, null terminated */ + +} theora_comment; + + +/**\name theora_control() codes */ +/* \anchor decctlcodes_old + * These are the available request codes for theora_control() + * when called with a decoder instance. + * By convention decoder control codes are odd, to distinguish + * them from \ref encctlcodes_old "encoder control codes" which + * are even. + * + * Note that since the 1.0 release, both the legacy and the final + * implementation accept all the same control codes, but only the + * final API declares the newer codes. + * + * Keep any experimental or vendor-specific values above \c 0x8000.*/ + +/*@{*/ + +/**Get the maximum post-processing level. + * The decoder supports a post-processing filter that can improve + * the appearance of the decoded images. This returns the highest + * level setting for this post-processor, corresponding to maximum + * improvement and computational expense. + */ +#define TH_DECCTL_GET_PPLEVEL_MAX (1) + +/**Set the post-processing level. + * Sets the level of post-processing to use when decoding the + * compressed stream. This must be a value between zero (off) + * and the maximum returned by TH_DECCTL_GET_PPLEVEL_MAX. + */ +#define TH_DECCTL_SET_PPLEVEL (3) + +/**Sets the maximum distance between key frames. + * This can be changed during an encode, but will be bounded by + * 1<. + * If it is set before encoding begins, th_info#keyframe_granule_shift will + * be enlarged appropriately. + * + * \param[in] buf ogg_uint32_t: The maximum distance between key + * frames. + * \param[out] buf ogg_uint32_t: The actual maximum distance set. + * \retval OC_FAULT \a theora_state or \a buf is NULL. + * \retval OC_EINVAL \a buf_sz is not sizeof(ogg_uint32_t). + * \retval OC_IMPL Not supported by this implementation.*/ +#define TH_ENCCTL_SET_KEYFRAME_FREQUENCY_FORCE (4) + +/**Set the granule position. + * Call this after a seek, to update the internal granulepos + * in the decoder, to insure that subsequent frames are marked + * properly. If you track timestamps yourself and do not use + * the granule postion returned by the decoder, then you do + * not need to use this control. + */ +#define TH_DECCTL_SET_GRANPOS (5) + +/**\anchor encctlcodes_old */ + +/**Sets the quantization parameters to use. + * The parameters are copied, not stored by reference, so they can be freed + * after this call. + * NULL may be specified to revert to the default parameters. + * + * \param[in] buf #th_quant_info + * \retval OC_FAULT \a theora_state is NULL. + * \retval OC_EINVAL Encoding has already begun, the quantization parameters + * are not acceptable to this version of the encoder, + * \a buf is NULL and \a buf_sz is not zero, + * or \a buf is non-NULL and \a buf_sz is + * not sizeof(#th_quant_info). + * \retval OC_IMPL Not supported by this implementation.*/ +#define TH_ENCCTL_SET_QUANT_PARAMS (2) + +/**Disables any encoder features that would prevent lossless transcoding back + * to VP3. + * This primarily means disabling block-level QI values and not using 4MV mode + * when any of the luma blocks in a macro block are not coded. + * It also includes using the VP3 quantization tables and Huffman codes; if you + * set them explicitly after calling this function, the resulting stream will + * not be VP3-compatible. + * If you enable VP3-compatibility when encoding 4:2:2 or 4:4:4 source + * material, or when using a picture region smaller than the full frame (e.g. + * a non-multiple-of-16 width or height), then non-VP3 bitstream features will + * still be disabled, but the stream will still not be VP3-compatible, as VP3 + * was not capable of encoding such formats. + * If you call this after encoding has already begun, then the quantization + * tables and codebooks cannot be changed, but the frame-level features will + * be enabled or disabled as requested. + * + * \param[in] buf int: a non-zero value to enable VP3 compatibility, + * or 0 to disable it (the default). + * \param[out] buf int: 1 if all bitstream features required for + * VP3-compatibility could be set, and 0 otherwise. + * The latter will be returned if the pixel format is not + * 4:2:0, the picture region is smaller than the full frame, + * or if encoding has begun, preventing the quantization + * tables and codebooks from being set. + * \retval OC_FAULT \a theora_state or \a buf is NULL. + * \retval OC_EINVAL \a buf_sz is not sizeof(int). + * \retval OC_IMPL Not supported by this implementation.*/ +#define TH_ENCCTL_SET_VP3_COMPATIBLE (10) + +/**Gets the maximum speed level. + * Higher speed levels favor quicker encoding over better quality per bit. + * Depending on the encoding mode, and the internal algorithms used, quality + * may actually improve, but in this case bitrate will also likely increase. + * In any case, overall rate/distortion performance will probably decrease. + * The maximum value, and the meaning of each value, may change depending on + * the current encoding mode (VBR vs. CQI, etc.). + * + * \param[out] buf int: The maximum encoding speed level. + * \retval OC_FAULT \a theora_state or \a buf is NULL. + * \retval OC_EINVAL \a buf_sz is not sizeof(int). + * \retval OC_IMPL Not supported by this implementation in the current + * encoding mode.*/ +#define TH_ENCCTL_GET_SPLEVEL_MAX (12) + +/**Sets the speed level. + * By default a speed value of 1 is used. + * + * \param[in] buf int: The new encoding speed level. + * 0 is slowest, larger values use less CPU. + * \retval OC_FAULT \a theora_state or \a buf is NULL. + * \retval OC_EINVAL \a buf_sz is not sizeof(int), or the + * encoding speed level is out of bounds. + * The maximum encoding speed level may be + * implementation- and encoding mode-specific, and can be + * obtained via #TH_ENCCTL_GET_SPLEVEL_MAX. + * \retval OC_IMPL Not supported by this implementation in the current + * encoding mode.*/ +#define TH_ENCCTL_SET_SPLEVEL (14) + +/*@}*/ + +#define OC_FAULT -1 /**< General failure */ +#define OC_EINVAL -10 /**< Library encountered invalid internal data */ +#define OC_DISABLED -11 /**< Requested action is disabled */ +#define OC_BADHEADER -20 /**< Header packet was corrupt/invalid */ +#define OC_NOTFORMAT -21 /**< Packet is not a theora packet */ +#define OC_VERSION -22 /**< Bitstream version is not handled */ +#define OC_IMPL -23 /**< Feature or action not implemented */ +#define OC_BADPACKET -24 /**< Packet is corrupt */ +#define OC_NEWPACKET -25 /**< Packet is an (ignorable) unhandled extension */ +#define OC_DUPFRAME 1 /**< Packet is a dropped frame */ + +/** + * Retrieve a human-readable string to identify the encoder vendor and version. + * \returns A version string. + */ +extern const char *theora_version_string(void); + +/** + * Retrieve a 32-bit version number. + * This number is composed of a 16-bit major version, 8-bit minor version + * and 8 bit sub-version, composed as follows: +
    +   (VERSION_MAJOR<<16) + (VERSION_MINOR<<8) + (VERSION_SUB)
    +
    +* \returns The version number. +*/ +extern ogg_uint32_t theora_version_number(void); + +/** + * Initialize the theora encoder. + * \param th The theora_state handle to initialize for encoding. + * \param ti A theora_info struct filled with the desired encoding parameters. + * \retval 0 Success + */ +extern int theora_encode_init(theora_state *th, theora_info *ti); + +/** + * Submit a YUV buffer to the theora encoder. + * \param t A theora_state handle previously initialized for encoding. + * \param yuv A buffer of YUV data to encode. Note that both the yuv_buffer + * struct and the luma/chroma buffers within should be allocated by + * the user. + * \retval OC_EINVAL Encoder is not ready, or is finished. + * \retval -1 The size of the given frame differs from those previously input + * \retval 0 Success + */ +extern int theora_encode_YUVin(theora_state *t, yuv_buffer *yuv); + +/** + * Request the next packet of encoded video. + * The encoded data is placed in a user-provided ogg_packet structure. + * \param t A theora_state handle previously initialized for encoding. + * \param last_p whether this is the last packet the encoder should produce. + * \param op An ogg_packet structure to fill. libtheora will set all + * elements of this structure, including a pointer to encoded + * data. The memory for the encoded data is owned by libtheora. + * \retval 0 No internal storage exists OR no packet is ready + * \retval -1 The encoding process has completed + * \retval 1 Success + */ +extern int theora_encode_packetout( theora_state *t, int last_p, + ogg_packet *op); + +/** + * Request a packet containing the initial header. + * A pointer to the header data is placed in a user-provided ogg_packet + * structure. + * \param t A theora_state handle previously initialized for encoding. + * \param op An ogg_packet structure to fill. libtheora will set all + * elements of this structure, including a pointer to the header + * data. The memory for the header data is owned by libtheora. + * \retval 0 Success + */ +extern int theora_encode_header(theora_state *t, ogg_packet *op); + +/** + * Request a comment header packet from provided metadata. + * A pointer to the comment data is placed in a user-provided ogg_packet + * structure. + * \param tc A theora_comment structure filled with the desired metadata + * \param op An ogg_packet structure to fill. libtheora will set all + * elements of this structure, including a pointer to the encoded + * comment data. The memory for the comment data is owned by + * the application, and must be freed by it using _ogg_free(). + * On some systems (such as Windows when using dynamic linking), this + * may mean the free is executed in a different module from the + * malloc, which will crash; there is no way to free this memory on + * such systems. + * \retval 0 Success + */ +extern int theora_encode_comment(theora_comment *tc, ogg_packet *op); + +/** + * Request a packet containing the codebook tables for the stream. + * A pointer to the codebook data is placed in a user-provided ogg_packet + * structure. + * \param t A theora_state handle previously initialized for encoding. + * \param op An ogg_packet structure to fill. libtheora will set all + * elements of this structure, including a pointer to the codebook + * data. The memory for the header data is owned by libtheora. + * \retval 0 Success + */ +extern int theora_encode_tables(theora_state *t, ogg_packet *op); + +/** + * Decode an Ogg packet, with the expectation that the packet contains + * an initial header, comment data or codebook tables. + * + * \param ci A theora_info structure to fill. This must have been previously + * initialized with theora_info_init(). If \a op contains an initial + * header, theora_decode_header() will fill \a ci with the + * parsed header values. If \a op contains codebook tables, + * theora_decode_header() will parse these and attach an internal + * representation to \a ci->codec_setup. + * \param cc A theora_comment structure to fill. If \a op contains comment + * data, theora_decode_header() will fill \a cc with the parsed + * comments. + * \param op An ogg_packet structure which you expect contains an initial + * header, comment data or codebook tables. + * + * \retval OC_BADHEADER \a op is NULL; OR the first byte of \a op->packet + * has the signature of an initial packet, but op is + * not a b_o_s packet; OR this packet has the signature + * of an initial header packet, but an initial header + * packet has already been seen; OR this packet has the + * signature of a comment packet, but the initial header + * has not yet been seen; OR this packet has the signature + * of a comment packet, but contains invalid data; OR + * this packet has the signature of codebook tables, + * but the initial header or comments have not yet + * been seen; OR this packet has the signature of codebook + * tables, but contains invalid data; + * OR the stream being decoded has a compatible version + * but this packet does not have the signature of a + * theora initial header, comments, or codebook packet + * \retval OC_VERSION The packet data of \a op is an initial header with + * a version which is incompatible with this version of + * libtheora. + * \retval OC_NEWPACKET the stream being decoded has an incompatible (future) + * version and contains an unknown signature. + * \retval 0 Success + * + * \note The normal usage is that theora_decode_header() be called on the + * first three packets of a theora logical bitstream in succession. + */ +extern int theora_decode_header(theora_info *ci, theora_comment *cc, + ogg_packet *op); + +/** + * Initialize a theora_state handle for decoding. + * \param th The theora_state handle to initialize. + * \param c A theora_info struct filled with the desired decoding parameters. + * This is of course usually obtained from a previous call to + * theora_decode_header(). + * \retval 0 Success + */ +extern int theora_decode_init(theora_state *th, theora_info *c); + +/** + * Input a packet containing encoded data into the theora decoder. + * \param th A theora_state handle previously initialized for decoding. + * \param op An ogg_packet containing encoded theora data. + * \retval 0 Success + * \retval OC_BADPACKET \a op does not contain encoded video data + */ +extern int theora_decode_packetin(theora_state *th,ogg_packet *op); + +/** + * Output the next available frame of decoded YUV data. + * \param th A theora_state handle previously initialized for decoding. + * \param yuv A yuv_buffer in which libtheora should place the decoded data. + * Note that the buffer struct itself is allocated by the user, but + * that the luma and chroma pointers will be filled in by the + * library. Also note that these luma and chroma regions should be + * considered read-only by the user. + * \retval 0 Success + */ +extern int theora_decode_YUVout(theora_state *th,yuv_buffer *yuv); + +/** + * Report whether a theora packet is a header or not + * This function does no verification beyond checking the header + * flag bit so it should not be used for bitstream identification; + * use theora_decode_header() for that. + * + * \param op An ogg_packet containing encoded theora data. + * \retval 1 The packet is a header packet + * \retval 0 The packet is not a header packet (and so contains frame data) + * + * Thus function was added in the 1.0alpha4 release. + */ +extern int theora_packet_isheader(ogg_packet *op); + +/** + * Report whether a theora packet is a keyframe or not + * + * \param op An ogg_packet containing encoded theora data. + * \retval 1 The packet contains a keyframe image + * \retval 0 The packet is contains an interframe delta + * \retval -1 The packet is not an image data packet at all + * + * Thus function was added in the 1.0alpha4 release. + */ +extern int theora_packet_iskeyframe(ogg_packet *op); + +/** + * Report the granulepos shift radix + * + * When embedded in Ogg, Theora uses a two-part granulepos, + * splitting the 64-bit field into two pieces. The more-significant + * section represents the frame count at the last keyframe, + * and the less-significant section represents the count of + * frames since the last keyframe. In this way the overall + * field is still non-decreasing with time, but usefully encodes + * a pointer to the last keyframe, which is necessary for + * correctly restarting decode after a seek. + * + * This function reports the number of bits used to represent + * the distance to the last keyframe, and thus how the granulepos + * field must be shifted or masked to obtain the two parts. + * + * Since libtheora returns compressed data in an ogg_packet + * structure, this may be generally useful even if the Theora + * packets are not being used in an Ogg container. + * + * \param ti A previously initialized theora_info struct + * \returns The bit shift dividing the two granulepos fields + * + * This function was added in the 1.0alpha5 release. + */ +int theora_granule_shift(theora_info *ti); + +/** + * Convert a granulepos to an absolute frame index, starting at 0. + * The granulepos is interpreted in the context of a given theora_state handle. + * + * Note that while the granulepos encodes the frame count (i.e. starting + * from 1) this call returns the frame index, starting from zero. Thus + * One can calculate the presentation time by multiplying the index by + * the rate. + * + * \param th A previously initialized theora_state handle (encode or decode) + * \param granulepos The granulepos to convert. + * \returns The frame index corresponding to \a granulepos. + * \retval -1 The given granulepos is undefined (i.e. negative) + * + * Thus function was added in the 1.0alpha4 release. + */ +extern ogg_int64_t theora_granule_frame(theora_state *th,ogg_int64_t granulepos); + +/** + * Convert a granulepos to absolute time in seconds. The granulepos is + * interpreted in the context of a given theora_state handle, and gives + * the end time of a frame's presentation as used in Ogg mux ordering. + * + * \param th A previously initialized theora_state handle (encode or decode) + * \param granulepos The granulepos to convert. + * \returns The absolute time in seconds corresponding to \a granulepos. + * This is the "end time" for the frame, or the latest time it should + * be displayed. + * It is not the presentation time. + * \retval -1. The given granulepos is undefined (i.e. negative). + */ +extern double theora_granule_time(theora_state *th,ogg_int64_t granulepos); + +/** + * Initialize a theora_info structure. All values within the given theora_info + * structure are initialized, and space is allocated within libtheora for + * internal codec setup data. + * \param c A theora_info struct to initialize. + */ +extern void theora_info_init(theora_info *c); + +/** + * Clear a theora_info structure. All values within the given theora_info + * structure are cleared, and associated internal codec setup data is freed. + * \param c A theora_info struct to initialize. + */ +extern void theora_info_clear(theora_info *c); + +/** + * Free all internal data associated with a theora_state handle. + * \param t A theora_state handle. + */ +extern void theora_clear(theora_state *t); + +/** + * Initialize an allocated theora_comment structure + * \param tc An allocated theora_comment structure + **/ +extern void theora_comment_init(theora_comment *tc); + +/** + * Add a comment to an initialized theora_comment structure + * \param tc A previously initialized theora comment structure + * \param comment A null-terminated string encoding the comment in the form + * "TAG=the value" + * + * Neither theora_comment_add() nor theora_comment_add_tag() support + * comments containing null values, although the bitstream format + * supports this. To add such comments you will need to manipulate + * the theora_comment structure directly. + **/ + +extern void theora_comment_add(theora_comment *tc, char *comment); + +/** + * Add a comment to an initialized theora_comment structure. + * \param tc A previously initialized theora comment structure + * \param tag A null-terminated string containing the tag + * associated with the comment. + * \param value The corresponding value as a null-terminated string + * + * Neither theora_comment_add() nor theora_comment_add_tag() support + * comments containing null values, although the bitstream format + * supports this. To add such comments you will need to manipulate + * the theora_comment structure directly. + **/ +extern void theora_comment_add_tag(theora_comment *tc, + char *tag, char *value); + +/** + * Look up a comment value by tag. + * \param tc Tn initialized theora_comment structure + * \param tag The tag to look up + * \param count The instance of the tag. The same tag can appear multiple + * times, each with a distinct and ordered value, so an index + * is required to retrieve them all. + * \returns A pointer to the queried tag's value + * \retval NULL No matching tag is found + * + * \note Use theora_comment_query_count() to get the legal range for the + * count parameter. + **/ + +extern char *theora_comment_query(theora_comment *tc, char *tag, int count); + +/** Look up the number of instances of a tag. + * \param tc An initialized theora_comment structure + * \param tag The tag to look up + * \returns The number on instances of a particular tag. + * + * Call this first when querying for a specific tag and then interate + * over the number of instances with separate calls to + * theora_comment_query() to retrieve all instances in order. + **/ +extern int theora_comment_query_count(theora_comment *tc, char *tag); + +/** + * Clear an allocated theora_comment struct so that it can be freed. + * \param tc An allocated theora_comment structure. + **/ +extern void theora_comment_clear(theora_comment *tc); + +/**Encoder control function. + * This is used to provide advanced control the encoding process. + * \param th A #theora_state handle. + * \param req The control code to process. + * See \ref encctlcodes_old "the list of available + * control codes" for details. + * \param buf The parameters for this control code. + * \param buf_sz The size of the parameter buffer.*/ +extern int theora_control(theora_state *th,int req,void *buf,size_t buf_sz); + +/* @} */ /* end oldfuncs doxygen group */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _O_THEORA_H_ */ diff --git a/cs/3rd party/libtheora/include/theora/theoradec.h b/cs/3rd party/libtheora/include/theora/theoradec.h new file mode 100644 index 000000000..a9d53ecc9 --- /dev/null +++ b/cs/3rd party/libtheora/include/theora/theoradec.h @@ -0,0 +1,329 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggTheora SOFTWARE 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 Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: + last mod: $Id: theora.h,v 1.8 2004/03/15 22:17:32 derf Exp $ + + ********************************************************************/ + +/**\file + * The libtheoradec C decoding API.*/ + +#if !defined(_O_THEORA_THEORADEC_H_) +# define _O_THEORA_THEORADEC_H_ (1) +# include +# include +# include "codec.h" + +#if defined(__cplusplus) +extern "C" { +#endif + + + +/**\name th_decode_ctl() codes + * \anchor decctlcodes + * These are the available request codes for th_decode_ctl(). + * By convention, these are odd, to distinguish them from the + * \ref encctlcodes "encoder control codes". + * Keep any experimental or vendor-specific values above \c 0x8000.*/ +/*@{*/ +/**Gets the maximum post-processing level. + * The decoder supports a post-processing filter that can improve + * the appearance of the decoded images. This returns the highest + * level setting for this post-processor, corresponding to maximum + * improvement and computational expense. + * + * \param[out] _buf int: The maximum post-processing level. + * \retval TH_EFAULT \a _dec_ctx or \a _buf is NULL. + * \retval TH_EINVAL \a _buf_sz is not sizeof(int). + * \retval TH_EIMPL Not supported by this implementation.*/ +#define TH_DECCTL_GET_PPLEVEL_MAX (1) +/**Sets the post-processing level. + * By default, post-processing is disabled. + * + * Sets the level of post-processing to use when decoding the + * compressed stream. This must be a value between zero (off) + * and the maximum returned by TH_DECCTL_GET_PPLEVEL_MAX. + * + * \param[in] _buf int: The new post-processing level. + * 0 to disable; larger values use more CPU. + * \retval TH_EFAULT \a _dec_ctx or \a _buf is NULL. + * \retval TH_EINVAL \a _buf_sz is not sizeof(int), or the + * post-processing level is out of bounds. + * The maximum post-processing level may be + * implementation-specific, and can be obtained via + * #TH_DECCTL_GET_PPLEVEL_MAX. + * \retval TH_EIMPL Not supported by this implementation.*/ +#define TH_DECCTL_SET_PPLEVEL (3) +/**Sets the granule position. + * Call this after a seek, before decoding the first frame, to ensure that the + * proper granule position is returned for all subsequent frames. + * If you track timestamps yourself and do not use the granule position + * returned by the decoder, then you need not call this function. + * + * \param[in] _buf ogg_int64_t: The granule position of the next + * frame. + * \retval TH_EFAULT \a _dec_ctx or \a _buf is NULL. + * \retval TH_EINVAL \a _buf_sz is not sizeof(ogg_int64_t), or the + * granule position is negative.*/ +#define TH_DECCTL_SET_GRANPOS (5) +/**Sets the striped decode callback function. + * If set, this function will be called as each piece of a frame is fully + * decoded in th_decode_packetin(). + * You can pass in a #th_stripe_callback with + * th_stripe_callback#stripe_decoded set to NULL to disable the + * callbacks at any point. + * Enabling striped decode does not prevent you from calling + * th_decode_ycbcr_out() after the frame is fully decoded. + * + * \param[in] _buf #th_stripe_callback: The callback parameters. + * \retval TH_EFAULT \a _dec_ctx or \a _buf is NULL. + * \retval TH_EINVAL \a _buf_sz is not + * sizeof(th_stripe_callback).*/ +#define TH_DECCTL_SET_STRIPE_CB (7) + +/**Enables telemetry and sets the macroblock display mode */ +#define TH_DECCTL_SET_TELEMETRY_MBMODE (9) +/**Enables telemetry and sets the motion vector display mode */ +#define TH_DECCTL_SET_TELEMETRY_MV (11) +/**Enables telemetry and sets the adaptive quantization display mode */ +#define TH_DECCTL_SET_TELEMETRY_QI (13) +/**Enables telemetry and sets the bitstream breakdown visualization mode */ +#define TH_DECCTL_SET_TELEMETRY_BITS (15) +/*@}*/ + + + +/**A callback function for striped decode. + * This is a function pointer to an application-provided function that will be + * called each time a section of the image is fully decoded in + * th_decode_packetin(). + * This allows the application to process the section immediately, while it is + * still in cache. + * Note that the frame is decoded bottom to top, so \a _yfrag0 will steadily + * decrease with each call until it reaches 0, at which point the full frame + * is decoded. + * The number of fragment rows made available in each call depends on the pixel + * format and the number of post-processing filters enabled, and may not even + * be constant for the entire frame. + * If a non-NULL \a _granpos pointer is passed to + * th_decode_packetin(), the granule position for the frame will be stored + * in it before the first callback is made. + * If an entire frame is dropped (a 0-byte packet), then no callbacks will be + * made at all for that frame. + * \param _ctx An application-provided context pointer. + * \param _buf The image buffer for the decoded frame. + * \param _yfrag0 The Y coordinate of the first row of 8x8 fragments + * decoded. + * Multiply this by 8 to obtain the pixel row number in the + * luma plane. + * If the chroma planes are subsampled in the Y direction, + * this will always be divisible by two. + * \param _yfrag_end The Y coordinate of the first row of 8x8 fragments past + * the newly decoded section. + * If the chroma planes are subsampled in the Y direction, + * this will always be divisible by two. + * I.e., this section contains fragment rows + * \a _yfrag0 ...\a _yfrag_end -1.*/ +typedef void (*th_stripe_decoded_func)(void *_ctx,th_ycbcr_buffer _buf, + int _yfrag0,int _yfrag_end); + +/**The striped decode callback data to pass to #TH_DECCTL_SET_STRIPE_CB.*/ +typedef struct{ + /**An application-provided context pointer. + * This will be passed back verbatim to the application.*/ + void *ctx; + /**The callback function pointer.*/ + th_stripe_decoded_func stripe_decoded; +}th_stripe_callback; + + + +/**\name Decoder state + The following data structures are opaque, and their contents are not + publicly defined by this API. + Referring to their internals directly is unsupported, and may break without + warning.*/ +/*@{*/ +/**The decoder context.*/ +typedef struct th_dec_ctx th_dec_ctx; +/**Setup information. + This contains auxiliary information (Huffman tables and quantization + parameters) decoded from the setup header by th_decode_headerin() to be + passed to th_decode_alloc(). + It can be re-used to initialize any number of decoders, and can be freed + via th_setup_free() at any time.*/ +typedef struct th_setup_info th_setup_info; +/*@}*/ + + + +/**\defgroup decfuncs Functions for Decoding*/ +/*@{*/ +/**\name Functions for decoding + * You must link to libtheoradec if you use any of the + * functions in this section. + * + * The functions are listed in the order they are used in a typical decode. + * The basic steps are: + * - Parse the header packets by repeatedly calling th_decode_headerin(). + * - Allocate a #th_dec_ctx handle with th_decode_alloc(). + * - Call th_setup_free() to free any memory used for codec setup + * information. + * - Perform any additional decoder configuration with th_decode_ctl(). + * - For each video data packet: + * - Submit the packet to the decoder via th_decode_packetin(). + * - Retrieve the uncompressed video data via th_decode_ycbcr_out(). + * - Call th_decode_free() to release all decoder memory.*/ +/*@{*/ +/**Decodes the header packets of a Theora stream. + * This should be called on the initial packets of the stream, in succession, + * until it returns 0, indicating that all headers have been + * processed, or an error is encountered. + * At least three header packets are required, and additional optional header + * packets may follow. + * This can be used on the first packet of any logical stream to determine if + * that stream is a Theora stream. + * \param _info A #th_info structure to fill in. + * This must have been previously initialized with + * th_info_init(). + * The application may immediately begin using the contents of + * this structure after the first header is decoded, though it + * must continue to be passed in on all subsequent calls. + * \param _tc A #th_comment structure to fill in. + * The application may immediately begin using the contents of + * this structure after the second header is decoded, though it + * must continue to be passed in on all subsequent calls. + * \param _setup Returns a pointer to additional, private setup information + * needed by the decoder. + * The contents of this pointer must be initialized to + * NULL on the first call, and the returned value must + * continue to be passed in on all subsequent calls. + * \param _op An ogg_packet structure which contains one of the + * initial packets of an Ogg logical stream. + * \return A positive value indicates that a Theora header was successfully + * processed. + * \retval 0 The first video data packet was encountered after all + * required header packets were parsed. + * The packet just passed in on this call should be saved + * and fed to th_decode_packetin() to begin decoding + * video data. + * \retval TH_EFAULT One of \a _info, \a _tc, or \a _setup was + * NULL. + * \retval TH_EBADHEADER \a _op was NULL, the packet was not the next + * header packet in the expected sequence, or the format + * of the header data was invalid. + * \retval TH_EVERSION The packet data was a Theora info header, but for a + * bitstream version not decodable with this version of + * libtheoradec. + * \retval TH_ENOTFORMAT The packet was not a Theora header. + */ +extern int th_decode_headerin(th_info *_info,th_comment *_tc, + th_setup_info **_setup,ogg_packet *_op); +/**Allocates a decoder instance. + * + * Security Warning: The Theora format supports very large frame sizes, + * potentially even larger than the address space of a 32-bit machine, and + * creating a decoder context allocates the space for several frames of data. + * If the allocation fails here, your program will crash, possibly at some + * future point because the OS kernel returned a valid memory range and will + * only fail when it tries to map the pages in it the first time they are + * used. + * Even if it succeeds, you may experience a denial of service if the frame + * size is large enough to cause excessive paging. + * If you are integrating libtheora in a larger application where such things + * are undesirable, it is highly recommended that you check the frame size in + * \a _info before calling this function and refuse to decode streams where it + * is larger than some reasonable maximum. + * libtheora will not check this for you, because there may be machines that + * can handle such streams and applications that wish to. + * \param _info A #th_info struct filled via th_decode_headerin(). + * \param _setup A #th_setup_info handle returned via + * th_decode_headerin(). + * \return The initialized #th_dec_ctx handle. + * \retval NULL If the decoding parameters were invalid.*/ +extern th_dec_ctx *th_decode_alloc(const th_info *_info, + const th_setup_info *_setup); +/**Releases all storage used for the decoder setup information. + * This should be called after you no longer want to create any decoders for + * a stream whose headers you have parsed with th_decode_headerin(). + * \param _setup The setup information to free. + * This can safely be NULL.*/ +extern void th_setup_free(th_setup_info *_setup); +/**Decoder control function. + * This is used to provide advanced control of the decoding process. + * \param _dec A #th_dec_ctx handle. + * \param _req The control code to process. + * See \ref decctlcodes "the list of available control codes" + * for details. + * \param _buf The parameters for this control code. + * \param _buf_sz The size of the parameter buffer. + * \return Possible return values depend on the control code used. + * See \ref decctlcodes "the list of control codes" for + * specific values. Generally 0 indicates success.*/ +extern int th_decode_ctl(th_dec_ctx *_dec,int _req,void *_buf, + size_t _buf_sz); +/**Submits a packet containing encoded video data to the decoder. + * \param _dec A #th_dec_ctx handle. + * \param _op An ogg_packet containing encoded video data. + * \param _granpos Returns the granule position of the decoded packet. + * If non-NULL, the granule position for this specific + * packet is stored in this location. + * This is computed incrementally from previously decoded + * packets. + * After a seek, the correct granule position must be set via + * #TH_DECCTL_SET_GRANPOS for this to work properly. + * \retval 0 Success. + * A new decoded frame can be retrieved by calling + * th_decode_ycbcr_out(). + * \retval TH_DUPFRAME The packet represented a dropped frame (either a + * 0-byte frame or an INTER frame with no coded blocks). + * The player can skip the call to th_decode_ycbcr_out(), + * as the contents of the decoded frame buffer have not + * changed. + * \retval TH_EFAULT \a _dec or \a _op was NULL. + * \retval TH_EBADPACKET \a _op does not contain encoded video data. + * \retval TH_EIMPL The video data uses bitstream features which this + * library does not support.*/ +extern int th_decode_packetin(th_dec_ctx *_dec,const ogg_packet *_op, + ogg_int64_t *_granpos); +/**Outputs the next available frame of decoded Y'CbCr data. + * If a striped decode callback has been set with #TH_DECCTL_SET_STRIPE_CB, + * then the application does not need to call this function. + * \param _dec A #th_dec_ctx handle. + * \param _ycbcr A video buffer structure to fill in. + * libtheoradec will fill in all the members of this + * structure, including the pointers to the uncompressed video + * data. + * The memory for this video data is owned by + * libtheoradec. + * It may be freed or overwritten without notification when + * subsequent frames are decoded. + * \retval 0 Success + * \retval TH_EFAULT \a _dec or \a _ycbcr was NULL. + */ +extern int th_decode_ycbcr_out(th_dec_ctx *_dec, + th_ycbcr_buffer _ycbcr); +/**Frees an allocated decoder instance. + * \param _dec A #th_dec_ctx handle.*/ +extern void th_decode_free(th_dec_ctx *_dec); +/*@}*/ +/*@}*/ + + + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/cs/3rd party/libtheora/include/theora/theoraenc.h b/cs/3rd party/libtheora/include/theora/theoraenc.h new file mode 100644 index 000000000..79b1c2b88 --- /dev/null +++ b/cs/3rd party/libtheora/include/theora/theoraenc.h @@ -0,0 +1,548 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggTheora SOFTWARE 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 Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: + last mod: $Id: theora.h,v 1.8 2004/03/15 22:17:32 derf Exp $ + + ********************************************************************/ + +/**\file + * The libtheoraenc C encoding API.*/ + +#if !defined(_O_THEORA_THEORAENC_H_) +# define _O_THEORA_THEORAENC_H_ (1) +# include +# include +# include "codec.h" + +#if defined(__cplusplus) +extern "C" { +#endif + + + +/**\name th_encode_ctl() codes + * \anchor encctlcodes + * These are the available request codes for th_encode_ctl(). + * By convention, these are even, to distinguish them from the + * \ref decctlcodes "decoder control codes". + * Keep any experimental or vendor-specific values above \c 0x8000.*/ +/*@{*/ +/**Sets the Huffman tables to use. + * The tables are copied, not stored by reference, so they can be freed after + * this call. + * NULL may be specified to revert to the default tables. + * + * \param[in] _buf #th_huff_code[#TH_NHUFFMAN_TABLES][#TH_NDCT_TOKENS] + * \retval TH_EFAULT \a _enc is NULL. + * \retval TH_EINVAL Encoding has already begun or one or more of the given + * tables is not full or prefix-free, \a _buf is + * NULL and \a _buf_sz is not zero, or \a _buf is + * non-NULL and \a _buf_sz is not + * sizeof(#th_huff_code)*#TH_NHUFFMAN_TABLES*#TH_NDCT_TOKENS. + * \retval TH_EIMPL Not supported by this implementation.*/ +#define TH_ENCCTL_SET_HUFFMAN_CODES (0) +/**Sets the quantization parameters to use. + * The parameters are copied, not stored by reference, so they can be freed + * after this call. + * NULL may be specified to revert to the default parameters. + * + * \param[in] _buf #th_quant_info + * \retval TH_EFAULT \a _enc is NULL. + * \retval TH_EINVAL Encoding has already begun, \a _buf is + * NULL and \a _buf_sz is not zero, + * or \a _buf is non-NULL and + * \a _buf_sz is not sizeof(#th_quant_info). + * \retval TH_EIMPL Not supported by this implementation.*/ +#define TH_ENCCTL_SET_QUANT_PARAMS (2) +/**Sets the maximum distance between key frames. + * This can be changed during an encode, but will be bounded by + * 1<. + * If it is set before encoding begins, th_info#keyframe_granule_shift will + * be enlarged appropriately. + * + * \param[in] _buf ogg_uint32_t: The maximum distance between key + * frames. + * \param[out] _buf ogg_uint32_t: The actual maximum distance set. + * \retval TH_EFAULT \a _enc or \a _buf is NULL. + * \retval TH_EINVAL \a _buf_sz is not sizeof(ogg_uint32_t). + * \retval TH_EIMPL Not supported by this implementation.*/ +#define TH_ENCCTL_SET_KEYFRAME_FREQUENCY_FORCE (4) +/**Disables any encoder features that would prevent lossless transcoding back + * to VP3. + * This primarily means disabling block-adaptive quantization and always coding + * all four luma blocks in a macro block when 4MV is used. + * It also includes using the VP3 quantization tables and Huffman codes; if you + * set them explicitly after calling this function, the resulting stream will + * not be VP3-compatible. + * If you enable VP3-compatibility when encoding 4:2:2 or 4:4:4 source + * material, or when using a picture region smaller than the full frame (e.g. + * a non-multiple-of-16 width or height), then non-VP3 bitstream features will + * still be disabled, but the stream will still not be VP3-compatible, as VP3 + * was not capable of encoding such formats. + * If you call this after encoding has already begun, then the quantization + * tables and codebooks cannot be changed, but the frame-level features will + * be enabled or disabled as requested. + * + * \param[in] _buf int: a non-zero value to enable VP3 compatibility, + * or 0 to disable it (the default). + * \param[out] _buf int: 1 if all bitstream features required for + * VP3-compatibility could be set, and 0 otherwise. + * The latter will be returned if the pixel format is not + * 4:2:0, the picture region is smaller than the full frame, + * or if encoding has begun, preventing the quantization + * tables and codebooks from being set. + * \retval TH_EFAULT \a _enc or \a _buf is NULL. + * \retval TH_EINVAL \a _buf_sz is not sizeof(int). + * \retval TH_EIMPL Not supported by this implementation.*/ +#define TH_ENCCTL_SET_VP3_COMPATIBLE (10) +/**Gets the maximum speed level. + * Higher speed levels favor quicker encoding over better quality per bit. + * Depending on the encoding mode, and the internal algorithms used, quality + * may actually improve, but in this case bitrate will also likely increase. + * In any case, overall rate/distortion performance will probably decrease. + * The maximum value, and the meaning of each value, may change depending on + * the current encoding mode (VBR vs. constant quality, etc.). + * + * \param[out] _buf int: The maximum encoding speed level. + * \retval TH_EFAULT \a _enc or \a _buf is NULL. + * \retval TH_EINVAL \a _buf_sz is not sizeof(int). + * \retval TH_EIMPL Not supported by this implementation in the current + * encoding mode.*/ +#define TH_ENCCTL_GET_SPLEVEL_MAX (12) +/**Sets the speed level. + * The current speed level may be retrieved using #TH_ENCCTL_GET_SPLEVEL. + * + * \param[in] _buf int: The new encoding speed level. + * 0 is slowest, larger values use less CPU. + * \retval TH_EFAULT \a _enc or \a _buf is NULL. + * \retval TH_EINVAL \a _buf_sz is not sizeof(int), or the + * encoding speed level is out of bounds. + * The maximum encoding speed level may be + * implementation- and encoding mode-specific, and can be + * obtained via #TH_ENCCTL_GET_SPLEVEL_MAX. + * \retval TH_EIMPL Not supported by this implementation in the current + * encoding mode.*/ +#define TH_ENCCTL_SET_SPLEVEL (14) +/**Gets the current speed level. + * The default speed level may vary according to encoder implementation, but if + * this control code is not supported (it returns #TH_EIMPL), the default may + * be assumed to be the slowest available speed (0). + * The maximum encoding speed level may be implementation- and encoding + * mode-specific, and can be obtained via #TH_ENCCTL_GET_SPLEVEL_MAX. + * + * \param[out] _buf int: The current encoding speed level. + * 0 is slowest, larger values use less CPU. + * \retval TH_EFAULT \a _enc or \a _buf is NULL. + * \retval TH_EINVAL \a _buf_sz is not sizeof(int). + * \retval TH_EIMPL Not supported by this implementation in the current + * encoding mode.*/ +#define TH_ENCCTL_GET_SPLEVEL (16) +/**Sets the number of duplicates of the next frame to produce. + * Although libtheora can encode duplicate frames very cheaply, it costs some + * amount of CPU to detect them, and a run of duplicates cannot span a + * keyframe boundary. + * This control code tells the encoder to produce the specified number of extra + * duplicates of the next frame. + * This allows the encoder to make smarter keyframe placement decisions and + * rate control decisions, and reduces CPU usage as well, when compared to + * just submitting the same frame for encoding multiple times. + * This setting only applies to the next frame submitted for encoding. + * You MUST call th_encode_packetout() repeatedly until it returns 0, or the + * extra duplicate frames will be lost. + * + * \param[in] _buf int: The number of duplicates to produce. + * If this is negative or zero, no duplicates will be produced. + * \retval TH_EFAULT \a _enc or \a _buf is NULL. + * \retval TH_EINVAL \a _buf_sz is not sizeof(int), or the + * number of duplicates is greater than or equal to the + * maximum keyframe interval. + * In the latter case, NO duplicate frames will be produced. + * You must ensure that the maximum keyframe interval is set + * larger than the maximum number of duplicates you will + * ever wish to insert prior to encoding. + * \retval TH_EIMPL Not supported by this implementation in the current + * encoding mode.*/ +#define TH_ENCCTL_SET_DUP_COUNT (18) +/**Modifies the default bitrate management behavior. + * Use to allow or disallow frame dropping, and to enable or disable capping + * bit reservoir overflows and underflows. + * See \ref encctlcodes "the list of available flags". + * The flags are set by default to + * #TH_RATECTL_DROP_FRAMES|#TH_RATECTL_CAP_OVERFLOW. + * + * \param[in] _buf int: Any combination of + * \ref ratectlflags "the available flags": + * - #TH_RATECTL_DROP_FRAMES: Enable frame dropping. + * - #TH_RATECTL_CAP_OVERFLOW: Don't bank excess bits for later + * use. + * - #TH_RATECTL_CAP_UNDERFLOW: Don't try to make up shortfalls + * later. + * \retval TH_EFAULT \a _enc or \a _buf is NULL. + * \retval TH_EINVAL \a _buf_sz is not sizeof(int) or rate control + * is not enabled. + * \retval TH_EIMPL Not supported by this implementation in the current + * encoding mode.*/ +#define TH_ENCCTL_SET_RATE_FLAGS (20) +/**Sets the size of the bitrate management bit reservoir as a function + * of number of frames. + * The reservoir size affects how quickly bitrate management reacts to + * instantaneous changes in the video complexity. + * Larger reservoirs react more slowly, and provide better overall quality, but + * require more buffering by a client, adding more latency to live streams. + * By default, libtheora sets the reservoir to the maximum distance between + * keyframes, subject to a minimum and maximum limit. + * This call may be used to increase or decrease the reservoir, increasing or + * decreasing the allowed temporary variance in bitrate. + * An implementation may impose some limits on the size of a reservoir it can + * handle, in which case the actual reservoir size may not be exactly what was + * requested. + * The actual value set will be returned. + * + * \param[in] _buf int: Requested size of the reservoir measured in + * frames. + * \param[out] _buf int: The actual size of the reservoir set. + * \retval TH_EFAULT \a _enc or \a _buf is NULL. + * \retval TH_EINVAL \a _buf_sz is not sizeof(int), or rate control + * is not enabled. The buffer has an implementation + * defined minimum and maximum size and the value in _buf + * will be adjusted to match the actual value set. + * \retval TH_EIMPL Not supported by this implementation in the current + * encoding mode.*/ +#define TH_ENCCTL_SET_RATE_BUFFER (22) +/**Enable pass 1 of two-pass encoding mode and retrieve the first pass metrics. + * Pass 1 mode must be enabled before the first frame is encoded, and a target + * bitrate must have already been specified to the encoder. + * Although this does not have to be the exact rate that will be used in the + * second pass, closer values may produce better results. + * The first call returns the size of the two-pass header data, along with some + * placeholder content, and sets the encoder into pass 1 mode implicitly. + * This call sets the encoder to pass 1 mode implicitly. + * Then, a subsequent call must be made after each call to + * th_encode_ycbcr_in() to retrieve the metrics for that frame. + * An additional, final call must be made to retrieve the summary data, + * containing such information as the total number of frames, etc. + * This must be stored in place of the placeholder data that was returned + * in the first call, before the frame metrics data. + * All of this data must be presented back to the encoder during pass 2 using + * #TH_ENCCTL_2PASS_IN. + * + * \param[out] char *_buf: Returns a pointer to internal storage + * containing the two pass metrics data. + * This storage is only valid until the next call, or until the + * encoder context is freed, and must be copied by the + * application. + * \retval >=0 The number of bytes of metric data available in the + * returned buffer. + * \retval TH_EFAULT \a _enc or \a _buf is NULL. + * \retval TH_EINVAL \a _buf_sz is not sizeof(char *), no target + * bitrate has been set, or the first call was made after + * the first frame was submitted for encoding. + * \retval TH_EIMPL Not supported by this implementation.*/ +#define TH_ENCCTL_2PASS_OUT (24) +/**Submits two-pass encoding metric data collected the first encoding pass to + * the second pass. + * The first call must be made before the first frame is encoded, and a target + * bitrate must have already been specified to the encoder. + * It sets the encoder to pass 2 mode implicitly; this cannot be disabled. + * The encoder may require reading data from some or all of the frames in + * advance, depending on, e.g., the reservoir size used in the second pass. + * You must call this function repeatedly before each frame to provide data + * until either a) it fails to consume all of the data presented or b) all of + * the pass 1 data has been consumed. + * In the first case, you must save the remaining data to be presented after + * the next frame. + * You can call this function with a NULL argument to get an upper bound on + * the number of bytes that will be required before the next frame. + * + * When pass 2 is first enabled, the default bit reservoir is set to the entire + * file; this gives maximum flexibility but can lead to very high peak rates. + * You can subsequently set it to another value with #TH_ENCCTL_SET_RATE_BUFFER + * (e.g., to set it to the keyframe interval for non-live streaming), however, + * you may then need to provide more data before the next frame. + * + * \param[in] _buf char[]: A buffer containing the data returned by + * #TH_ENCCTL_2PASS_OUT in pass 1. + * You may pass NULL for \a _buf to return an upper + * bound on the number of additional bytes needed before the + * next frame. + * The summary data returned at the end of pass 1 must be at + * the head of the buffer on the first call with a + * non-NULL \a _buf, and the placeholder data + * returned at the start of pass 1 should be omitted. + * After each call you should advance this buffer by the number + * of bytes consumed. + * \retval >0 The number of bytes of metric data required/consumed. + * \retval 0 No more data is required before the next frame. + * \retval TH_EFAULT \a _enc is NULL. + * \retval TH_EINVAL No target bitrate has been set, or the first call was + * made after the first frame was submitted for + * encoding. + * \retval TH_ENOTFORMAT The data did not appear to be pass 1 from a compatible + * implementation of this library. + * \retval TH_EBADHEADER The data was invalid; this may be returned when + * attempting to read an aborted pass 1 file that still + * has the placeholder data in place of the summary + * data. + * \retval TH_EIMPL Not supported by this implementation.*/ +#define TH_ENCCTL_2PASS_IN (26) +/**Sets the current encoding quality. + * This is only valid so long as no bitrate has been specified, either through + * the #th_info struct used to initialize the encoder or through + * #TH_ENCCTL_SET_BITRATE (this restriction may be relaxed in a future + * version). + * If it is set before the headers are emitted, the target quality encoded in + * them will be updated. + * + * \param[in] _buf int: The new target quality, in the range 0...63, + * inclusive. + * \retval 0 Success. + * \retval TH_EFAULT \a _enc or \a _buf is NULL. + * \retval TH_EINVAL A target bitrate has already been specified, or the + * quality index was not in the range 0...63. + * \retval TH_EIMPL Not supported by this implementation.*/ +#define TH_ENCCTL_SET_QUALITY (28) +/**Sets the current encoding bitrate. + * Once a bitrate is set, the encoder must use a rate-controlled mode for all + * future frames (this restriction may be relaxed in a future version). + * If it is set before the headers are emitted, the target bitrate encoded in + * them will be updated. + * Due to the buffer delay, the exact bitrate of each section of the encode is + * not guaranteed. + * The encoder may have already used more bits than allowed for the frames it + * has encoded, expecting to make them up in future frames, or it may have + * used fewer, holding the excess in reserve. + * The exact transition between the two bitrates is not well-defined by this + * API, but may be affected by flags set with #TH_ENCCTL_SET_RATE_FLAGS. + * After a number of frames equal to the buffer delay, one may expect further + * output to average at the target bitrate. + * + * \param[in] _buf long: The new target bitrate, in bits per second. + * \retval 0 Success. + * \retval TH_EFAULT \a _enc or \a _buf is NULL. + * \retval TH_EINVAL The target bitrate was not positive. + * A future version of this library may allow passing 0 + * to disabled rate-controlled mode and return to a + * quality-based mode, in which case this function will + * not return an error for that value. + * \retval TH_EIMPL Not supported by this implementation.*/ +#define TH_ENCCTL_SET_BITRATE (30) +/**Sets the configuration to be compatible with that from the given setup + * header. + * This sets the Huffman codebooks and quantization parameters to match those + * found in the given setup header. + * This guarantees that packets encoded by this encoder will be decodable using + * a decoder configured with the passed-in setup header. + * It does not guarantee that th_encode_flushheader() will produce a + * bit-identical setup header, only that they will be compatible. + * If you need a bit-identical setup header, then use the one you passed into + * this command, and not the one returned by th_encode_flushheader(). + * + * This also does not enable or disable VP3 compatibility; that is not + * signaled in the setup header (or anywhere else in the encoded stream), and + * is controlled independently by the #TH_ENCCTL_SET_VP3_COMPATIBLE function. + * If you wish to enable VP3 compatibility mode and want the codebooks + * and quantization parameters to match the given setup header, you should + * enable VP3 compatibility before invoking this command, otherwise the + * codebooks and quantization parameters will be reset to the VP3 defaults. + * + * The current encoder does not support Huffman codebooks which do not contain + * codewords for all 32 tokens. + * Such codebooks are legal, according to the specification, but cannot be + * configured with this function. + * + * \param[in] _buf unsigned char[]: The encoded setup header to copy + * the configuration from. + * This should be the original, + * undecoded setup header packet, + * and not a #th_setup_info + * structure filled in by + * th_decode_headerin(). + * \retval TH_EFAULT \a _enc or \a _buf is NULL. + * \retval TH_EINVAL Encoding has already begun, so the codebooks and + * quantization parameters cannot be changed, or the + * data in the setup header was not supported by this + * encoder. + * \retval TH_EBADHEADER \a _buf did not contain a valid setup header packet. + * \retval TH_ENOTFORMAT \a _buf did not contain a Theora header at all. + * \retval TH_EIMPL Not supported by this implementation.*/ +#define TH_ENCCTL_SET_COMPAT_CONFIG (32) + +/*@}*/ + + +/**\name TH_ENCCTL_SET_RATE_FLAGS flags + * \anchor ratectlflags + * These are the flags available for use with #TH_ENCCTL_SET_RATE_FLAGS.*/ +/*@{*/ +/**Drop frames to keep within bitrate buffer constraints. + * This can have a severe impact on quality, but is the only way to ensure that + * bitrate targets are met at low rates during sudden bursts of activity. + * It is enabled by default.*/ +#define TH_RATECTL_DROP_FRAMES (0x1) +/**Ignore bitrate buffer overflows. + * If the encoder uses so few bits that the reservoir of available bits + * overflows, ignore the excess. + * The encoder will not try to use these extra bits in future frames. + * At high rates this may cause the result to be undersized, but allows a + * client to play the stream using a finite buffer; it should normally be + * enabled, which is the default.*/ +#define TH_RATECTL_CAP_OVERFLOW (0x2) +/**Ignore bitrate buffer underflows. + * If the encoder uses so many bits that the reservoir of available bits + * underflows, ignore the deficit. + * The encoder will not try to make up these extra bits in future frames. + * At low rates this may cause the result to be oversized; it should normally + * be disabled, which is the default.*/ +#define TH_RATECTL_CAP_UNDERFLOW (0x4) +/*@}*/ + + + +/**The quantization parameters used by VP3.*/ +extern const th_quant_info TH_VP31_QUANT_INFO; + +/**The Huffman tables used by VP3.*/ +extern const th_huff_code + TH_VP31_HUFF_CODES[TH_NHUFFMAN_TABLES][TH_NDCT_TOKENS]; + + + +/**\name Encoder state + The following data structure is opaque, and its contents are not publicly + defined by this API. + Referring to its internals directly is unsupported, and may break without + warning.*/ +/*@{*/ +/**The encoder context.*/ +typedef struct th_enc_ctx th_enc_ctx; +/*@}*/ + + + +/**\defgroup encfuncs Functions for Encoding*/ +/*@{*/ +/**\name Functions for encoding + * You must link to libtheoraenc and libtheoradec + * if you use any of the functions in this section. + * + * The functions are listed in the order they are used in a typical encode. + * The basic steps are: + * - Fill in a #th_info structure with details on the format of the video you + * wish to encode. + * - Allocate a #th_enc_ctx handle with th_encode_alloc(). + * - Perform any additional encoder configuration required with + * th_encode_ctl(). + * - Repeatedly call th_encode_flushheader() to retrieve all the header + * packets. + * - For each uncompressed frame: + * - Submit the uncompressed frame via th_encode_ycbcr_in() + * - Repeatedly call th_encode_packetout() to retrieve any video + * data packets that are ready. + * - Call th_encode_free() to release all encoder memory.*/ +/*@{*/ +/**Allocates an encoder instance. + * \param _info A #th_info struct filled with the desired encoding parameters. + * \return The initialized #th_enc_ctx handle. + * \retval NULL If the encoding parameters were invalid.*/ +extern th_enc_ctx *th_encode_alloc(const th_info *_info); +/**Encoder control function. + * This is used to provide advanced control the encoding process. + * \param _enc A #th_enc_ctx handle. + * \param _req The control code to process. + * See \ref encctlcodes "the list of available control codes" + * for details. + * \param _buf The parameters for this control code. + * \param _buf_sz The size of the parameter buffer. + * \return Possible return values depend on the control code used. + * See \ref encctlcodes "the list of control codes" for + * specific values. Generally 0 indicates success.*/ +extern int th_encode_ctl(th_enc_ctx *_enc,int _req,void *_buf,size_t _buf_sz); +/**Outputs the next header packet. + * This should be called repeatedly after encoder initialization until it + * returns 0 in order to get all of the header packets, in order, before + * encoding actual video data. + * \param _enc A #th_enc_ctx handle. + * \param _comments The metadata to place in the comment header, when it is + * encoded. + * \param _op An ogg_packet structure to fill. + * All of the elements of this structure will be set, + * including a pointer to the header data. + * The memory for the header data is owned by + * libtheoraenc, and may be invalidated when the + * next encoder function is called. + * \return A positive value indicates that a header packet was successfully + * produced. + * \retval 0 No packet was produced, and no more header packets remain. + * \retval TH_EFAULT \a _enc, \a _comments, or \a _op was NULL.*/ +extern int th_encode_flushheader(th_enc_ctx *_enc, + th_comment *_comments,ogg_packet *_op); +/**Submits an uncompressed frame to the encoder. + * \param _enc A #th_enc_ctx handle. + * \param _ycbcr A buffer of Y'CbCr data to encode. + * If the width and height of the buffer matches the frame size + * the encoder was initialized with, the encoder will only + * reference the portion inside the picture region. + * Any data outside this region will be ignored, and need not map + * to a valid address. + * Alternatively, you can pass a buffer equal to the size of the + * picture region, if this is less than the full frame size. + * When using subsampled chroma planes, odd picture sizes or odd + * picture offsets may require an unexpected chroma plane size, + * and their use is generally discouraged, as they will not be + * well-supported by players and other media frameworks. + * See Section 4.4 of + * the Theora + * specification for details if you wish to use them anyway. + * \retval 0 Success. + * \retval TH_EFAULT \a _enc or \a _ycbcr is NULL. + * \retval TH_EINVAL The buffer size matches neither the frame size nor the + * picture size the encoder was initialized with, or + * encoding has already completed.*/ +extern int th_encode_ycbcr_in(th_enc_ctx *_enc,th_ycbcr_buffer _ycbcr); +/**Retrieves encoded video data packets. + * This should be called repeatedly after each frame is submitted to flush any + * encoded packets, until it returns 0. + * The encoder will not buffer these packets as subsequent frames are + * compressed, so a failure to do so will result in lost video data. + * \note Currently the encoder operates in a one-frame-in, one-packet-out + * manner. + * However, this may be changed in the future. + * \param _enc A #th_enc_ctx handle. + * \param _last Set this flag to a non-zero value if no more uncompressed + * frames will be submitted. + * This ensures that a proper EOS flag is set on the last packet. + * \param _op An ogg_packet structure to fill. + * All of the elements of this structure will be set, including a + * pointer to the video data. + * The memory for the video data is owned by + * libtheoraenc, and may be invalidated when the next + * encoder function is called. + * \return A positive value indicates that a video data packet was successfully + * produced. + * \retval 0 No packet was produced, and no more encoded video data + * remains. + * \retval TH_EFAULT \a _enc or \a _op was NULL.*/ +extern int th_encode_packetout(th_enc_ctx *_enc,int _last,ogg_packet *_op); +/**Frees an allocated encoder instance. + * \param _enc A #th_enc_ctx handle.*/ +extern void th_encode_free(th_enc_ctx *_enc); +/*@}*/ +/*@}*/ + + + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/cs/3rd party/libtheora/libtheora.spec.in b/cs/3rd party/libtheora/libtheora.spec.in new file mode 100644 index 000000000..ce9345ed0 --- /dev/null +++ b/cs/3rd party/libtheora/libtheora.spec.in @@ -0,0 +1,82 @@ +Name: libtheora +Version: @VERSION@ +Release: 0.xiph.0.4.alpha5 +Summary: The Theora Video Compression Codec. + +Group: System Environment/Libraries +License: BSD +URL: http://www.theora.org/ +Vendor: Xiph.org Foundation +Source: http://downloads.xiph.org/releases/theora/%{name}-%{version}.tar.gz +BuildRoot: %{_tmppath}/%{name}-%{version}-root + +BuildRequires: libogg-devel >= 2:1.1 +BuildRequires: libvorbis-devel >= 1:1.0.1 +BuildRequires: SDL-devel + +# this needs to be explicit since vorbis's .so versioning didn't get bumped +# when going from 1.0 to 1.0.1 +Requires: libvorbis >= 1:1.0.1 + +%description +Theora is Xiph.Org's first publicly released video codec, intended +for use within the Ogg's project's Ogg multimedia streaming system. +Theora is derived directly from On2's VP3 codec; Currently the two are +nearly identical, varying only in encapsulating decoder tables in the +bitstream headers, but Theora will make use of this extra freedom +in the future to improve over what is possible with VP3. + +%package devel +Summary: Development tools for Theora applications. +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} +Requires: libogg-devel >= 2:1.1 + +%description devel +The libtheora-devel package contains the header files and documentation +needed to develop applications with Ogg Theora. + +%prep +%setup -q -n %{name}-%{version} + +%build +%configure --enable-shared +make + +%install +rm -rf $RPM_BUILD_ROOT +# make sure our temp doc build dir is removed +rm -rf $(pwd)/__docs + +%makeinstall docdir=$(pwd)/__docs + +find $RPM_BUILD_ROOT -type f -name "*.la" -exec rm -f {} ';' + +%clean +rm -rf $RPM_BUILD_ROOT + +%post -p /sbin/ldconfig + +%postun -p /sbin/ldconfig + +%files +%defattr(-,root,root) +%doc COPYING README +%{_libdir}/libtheora.so.* + +%files devel +%defattr(-,root,root,-) +%doc __docs/* +%{_libdir}/libtheora.a +%{_libdir}/libtheora.so +%dir %{_includedir}/theora +%{_includedir}/theora/codec.h +%{_includedir}/theora/theora.h +%{_includedir}/theora/theoradec.h +%{_libdir}/pkgconfig/theora.pc + +%changelog +* Sat Aug 20 2005 Ralph Giles +- updated version for 1.0alpha5 release +* Thu Jun 10 2004 Thomas Vander Stichele +- transported fedora.us spec file diff --git a/cs/3rd party/libtheora/m4/Makefile.am b/cs/3rd party/libtheora/m4/Makefile.am new file mode 100644 index 000000000..92ad86c59 --- /dev/null +++ b/cs/3rd party/libtheora/m4/Makefile.am @@ -0,0 +1,6 @@ +EXTRA_DIST = \ + as-ac-expand.m4 \ + as-gcc-inline-assembly.m4 \ + ogg.m4 \ + pkg.m4 \ + vorbis.m4 diff --git a/cs/3rd party/libtheora/macosx/English.lproj/InfoPlist.strings b/cs/3rd party/libtheora/macosx/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..e5964ff905b6b962803a0b21997fa55fb0135b09 GIT binary patch literal 142 zcmW-a%?g5G5Jk`0r}%K`A|D{!6a+%J@&&{nipnptf_ixMAj8a^dpXR^3pp8qGm(~t zJ6HbnbY@@m#bgp0)u0Z}Qa8Bocy9c}+w>;=+o;T&iFM?}fsb@2*Hd}_p#};&rRJiG J{%CZ2k` + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + Theora + CFBundleGetInfoString + Theora framework 1.1alpha1svn, Copyright © 2002-2009Xiph.Org Foundation + CFBundleIconFile + + CFBundleIdentifier + org.xiph.theora + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + FMWK + CFBundleSignature + ???? + CFBundleVersion + 1.0d6 + CFBundleShortVersionString + 1.1alpha1svn + NSHumanReadableCopyright + Theora framework 1.1alpha1svn, Copyright © 2002-2009Xiph.Org Foundation + CSResourcesFileMapped + + + diff --git a/cs/3rd party/libtheora/macosx/Theora.xcodeproj/project.pbxproj b/cs/3rd party/libtheora/macosx/Theora.xcodeproj/project.pbxproj new file mode 100644 index 000000000..4b80b7026 --- /dev/null +++ b/cs/3rd party/libtheora/macosx/Theora.xcodeproj/project.pbxproj @@ -0,0 +1,872 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 42; + objects = { + +/* Begin PBXBuildFile section */ + 084C31FE0FE4E5BD00117FC9 /* apiwrapper.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31D90FE4E5BD00117FC9 /* apiwrapper.c */; }; + 084C31FF0FE4E5BD00117FC9 /* apiwrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C31DA0FE4E5BD00117FC9 /* apiwrapper.h */; }; + 084C32000FE4E5BD00117FC9 /* bitpack.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31DB0FE4E5BD00117FC9 /* bitpack.c */; }; + 084C32010FE4E5BD00117FC9 /* bitpack.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C31DC0FE4E5BD00117FC9 /* bitpack.h */; }; + 084C32020FE4E5BD00117FC9 /* dct.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C31DD0FE4E5BD00117FC9 /* dct.h */; }; + 084C32030FE4E5BD00117FC9 /* decapiwrapper.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31DE0FE4E5BD00117FC9 /* decapiwrapper.c */; }; + 084C32040FE4E5BD00117FC9 /* decinfo.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31DF0FE4E5BD00117FC9 /* decinfo.c */; }; + 084C32050FE4E5BD00117FC9 /* decint.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C31E00FE4E5BD00117FC9 /* decint.h */; }; + 084C32060FE4E5BD00117FC9 /* decode.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31E10FE4E5BD00117FC9 /* decode.c */; }; + 084C32070FE4E5BD00117FC9 /* dequant.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31E20FE4E5BD00117FC9 /* dequant.c */; }; + 084C32080FE4E5BD00117FC9 /* dequant.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C31E30FE4E5BD00117FC9 /* dequant.h */; }; + 084C32090FE4E5BD00117FC9 /* fragment.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31E40FE4E5BD00117FC9 /* fragment.c */; }; + 084C320A0FE4E5BD00117FC9 /* huffdec.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31E50FE4E5BD00117FC9 /* huffdec.c */; }; + 084C320B0FE4E5BD00117FC9 /* huffdec.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C31E60FE4E5BD00117FC9 /* huffdec.h */; }; + 084C320C0FE4E5BD00117FC9 /* huffman.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C31E70FE4E5BD00117FC9 /* huffman.h */; }; + 084C320D0FE4E5BD00117FC9 /* idct.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31E80FE4E5BD00117FC9 /* idct.c */; }; + 084C320E0FE4E5BD00117FC9 /* info.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31E90FE4E5BD00117FC9 /* info.c */; }; + 084C320F0FE4E5BD00117FC9 /* internal.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31EA0FE4E5BD00117FC9 /* internal.c */; }; + 084C32100FE4E5BD00117FC9 /* ocintrin.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C31EB0FE4E5BD00117FC9 /* ocintrin.h */; }; + 084C32110FE4E5BD00117FC9 /* quant.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31EC0FE4E5BD00117FC9 /* quant.c */; }; + 084C32120FE4E5BD00117FC9 /* quant.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C31ED0FE4E5BD00117FC9 /* quant.h */; }; + 084C32130FE4E5BD00117FC9 /* state.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31EE0FE4E5BD00117FC9 /* state.c */; }; + 084C32210FE4E5BD00117FC9 /* apiwrapper.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31D90FE4E5BD00117FC9 /* apiwrapper.c */; }; + 084C32220FE4E5BD00117FC9 /* apiwrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C31DA0FE4E5BD00117FC9 /* apiwrapper.h */; }; + 084C32230FE4E5BD00117FC9 /* bitpack.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31DB0FE4E5BD00117FC9 /* bitpack.c */; }; + 084C32240FE4E5BD00117FC9 /* bitpack.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C31DC0FE4E5BD00117FC9 /* bitpack.h */; }; + 084C32250FE4E5BD00117FC9 /* dct.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C31DD0FE4E5BD00117FC9 /* dct.h */; }; + 084C32260FE4E5BD00117FC9 /* decapiwrapper.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31DE0FE4E5BD00117FC9 /* decapiwrapper.c */; }; + 084C32270FE4E5BD00117FC9 /* decinfo.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31DF0FE4E5BD00117FC9 /* decinfo.c */; }; + 084C32280FE4E5BD00117FC9 /* decint.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C31E00FE4E5BD00117FC9 /* decint.h */; }; + 084C32290FE4E5BD00117FC9 /* decode.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31E10FE4E5BD00117FC9 /* decode.c */; }; + 084C322A0FE4E5BD00117FC9 /* dequant.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31E20FE4E5BD00117FC9 /* dequant.c */; }; + 084C322B0FE4E5BD00117FC9 /* dequant.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C31E30FE4E5BD00117FC9 /* dequant.h */; }; + 084C322C0FE4E5BD00117FC9 /* fragment.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31E40FE4E5BD00117FC9 /* fragment.c */; }; + 084C322D0FE4E5BD00117FC9 /* huffdec.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31E50FE4E5BD00117FC9 /* huffdec.c */; }; + 084C322E0FE4E5BD00117FC9 /* huffdec.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C31E60FE4E5BD00117FC9 /* huffdec.h */; }; + 084C322F0FE4E5BD00117FC9 /* huffman.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C31E70FE4E5BD00117FC9 /* huffman.h */; }; + 084C32300FE4E5BD00117FC9 /* idct.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31E80FE4E5BD00117FC9 /* idct.c */; }; + 084C32310FE4E5BD00117FC9 /* info.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31E90FE4E5BD00117FC9 /* info.c */; }; + 084C32320FE4E5BD00117FC9 /* internal.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31EA0FE4E5BD00117FC9 /* internal.c */; }; + 084C32330FE4E5BD00117FC9 /* ocintrin.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C31EB0FE4E5BD00117FC9 /* ocintrin.h */; }; + 084C32340FE4E5BD00117FC9 /* quant.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31EC0FE4E5BD00117FC9 /* quant.c */; }; + 084C32350FE4E5BD00117FC9 /* quant.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C31ED0FE4E5BD00117FC9 /* quant.h */; }; + 084C32360FE4E5BD00117FC9 /* state.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31EE0FE4E5BD00117FC9 /* state.c */; }; + 084C32620FE4E5D500117FC9 /* analyze.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C32450FE4E5D500117FC9 /* analyze.c */; }; + 084C32630FE4E5D500117FC9 /* encapiwrapper.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C32460FE4E5D500117FC9 /* encapiwrapper.c */; }; + 084C32640FE4E5D500117FC9 /* encfrag.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C32470FE4E5D500117FC9 /* encfrag.c */; }; + 084C32650FE4E5D500117FC9 /* encinfo.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C32480FE4E5D500117FC9 /* encinfo.c */; }; + 084C32660FE4E5D500117FC9 /* encint.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C32490FE4E5D500117FC9 /* encint.h */; }; + 084C32670FE4E5D500117FC9 /* encode.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C324A0FE4E5D500117FC9 /* encode.c */; }; + 084C32690FE4E5D500117FC9 /* enquant.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C324C0FE4E5D500117FC9 /* enquant.c */; }; + 084C326A0FE4E5D500117FC9 /* enquant.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C324D0FE4E5D500117FC9 /* enquant.h */; }; + 084C326B0FE4E5D500117FC9 /* fdct.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C324E0FE4E5D500117FC9 /* fdct.c */; }; + 084C326C0FE4E5D500117FC9 /* huffenc.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C324F0FE4E5D500117FC9 /* huffenc.c */; }; + 084C326D0FE4E5D500117FC9 /* huffenc.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C32500FE4E5D500117FC9 /* huffenc.h */; }; + 084C326E0FE4E5D500117FC9 /* mathops.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C32510FE4E5D500117FC9 /* mathops.c */; }; + 084C326F0FE4E5D500117FC9 /* mathops.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C32520FE4E5D500117FC9 /* mathops.h */; }; + 084C32700FE4E5D500117FC9 /* mcenc.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C32530FE4E5D500117FC9 /* mcenc.c */; }; + 084C32710FE4E5D500117FC9 /* modedec.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C32540FE4E5D500117FC9 /* modedec.h */; }; + 084C32720FE4E5D500117FC9 /* rate.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C32550FE4E5D500117FC9 /* rate.c */; }; + 084C32730FE4E5D500117FC9 /* tokenize.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C32560FE4E5D500117FC9 /* tokenize.c */; }; + 084C327D0FE4E5D500117FC9 /* analyze.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C32450FE4E5D500117FC9 /* analyze.c */; }; + 084C327E0FE4E5D500117FC9 /* encapiwrapper.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C32460FE4E5D500117FC9 /* encapiwrapper.c */; }; + 084C327F0FE4E5D500117FC9 /* encfrag.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C32470FE4E5D500117FC9 /* encfrag.c */; }; + 084C32800FE4E5D500117FC9 /* encinfo.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C32480FE4E5D500117FC9 /* encinfo.c */; }; + 084C32810FE4E5D500117FC9 /* encint.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C32490FE4E5D500117FC9 /* encint.h */; }; + 084C32820FE4E5D500117FC9 /* encode.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C324A0FE4E5D500117FC9 /* encode.c */; }; + 084C32840FE4E5D500117FC9 /* enquant.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C324C0FE4E5D500117FC9 /* enquant.c */; }; + 084C32850FE4E5D500117FC9 /* enquant.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C324D0FE4E5D500117FC9 /* enquant.h */; }; + 084C32860FE4E5D500117FC9 /* fdct.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C324E0FE4E5D500117FC9 /* fdct.c */; }; + 084C32870FE4E5D500117FC9 /* huffenc.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C324F0FE4E5D500117FC9 /* huffenc.c */; }; + 084C32880FE4E5D500117FC9 /* huffenc.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C32500FE4E5D500117FC9 /* huffenc.h */; }; + 084C32890FE4E5D500117FC9 /* mathops.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C32510FE4E5D500117FC9 /* mathops.c */; }; + 084C328A0FE4E5D500117FC9 /* mathops.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C32520FE4E5D500117FC9 /* mathops.h */; }; + 084C328B0FE4E5D500117FC9 /* mcenc.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C32530FE4E5D500117FC9 /* mcenc.c */; }; + 084C328C0FE4E5D500117FC9 /* modedec.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C32540FE4E5D500117FC9 /* modedec.h */; }; + 084C328D0FE4E5D500117FC9 /* rate.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C32550FE4E5D500117FC9 /* rate.c */; }; + 084C328E0FE4E5D500117FC9 /* tokenize.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C32560FE4E5D500117FC9 /* tokenize.c */; }; + 084C32A70FE4E7FE00117FC9 /* apiwrapper.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31D90FE4E5BD00117FC9 /* apiwrapper.c */; }; + 084C32A80FE4E7FF00117FC9 /* apiwrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C31DA0FE4E5BD00117FC9 /* apiwrapper.h */; }; + 084C32A90FE4E82500117FC9 /* dct.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C31DD0FE4E5BD00117FC9 /* dct.h */; }; + 084C32AA0FE4E83100117FC9 /* idct.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31E80FE4E5BD00117FC9 /* idct.c */; }; + 084C32AB0FE4E83300117FC9 /* internal.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31EA0FE4E5BD00117FC9 /* internal.c */; }; + 084C32AC0FE4E83600117FC9 /* fragment.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31E40FE4E5BD00117FC9 /* fragment.c */; }; + 084C32AD0FE4E84800117FC9 /* quant.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C31ED0FE4E5BD00117FC9 /* quant.h */; }; + 084C32AE0FE4E84A00117FC9 /* quant.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31EC0FE4E5BD00117FC9 /* quant.c */; }; + 084C32AF0FE4E84C00117FC9 /* ocintrin.h in Headers */ = {isa = PBXBuildFile; fileRef = 084C31EB0FE4E5BD00117FC9 /* ocintrin.h */; }; + 084C32B00FE4E84F00117FC9 /* state.c in Sources */ = {isa = PBXBuildFile; fileRef = 084C31EE0FE4E5BD00117FC9 /* state.c */; }; + 08D99AEC12526E77005A6116 /* mmxencfrag.c in Sources */ = {isa = PBXBuildFile; fileRef = 08E45537124A6B6D00721BF7 /* mmxencfrag.c */; }; + 08D99AED12526E7A005A6116 /* mmxfdct.c in Sources */ = {isa = PBXBuildFile; fileRef = 08E45538124A6B6D00721BF7 /* mmxfdct.c */; }; + 08D99AEE12526E87005A6116 /* mmxfrag.c in Sources */ = {isa = PBXBuildFile; fileRef = 08E45539124A6B6D00721BF7 /* mmxfrag.c */; }; + 08D99AEF12526E89005A6116 /* mmxidct.c in Sources */ = {isa = PBXBuildFile; fileRef = 08E4553A124A6B6D00721BF7 /* mmxidct.c */; }; + 08D99AF012526E90005A6116 /* mmxstate.c in Sources */ = {isa = PBXBuildFile; fileRef = 08E4553C124A6B6D00721BF7 /* mmxstate.c */; }; + 08D99AF112526E99005A6116 /* sse2encfrag.c in Sources */ = {isa = PBXBuildFile; fileRef = 08E4553D124A6B6D00721BF7 /* sse2encfrag.c */; }; + 08D99AF212526EA2005A6116 /* sse2idct.c in Sources */ = {isa = PBXBuildFile; fileRef = 08E4553F124A6B6D00721BF7 /* sse2idct.c */; }; + 08D99AF312526EAA005A6116 /* x86cpu.c in Sources */ = {isa = PBXBuildFile; fileRef = 08E45541124A6B6D00721BF7 /* x86cpu.c */; }; + 08D99AF412526EB0005A6116 /* x86enc.c in Sources */ = {isa = PBXBuildFile; fileRef = 08E45543124A6B6D00721BF7 /* x86enc.c */; }; + 08D99AF512526EB2005A6116 /* x86enquant.c in Sources */ = {isa = PBXBuildFile; fileRef = 08E45545124A6B6D00721BF7 /* x86enquant.c */; }; + 08D99AF612526EF8005A6116 /* x86state.c in Sources */ = {isa = PBXBuildFile; fileRef = 08E45547124A6B6D00721BF7 /* x86state.c */; }; + 08D99AFC12526F06005A6116 /* x86cpu.c in Sources */ = {isa = PBXBuildFile; fileRef = 08E45541124A6B6D00721BF7 /* x86cpu.c */; }; + 08D99AFD12526F14005A6116 /* sse2idct.c in Sources */ = {isa = PBXBuildFile; fileRef = 08E4553F124A6B6D00721BF7 /* sse2idct.c */; }; + 08D99AFE12526F2C005A6116 /* mmxstate.c in Sources */ = {isa = PBXBuildFile; fileRef = 08E4553C124A6B6D00721BF7 /* mmxstate.c */; }; + 08D99AFF12526F32005A6116 /* mmxidct.c in Sources */ = {isa = PBXBuildFile; fileRef = 08E4553A124A6B6D00721BF7 /* mmxidct.c */; }; + 08D99B0012526F33005A6116 /* mmxfrag.c in Sources */ = {isa = PBXBuildFile; fileRef = 08E45539124A6B6D00721BF7 /* mmxfrag.c */; }; + 08E45548124A6B6D00721BF7 /* mmxencfrag.c in Sources */ = {isa = PBXBuildFile; fileRef = 08E45537124A6B6D00721BF7 /* mmxencfrag.c */; }; + 08E45549124A6B6D00721BF7 /* mmxfdct.c in Sources */ = {isa = PBXBuildFile; fileRef = 08E45538124A6B6D00721BF7 /* mmxfdct.c */; }; + 08E4554A124A6B6D00721BF7 /* mmxfrag.c in Sources */ = {isa = PBXBuildFile; fileRef = 08E45539124A6B6D00721BF7 /* mmxfrag.c */; }; + 08E4554B124A6B6D00721BF7 /* mmxidct.c in Sources */ = {isa = PBXBuildFile; fileRef = 08E4553A124A6B6D00721BF7 /* mmxidct.c */; }; + 08E4554C124A6B6D00721BF7 /* mmxloop.h in Headers */ = {isa = PBXBuildFile; fileRef = 08E4553B124A6B6D00721BF7 /* mmxloop.h */; }; + 08E4554D124A6B6D00721BF7 /* mmxstate.c in Sources */ = {isa = PBXBuildFile; fileRef = 08E4553C124A6B6D00721BF7 /* mmxstate.c */; }; + 08E4554E124A6B6D00721BF7 /* sse2encfrag.c in Sources */ = {isa = PBXBuildFile; fileRef = 08E4553D124A6B6D00721BF7 /* sse2encfrag.c */; }; + 08E4554F124A6B6D00721BF7 /* sse2fdct.c in Sources */ = {isa = PBXBuildFile; fileRef = 08E4553E124A6B6D00721BF7 /* sse2fdct.c */; }; + 08E45550124A6B6D00721BF7 /* sse2idct.c in Sources */ = {isa = PBXBuildFile; fileRef = 08E4553F124A6B6D00721BF7 /* sse2idct.c */; }; + 08E45551124A6B6D00721BF7 /* sse2trans.h in Headers */ = {isa = PBXBuildFile; fileRef = 08E45540124A6B6D00721BF7 /* sse2trans.h */; }; + 08E45552124A6B6D00721BF7 /* x86cpu.c in Sources */ = {isa = PBXBuildFile; fileRef = 08E45541124A6B6D00721BF7 /* x86cpu.c */; }; + 08E45553124A6B6D00721BF7 /* x86cpu.h in Headers */ = {isa = PBXBuildFile; fileRef = 08E45542124A6B6D00721BF7 /* x86cpu.h */; }; + 08E45554124A6B6D00721BF7 /* x86enc.c in Sources */ = {isa = PBXBuildFile; fileRef = 08E45543124A6B6D00721BF7 /* x86enc.c */; }; + 08E45555124A6B6D00721BF7 /* x86enc.h in Headers */ = {isa = PBXBuildFile; fileRef = 08E45544124A6B6D00721BF7 /* x86enc.h */; }; + 08E45556124A6B6D00721BF7 /* x86enquant.c in Sources */ = {isa = PBXBuildFile; fileRef = 08E45545124A6B6D00721BF7 /* x86enquant.c */; }; + 08E45557124A6B6D00721BF7 /* x86int.h in Headers */ = {isa = PBXBuildFile; fileRef = 08E45546124A6B6D00721BF7 /* x86int.h */; }; + 08E45558124A6B6D00721BF7 /* x86state.c in Sources */ = {isa = PBXBuildFile; fileRef = 08E45547124A6B6D00721BF7 /* x86state.c */; }; + 097729950BCAC60000303091 /* codec.h in Headers */ = {isa = PBXBuildFile; fileRef = 097729930BCAC60000303091 /* codec.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 097729960BCAC60000303091 /* theoradec.h in Headers */ = {isa = PBXBuildFile; fileRef = 097729940BCAC60000303091 /* theoradec.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 37C9B0140EBB831F0046849C /* theoraenc.h in Headers */ = {isa = PBXBuildFile; fileRef = 37C9B0130EBB831F0046849C /* theoraenc.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 37CA8E390DD747F1005C8CB6 /* internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 37CA8E380DD747F1005C8CB6 /* internal.h */; }; + 734A751909D76ADD002D8FAE /* Ogg.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 734A751809D76ADD002D8FAE /* Ogg.framework */; }; + 734A75BF09D76BB9002D8FAE /* theora.h in Headers */ = {isa = PBXBuildFile; fileRef = 734A75BE09D76BB9002D8FAE /* theora.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8D07F2BE0486CC7A007CD1D0 /* Theora_Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = 32BAE0B70371A74B00C91783 /* Theora_Prefix.pch */; }; + 8D07F2C00486CC7A007CD1D0 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C1666FE841158C02AAC07 /* InfoPlist.strings */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 084C31D90FE4E5BD00117FC9 /* apiwrapper.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = apiwrapper.c; sourceTree = ""; }; + 084C31DA0FE4E5BD00117FC9 /* apiwrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = apiwrapper.h; sourceTree = ""; }; + 084C31DB0FE4E5BD00117FC9 /* bitpack.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bitpack.c; sourceTree = ""; }; + 084C31DC0FE4E5BD00117FC9 /* bitpack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bitpack.h; sourceTree = ""; }; + 084C31DD0FE4E5BD00117FC9 /* dct.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dct.h; sourceTree = ""; }; + 084C31DE0FE4E5BD00117FC9 /* decapiwrapper.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = decapiwrapper.c; sourceTree = ""; }; + 084C31DF0FE4E5BD00117FC9 /* decinfo.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = decinfo.c; sourceTree = ""; }; + 084C31E00FE4E5BD00117FC9 /* decint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = decint.h; sourceTree = ""; }; + 084C31E10FE4E5BD00117FC9 /* decode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = decode.c; sourceTree = ""; }; + 084C31E20FE4E5BD00117FC9 /* dequant.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dequant.c; sourceTree = ""; }; + 084C31E30FE4E5BD00117FC9 /* dequant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dequant.h; sourceTree = ""; }; + 084C31E40FE4E5BD00117FC9 /* fragment.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fragment.c; sourceTree = ""; }; + 084C31E50FE4E5BD00117FC9 /* huffdec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = huffdec.c; sourceTree = ""; }; + 084C31E60FE4E5BD00117FC9 /* huffdec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = huffdec.h; sourceTree = ""; }; + 084C31E70FE4E5BD00117FC9 /* huffman.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = huffman.h; sourceTree = ""; }; + 084C31E80FE4E5BD00117FC9 /* idct.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = idct.c; sourceTree = ""; }; + 084C31E90FE4E5BD00117FC9 /* info.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = info.c; sourceTree = ""; }; + 084C31EA0FE4E5BD00117FC9 /* internal.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = internal.c; sourceTree = ""; }; + 084C31EB0FE4E5BD00117FC9 /* ocintrin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ocintrin.h; sourceTree = ""; }; + 084C31EC0FE4E5BD00117FC9 /* quant.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = quant.c; sourceTree = ""; }; + 084C31ED0FE4E5BD00117FC9 /* quant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = quant.h; sourceTree = ""; }; + 084C31EE0FE4E5BD00117FC9 /* state.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = state.c; sourceTree = ""; }; + 084C32450FE4E5D500117FC9 /* analyze.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = analyze.c; sourceTree = ""; }; + 084C32460FE4E5D500117FC9 /* encapiwrapper.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = encapiwrapper.c; sourceTree = ""; }; + 084C32470FE4E5D500117FC9 /* encfrag.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = encfrag.c; sourceTree = ""; }; + 084C32480FE4E5D500117FC9 /* encinfo.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = encinfo.c; sourceTree = ""; }; + 084C32490FE4E5D500117FC9 /* encint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = encint.h; sourceTree = ""; }; + 084C324A0FE4E5D500117FC9 /* encode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = encode.c; sourceTree = ""; }; + 084C324B0FE4E5D500117FC9 /* encoder_disabled.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = encoder_disabled.c; sourceTree = ""; }; + 084C324C0FE4E5D500117FC9 /* enquant.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = enquant.c; sourceTree = ""; }; + 084C324D0FE4E5D500117FC9 /* enquant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = enquant.h; sourceTree = ""; }; + 084C324E0FE4E5D500117FC9 /* fdct.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fdct.c; sourceTree = ""; }; + 084C324F0FE4E5D500117FC9 /* huffenc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = huffenc.c; sourceTree = ""; }; + 084C32500FE4E5D500117FC9 /* huffenc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = huffenc.h; sourceTree = ""; }; + 084C32510FE4E5D500117FC9 /* mathops.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mathops.c; sourceTree = ""; }; + 084C32520FE4E5D500117FC9 /* mathops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mathops.h; sourceTree = ""; }; + 084C32530FE4E5D500117FC9 /* mcenc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mcenc.c; sourceTree = ""; }; + 084C32540FE4E5D500117FC9 /* modedec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = modedec.h; sourceTree = ""; }; + 084C32550FE4E5D500117FC9 /* rate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rate.c; sourceTree = ""; }; + 084C32560FE4E5D500117FC9 /* tokenize.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tokenize.c; sourceTree = ""; }; + 089C1667FE841158C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; + 08E45537124A6B6D00721BF7 /* mmxencfrag.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mmxencfrag.c; sourceTree = ""; }; + 08E45538124A6B6D00721BF7 /* mmxfdct.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mmxfdct.c; sourceTree = ""; }; + 08E45539124A6B6D00721BF7 /* mmxfrag.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mmxfrag.c; sourceTree = ""; }; + 08E4553A124A6B6D00721BF7 /* mmxidct.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mmxidct.c; sourceTree = ""; }; + 08E4553B124A6B6D00721BF7 /* mmxloop.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mmxloop.h; sourceTree = ""; }; + 08E4553C124A6B6D00721BF7 /* mmxstate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mmxstate.c; sourceTree = ""; }; + 08E4553D124A6B6D00721BF7 /* sse2encfrag.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sse2encfrag.c; sourceTree = ""; }; + 08E4553E124A6B6D00721BF7 /* sse2fdct.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sse2fdct.c; sourceTree = ""; }; + 08E4553F124A6B6D00721BF7 /* sse2idct.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sse2idct.c; sourceTree = ""; }; + 08E45540124A6B6D00721BF7 /* sse2trans.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sse2trans.h; sourceTree = ""; }; + 08E45541124A6B6D00721BF7 /* x86cpu.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = x86cpu.c; sourceTree = ""; }; + 08E45542124A6B6D00721BF7 /* x86cpu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86cpu.h; sourceTree = ""; }; + 08E45543124A6B6D00721BF7 /* x86enc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = x86enc.c; sourceTree = ""; }; + 08E45544124A6B6D00721BF7 /* x86enc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86enc.h; sourceTree = ""; }; + 08E45545124A6B6D00721BF7 /* x86enquant.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = x86enquant.c; sourceTree = ""; }; + 08E45546124A6B6D00721BF7 /* x86int.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86int.h; sourceTree = ""; }; + 08E45547124A6B6D00721BF7 /* x86state.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = x86state.c; sourceTree = ""; }; + 097729930BCAC60000303091 /* codec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = codec.h; path = ../include/theora/codec.h; sourceTree = SOURCE_ROOT; }; + 097729940BCAC60000303091 /* theoradec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = theoradec.h; path = ../include/theora/theoradec.h; sourceTree = SOURCE_ROOT; }; + 09C8F6430C82FBE500F72188 /* libtheoradec.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libtheoradec.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 32BAE0B70371A74B00C91783 /* Theora_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Theora_Prefix.pch; sourceTree = ""; }; + 37C9B0130EBB831F0046849C /* theoraenc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = theoraenc.h; path = ../include/theora/theoraenc.h; sourceTree = SOURCE_ROOT; }; + 37CA8E380DD747F1005C8CB6 /* internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = internal.h; path = ../lib/internal.h; sourceTree = SOURCE_ROOT; }; + 734A751809D76ADD002D8FAE /* Ogg.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Ogg.framework; path = /Library/Frameworks/Ogg.framework; sourceTree = ""; }; + 734A75BE09D76BB9002D8FAE /* theora.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = theora.h; path = ../include/theora/theora.h; sourceTree = SOURCE_ROOT; }; + 738837100B192732005C7A69 /* libtheoraenc.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libtheoraenc.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 8D07F2C70486CC7A007CD1D0 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; + 8D07F2C80486CC7A007CD1D0 /* Theora.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Theora.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 09C8F6410C82FBE500F72188 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7388370E0B192732005C7A69 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8D07F2C30486CC7A007CD1D0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 734A751909D76ADD002D8FAE /* Ogg.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 034768DDFF38A45A11DB9C8B /* Products */ = { + isa = PBXGroup; + children = ( + 8D07F2C80486CC7A007CD1D0 /* Theora.framework */, + 738837100B192732005C7A69 /* libtheoraenc.a */, + 09C8F6430C82FBE500F72188 /* libtheoradec.a */, + ); + name = Products; + sourceTree = ""; + }; + 084C31D80FE4E5BD00117FC9 /* lib */ = { + isa = PBXGroup; + children = ( + 08E45536124A6B6D00721BF7 /* x86 */, + 084C32450FE4E5D500117FC9 /* analyze.c */, + 084C32460FE4E5D500117FC9 /* encapiwrapper.c */, + 084C32470FE4E5D500117FC9 /* encfrag.c */, + 084C32480FE4E5D500117FC9 /* encinfo.c */, + 084C32490FE4E5D500117FC9 /* encint.h */, + 084C324A0FE4E5D500117FC9 /* encode.c */, + 084C324B0FE4E5D500117FC9 /* encoder_disabled.c */, + 084C324C0FE4E5D500117FC9 /* enquant.c */, + 084C324D0FE4E5D500117FC9 /* enquant.h */, + 084C324E0FE4E5D500117FC9 /* fdct.c */, + 084C324F0FE4E5D500117FC9 /* huffenc.c */, + 084C32500FE4E5D500117FC9 /* huffenc.h */, + 084C32510FE4E5D500117FC9 /* mathops.c */, + 084C32520FE4E5D500117FC9 /* mathops.h */, + 084C32530FE4E5D500117FC9 /* mcenc.c */, + 084C32540FE4E5D500117FC9 /* modedec.h */, + 084C32550FE4E5D500117FC9 /* rate.c */, + 084C32560FE4E5D500117FC9 /* tokenize.c */, + 084C31D90FE4E5BD00117FC9 /* apiwrapper.c */, + 084C31DA0FE4E5BD00117FC9 /* apiwrapper.h */, + 084C31DB0FE4E5BD00117FC9 /* bitpack.c */, + 084C31DC0FE4E5BD00117FC9 /* bitpack.h */, + 084C31DD0FE4E5BD00117FC9 /* dct.h */, + 084C31DE0FE4E5BD00117FC9 /* decapiwrapper.c */, + 084C31DF0FE4E5BD00117FC9 /* decinfo.c */, + 084C31E00FE4E5BD00117FC9 /* decint.h */, + 084C31E10FE4E5BD00117FC9 /* decode.c */, + 084C31E20FE4E5BD00117FC9 /* dequant.c */, + 084C31E30FE4E5BD00117FC9 /* dequant.h */, + 084C31E40FE4E5BD00117FC9 /* fragment.c */, + 084C31E50FE4E5BD00117FC9 /* huffdec.c */, + 084C31E60FE4E5BD00117FC9 /* huffdec.h */, + 084C31E70FE4E5BD00117FC9 /* huffman.h */, + 084C31E80FE4E5BD00117FC9 /* idct.c */, + 084C31E90FE4E5BD00117FC9 /* info.c */, + 084C31EA0FE4E5BD00117FC9 /* internal.c */, + 084C31EB0FE4E5BD00117FC9 /* ocintrin.h */, + 084C31EC0FE4E5BD00117FC9 /* quant.c */, + 084C31ED0FE4E5BD00117FC9 /* quant.h */, + 084C31EE0FE4E5BD00117FC9 /* state.c */, + ); + name = lib; + path = ../lib; + sourceTree = SOURCE_ROOT; + }; + 0867D691FE84028FC02AAC07 /* Theora */ = { + isa = PBXGroup; + children = ( + 734A75BD09D76B96002D8FAE /* Headers */, + 08FB77ACFE841707C02AAC07 /* Source */, + 089C1665FE841158C02AAC07 /* Resources */, + 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */, + 034768DDFF38A45A11DB9C8B /* Products */, + ); + name = Theora; + sourceTree = ""; + }; + 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = { + isa = PBXGroup; + children = ( + 734A751809D76ADD002D8FAE /* Ogg.framework */, + ); + name = "External Frameworks and Libraries"; + sourceTree = ""; + }; + 089C1665FE841158C02AAC07 /* Resources */ = { + isa = PBXGroup; + children = ( + 8D07F2C70486CC7A007CD1D0 /* Info.plist */, + 089C1666FE841158C02AAC07 /* InfoPlist.strings */, + ); + name = Resources; + sourceTree = ""; + }; + 08E45536124A6B6D00721BF7 /* x86 */ = { + isa = PBXGroup; + children = ( + 08E45537124A6B6D00721BF7 /* mmxencfrag.c */, + 08E45538124A6B6D00721BF7 /* mmxfdct.c */, + 08E45539124A6B6D00721BF7 /* mmxfrag.c */, + 08E4553A124A6B6D00721BF7 /* mmxidct.c */, + 08E4553B124A6B6D00721BF7 /* mmxloop.h */, + 08E4553C124A6B6D00721BF7 /* mmxstate.c */, + 08E4553D124A6B6D00721BF7 /* sse2encfrag.c */, + 08E4553E124A6B6D00721BF7 /* sse2fdct.c */, + 08E4553F124A6B6D00721BF7 /* sse2idct.c */, + 08E45540124A6B6D00721BF7 /* sse2trans.h */, + 08E45541124A6B6D00721BF7 /* x86cpu.c */, + 08E45542124A6B6D00721BF7 /* x86cpu.h */, + 08E45543124A6B6D00721BF7 /* x86enc.c */, + 08E45544124A6B6D00721BF7 /* x86enc.h */, + 08E45545124A6B6D00721BF7 /* x86enquant.c */, + 08E45546124A6B6D00721BF7 /* x86int.h */, + 08E45547124A6B6D00721BF7 /* x86state.c */, + ); + path = x86; + sourceTree = ""; + }; + 08FB77ACFE841707C02AAC07 /* Source */ = { + isa = PBXGroup; + children = ( + 084C31D80FE4E5BD00117FC9 /* lib */, + 37CA8E380DD747F1005C8CB6 /* internal.h */, + 32BAE0B70371A74B00C91783 /* Theora_Prefix.pch */, + ); + name = Source; + sourceTree = ""; + }; + 734A75BD09D76B96002D8FAE /* Headers */ = { + isa = PBXGroup; + children = ( + 37C9B0130EBB831F0046849C /* theoraenc.h */, + 097729940BCAC60000303091 /* theoradec.h */, + 097729930BCAC60000303091 /* codec.h */, + 734A75BE09D76BB9002D8FAE /* theora.h */, + ); + name = Headers; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 09C8F63F0C82FBE500F72188 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 084C32220FE4E5BD00117FC9 /* apiwrapper.h in Headers */, + 084C32240FE4E5BD00117FC9 /* bitpack.h in Headers */, + 084C32250FE4E5BD00117FC9 /* dct.h in Headers */, + 084C32280FE4E5BD00117FC9 /* decint.h in Headers */, + 084C322B0FE4E5BD00117FC9 /* dequant.h in Headers */, + 084C322E0FE4E5BD00117FC9 /* huffdec.h in Headers */, + 084C322F0FE4E5BD00117FC9 /* huffman.h in Headers */, + 084C32330FE4E5BD00117FC9 /* ocintrin.h in Headers */, + 084C32350FE4E5BD00117FC9 /* quant.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7388370C0B192732005C7A69 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 084C32810FE4E5D500117FC9 /* encint.h in Headers */, + 084C32850FE4E5D500117FC9 /* enquant.h in Headers */, + 084C32880FE4E5D500117FC9 /* huffenc.h in Headers */, + 084C328A0FE4E5D500117FC9 /* mathops.h in Headers */, + 084C328C0FE4E5D500117FC9 /* modedec.h in Headers */, + 084C32A80FE4E7FF00117FC9 /* apiwrapper.h in Headers */, + 084C32A90FE4E82500117FC9 /* dct.h in Headers */, + 084C32AD0FE4E84800117FC9 /* quant.h in Headers */, + 084C32AF0FE4E84C00117FC9 /* ocintrin.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8D07F2BD0486CC7A007CD1D0 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 8D07F2BE0486CC7A007CD1D0 /* Theora_Prefix.pch in Headers */, + 734A75BF09D76BB9002D8FAE /* theora.h in Headers */, + 097729950BCAC60000303091 /* codec.h in Headers */, + 097729960BCAC60000303091 /* theoradec.h in Headers */, + 37CA8E390DD747F1005C8CB6 /* internal.h in Headers */, + 37C9B0140EBB831F0046849C /* theoraenc.h in Headers */, + 084C31FF0FE4E5BD00117FC9 /* apiwrapper.h in Headers */, + 084C32010FE4E5BD00117FC9 /* bitpack.h in Headers */, + 084C32020FE4E5BD00117FC9 /* dct.h in Headers */, + 084C32050FE4E5BD00117FC9 /* decint.h in Headers */, + 084C32080FE4E5BD00117FC9 /* dequant.h in Headers */, + 084C320B0FE4E5BD00117FC9 /* huffdec.h in Headers */, + 084C320C0FE4E5BD00117FC9 /* huffman.h in Headers */, + 084C32100FE4E5BD00117FC9 /* ocintrin.h in Headers */, + 084C32120FE4E5BD00117FC9 /* quant.h in Headers */, + 084C32660FE4E5D500117FC9 /* encint.h in Headers */, + 084C326A0FE4E5D500117FC9 /* enquant.h in Headers */, + 084C326D0FE4E5D500117FC9 /* huffenc.h in Headers */, + 084C326F0FE4E5D500117FC9 /* mathops.h in Headers */, + 084C32710FE4E5D500117FC9 /* modedec.h in Headers */, + 08E4554C124A6B6D00721BF7 /* mmxloop.h in Headers */, + 08E45551124A6B6D00721BF7 /* sse2trans.h in Headers */, + 08E45553124A6B6D00721BF7 /* x86cpu.h in Headers */, + 08E45555124A6B6D00721BF7 /* x86enc.h in Headers */, + 08E45557124A6B6D00721BF7 /* x86int.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 09C8F6420C82FBE500F72188 /* libtheoradec (static) */ = { + isa = PBXNativeTarget; + buildConfigurationList = 09C8F6610C82FC3E00F72188 /* Build configuration list for PBXNativeTarget "libtheoradec (static)" */; + buildPhases = ( + 09C8F63F0C82FBE500F72188 /* Headers */, + 09C8F6400C82FBE500F72188 /* Sources */, + 09C8F6410C82FBE500F72188 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "libtheoradec (static)"; + productName = libtheoradec; + productReference = 09C8F6430C82FBE500F72188 /* libtheoradec.a */; + productType = "com.apple.product-type.library.static"; + }; + 7388370F0B192732005C7A69 /* libtheoraenc (static) */ = { + isa = PBXNativeTarget; + buildConfigurationList = 738837110B19277F005C7A69 /* Build configuration list for PBXNativeTarget "libtheoraenc (static)" */; + buildPhases = ( + 7388370C0B192732005C7A69 /* Headers */, + 7388370D0B192732005C7A69 /* Sources */, + 7388370E0B192732005C7A69 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "libtheoraenc (static)"; + productName = theora; + productReference = 738837100B192732005C7A69 /* libtheoraenc.a */; + productType = "com.apple.product-type.library.static"; + }; + 8D07F2BC0486CC7A007CD1D0 /* Theora */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4FADC24208B4156D00ABE55E /* Build configuration list for PBXNativeTarget "Theora" */; + buildPhases = ( + 8D07F2BD0486CC7A007CD1D0 /* Headers */, + 8D07F2BF0486CC7A007CD1D0 /* Resources */, + 8D07F2C10486CC7A007CD1D0 /* Sources */, + 8D07F2C30486CC7A007CD1D0 /* Frameworks */, + 8D07F2C50486CC7A007CD1D0 /* Rez */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Theora; + productInstallPath = "$(HOME)/Library/Frameworks"; + productName = Theora; + productReference = 8D07F2C80486CC7A007CD1D0 /* Theora.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 0867D690FE84028FC02AAC07 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject "Theora" */; + compatibilityVersion = "Xcode 2.4"; + hasScannedForEncodings = 1; + mainGroup = 0867D691FE84028FC02AAC07 /* Theora */; + productRefGroup = 034768DDFF38A45A11DB9C8B /* Products */; + projectDirPath = ""; + projectRoot = ..; + targets = ( + 8D07F2BC0486CC7A007CD1D0 /* Theora */, + 7388370F0B192732005C7A69 /* libtheoraenc (static) */, + 09C8F6420C82FBE500F72188 /* libtheoradec (static) */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 8D07F2BF0486CC7A007CD1D0 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8D07F2C00486CC7A007CD1D0 /* InfoPlist.strings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXRezBuildPhase section */ + 8D07F2C50486CC7A007CD1D0 /* Rez */ = { + isa = PBXRezBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXRezBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 09C8F6400C82FBE500F72188 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 084C32210FE4E5BD00117FC9 /* apiwrapper.c in Sources */, + 084C32230FE4E5BD00117FC9 /* bitpack.c in Sources */, + 084C32260FE4E5BD00117FC9 /* decapiwrapper.c in Sources */, + 084C32270FE4E5BD00117FC9 /* decinfo.c in Sources */, + 084C32290FE4E5BD00117FC9 /* decode.c in Sources */, + 084C322A0FE4E5BD00117FC9 /* dequant.c in Sources */, + 084C322C0FE4E5BD00117FC9 /* fragment.c in Sources */, + 084C322D0FE4E5BD00117FC9 /* huffdec.c in Sources */, + 084C32300FE4E5BD00117FC9 /* idct.c in Sources */, + 084C32310FE4E5BD00117FC9 /* info.c in Sources */, + 084C32320FE4E5BD00117FC9 /* internal.c in Sources */, + 084C32340FE4E5BD00117FC9 /* quant.c in Sources */, + 084C32360FE4E5BD00117FC9 /* state.c in Sources */, + 08D99AF612526EF8005A6116 /* x86state.c in Sources */, + 08D99AFC12526F06005A6116 /* x86cpu.c in Sources */, + 08D99AFD12526F14005A6116 /* sse2idct.c in Sources */, + 08D99AFE12526F2C005A6116 /* mmxstate.c in Sources */, + 08D99AFF12526F32005A6116 /* mmxidct.c in Sources */, + 08D99B0012526F33005A6116 /* mmxfrag.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7388370D0B192732005C7A69 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 084C327D0FE4E5D500117FC9 /* analyze.c in Sources */, + 084C327E0FE4E5D500117FC9 /* encapiwrapper.c in Sources */, + 084C327F0FE4E5D500117FC9 /* encfrag.c in Sources */, + 084C32800FE4E5D500117FC9 /* encinfo.c in Sources */, + 084C32820FE4E5D500117FC9 /* encode.c in Sources */, + 084C32840FE4E5D500117FC9 /* enquant.c in Sources */, + 084C32860FE4E5D500117FC9 /* fdct.c in Sources */, + 084C32870FE4E5D500117FC9 /* huffenc.c in Sources */, + 084C32890FE4E5D500117FC9 /* mathops.c in Sources */, + 084C328B0FE4E5D500117FC9 /* mcenc.c in Sources */, + 084C328D0FE4E5D500117FC9 /* rate.c in Sources */, + 084C328E0FE4E5D500117FC9 /* tokenize.c in Sources */, + 084C32A70FE4E7FE00117FC9 /* apiwrapper.c in Sources */, + 084C32AA0FE4E83100117FC9 /* idct.c in Sources */, + 084C32AB0FE4E83300117FC9 /* internal.c in Sources */, + 084C32AC0FE4E83600117FC9 /* fragment.c in Sources */, + 084C32AE0FE4E84A00117FC9 /* quant.c in Sources */, + 084C32B00FE4E84F00117FC9 /* state.c in Sources */, + 08D99AEC12526E77005A6116 /* mmxencfrag.c in Sources */, + 08D99AED12526E7A005A6116 /* mmxfdct.c in Sources */, + 08D99AEE12526E87005A6116 /* mmxfrag.c in Sources */, + 08D99AEF12526E89005A6116 /* mmxidct.c in Sources */, + 08D99AF012526E90005A6116 /* mmxstate.c in Sources */, + 08D99AF112526E99005A6116 /* sse2encfrag.c in Sources */, + 08D99AF212526EA2005A6116 /* sse2idct.c in Sources */, + 08D99AF312526EAA005A6116 /* x86cpu.c in Sources */, + 08D99AF412526EB0005A6116 /* x86enc.c in Sources */, + 08D99AF512526EB2005A6116 /* x86enquant.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8D07F2C10486CC7A007CD1D0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 084C31FE0FE4E5BD00117FC9 /* apiwrapper.c in Sources */, + 084C32000FE4E5BD00117FC9 /* bitpack.c in Sources */, + 084C32030FE4E5BD00117FC9 /* decapiwrapper.c in Sources */, + 084C32040FE4E5BD00117FC9 /* decinfo.c in Sources */, + 084C32060FE4E5BD00117FC9 /* decode.c in Sources */, + 084C32070FE4E5BD00117FC9 /* dequant.c in Sources */, + 084C32090FE4E5BD00117FC9 /* fragment.c in Sources */, + 084C320A0FE4E5BD00117FC9 /* huffdec.c in Sources */, + 084C320D0FE4E5BD00117FC9 /* idct.c in Sources */, + 084C320E0FE4E5BD00117FC9 /* info.c in Sources */, + 084C320F0FE4E5BD00117FC9 /* internal.c in Sources */, + 084C32110FE4E5BD00117FC9 /* quant.c in Sources */, + 084C32130FE4E5BD00117FC9 /* state.c in Sources */, + 084C32620FE4E5D500117FC9 /* analyze.c in Sources */, + 084C32630FE4E5D500117FC9 /* encapiwrapper.c in Sources */, + 084C32640FE4E5D500117FC9 /* encfrag.c in Sources */, + 084C32650FE4E5D500117FC9 /* encinfo.c in Sources */, + 084C32670FE4E5D500117FC9 /* encode.c in Sources */, + 084C32690FE4E5D500117FC9 /* enquant.c in Sources */, + 084C326B0FE4E5D500117FC9 /* fdct.c in Sources */, + 084C326C0FE4E5D500117FC9 /* huffenc.c in Sources */, + 084C326E0FE4E5D500117FC9 /* mathops.c in Sources */, + 084C32700FE4E5D500117FC9 /* mcenc.c in Sources */, + 084C32720FE4E5D500117FC9 /* rate.c in Sources */, + 084C32730FE4E5D500117FC9 /* tokenize.c in Sources */, + 08E45548124A6B6D00721BF7 /* mmxencfrag.c in Sources */, + 08E45549124A6B6D00721BF7 /* mmxfdct.c in Sources */, + 08E4554A124A6B6D00721BF7 /* mmxfrag.c in Sources */, + 08E4554B124A6B6D00721BF7 /* mmxidct.c in Sources */, + 08E4554D124A6B6D00721BF7 /* mmxstate.c in Sources */, + 08E4554E124A6B6D00721BF7 /* sse2encfrag.c in Sources */, + 08E4554F124A6B6D00721BF7 /* sse2fdct.c in Sources */, + 08E45550124A6B6D00721BF7 /* sse2idct.c in Sources */, + 08E45552124A6B6D00721BF7 /* x86cpu.c in Sources */, + 08E45554124A6B6D00721BF7 /* x86enc.c in Sources */, + 08E45556124A6B6D00721BF7 /* x86enquant.c in Sources */, + 08E45558124A6B6D00721BF7 /* x86state.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 089C1666FE841158C02AAC07 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 089C1667FE841158C02AAC07 /* English */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 09C8F6620C82FC3E00F72188 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + ../../ogg/include, + ); + INSTALL_PATH = /usr/local/lib; + PREBINDING = NO; + PRODUCT_NAME = theoradec; + ZERO_LINK = YES; + }; + name = Debug; + }; + 09C8F6630C82FC3E00F72188 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + ../../ogg/include, + ); + INSTALL_PATH = /usr/local/lib; + PREBINDING = NO; + PRODUCT_NAME = theoradec; + ZERO_LINK = NO; + }; + name = Release; + }; + 4FADC24308B4156D00ABE55E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + /Library/Frameworks, + ); + FRAMEWORK_VERSION = A; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = Theora_Prefix.pch; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = /Library/Frameworks; + LIBRARY_STYLE = DYNAMIC; + MACH_O_TYPE = mh_dylib; + OTHER_LDFLAGS_i386 = "-Wl,-read_only_relocs,suppress"; + PRODUCT_NAME = Theora; + WRAPPER_EXTENSION = framework; + ZERO_LINK = YES; + }; + name = Debug; + }; + 4FADC24408B4156D00ABE55E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + /Library/Frameworks, + ); + FRAMEWORK_VERSION = A; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = Theora_Prefix.pch; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = /Library/Frameworks; + LIBRARY_STYLE = DYNAMIC; + MACH_O_TYPE = mh_dylib; + OTHER_LDFLAGS_i386 = "-Wl,-read_only_relocs,suppress"; + PREBINDING = YES; + PRODUCT_NAME = Theora; + WRAPPER_EXTENSION = framework; + }; + name = Release; + }; + 4FADC24708B4156D00ABE55E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(GCC_PREPROCESSOR_DEFINITIONS)", + __MACOSX__, + ); + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + ../include, + "../lib/**", + ); + OTHER_CFLAGS = ""; + PREBINDING = NO; + SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; + }; + name = Debug; + }; + 4FADC24808B4156D00ABE55E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_BIT_PRE_XCODE_3_1)"; + ARCHS_STANDARD_32_BIT_PRE_XCODE_3_1 = "ppc i386"; + GCC_OPTIMIZATION_LEVEL = 3; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(GCC_PREPROCESSOR_DEFINITIONS)", + __MACOSX__, + ); + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + ../include, + "../lib/**", + ); + OTHER_CFLAGS = ( + "$(OTHER_CFLAGS)", + "-falign-loops=16", + "-fforce-addr", + "-fomit-frame-pointer", + "-finline-functions", + "-funroll-loops", + ); + PER_ARCH_CFLAGS_i386 = "-DOC_X86_ASM"; + PREBINDING = NO; + SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; + }; + name = Release; + }; + 738837120B19277F005C7A69 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + ../../ogg/include, + ); + INSTALL_PATH = /usr/local/lib; + PREBINDING = NO; + PRODUCT_NAME = theoraenc; + ZERO_LINK = YES; + }; + name = Debug; + }; + 738837130B19277F005C7A69 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + ../../ogg/include, + ); + INSTALL_PATH = /usr/local/lib; + PREBINDING = NO; + PRODUCT_NAME = theoraenc; + ZERO_LINK = NO; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 09C8F6610C82FC3E00F72188 /* Build configuration list for PBXNativeTarget "libtheoradec (static)" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 09C8F6620C82FC3E00F72188 /* Debug */, + 09C8F6630C82FC3E00F72188 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4FADC24208B4156D00ABE55E /* Build configuration list for PBXNativeTarget "Theora" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4FADC24308B4156D00ABE55E /* Debug */, + 4FADC24408B4156D00ABE55E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject "Theora" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4FADC24708B4156D00ABE55E /* Debug */, + 4FADC24808B4156D00ABE55E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 738837110B19277F005C7A69 /* Build configuration list for PBXNativeTarget "libtheoraenc (static)" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 738837120B19277F005C7A69 /* Debug */, + 738837130B19277F005C7A69 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 0867D690FE84028FC02AAC07 /* Project object */; +} diff --git a/cs/3rd party/libtheora/macosx/Theora_Prefix.pch b/cs/3rd party/libtheora/macosx/Theora_Prefix.pch new file mode 100644 index 000000000..ddae8072f --- /dev/null +++ b/cs/3rd party/libtheora/macosx/Theora_Prefix.pch @@ -0,0 +1,5 @@ +// +// Prefix header for all source files of the 'Theora' target in the 'Theora' project. +// + +#include diff --git a/cs/3rd party/libtheora/symbian/bld.inf b/cs/3rd party/libtheora/symbian/bld.inf new file mode 100644 index 000000000..56a1514cf --- /dev/null +++ b/cs/3rd party/libtheora/symbian/bld.inf @@ -0,0 +1,35 @@ +/* + Copyright (C) 2003 Commonwealth Scientific and Industrial Research + Organisation (CSIRO) Australia + + 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 CSIRO Australia 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 ORGANISATION 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. +*/ + +PRJ_MMPFILES + +theora.mmp diff --git a/cs/3rd party/libtheora/symbian/theora.mmp b/cs/3rd party/libtheora/symbian/theora.mmp new file mode 100644 index 000000000..70e0df324 --- /dev/null +++ b/cs/3rd party/libtheora/symbian/theora.mmp @@ -0,0 +1,41 @@ +/* + Copyright (C) 2003 Commonwealth Scientific and Industrial Research + Organisation (CSIRO) Australia + + 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 CSIRO Australia 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 ORGANISATION 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. +*/ + +TARGET theora.lib +TARGETTYPE lib +UID 0 +MACRO HAVE_CONFIG_H +SOURCEPATH ..\lib +SOURCE blockmap.c comment.c dct.c dct_decode.c decode.c frarray.c frinit.c huffman.c +SOURCE idct.c mcomp.c misc_common.c pb.c pp.c quant.c reconstruct.c scan.c toplevel.c encoder_disabled.c +USERINCLUDE . +SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\include ..\..\ogg\include ..\..\ogg\symbian diff --git a/cs/3rd party/libtheora/tests/Makefile.am b/cs/3rd party/libtheora/tests/Makefile.am new file mode 100644 index 000000000..5501bd59f --- /dev/null +++ b/cs/3rd party/libtheora/tests/Makefile.am @@ -0,0 +1,68 @@ +noinst_HEADERS = tests.h + +AM_CPPFLAGS = -I$(top_srcdir)/include +AM_CFLAGS = $(OGG_CFLAGS) + +THEORADIR = ../lib +THEORA_LIBS = $(THEORADIR)/libtheora.la $(OGG_LIBS) +THEORADEC_LIBS = $(THEORADIR)/libtheoradec.la $(OGG_LIBS) +THEORAENC_LIBS = $(THEORADIR)/libtheoraenc.la \ + $(THEORADIR)/libtheoradec.la $(OGG_LIBS) +test: check + +TESTS_ENVIRONMENT = $(VALGRIND_ENVIRONMENT) + +TESTS_DEC = noop_theora \ + comment comment_theoradec comment_theora + +TESTS_ENC = noop noop_theoraenc \ + granulepos granulepos_theoraenc granulepos_theora + +if THEORA_DISABLE_ENCODE +TESTS = $(TESTS_DEC) +else +TESTS = $(TESTS_DEC) $(TESTS_ENC) +endif + +check_PROGRAMS = $(TESTS) +# dummy call tests for the current api +noop_SOURCES = noop.c +noop_LDADD = $(THEORAENC_LIBS) +noop_CFLAGS = $(OGG_CFLAGS) + +# dummy call tests for the pre-1.0 legacy api with current link line +noop_theoraenc_SOURCES = noop_theora.c +noop_theoraenc_LDADD = $(THEORAENC_LIBS) +noop_theoraenc_CFLAGS = $(OGG_CFLAGS) + +# dummy call tests for the pre-1.0 legacy api with legacy link line +noop_theora_SOURCES = noop_theora.c +noop_theora_LDADD = $(THEORA_LIBS) +noop_theora_CFLAGS = $(OGG_CFLAGS) + +# comment utilities for the current api +comment_SOURCES = comment.c +comment_LDADD = $(THEORADEC_LIBS) +comment_CFLAGS = $(OGG_CFLAGS) + +# comment utilities for the legacy api and current lib +comment_theoradec_SOURCES = comment.c +comment_theoradec_LDADD = $(THEORADEC_LIBS) +comment_theoradec_CFLAGS = $(OGG_CFLAGS) + +# comment utilities for the legacy api and legacy lib +comment_theora_SOURCES = comment_theora.c +comment_theora_LDADD = $(THEORA_LIBS) +comment_theora_CFLAGS = $(OGG_CFLAGS) + +granulepos_SOURCES = granulepos.c +granulepos_LDADD = $(THEORAENC_LIBS) -lm +granulepos_CFLAGS = $(OGG_CFLAGS) + +granulepos_theoraenc_SOURCES = granulepos_theora.c +granulepos_theoraenc_LDADD = $(THEORAENC_LIBS) -lm +granulepos_theoraenc_CFLAGS = $(OGG_CFLAGS) + +granulepos_theora_SOURCES = granulepos_theora.c +granulepos_theora_LDADD = $(THEORA_LIBS) -lm +granulepos_theora_CFLAGS = $(OGG_CFLAGS) diff --git a/cs/3rd party/libtheora/tests/comment.c b/cs/3rd party/libtheora/tests/comment.c new file mode 100644 index 000000000..e08f3f14a --- /dev/null +++ b/cs/3rd party/libtheora/tests/comment.c @@ -0,0 +1,91 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggTheora SOFTWARE 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 Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: routines for validating comment header code + last mod: $Id$ + + ********************************************************************/ + +#include + +#include +#include "tests.h" + +#define ARTIST1 "Bug-eyed Fish" +#define ARTIST2 "VJ Fugu" +#define COPYRIGHT "Copyright (C) 2005. Some Rights Reserved." +#define LICENSE "Creative Commons Attribution-ShareAlike 2.5" + +static int +test_comments () +{ + th_comment tc; + int n; + char * value; + + INFO ("+ Initializing th_comment"); + th_comment_init (&tc); + + INFO ("+ Adding ARTIST1"); + th_comment_add (&tc, "ARTIST=" ARTIST1); + + INFO ("+ Adding LICENSE by tag"); + th_comment_add_tag (&tc, "LICENSE", LICENSE); + + INFO ("+ Adding ARTIST2 by tag"); + th_comment_add_tag (&tc, "ARTIST", ARTIST2); + + INFO ("+ Querying value of LICENSE"); + value = th_comment_query (&tc, "LICENSE", 0); + printf("foo %s\n", value); + + if (strcmp (value, LICENSE)) + FAIL ("Incorrect value for LICENSE"); + + INFO ("+ Querying count of ARTIST comments"); + n = th_comment_query_count (&tc, "ARTIST"); + + if (n != 2) + FAIL ("Incorrect count of ARTIST comments"); + + INFO ("+ Querying value of ARTIST index 0"); + value = th_comment_query (&tc, "ARTIST", 0); + if (strcmp (value, ARTIST1)) + FAIL ("Incorrect value for ARTIST index 0"); + + INFO ("+ Querying value of ARTIST index 1"); + value = th_comment_query (&tc, "ARTIST", 1); + if (strcmp (value, ARTIST2)) + FAIL ("Incorrect value for ARTIST index 1"); + + INFO ("+ Querying value of ARTIST index 2 (out of bounds)"); + value = th_comment_query (&tc, "ARTIST", 2); + if (value != NULL) + FAIL ("Non-NULL value for ARTIST index 2 (out of bounds)"); + + INFO ("+ Querying value of UNDEF index 7 (tag not defined)"); + value = th_comment_query (&tc, "UNDEF", 7); + if (value != NULL) + FAIL ("Non-NULL value for UNDEF index 7 (tag not defined)"); + + INFO ("+ Clearing th_comment"); + th_comment_clear (&tc); + + return 0; +} + +int main(int argc, char *argv[]) +{ + test_comments (); + + exit (0); +} diff --git a/cs/3rd party/libtheora/tests/comment_theora.c b/cs/3rd party/libtheora/tests/comment_theora.c new file mode 100644 index 000000000..3b2ca5e39 --- /dev/null +++ b/cs/3rd party/libtheora/tests/comment_theora.c @@ -0,0 +1,91 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggTheora SOFTWARE 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 Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: routines for validating comment header code + last mod: $Id$ + + ********************************************************************/ + +#include + +#include +#include "tests.h" + +#define ARTIST1 "Bug-eyed Fish" +#define ARTIST2 "VJ Fugu" +#define COPYRIGHT "Copyright (C) 2005. Some Rights Reserved." +#define LICENSE "Creative Commons Attribution-ShareAlike 2.5" + +static int +test_comments () +{ + theora_comment tc; + int n; + char * value; + + INFO ("+ Initializing theora_comment"); + theora_comment_init (&tc); + + INFO ("+ Adding ARTIST1"); + theora_comment_add (&tc, "ARTIST=" ARTIST1); + + INFO ("+ Adding LICENSE by tag"); + theora_comment_add_tag (&tc, "LICENSE", LICENSE); + + INFO ("+ Adding ARTIST2 by tag"); + theora_comment_add_tag (&tc, "ARTIST", ARTIST2); + + INFO ("+ Querying value of LICENSE"); + value = theora_comment_query (&tc, "LICENSE", 0); + printf("foo %s\n", value); + + if (strcmp (value, LICENSE)) + FAIL ("Incorrect value for LICENSE"); + + INFO ("+ Querying count of ARTIST comments"); + n = theora_comment_query_count (&tc, "ARTIST"); + + if (n != 2) + FAIL ("Incorrect count of ARTIST comments"); + + INFO ("+ Querying value of ARTIST index 0"); + value = theora_comment_query (&tc, "ARTIST", 0); + if (strcmp (value, ARTIST1)) + FAIL ("Incorrect value for ARTIST index 0"); + + INFO ("+ Querying value of ARTIST index 1"); + value = theora_comment_query (&tc, "ARTIST", 1); + if (strcmp (value, ARTIST2)) + FAIL ("Incorrect value for ARTIST index 1"); + + INFO ("+ Querying value of ARTIST index 2 (out of bounds)"); + value = theora_comment_query (&tc, "ARTIST", 2); + if (value != NULL) + FAIL ("Non-NULL value for ARTIST index 2 (out of bounds)"); + + INFO ("+ Querying value of UNDEF index 7 (tag not defined)"); + value = theora_comment_query (&tc, "UNDEF", 7); + if (value != NULL) + FAIL ("Non-NULL value for UNDEF index 7 (tag not defined)"); + + INFO ("+ Clearing theora_comment"); + theora_comment_clear (&tc); + + return 0; +} + +int main(int argc, char *argv[]) +{ + test_comments (); + + exit (0); +} diff --git a/cs/3rd party/libtheora/tests/granulepos.c b/cs/3rd party/libtheora/tests/granulepos.c new file mode 100644 index 000000000..c00bfd451 --- /dev/null +++ b/cs/3rd party/libtheora/tests/granulepos.c @@ -0,0 +1,149 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggTheora SOFTWARE 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 Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: routines for validating encoder granulepos generation + last mod: $Id$ + + ********************************************************************/ + +#include +#include +#include + +#include "tests.h" + +static int ilog(unsigned int v){ + int ret=0; + while(v){ + ret++; + v>>=1; + } + return(ret); +} + +static int +granulepos_test_encode (int frequency) +{ + th_info ti; + th_enc_ctx *te; + int result; + int frame, tframe, keyframe, keydist; + int shift; + double rate, ttime; + th_ycbcr_buffer yuv; + unsigned char *framedata; + ogg_packet op; + long long int last_granule = -1; + +/* INFO ("+ Initializing th_info struct"); */ + th_info_init (&ti); + + ti.frame_width = 32; + ti.frame_height = 32; + ti.pic_width = ti.frame_width; + ti.pic_height = ti.frame_height; + ti.pic_x = 0; + ti.pic_y = 0; + ti.fps_numerator = 16; + ti.fps_denominator = 1; + ti.aspect_numerator = 1; + ti.aspect_denominator = 1; + ti.colorspace = TH_CS_UNSPECIFIED; + ti.pixel_fmt = TH_PF_420; + ti.quality = 16; + ti.keyframe_granule_shift=ilog(frequency); + +/* INFO ("+ Allocating encoder context"); */ + te = th_encode_alloc(&ti); + if (te == NULL) { + INFO ("+ Clearing th_info"); + th_info_clear(&ti); + FAIL ("negative return code initializing encoder"); + } + +/* INFO ("+ Setting up dummy 4:2:0 frame data"); */ + framedata = calloc(ti.frame_height, ti.frame_width); + yuv[0].width = ti.frame_width; + yuv[0].height = ti.frame_height; + yuv[0].stride = ti.frame_width; + yuv[0].data = framedata; + yuv[1].width = ti.frame_width / 2; + yuv[1].height = ti.frame_width / 2; + yuv[1].stride = ti.frame_width; + yuv[1].data = framedata; + yuv[2].width = ti.frame_width / 2; + yuv[2].height = ti.frame_width / 2; + yuv[2].stride = ti.frame_width; + yuv[2].data = framedata; + + INFO ("+ Checking granulepos generation"); + shift = ti.keyframe_granule_shift; + rate = (double)ti.fps_denominator/ti.fps_numerator; + for (frame = 0; frame < frequency * 2 + 1; frame++) { + result = th_encode_ycbcr_in (te, yuv); + if (result < 0) { + printf("th_encode_ycbcr_in() returned %d\n", result); + FAIL ("negative error code submitting frame for compression"); + } + result = th_encode_packetout (te, frame >= frequency * 2, &op); + if (result <= 0) { + printf("th_encode_packetout() returned %d\n", result); + FAIL("failed to retrieve compressed frame"); + } + if ((long long int)op.granulepos < last_granule) + FAIL ("encoder returned a decreasing granulepos value"); + last_granule = op.granulepos; + keyframe = op.granulepos >> shift; + keydist = op.granulepos - (keyframe << shift); + tframe = th_granule_frame (te, op.granulepos); + ttime = th_granule_time(te, op.granulepos); +#if DEBUG + printf("++ frame %d granulepos %lld %d:%d %d %.3lfs\n", + frame, (long long int)op.granulepos, keyframe, keydist, + tframe, th_granule_time (te, op.granulepos)); +#endif + /* granulepos stores the frame count */ + if ((keyframe + keydist) != frame + 1) + FAIL ("encoder granulepos does not map to the correct frame number"); + /* th_granule_frame() returns the frame index */ + if (tframe != frame) + FAIL ("th_granule_frame() returned incorrect results"); + /* th_granule_time() returns the end time */ + if (fabs(rate*(frame+1) - ttime) > 1.0e-6) + FAIL ("th_granule_time() returned incorrect results"); + } + + /* clean up */ +/* INFO ("+ Freeing dummy frame data"); */ + free(framedata); + +/* INFO ("+ Clearing th_info struct"); */ + th_info_clear(&ti); + +/* INFO ("+ Freeing encoder context"); */ + th_encode_free(te); + + return 0; +} + +int main(int argc, char *argv[]) +{ + + granulepos_test_encode (1); + granulepos_test_encode (2); + granulepos_test_encode (3); + granulepos_test_encode (4); + granulepos_test_encode (8); + granulepos_test_encode (64); + + exit (0); +} diff --git a/cs/3rd party/libtheora/tests/granulepos_theora.c b/cs/3rd party/libtheora/tests/granulepos_theora.c new file mode 100644 index 000000000..ddc81f9a0 --- /dev/null +++ b/cs/3rd party/libtheora/tests/granulepos_theora.c @@ -0,0 +1,145 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggTheora SOFTWARE 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 Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: routines for validating encoder granulepos generation + last mod: $Id$ + + ********************************************************************/ + +#include +#include +#include + +#include "tests.h" + +static int +granulepos_test_encode (int frequency, int auto_p) +{ + theora_info ti; + theora_state th; + int result; + int frame, tframe, keyframe, keydist; + int shift; + double rate, ttime; + yuv_buffer yuv; + unsigned char *framedata; + ogg_packet op; + long long int last_granule = -1; + +/* INFO ("+ Initializing theora_info struct"); */ + theora_info_init (&ti); + + ti.width = 32; + ti.height = 32; + ti.frame_width = ti.width; + ti.frame_height = ti.frame_height; + ti.offset_x = 0; + ti.offset_y = 0; + ti.fps_numerator = 16; + ti.fps_denominator = 1; + ti.aspect_numerator = 1; + ti.aspect_denominator = 1; + ti.colorspace = OC_CS_UNSPECIFIED; + ti.pixelformat = OC_PF_420; + ti.target_bitrate = 0; + ti.quality = 16; + + ti.dropframes_p = 0; + ti.quick_p = 1; + + /* check variations of automatic or forced keyframe choice */ + ti.keyframe_auto_p = auto_p; + /* check with variations of the maximum gap */ + ti.keyframe_frequency = frequency; + ti.keyframe_frequency_force = frequency; + + ti.keyframe_data_target_bitrate = ti.target_bitrate * 1.5; + ti.keyframe_auto_threshold = 80; + ti.keyframe_mindistance = MIN(8, frequency); + ti.noise_sensitivity = 1; + +/* INFO ("+ Initializing theora_state for encoding"); */ + result = theora_encode_init (&th, &ti); + if (result == OC_DISABLED) { + INFO ("+ Clearing theora_state"); + theora_clear (&th); + } else if (result < 0) { + FAIL ("negative return code initializing encoder"); + } + +/* INFO ("+ Setting up dummy 4:2:0 frame data"); */ + framedata = calloc(ti.height, ti.width); + yuv.y_width = ti.width; + yuv.y_height = ti.height; + yuv.y_stride = ti.width; + yuv.y = framedata; + yuv.uv_width = ti.width / 2; + yuv.uv_height = ti.width / 2; + yuv.uv_stride = ti.width; + yuv.u = framedata; + yuv.v = framedata; + + INFO ("+ Checking granulepos generation"); + shift = theora_granule_shift(&ti); + rate = (double)ti.fps_denominator/ti.fps_numerator; + for (frame = 0; frame < frequency * 2 + 1; frame++) { + result = theora_encode_YUVin (&th, &yuv); + if (result < 0) { + printf("theora_encode_YUVin() returned %d\n", result); + FAIL ("negative error code submitting frame for compression"); + } + theora_encode_packetout (&th, frame >= frequency * 2, &op); + if ((long long int)op.granulepos < last_granule) + FAIL ("encoder returned a decreasing granulepos value"); + last_granule = op.granulepos; + keyframe = op.granulepos >> shift; + keydist = op.granulepos - (keyframe << shift); + tframe = theora_granule_frame (&th, op.granulepos); + ttime = theora_granule_time(&th, op.granulepos); +#if DEBUG + printf("++ frame %d granulepos %lld %d:%d %d %.3lfs\n", + frame, (long long int)op.granulepos, keyframe, keydist, + tframe, theora_granule_time (&th, op.granulepos)); +#endif + if ((keyframe + keydist) != frame + 1) + FAIL ("encoder granulepos does not map to the correct frame number"); + if (tframe != frame) + FAIL ("theora_granule_frame returned incorrect results"); + if (fabs(rate*(frame+1) - ttime) > 1.0e-6) + FAIL ("theora_granule_time returned incorrect results"); + } + + /* clean up */ +/* INFO ("+ Freeing dummy frame data"); */ + free (framedata); + +/* INFO ("+ Clearing theora_info struct"); */ + theora_info_clear (&ti); + +/* INFO ("+ Clearing theora_state"); */ + theora_clear (&th); + + return 0; +} + +int main(int argc, char *argv[]) +{ + + granulepos_test_encode (1, 1); + granulepos_test_encode (2, 1); + granulepos_test_encode (3, 1); + granulepos_test_encode (4, 1); + granulepos_test_encode (8, 1); + granulepos_test_encode (64, 1); + + exit (0); +} diff --git a/cs/3rd party/libtheora/tests/noop.c b/cs/3rd party/libtheora/tests/noop.c new file mode 100644 index 000000000..424e36b12 --- /dev/null +++ b/cs/3rd party/libtheora/tests/noop.c @@ -0,0 +1,123 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggTheora SOFTWARE 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 Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: routines for validating codec initialization + last mod: $Id$ + + ********************************************************************/ + +#include +#include + +#include "tests.h" + +static int +noop_test_info () +{ + th_info ti; + + INFO ("+ Initializing th_info struct"); + th_info_init (&ti); + + INFO ("+ Clearing empty th_info struct"); + th_info_clear (&ti); + + return 0; +} + +static int +noop_test_comments () +{ + th_comment tc; + + INFO ("+ Initializing th_comment struct"); + th_comment_init (&tc); + + INFO ("+ Clearing empty th_comment struct") + th_comment_clear (&tc); + + return 0; +} + +static int +noop_test_encode () +{ + th_info ti; + th_enc_ctx *te; + + INFO ("+ Initializing th_info struct"); + th_info_init (&ti); + + INFO ("+ Testing encoder context with empty th_info"); + te = th_encode_alloc(&ti); + if (te != NULL) + FAIL("td_encode_alloc accepted an unconfigured th_info"); + + INFO ("+ Setting 16x16 image size"); + ti.frame_width = 16; + ti.frame_height = 16; + + INFO ("+ Setting a 1:1 frame rate"); + ti.fps_numerator = 1; + ti.fps_denominator = 1; + + INFO ("+ Allocating encoder context"); + te = th_encode_alloc(&ti); + if (te == NULL) + FAIL("td_encode_alloc returned a null pointer"); + + INFO ("+ Clearing th_info struct"); + th_info_clear (&ti); + + INFO ("+ Freeing encoder context"); + th_encode_free(te); + + return 0; +} + +static int +noop_test_decode () +{ + th_info ti; + th_dec_ctx *td; + + INFO ("+ Testing decoder context with null info and setup"); + td = th_decode_alloc(NULL, NULL); + if (td != NULL) + FAIL("td_decode_alloc accepted null info pointers"); + + INFO ("+ Initializing th_info struct"); + th_info_init (&ti); + + INFO ("+ Testing decoder context with empty info and null setup"); + td = th_decode_alloc(&ti, NULL); + if (td != NULL) + FAIL("td_decode_alloc accepted null info pointers"); + + INFO ("+ Clearing th_info struct"); + th_info_clear (&ti); + + return 0; +} + +int main(int argc, char *argv[]) +{ + noop_test_info (); + + noop_test_comments (); + + noop_test_encode (); + + noop_test_decode (); + + exit (0); +} diff --git a/cs/3rd party/libtheora/tests/noop_theora.c b/cs/3rd party/libtheora/tests/noop_theora.c new file mode 100644 index 000000000..60a29706d --- /dev/null +++ b/cs/3rd party/libtheora/tests/noop_theora.c @@ -0,0 +1,94 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggTheora SOFTWARE 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 Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: routines for validating codec initialization + last mod: $Id$ + + ********************************************************************/ + +#include + +#include "tests.h" + +static int +noop_test_encode () +{ + theora_info ti; + theora_state th; + + INFO ("+ Initializing theora_info struct"); + theora_info_init (&ti); + + INFO ("+ Setting a 16x16 frame"); + ti.width = 16; + ti.height = 16; + + INFO ("+ Setting a 1:1 frame rate"); + ti.fps_numerator = 1; + ti.fps_denominator = 1; + + INFO ("+ Initializing theora_state for encoding"); + if (theora_encode_init (&th, &ti) != OC_DISABLED) { + INFO ("+ Clearing theora_state"); + theora_clear (&th); + } + + INFO ("+ Clearing theora_info struct"); + theora_info_clear (&ti); + + return 0; +} + +#if 0 +static int +noop_test_decode () +{ + theora_info ti; + theora_state th; + + INFO ("+ Initializing theora_info struct"); + theora_info_init (&ti); + + INFO ("+ Initializing theora_state for decoding"); + theora_decode_init (&th, &ti); + + INFO ("+ Clearing theora_state"); + theora_clear (&th); + + INFO ("+ Clearing theora_info struct"); + theora_info_clear (&ti); + + return 0; +} +#endif + +static int +noop_test_comments () +{ + theora_comment tc; + + theora_comment_init (&tc); + theora_comment_clear (&tc); + + return 0; +} + +int main(int argc, char *argv[]) +{ + /*noop_test_decode ();*/ + + noop_test_encode (); + + noop_test_comments (); + + exit (0); +} diff --git a/cs/3rd party/libtheora/tests/tests.h b/cs/3rd party/libtheora/tests/tests.h new file mode 100644 index 000000000..dd420b210 --- /dev/null +++ b/cs/3rd party/libtheora/tests/tests.h @@ -0,0 +1,33 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggTheora SOFTWARE 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 Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: common test utilities + last mod: $Id$ + + ********************************************************************/ + +#include "config.h" + +#include +#include + +#define INFO(str) \ + { printf ("---- %s ...\n", (str)); } + +#define WARN(str) \ + { printf ("%s:%d: warning: %s\n", __FILE__, __LINE__, (str)); } + +#define FAIL(str) \ + { printf ("%s:%d: %s\n", __FILE__, __LINE__, (str)); exit(1); } + +#undef MIN +#define MIN(a,b) ((a)<(b)?(a):(b)) diff --git a/cs/3rd party/libtheora/theora-uninstalled.pc.in b/cs/3rd party/libtheora/theora-uninstalled.pc.in new file mode 100644 index 000000000..644685052 --- /dev/null +++ b/cs/3rd party/libtheora/theora-uninstalled.pc.in @@ -0,0 +1,14 @@ +# theora uninstalled pkg-config file + +prefix= +exec_prefix= +libdir=${pcfiledir}/lib +includedir=${pcfiledir}/include + +Name: theora uninstalled +Description: Theora video codec (not installed) +Version: @VERSION@ +Requires: ogg >= 1.1 +Conflicts: +Libs: ${libdir}/libtheora.la +Cflags: -I${includedir} diff --git a/cs/3rd party/libtheora/theora.pc.in b/cs/3rd party/libtheora/theora.pc.in new file mode 100644 index 000000000..96efec94d --- /dev/null +++ b/cs/3rd party/libtheora/theora.pc.in @@ -0,0 +1,14 @@ +# theora installed pkg-config file + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: theora +Description: Theora video codec +Version: @VERSION@ +Requires: ogg >= 1.1 +Conflicts: +Libs: -L${libdir} -ltheora +Cflags: -I${includedir} diff --git a/cs/3rd party/libtheora/theoradec-uninstalled.pc.in b/cs/3rd party/libtheora/theoradec-uninstalled.pc.in new file mode 100644 index 000000000..8bf9df132 --- /dev/null +++ b/cs/3rd party/libtheora/theoradec-uninstalled.pc.in @@ -0,0 +1,14 @@ +# theoradec uninstalled pkg-config file + +prefix= +exec_prefix= +libdir=${pcfiledir}/lib +includedir=${pcfiledir}/include + +Name: theora uninstalled +Description: Theora video codec(decoder) (not installed) +Version: @VERSION@ +Requires: ogg >= 1.1 +Conflicts: +Libs: ${libdir}/libtheoradec.la +Cflags: -I${includedir} diff --git a/cs/3rd party/libtheora/theoradec.pc.in b/cs/3rd party/libtheora/theoradec.pc.in new file mode 100644 index 000000000..615718df8 --- /dev/null +++ b/cs/3rd party/libtheora/theoradec.pc.in @@ -0,0 +1,14 @@ +# theoradec installed pkg-config file + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: theora +Description: Theora video codec (decoder) +Version: @VERSION@ +Requires: ogg >= 1.1 +Conflicts: +Libs: -L${libdir} -ltheoradec +Cflags: -I${includedir} diff --git a/cs/3rd party/libtheora/theoraenc-uninstalled.pc.in b/cs/3rd party/libtheora/theoraenc-uninstalled.pc.in new file mode 100644 index 000000000..00c62242c --- /dev/null +++ b/cs/3rd party/libtheora/theoraenc-uninstalled.pc.in @@ -0,0 +1,14 @@ +# theoraenc uninstalled pkg-config file + +prefix= +exec_prefix= +libdir=${pcfiledir}/lib +includedir=${pcfiledir}/include + +Name: theora uninstalled +Description: Theora video codec (encoder) (not installed) +Version: @VERSION@ +Requires: theoradec, ogg >= 1.1 +Conflicts: +Libs: ${libdir}/libtheoraenc.la +Cflags: -I${includedir} diff --git a/cs/3rd party/libtheora/theoraenc.pc.in b/cs/3rd party/libtheora/theoraenc.pc.in new file mode 100644 index 000000000..007ac8f82 --- /dev/null +++ b/cs/3rd party/libtheora/theoraenc.pc.in @@ -0,0 +1,14 @@ +# theoraenc installed pkg-config file + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: theora +Description: Theora video codec (encoder) +Version: @VERSION@ +Requires: theoradec, ogg >= 1.1 +Conflicts: +Libs: -L${libdir} -ltheoraenc +Cflags: -I${includedir} diff --git a/cs/3rd party/libtheora/tools/process_modedec_stats.c b/cs/3rd party/libtheora/tools/process_modedec_stats.c new file mode 100644 index 000000000..2d80d4e9a --- /dev/null +++ b/cs/3rd party/libtheora/tools/process_modedec_stats.c @@ -0,0 +1,240 @@ +#include +#include +#include +#include +#include "../lib/modedec.h" +#if !defined(OC_COLLECT_METRICS) +# error "Recompile libtheoraenc and encoder_example with -DOC_COLLECT_METRICS" +#endif +#define OC_COLLECT_NO_ENC_FUNCS (1) +#include "../lib/collect.c" + + + +ogg_int16_t OC_MODE_LOGQ_TMP[OC_LOGQ_BINS][3][2]; +oc_mode_metrics OC_MODE_METRICS_SATD_TMP[OC_LOGQ_BINS-1][3][2][OC_COMP_BINS]; +oc_mode_metrics OC_MODE_METRICS_SAD_TMP[OC_LOGQ_BINS-1][3][2][OC_COMP_BINS]; + +ogg_int16_t OC_MODE_LOGQ_BASE[OC_LOGQ_BINS][3][2]; +oc_mode_metrics OC_MODE_METRICS_SATD_BASE[OC_LOGQ_BINS-1][3][2][OC_COMP_BINS]; +oc_mode_metrics OC_MODE_METRICS_SAD_BASE[OC_LOGQ_BINS-1][3][2][OC_COMP_BINS]; + + +static int logq_cmp(ogg_int16_t(*a)[3][2],ogg_int16_t(*b)[3][2]){ + int pli; + int qti; + int qi; + for(pli=0;pli<3;pli++){ + for(qti=0;qti<2;qti++){ + for(qi=0;qi] [ ...] [-o ]\n", + _argv[0]); + return EXIT_FAILURE; + } + /*Claim not to have metrics yet so update starts fresh.*/ + OC_HAS_MODE_METRICS=0; + oc_mode_metrics_update(OC_MODE_METRICS_SATD,100,0, + OC_MODE_RD_SATD,OC_SATD_SHIFT,OC_MODE_RD_WEIGHT_SATD); + oc_mode_metrics_update(OC_MODE_METRICS_SAD,100,0, + OC_MODE_RD_SAD,OC_SAD_SHIFT,OC_MODE_RD_WEIGHT_SAD); + oc_mode_metrics_print(stdout); + if(have_output)oc_mode_metrics_dump(); + return EXIT_SUCCESS; +} diff --git a/cs/3rd party/libtheora/win32/VS2005/README b/cs/3rd party/libtheora/win32/VS2005/README new file mode 100644 index 000000000..5bf0bf405 --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2005/README @@ -0,0 +1,22 @@ +libtheora has libogg as a dependency, and for examples, also +libvorbis, therefore you need to have libogg and libvorbis +compiled beforehand. + +Lets say you have libogg, libvorbis and libtheora in the same directory: + +libogg-1.1.4 +libvorbis-1.2.2 +libtheora-1.0 + +Because there is no automatic library detection you have to, +either: + +1. Rename libogg-1.1.4 to libogg, and libvorbis-1.2.2 to libvorbis. + +2. Open libogg.vsprops with a text editor (even notepad.exe +will suffice) and see if LIBOGG_VERSION is set to the correct +version, in this case "1.1.4". + +The same procedure should be done for libvorbis.vsprops and +check LIBVORBIS_VERSION for the correct version, in this +case "1.2.2". diff --git a/cs/3rd party/libtheora/win32/VS2005/dump_video/dump_video_dynamic.vcproj b/cs/3rd party/libtheora/win32/VS2005/dump_video/dump_video_dynamic.vcproj new file mode 100644 index 000000000..df82cdd2c --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2005/dump_video/dump_video_dynamic.vcproj @@ -0,0 +1,690 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cs/3rd party/libtheora/win32/VS2005/dump_video/dump_video_static.vcproj b/cs/3rd party/libtheora/win32/VS2005/dump_video/dump_video_static.vcproj new file mode 100644 index 000000000..4d443b99b --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2005/dump_video/dump_video_static.vcproj @@ -0,0 +1,690 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cs/3rd party/libtheora/win32/VS2005/encoder_example/encoder_example_dynamic.vcproj b/cs/3rd party/libtheora/win32/VS2005/encoder_example/encoder_example_dynamic.vcproj new file mode 100644 index 000000000..8974c8d64 --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2005/encoder_example/encoder_example_dynamic.vcproj @@ -0,0 +1,706 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cs/3rd party/libtheora/win32/VS2005/encoder_example/encoder_example_static.vcproj b/cs/3rd party/libtheora/win32/VS2005/encoder_example/encoder_example_static.vcproj new file mode 100644 index 000000000..29f97aeda --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2005/encoder_example/encoder_example_static.vcproj @@ -0,0 +1,708 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cs/3rd party/libtheora/win32/VS2005/libogg.vsprops b/cs/3rd party/libtheora/win32/VS2005/libogg.vsprops new file mode 100644 index 000000000..dca120819 --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2005/libogg.vsprops @@ -0,0 +1,19 @@ + + + + + + diff --git a/cs/3rd party/libtheora/win32/VS2005/libtheora/libtheora_dynamic.vcproj b/cs/3rd party/libtheora/win32/VS2005/libtheora/libtheora_dynamic.vcproj new file mode 100644 index 000000000..f31f03aee --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2005/libtheora/libtheora_dynamic.vcproj @@ -0,0 +1,2905 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cs/3rd party/libtheora/win32/VS2005/libtheora/libtheora_static.vcproj b/cs/3rd party/libtheora/win32/VS2005/libtheora/libtheora_static.vcproj new file mode 100644 index 000000000..085e70cf4 --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2005/libtheora/libtheora_static.vcproj @@ -0,0 +1,2809 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cs/3rd party/libtheora/win32/VS2005/libtheora_dynamic.sln b/cs/3rd party/libtheora/win32/VS2005/libtheora_dynamic.sln new file mode 100644 index 000000000..2038853a9 --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2005/libtheora_dynamic.sln @@ -0,0 +1,46 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libtheora", "libtheora\libtheora_dynamic.vcproj", "{653F3841-3F26-49B9-AFCF-091DB4B67031}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dump_video", "dump_video\dump_video_dynamic.vcproj", "{1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "encoder_example", "encoder_example\encoder_example_dynamic.vcproj", "{AD710263-EBFA-4388-BAA9-AD73C32AFF26}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Win32.ActiveCfg = Debug|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Win32.Build.0 = Debug|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|x64.ActiveCfg = Debug|x64 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|x64.Build.0 = Debug|x64 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Win32.ActiveCfg = Release|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Win32.Build.0 = Release|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|x64.ActiveCfg = Release|x64 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|x64.Build.0 = Release|x64 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Debug|Win32.ActiveCfg = Debug|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Debug|Win32.Build.0 = Debug|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Debug|x64.ActiveCfg = Debug|x64 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Debug|x64.Build.0 = Debug|x64 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release|Win32.ActiveCfg = Release|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release|Win32.Build.0 = Release|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release|x64.ActiveCfg = Release|x64 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release|x64.Build.0 = Release|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Debug|Win32.ActiveCfg = Debug|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Debug|Win32.Build.0 = Debug|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Debug|x64.ActiveCfg = Debug|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Debug|x64.Build.0 = Debug|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release|Win32.ActiveCfg = Release|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release|Win32.Build.0 = Release|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release|x64.ActiveCfg = Release|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/cs/3rd party/libtheora/win32/VS2005/libtheora_static.sln b/cs/3rd party/libtheora/win32/VS2005/libtheora_static.sln new file mode 100644 index 000000000..394f0c1cc --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2005/libtheora_static.sln @@ -0,0 +1,46 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dump_video_static", "dump_video\dump_video_static.vcproj", "{1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libtheora_static", "libtheora\libtheora_static.vcproj", "{653F3841-3F26-49B9-AFCF-091DB4B67031}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "encoder_example_static", "encoder_example\encoder_example_static.vcproj", "{AD710263-EBFA-4388-BAA9-AD73C32AFF26}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Debug|Win32.ActiveCfg = Debug|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Debug|Win32.Build.0 = Debug|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Debug|x64.ActiveCfg = Debug|x64 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Debug|x64.Build.0 = Debug|x64 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release|Win32.ActiveCfg = Release|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release|Win32.Build.0 = Release|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release|x64.ActiveCfg = Release|x64 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release|x64.Build.0 = Release|x64 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Win32.ActiveCfg = Debug|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Win32.Build.0 = Debug|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|x64.ActiveCfg = Debug|x64 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|x64.Build.0 = Debug|x64 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Win32.ActiveCfg = Release|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Win32.Build.0 = Release|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|x64.ActiveCfg = Release|x64 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|x64.Build.0 = Release|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Debug|Win32.ActiveCfg = Debug|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Debug|Win32.Build.0 = Debug|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Debug|x64.ActiveCfg = Debug|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Debug|x64.Build.0 = Debug|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release|Win32.ActiveCfg = Release|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release|Win32.Build.0 = Release|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release|x64.ActiveCfg = Release|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/cs/3rd party/libtheora/win32/VS2005/libvorbis.vsprops b/cs/3rd party/libtheora/win32/VS2005/libvorbis.vsprops new file mode 100644 index 000000000..d3a5454c5 --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2005/libvorbis.vsprops @@ -0,0 +1,19 @@ + + + + + + diff --git a/cs/3rd party/libtheora/win32/VS2008/README b/cs/3rd party/libtheora/win32/VS2008/README new file mode 100644 index 000000000..5bf0bf405 --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2008/README @@ -0,0 +1,22 @@ +libtheora has libogg as a dependency, and for examples, also +libvorbis, therefore you need to have libogg and libvorbis +compiled beforehand. + +Lets say you have libogg, libvorbis and libtheora in the same directory: + +libogg-1.1.4 +libvorbis-1.2.2 +libtheora-1.0 + +Because there is no automatic library detection you have to, +either: + +1. Rename libogg-1.1.4 to libogg, and libvorbis-1.2.2 to libvorbis. + +2. Open libogg.vsprops with a text editor (even notepad.exe +will suffice) and see if LIBOGG_VERSION is set to the correct +version, in this case "1.1.4". + +The same procedure should be done for libvorbis.vsprops and +check LIBVORBIS_VERSION for the correct version, in this +case "1.2.2". diff --git a/cs/3rd party/libtheora/win32/VS2008/dump_video/dump_video_dynamic.vcproj b/cs/3rd party/libtheora/win32/VS2008/dump_video/dump_video_dynamic.vcproj new file mode 100644 index 000000000..bdf832060 --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2008/dump_video/dump_video_dynamic.vcproj @@ -0,0 +1,683 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cs/3rd party/libtheora/win32/VS2008/dump_video/dump_video_static.vcproj b/cs/3rd party/libtheora/win32/VS2008/dump_video/dump_video_static.vcproj new file mode 100644 index 000000000..0c39b0e40 --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2008/dump_video/dump_video_static.vcproj @@ -0,0 +1,683 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cs/3rd party/libtheora/win32/VS2008/encoder_example/encoder_example_dynamic.vcproj b/cs/3rd party/libtheora/win32/VS2008/encoder_example/encoder_example_dynamic.vcproj new file mode 100644 index 000000000..ae3df6989 --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2008/encoder_example/encoder_example_dynamic.vcproj @@ -0,0 +1,699 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cs/3rd party/libtheora/win32/VS2008/encoder_example/encoder_example_static.vcproj b/cs/3rd party/libtheora/win32/VS2008/encoder_example/encoder_example_static.vcproj new file mode 100644 index 000000000..20295e8d9 --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2008/encoder_example/encoder_example_static.vcproj @@ -0,0 +1,699 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cs/3rd party/libtheora/win32/VS2008/libogg.vsprops b/cs/3rd party/libtheora/win32/VS2008/libogg.vsprops new file mode 100644 index 000000000..807b74a67 --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2008/libogg.vsprops @@ -0,0 +1,19 @@ + + + + + + diff --git a/cs/3rd party/libtheora/win32/VS2008/libtheora/libtheora_dynamic.vcproj b/cs/3rd party/libtheora/win32/VS2008/libtheora/libtheora_dynamic.vcproj new file mode 100644 index 000000000..b0bf2e297 --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2008/libtheora/libtheora_dynamic.vcproj @@ -0,0 +1,2598 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cs/3rd party/libtheora/win32/VS2008/libtheora/libtheora_static.vcproj b/cs/3rd party/libtheora/win32/VS2008/libtheora/libtheora_static.vcproj new file mode 100644 index 000000000..c91d07827 --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2008/libtheora/libtheora_static.vcproj @@ -0,0 +1,2470 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cs/3rd party/libtheora/win32/VS2008/libtheora_dynamic.sln b/cs/3rd party/libtheora/win32/VS2008/libtheora_dynamic.sln new file mode 100644 index 000000000..f0f923705 --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2008/libtheora_dynamic.sln @@ -0,0 +1,146 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libtheora", "libtheora\libtheora_dynamic.vcproj", "{653F3841-3F26-49B9-AFCF-091DB4B67031}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dump_video", "dump_video\dump_video_dynamic.vcproj", "{1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "encoder_example", "encoder_example\encoder_example_dynamic.vcproj", "{AD710263-EBFA-4388-BAA9-AD73C32AFF26}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) = Debug|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + Debug|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) = Debug|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + Debug|Windows Mobile 6 Professional SDK (ARMV4I) = Debug|Windows Mobile 6 Professional SDK (ARMV4I) + Debug|x64 = Debug|x64 + Release_SSE|Win32 = Release_SSE|Win32 + Release_SSE|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) = Release_SSE|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + Release_SSE|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) = Release_SSE|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + Release_SSE|Windows Mobile 6 Professional SDK (ARMV4I) = Release_SSE|Windows Mobile 6 Professional SDK (ARMV4I) + Release_SSE|x64 = Release_SSE|x64 + Release_SSE2|Win32 = Release_SSE2|Win32 + Release_SSE2|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) = Release_SSE2|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + Release_SSE2|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) = Release_SSE2|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + Release_SSE2|Windows Mobile 6 Professional SDK (ARMV4I) = Release_SSE2|Windows Mobile 6 Professional SDK (ARMV4I) + Release_SSE2|x64 = Release_SSE2|x64 + Release|Win32 = Release|Win32 + Release|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) = Release|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + Release|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) = Release|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + Release|Windows Mobile 6 Professional SDK (ARMV4I) = Release|Windows Mobile 6 Professional SDK (ARMV4I) + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Win32.ActiveCfg = Debug|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Win32.Build.0 = Debug|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).ActiveCfg = Debug|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).Build.0 = Debug|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).Deploy.0 = Debug|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).ActiveCfg = Debug|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).Build.0 = Debug|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).Deploy.0 = Debug|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 6 Professional SDK (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Debug|Windows Mobile 6 Professional SDK (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 6 Professional SDK (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|x64.ActiveCfg = Debug|x64 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|x64.Build.0 = Debug|x64 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).ActiveCfg = Release_SSE|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).Build.0 = Release_SSE|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).Deploy.0 = Release_SSE|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).ActiveCfg = Release_SSE|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).Build.0 = Release_SSE|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).Deploy.0 = Release_SSE|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release_SSE|Windows Mobile 6 Professional SDK (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Release_SSE|Windows Mobile 6 Professional SDK (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Release_SSE|Windows Mobile 6 Professional SDK (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE|x64.ActiveCfg = Release_SSE|x64 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE|x64.Build.0 = Release_SSE|x64 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE2|Win32.ActiveCfg = Release_SSE2|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE2|Win32.Build.0 = Release_SSE2|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).ActiveCfg = Release_SSE2|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).Build.0 = Release_SSE2|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).Deploy.0 = Release_SSE2|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE2|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).ActiveCfg = Release_SSE2|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE2|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).Build.0 = Release_SSE2|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE2|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).Deploy.0 = Release_SSE2|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE2|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release_SSE2|Windows Mobile 6 Professional SDK (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE2|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Release_SSE2|Windows Mobile 6 Professional SDK (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE2|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Release_SSE2|Windows Mobile 6 Professional SDK (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE2|x64.ActiveCfg = Release_SSE2|x64 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE2|x64.Build.0 = Release_SSE2|x64 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Win32.ActiveCfg = Release|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Win32.Build.0 = Release|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).ActiveCfg = Release|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).Build.0 = Release|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).Deploy.0 = Release|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).ActiveCfg = Release|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).Build.0 = Release|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).Deploy.0 = Release|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 6 Professional SDK (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Release|Windows Mobile 6 Professional SDK (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 6 Professional SDK (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|x64.ActiveCfg = Release|x64 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|x64.Build.0 = Release|x64 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Debug|Win32.ActiveCfg = Debug|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Debug|Win32.Build.0 = Debug|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Debug|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).ActiveCfg = Debug|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Debug|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).ActiveCfg = Debug|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Debug|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Debug|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Debug|x64.ActiveCfg = Debug|x64 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Debug|x64.Build.0 = Debug|x64 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).ActiveCfg = Release_SSE|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release_SSE|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).ActiveCfg = Release_SSE|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release_SSE|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release_SSE|x64.ActiveCfg = Release_SSE|x64 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release_SSE|x64.Build.0 = Release_SSE|x64 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release_SSE2|Win32.ActiveCfg = Release_SSE2|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release_SSE2|Win32.Build.0 = Release_SSE2|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).ActiveCfg = Release_SSE2|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release_SSE2|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).ActiveCfg = Release_SSE2|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release_SSE2|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release_SSE2|x64.ActiveCfg = Release_SSE2|x64 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release_SSE2|x64.Build.0 = Release_SSE2|x64 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release|Win32.ActiveCfg = Release|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release|Win32.Build.0 = Release|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).ActiveCfg = Release|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).ActiveCfg = Release|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release|x64.ActiveCfg = Release|x64 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release|x64.Build.0 = Release|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Debug|Win32.ActiveCfg = Debug|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Debug|Win32.Build.0 = Debug|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Debug|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).ActiveCfg = Debug|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Debug|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).ActiveCfg = Debug|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Debug|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Debug|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Debug|x64.ActiveCfg = Debug|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Debug|x64.Build.0 = Debug|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).ActiveCfg = Release_SSE|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release_SSE|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).ActiveCfg = Release_SSE|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release_SSE|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release_SSE|x64.ActiveCfg = Release_SSE|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release_SSE|x64.Build.0 = Release_SSE|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release_SSE2|Win32.ActiveCfg = Release_SSE2|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release_SSE2|Win32.Build.0 = Release_SSE2|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).ActiveCfg = Release_SSE2|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release_SSE2|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).ActiveCfg = Release_SSE2|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release_SSE2|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release_SSE2|x64.ActiveCfg = Release_SSE2|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release_SSE2|x64.Build.0 = Release_SSE2|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release|Win32.ActiveCfg = Release|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release|Win32.Build.0 = Release|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).ActiveCfg = Release|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).ActiveCfg = Release|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release|x64.ActiveCfg = Release|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/cs/3rd party/libtheora/win32/VS2008/libtheora_static.sln b/cs/3rd party/libtheora/win32/VS2008/libtheora_static.sln new file mode 100644 index 000000000..807e2fae2 --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2008/libtheora_static.sln @@ -0,0 +1,146 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dump_video_static", "dump_video\dump_video_static.vcproj", "{1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libtheora_static", "libtheora\libtheora_static.vcproj", "{653F3841-3F26-49B9-AFCF-091DB4B67031}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "encoder_example_static", "encoder_example\encoder_example_static.vcproj", "{AD710263-EBFA-4388-BAA9-AD73C32AFF26}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) = Debug|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + Debug|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) = Debug|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + Debug|Windows Mobile 6 Professional SDK (ARMV4I) = Debug|Windows Mobile 6 Professional SDK (ARMV4I) + Debug|x64 = Debug|x64 + Release_SSE|Win32 = Release_SSE|Win32 + Release_SSE|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) = Release_SSE|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + Release_SSE|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) = Release_SSE|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + Release_SSE|Windows Mobile 6 Professional SDK (ARMV4I) = Release_SSE|Windows Mobile 6 Professional SDK (ARMV4I) + Release_SSE|x64 = Release_SSE|x64 + Release_SSE2|Win32 = Release_SSE2|Win32 + Release_SSE2|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) = Release_SSE2|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + Release_SSE2|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) = Release_SSE2|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + Release_SSE2|Windows Mobile 6 Professional SDK (ARMV4I) = Release_SSE2|Windows Mobile 6 Professional SDK (ARMV4I) + Release_SSE2|x64 = Release_SSE2|x64 + Release|Win32 = Release|Win32 + Release|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) = Release|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + Release|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) = Release|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + Release|Windows Mobile 6 Professional SDK (ARMV4I) = Release|Windows Mobile 6 Professional SDK (ARMV4I) + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Debug|Win32.ActiveCfg = Debug|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Debug|Win32.Build.0 = Debug|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Debug|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).ActiveCfg = Debug|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Debug|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).ActiveCfg = Debug|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Debug|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Debug|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Debug|x64.ActiveCfg = Debug|x64 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Debug|x64.Build.0 = Debug|x64 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).ActiveCfg = Release_SSE|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release_SSE|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).ActiveCfg = Release_SSE|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release_SSE|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release_SSE|x64.ActiveCfg = Release_SSE|x64 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release_SSE|x64.Build.0 = Release_SSE|x64 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release_SSE2|Win32.ActiveCfg = Release_SSE2|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release_SSE2|Win32.Build.0 = Release_SSE2|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).ActiveCfg = Release_SSE2|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release_SSE2|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).ActiveCfg = Release_SSE2|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release_SSE2|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release_SSE2|x64.ActiveCfg = Release_SSE2|x64 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release_SSE2|x64.Build.0 = Release_SSE2|x64 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release|Win32.ActiveCfg = Release|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release|Win32.Build.0 = Release|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).ActiveCfg = Release|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).ActiveCfg = Release|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release|x64.ActiveCfg = Release|x64 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release|x64.Build.0 = Release|x64 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Win32.ActiveCfg = Debug|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Win32.Build.0 = Debug|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).ActiveCfg = Debug|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).Build.0 = Debug|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).Deploy.0 = Debug|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).ActiveCfg = Debug|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).Build.0 = Debug|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).Deploy.0 = Debug|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 6 Professional SDK (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Debug|Windows Mobile 6 Professional SDK (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 6 Professional SDK (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|x64.ActiveCfg = Debug|x64 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|x64.Build.0 = Debug|x64 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).ActiveCfg = Release_SSE|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).Build.0 = Release_SSE|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).Deploy.0 = Release_SSE|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).ActiveCfg = Release_SSE|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).Build.0 = Release_SSE|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).Deploy.0 = Release_SSE|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release_SSE|Windows Mobile 6 Professional SDK (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Release_SSE|Windows Mobile 6 Professional SDK (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Release_SSE|Windows Mobile 6 Professional SDK (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE|x64.ActiveCfg = Release_SSE|x64 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE|x64.Build.0 = Release_SSE|x64 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE2|Win32.ActiveCfg = Release_SSE2|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE2|Win32.Build.0 = Release_SSE2|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).ActiveCfg = Release_SSE2|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).Build.0 = Release_SSE2|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).Deploy.0 = Release_SSE2|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE2|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).ActiveCfg = Release_SSE2|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE2|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).Build.0 = Release_SSE2|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE2|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).Deploy.0 = Release_SSE2|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE2|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release_SSE2|Windows Mobile 6 Professional SDK (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE2|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Release_SSE2|Windows Mobile 6 Professional SDK (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE2|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Release_SSE2|Windows Mobile 6 Professional SDK (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE2|x64.ActiveCfg = Release_SSE2|x64 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release_SSE2|x64.Build.0 = Release_SSE2|x64 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Win32.ActiveCfg = Release|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Win32.Build.0 = Release|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).ActiveCfg = Release|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).Build.0 = Release|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).Deploy.0 = Release|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).ActiveCfg = Release|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).Build.0 = Release|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).Deploy.0 = Release|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 6 Professional SDK (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Release|Windows Mobile 6 Professional SDK (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 6 Professional SDK (ARMV4I) + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|x64.ActiveCfg = Release|x64 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|x64.Build.0 = Release|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Debug|Win32.ActiveCfg = Debug|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Debug|Win32.Build.0 = Debug|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Debug|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).ActiveCfg = Debug|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Debug|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).ActiveCfg = Debug|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Debug|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Debug|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Debug|x64.ActiveCfg = Debug|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Debug|x64.Build.0 = Debug|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).ActiveCfg = Release_SSE|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release_SSE|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).ActiveCfg = Release_SSE|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release_SSE|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release_SSE|x64.ActiveCfg = Release_SSE|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release_SSE|x64.Build.0 = Release_SSE|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release_SSE2|Win32.ActiveCfg = Release_SSE2|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release_SSE2|Win32.Build.0 = Release_SSE2|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).ActiveCfg = Release_SSE2|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release_SSE2|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).ActiveCfg = Release_SSE2|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release_SSE2|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release_SSE2|x64.ActiveCfg = Release_SSE2|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release_SSE2|x64.Build.0 = Release_SSE2|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release|Win32.ActiveCfg = Release|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release|Win32.Build.0 = Release|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release|Windows Mobile 5.0 Pocket PC SDK 2 (ARMV4I).ActiveCfg = Release|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release|Windows Mobile 5.0 Smartphone SDK 2 (ARMV4I).ActiveCfg = Release|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release|x64.ActiveCfg = Release|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/cs/3rd party/libtheora/win32/VS2008/libvorbis.vsprops b/cs/3rd party/libtheora/win32/VS2008/libvorbis.vsprops new file mode 100644 index 000000000..c0bebf8cd --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2008/libvorbis.vsprops @@ -0,0 +1,19 @@ + + + + + + diff --git a/cs/3rd party/libtheora/win32/VS2010/README b/cs/3rd party/libtheora/win32/VS2010/README new file mode 100644 index 000000000..6c62c1a89 --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2010/README @@ -0,0 +1,22 @@ +libtheora has libogg as a dependency, and for examples, also +libvorbis, therefore you need to have libogg and libvorbis +compiled beforehand. + +Lets say you have libogg, libvorbis and libtheora in the same directory: + +libogg-1.1.4 +libvorbis-1.2.2 +libtheora-1.0 + +Because there is no automatic library detection you have to, +either: + +1. Rename libogg-1.1.4 to libogg, and libvorbis-1.2.2 to libvorbis. + +2. Open libogg.props with a text editor (even notepad.exe +will suffice) and see if LIBOGG_VERSION is set to the correct +version, in this case "1.1.4". + +The same procedure should be done for libvorbis.props and +check LIBVORBIS_VERSION for the correct version, in this +case "1.2.2". diff --git a/cs/3rd party/libtheora/win32/VS2010/dump_video/dump_video_dynamic.vcxproj b/cs/3rd party/libtheora/win32/VS2010/dump_video/dump_video_dynamic.vcxproj new file mode 100644 index 000000000..62460a948 --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2010/dump_video/dump_video_dynamic.vcxproj @@ -0,0 +1,198 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + dump_video + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF} + dump_video + Win32Proj + + + + Application + Unicode + true + + + Application + Unicode + + + Application + Unicode + true + + + Application + Unicode + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + false + + + + Disabled + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + StackFrameRuntimeCheck + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + + + libogg.lib;libtheora.lib;%(AdditionalDependencies) + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + true + Console + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + StackFrameRuntimeCheck + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + + + libogg.lib;libtheora.lib;%(AdditionalDependencies) + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + true + Console + false + + + MachineX64 + + + + + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + + + libogg.lib;libtheora.lib;%(AdditionalDependencies) + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + false + Console + true + true + false + + + MachineX86 + + + + + X64 + + + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + + + libogg.lib;libtheora.lib;%(AdditionalDependencies) + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + false + Console + true + true + false + + + MachineX64 + + + + + + + + + + + + + + {653f3841-3f26-49b9-afcf-091db4b67031} + + + + + + \ No newline at end of file diff --git a/cs/3rd party/libtheora/win32/VS2010/dump_video/dump_video_static.vcxproj b/cs/3rd party/libtheora/win32/VS2010/dump_video/dump_video_static.vcxproj new file mode 100644 index 000000000..011789fa6 --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2010/dump_video/dump_video_static.vcxproj @@ -0,0 +1,198 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF} + dump_video + Win32Proj + + + + Application + Unicode + true + + + Application + Unicode + + + Application + Unicode + true + + + Application + Unicode + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + false + + + + Disabled + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + StackFrameRuntimeCheck + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + + + libogg_static.lib;libtheora_static.lib;%(AdditionalDependencies) + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + true + Console + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + StackFrameRuntimeCheck + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + + + libogg_static.lib;libtheora_static.lib;%(AdditionalDependencies) + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + true + Console + false + + + MachineX64 + + + + + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + + + libogg_static.lib;libtheora_static.lib;%(AdditionalDependencies) + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + false + Console + true + true + false + + + MachineX86 + + + + + X64 + + + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + + + libogg_static.lib;libtheora_static.lib;%(AdditionalDependencies) + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + false + Console + true + true + false + + + MachineX64 + + + + + + + + + + + + + + {653f3841-3f26-49b9-afcf-091db4b67031} + false + + + + + + \ No newline at end of file diff --git a/cs/3rd party/libtheora/win32/VS2010/encoder_example/encoder_example_dynamic.vcxproj b/cs/3rd party/libtheora/win32/VS2010/encoder_example/encoder_example_dynamic.vcxproj new file mode 100644 index 000000000..4adbf855c --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2010/encoder_example/encoder_example_dynamic.vcxproj @@ -0,0 +1,204 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + encoder_example + {AD710263-EBFA-4388-BAA9-AD73C32AFF26} + encoder_example + Win32Proj + + + + Application + Unicode + true + + + Application + Unicode + + + Application + Unicode + true + + + Application + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + false + + + + Disabled + ..\..\..\include;..\..\..\..\libogg\include;..\..\..\..\libvorbis\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + StackFrameRuntimeCheck + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + + + libogg.lib;libvorbis.lib;libtheora.lib;%(AdditionalDependencies) + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\..\..\..\libvorbis\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + true + Console + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..\include;..\..\..\..\libogg\include;..\..\..\..\libvorbis\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + StackFrameRuntimeCheck + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + + + libogg.lib;libvorbis.lib;libtheora.lib;%(AdditionalDependencies) + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\..\..\..\libvorbis\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + true + Console + false + + + MachineX64 + + + + + AnySuitable + true + Speed + ..\..\..\include;..\..\..\..\libogg\include;..\..\..\..\libvorbis\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level4 + ProgramDatabase + + + libogg.lib;libvorbis.lib;libtheora.lib;%(AdditionalDependencies) + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\..\..\..\libvorbis\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + false + Console + true + true + false + + + MachineX86 + + + + + X64 + + + AnySuitable + true + Speed + ..\..\..\include;..\..\..\..\libogg\include;..\..\..\..\libvorbis\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level4 + ProgramDatabase + + + libogg.lib;libvorbis.lib;libtheora.lib;%(AdditionalDependencies) + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\..\..\..\libvorbis\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + false + Console + true + true + false + + + MachineX64 + + + + + + + + + + {653f3841-3f26-49b9-afcf-091db4b67031} + + + + + + \ No newline at end of file diff --git a/cs/3rd party/libtheora/win32/VS2010/encoder_example/encoder_example_static.vcxproj b/cs/3rd party/libtheora/win32/VS2010/encoder_example/encoder_example_static.vcxproj new file mode 100644 index 000000000..f99301aa7 --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2010/encoder_example/encoder_example_static.vcxproj @@ -0,0 +1,204 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {AD710263-EBFA-4388-BAA9-AD73C32AFF26} + encoder_example + Win32Proj + + + + Application + Unicode + true + + + Application + Unicode + + + Application + Unicode + true + + + Application + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + false + + + + Disabled + ..\..\..\include;..\..\..\..\libogg\include;..\..\..\..\libvorbis\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + StackFrameRuntimeCheck + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + + + libogg_static.lib;libvorbis_static.lib;libtheora_static.lib;%(AdditionalDependencies) + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\..\..\..\libvorbis\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + true + Console + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..\include;..\..\..\..\libogg\include;..\..\..\..\libvorbis\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + StackFrameRuntimeCheck + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + + + libogg_static.lib;libvorbis_static.lib;libtheora_static.lib;%(AdditionalDependencies) + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\..\..\..\libvorbis\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + true + Console + false + + + MachineX64 + + + + + AnySuitable + true + Speed + ..\..\..\include;..\..\..\..\libogg\include;..\..\..\..\libvorbis\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level4 + ProgramDatabase + + + libogg_static.lib;libvorbis_static.lib;libtheora_static.lib;%(AdditionalDependencies) + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\..\..\..\libvorbis\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + false + Console + true + true + false + + + MachineX86 + + + + + X64 + + + AnySuitable + true + Speed + ..\..\..\include;..\..\..\..\libogg\include;..\..\..\..\libvorbis\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level4 + ProgramDatabase + + + libogg_static.lib;libvorbis_static.lib;libtheora_static.lib;%(AdditionalDependencies) + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\..\..\..\libvorbis\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + false + Console + true + true + false + + + MachineX64 + + + + + + + + + + {653f3841-3f26-49b9-afcf-091db4b67031} + false + + + + + + \ No newline at end of file diff --git a/cs/3rd party/libtheora/win32/VS2010/libogg.props b/cs/3rd party/libtheora/win32/VS2010/libogg.props new file mode 100644 index 000000000..2d8abdfbe --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2010/libogg.props @@ -0,0 +1,22 @@ + + + + 1.2.0 + + + <_ProjectFileVersion>10.0.30319.1 + + + + ..\..\..\..\libogg-$(LIBOGG_VERSION)\include;..\..\..\..\ogg\include;..\..\..\..\..\..\..\core\ogg\libogg\include;%(AdditionalIncludeDirectories) + + + ..\..\..\..\libogg-$(LIBOGG_VERSION)\win32\VS2010\$(PlatformName)\$(ConfigurationName);..\..\..\..\ogg\win32\VS2010\$(PlatformName)\$(ConfigurationName);..\..\..\..\..\..\..\core\ogg\libogg\win32\VS2010\$(PlatformName)\$(ConfigurationName) + + + + + $(LIBOGG_VERSION) + + + \ No newline at end of file diff --git a/cs/3rd party/libtheora/win32/VS2010/libtheora/libtheora_dynamic.vcxproj b/cs/3rd party/libtheora/win32/VS2010/libtheora/libtheora_dynamic.vcxproj new file mode 100644 index 000000000..ceccd9f4b --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2010/libtheora/libtheora_dynamic.vcxproj @@ -0,0 +1,285 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + libtheora + {653F3841-3F26-49B9-AFCF-091DB4B67031} + libtheora + Win32Proj + + + + DynamicLibrary + Unicode + true + + + DynamicLibrary + Unicode + + + DynamicLibrary + Unicode + true + + + DynamicLibrary + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + + + + Disabled + ..\..\..\include;..\..\..\lib;..\..\..\..\libogg\include;..\..\..\..\..\..\..\core\ogg\libogg\include\;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_BIND_TO_CURRENT_CRT_VERSION;WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBTHEORA_EXPORTS;DEBUG;OC_X86_ASM;%(PreprocessorDefinitions) + true + StackFrameRuntimeCheck + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + + + libogg.lib;%(AdditionalDependencies) + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + ..\..\..\lib\theora.def + false + + + + + + + X64 + + + Disabled + ..\..\..\include;..\..\..\lib;..\..\..\..\libogg\include;..\..\..\..\..\..\..\core\ogg\libogg\include\;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_BIND_TO_CURRENT_CRT_VERSION;WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBTHEORA_EXPORTS;DEBUG;%(PreprocessorDefinitions) + true + StackFrameRuntimeCheck + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + + + libogg.lib;%(AdditionalDependencies) + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + ..\..\..\lib\theora.def + false + + + + + + + MaxSpeed + AnySuitable + true + Speed + ..\..\..\include;..\..\..\lib;..\..\..\..\libogg\include;..\..\..\..\..\..\..\core\ogg\libogg\include\;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_BIND_TO_CURRENT_CRT_VERSION;WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBTHEORA_EXPORTS;OC_X86_ASM;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + + + Level4 + + + CompileAsC + 4244;4267;4057;4100;4245;%(DisableSpecificWarnings) + + + libogg.lib;%(AdditionalDependencies) + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + ..\..\..\lib\theora.def + false + + + + + + + X64 + + + MaxSpeed + AnySuitable + true + Speed + ..\..\..\include;..\..\..\lib;..\..\..\..\libogg\include;..\..\..\..\..\..\..\core\ogg\libogg\include\;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_BIND_TO_CURRENT_CRT_VERSION;WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBTHEORA_EXPORTS;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + + + Level4 + + + CompileAsC + 4244;4267;4057;4100;4245;%(DisableSpecificWarnings) + + + libogg.lib;%(AdditionalDependencies) + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + ..\..\..\lib\theora.def + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + true + true + true + + + + + + + + + + + + + + + + + + $(IntDir)%(Filename)1.obj + $(IntDir)%(Filename)1.xdc + $(IntDir)%(Filename)1.obj + $(IntDir)%(Filename)1.xdc + $(IntDir)%(Filename)1.obj + $(IntDir)%(Filename)1.xdc + $(IntDir)%(Filename)1.obj + $(IntDir)%(Filename)1.xdc + + + + + + $(IntDir)%(Filename)1.obj + $(IntDir)%(Filename)1.xdc + $(IntDir)%(Filename)1.obj + $(IntDir)%(Filename)1.xdc + $(IntDir)%(Filename)1.obj + $(IntDir)%(Filename)1.xdc + $(IntDir)%(Filename)1.obj + $(IntDir)%(Filename)1.xdc + + + + + $(IntDir)%(Filename)1.obj + $(IntDir)%(Filename)1.xdc + $(IntDir)%(Filename)1.obj + $(IntDir)%(Filename)1.xdc + $(IntDir)%(Filename)1.obj + $(IntDir)%(Filename)1.xdc + $(IntDir)%(Filename)1.obj + $(IntDir)%(Filename)1.xdc + + + + + + + + + + + \ No newline at end of file diff --git a/cs/3rd party/libtheora/win32/VS2010/libtheora/libtheora_static.vcxproj b/cs/3rd party/libtheora/win32/VS2010/libtheora/libtheora_static.vcxproj new file mode 100644 index 000000000..527bb1af3 --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2010/libtheora/libtheora_static.vcxproj @@ -0,0 +1,251 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {653F3841-3F26-49B9-AFCF-091DB4B67031} + libtheora + Win32Proj + + + + StaticLibrary + Unicode + true + + + StaticLibrary + Unicode + + + StaticLibrary + Unicode + true + + + StaticLibrary + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + + + + Disabled + ..\..\..\include;..\..\..\lib;..\..\..\..\libogg\include;..\..\..\..\..\..\..\core\ogg\libogg\include\;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_BIND_TO_CURRENT_CRT_VERSION;WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBTHEORA_EXPORTS;DEBUG;OC_X86_ASM;%(PreprocessorDefinitions) + true + StackFrameRuntimeCheck + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + + + + + X64 + + + Disabled + ..\..\..\include;..\..\..\lib;..\..\..\..\libogg\include;..\..\..\..\..\..\..\core\ogg\libogg\include\;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_BIND_TO_CURRENT_CRT_VERSION;WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBTHEORA_EXPORTS;DEBUG;%(PreprocessorDefinitions) + true + StackFrameRuntimeCheck + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + + + + + MaxSpeed + AnySuitable + true + Speed + ..\..\..\include;..\..\..\lib;..\..\..\..\libogg\include;..\..\..\..\..\..\..\core\ogg\libogg\include\;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_BIND_TO_CURRENT_CRT_VERSION;WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBTHEORA_EXPORTS;OC_X86_ASM;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + + + Level4 + + + CompileAsC + 4244;4267;4057;4100;4245;%(DisableSpecificWarnings) + + + + + X64 + + + MaxSpeed + AnySuitable + true + Speed + ..\..\..\include;..\..\..\lib;..\..\..\..\libogg\include;..\..\..\..\..\..\..\core\ogg\libogg\include\;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_BIND_TO_CURRENT_CRT_VERSION;WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBTHEORA_EXPORTS;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + + + Level4 + + + CompileAsC + 4244;4267;4057;4100;4245;%(DisableSpecificWarnings) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + true + true + true + + + + + + + + + + + + + + + + + + $(IntDir)%(Filename)1.obj + $(IntDir)%(Filename)1.xdc + $(IntDir)%(Filename)1.obj + $(IntDir)%(Filename)1.xdc + $(IntDir)%(Filename)1.obj + $(IntDir)%(Filename)1.xdc + $(IntDir)%(Filename)1.obj + $(IntDir)%(Filename)1.xdc + + + + + + $(IntDir)%(Filename)1.obj + $(IntDir)%(Filename)1.xdc + $(IntDir)%(Filename)1.obj + $(IntDir)%(Filename)1.xdc + $(IntDir)%(Filename)1.obj + $(IntDir)%(Filename)1.xdc + $(IntDir)%(Filename)1.obj + $(IntDir)%(Filename)1.xdc + + + + + $(IntDir)%(Filename)1.obj + $(IntDir)%(Filename)1.xdc + $(IntDir)%(Filename)1.obj + $(IntDir)%(Filename)1.xdc + $(IntDir)%(Filename)1.obj + $(IntDir)%(Filename)1.xdc + $(IntDir)%(Filename)1.obj + $(IntDir)%(Filename)1.xdc + + + + + + + + + + + \ No newline at end of file diff --git a/cs/3rd party/libtheora/win32/VS2010/libtheora_dynamic.sln b/cs/3rd party/libtheora/win32/VS2010/libtheora_dynamic.sln new file mode 100644 index 000000000..e155ccab3 --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2010/libtheora_dynamic.sln @@ -0,0 +1,46 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libtheora_dynamic", "libtheora\libtheora_dynamic.vcxproj", "{653F3841-3F26-49B9-AFCF-091DB4B67031}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dump_video_dynamic", "dump_video\dump_video_dynamic.vcxproj", "{1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "encoder_example_dynamic", "encoder_example\encoder_example_dynamic.vcxproj", "{AD710263-EBFA-4388-BAA9-AD73C32AFF26}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Win32.ActiveCfg = Debug|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Win32.Build.0 = Debug|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|x64.ActiveCfg = Debug|x64 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|x64.Build.0 = Debug|x64 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Win32.ActiveCfg = Release|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Win32.Build.0 = Release|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|x64.ActiveCfg = Release|x64 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|x64.Build.0 = Release|x64 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Debug|Win32.ActiveCfg = Debug|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Debug|Win32.Build.0 = Debug|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Debug|x64.ActiveCfg = Debug|x64 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Debug|x64.Build.0 = Debug|x64 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release|Win32.ActiveCfg = Release|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release|Win32.Build.0 = Release|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release|x64.ActiveCfg = Release|x64 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release|x64.Build.0 = Release|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Debug|Win32.ActiveCfg = Debug|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Debug|Win32.Build.0 = Debug|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Debug|x64.ActiveCfg = Debug|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Debug|x64.Build.0 = Debug|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release|Win32.ActiveCfg = Release|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release|Win32.Build.0 = Release|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release|x64.ActiveCfg = Release|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/cs/3rd party/libtheora/win32/VS2010/libtheora_static.sln b/cs/3rd party/libtheora/win32/VS2010/libtheora_static.sln new file mode 100644 index 000000000..447fe8b8b --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2010/libtheora_static.sln @@ -0,0 +1,46 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libtheora_static", "libtheora\libtheora_static.vcxproj", "{653F3841-3F26-49B9-AFCF-091DB4B67031}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dump_video_static", "dump_video\dump_video_static.vcxproj", "{1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "encoder_example_static", "encoder_example\encoder_example_static.vcxproj", "{AD710263-EBFA-4388-BAA9-AD73C32AFF26}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Win32.ActiveCfg = Debug|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|Win32.Build.0 = Debug|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|x64.ActiveCfg = Debug|x64 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Debug|x64.Build.0 = Debug|x64 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Win32.ActiveCfg = Release|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|Win32.Build.0 = Release|Win32 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|x64.ActiveCfg = Release|x64 + {653F3841-3F26-49B9-AFCF-091DB4B67031}.Release|x64.Build.0 = Release|x64 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Debug|Win32.ActiveCfg = Debug|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Debug|Win32.Build.0 = Debug|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Debug|x64.ActiveCfg = Debug|x64 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Debug|x64.Build.0 = Debug|x64 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release|Win32.ActiveCfg = Release|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release|Win32.Build.0 = Release|Win32 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release|x64.ActiveCfg = Release|x64 + {1A8CA99D-B6C7-48CB-B263-6CECDADF5FBF}.Release|x64.Build.0 = Release|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Debug|Win32.ActiveCfg = Debug|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Debug|Win32.Build.0 = Debug|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Debug|x64.ActiveCfg = Debug|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Debug|x64.Build.0 = Debug|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release|Win32.ActiveCfg = Release|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release|Win32.Build.0 = Release|Win32 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release|x64.ActiveCfg = Release|x64 + {AD710263-EBFA-4388-BAA9-AD73C32AFF26}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/cs/3rd party/libtheora/win32/VS2010/libvorbis.props b/cs/3rd party/libtheora/win32/VS2010/libvorbis.props new file mode 100644 index 000000000..e8ae8d858 --- /dev/null +++ b/cs/3rd party/libtheora/win32/VS2010/libvorbis.props @@ -0,0 +1,22 @@ + + + + 1.3.1 + + + <_ProjectFileVersion>10.0.30319.1 + + + + ..\..\..\..\libvorbis-$(LIBVORBIS_VERSION)\include;..\..\..\..\vorbis\include;..\..\..\..\..\..\vorbis\libs\libvorbis\include;%(AdditionalIncludeDirectories) + + + ..\..\..\..\libvorbis-$(LIBVORBIS_VERSION)\win32\VS2010\$(Platform)\$(Configuration);..\..\..\..\vorbis\win32\VS2010\$(Platform)\$(Configuration);..\..\..\..\..\..\vorbis\libs\libvorbis\win32\VS2010\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + + + + + $(LIBVORBIS_VERSION) + + + \ No newline at end of file diff --git a/cs/3rd party/libtheora/win32/build_theora_static.bat b/cs/3rd party/libtheora/win32/build_theora_static.bat new file mode 100644 index 000000000..0ce8e825b --- /dev/null +++ b/cs/3rd party/libtheora/win32/build_theora_static.bat @@ -0,0 +1,18 @@ +@echo off +echo ---+++--- Building Theora (Static) ---+++--- + +if .%SRCROOT%==. set SRCROOT=D:\xiph + +set OLDPATH=%PATH% +set OLDINCLUDE=%INCLUDE% +set OLDLIB=%LIB% + +call "c:\program files\microsoft visual studio\vc98\bin\vcvars32.bat" +echo Setting include paths for Theora +set INCLUDE=%INCLUDE%;%SRCROOT%\ogg\include;%SRCROOT%\theora\include +echo Compiling... +msdev theora_static.dsp /useenv /make "theora_static - Win32 Release" /rebuild + +set PATH=%OLDPATH% +set INCLUDE=%OLDINCLUDE% +set LIB=%OLDLIB% diff --git a/cs/3rd party/libtheora/win32/build_theora_static_debug.bat b/cs/3rd party/libtheora/win32/build_theora_static_debug.bat new file mode 100644 index 000000000..849c48ca3 --- /dev/null +++ b/cs/3rd party/libtheora/win32/build_theora_static_debug.bat @@ -0,0 +1,18 @@ +@echo off +echo ---+++--- Building Theora (Static) ---+++--- + +if .%SRCROOT%==. set SRCROOT=D:\xiph + +set OLDPATH=%PATH% +set OLDINCLUDE=%INCLUDE% +set OLDLIB=%LIB% + +call "c:\program files\microsoft visual studio\vc98\bin\vcvars32.bat" +echo Setting include paths for Theora +set INCLUDE=%INCLUDE%;%SRCROOT%\ogg\include;%SRCROOT%\theora\include +echo Compiling... +msdev theora_static.dsp /useenv /make "theora_static - Win32 Debug" /rebuild + +set PATH=%OLDPATH% +set INCLUDE=%OLDINCLUDE% +set LIB=%OLDLIB% diff --git a/cs/3rd party/libtheora/win32/experimental/dumpvid/dumpvid.dsp b/cs/3rd party/libtheora/win32/experimental/dumpvid/dumpvid.dsp new file mode 100644 index 000000000..a05cb04e0 --- /dev/null +++ b/cs/3rd party/libtheora/win32/experimental/dumpvid/dumpvid.dsp @@ -0,0 +1,121 @@ +# Microsoft Developer Studio Project File - Name="dumpvid" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=dumpvid - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "dumpvid.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "dumpvid.mak" CFG="dumpvid - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "dumpvid - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "dumpvid - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "dumpvid - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\..\include" /I "..\..\..\..\ogg\include" /I "..\wincompat" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c +# SUBTRACT CPP /YX /Yc /Yu +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib theora_static.lib ogg_static.lib /nologo /subsystem:console /machine:I386 /nodefaultlib:"LIBCMT" /out:"dump_vid.exe" /libpath:"..\..\Static_Release" /libpath:"..\..\..\..\ogg\win32\Static_Release" /libpath:"..\..\..\..\vorbis\win32\Vorbis_Static_Release" /libpath:"..\..\..\..\vorbis\win32\VorbisEnc_Static_Release" + +!ELSEIF "$(CFG)" == "dumpvid - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\..\include" /I "..\..\..\..\ogg\include" /I "..\wincompat" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /FD /GZ /c +# SUBTRACT CPP /YX /Yc /Yu +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib theora_static_d.lib ogg_static_d.lib /nologo /subsystem:console /debug /machine:I386 /nodefaultlib:"LIBCD" /out:"dump_vid.exe" /pdbtype:sept /libpath:"..\..\Static_Debug" /libpath:"..\..\..\..\ogg\win32\Static_Debug" /libpath:"..\..\..\..\vorbis\win32\Vorbis_Static_Debug" /libpath:"..\..\..\..\vorbis\win32\VorbisEnc_Static_Debug" +# SUBTRACT LINK32 /nodefaultlib + +!ENDIF + +# Begin Target + +# Name "dumpvid - Win32 Release" +# Name "dumpvid - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\..\examples\dump_video.c +# End Source File +# Begin Source File + +SOURCE=..\wincompat\getopt.c +# End Source File +# Begin Source File + +SOURCE=..\wincompat\getopt_long.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# Begin Group "library" + +# PROP Default_Filter "" +# End Group +# Begin Source File + +SOURCE=.\ReadMe.txt +# End Source File +# End Target +# End Project diff --git a/cs/3rd party/libtheora/win32/experimental/encoderwin/ReadMe.txt b/cs/3rd party/libtheora/win32/experimental/encoderwin/ReadMe.txt new file mode 100644 index 000000000..12c4090f9 --- /dev/null +++ b/cs/3rd party/libtheora/win32/experimental/encoderwin/ReadMe.txt @@ -0,0 +1,13 @@ +05/30/03 +Updated to use the common encoder_sample.c source in theora/examples. + +05/23/03 + +Very simple port of the sample encoder for Windows, for testing. +Encoder options in the command line are not working, and the frame rate +of video needs to be set in code (like in the simple sample encoder.) + +This example will be updated to a true Win32 app sometime in the future, +hope it is useful for basic testing now. + +mauricio@xiph.org \ No newline at end of file diff --git a/cs/3rd party/libtheora/win32/experimental/encoderwin/encoderwin.dsp b/cs/3rd party/libtheora/win32/experimental/encoderwin/encoderwin.dsp new file mode 100644 index 000000000..6d350bd1e --- /dev/null +++ b/cs/3rd party/libtheora/win32/experimental/encoderwin/encoderwin.dsp @@ -0,0 +1,121 @@ +# Microsoft Developer Studio Project File - Name="encoderwin" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=encoderwin - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "encoderwin.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "encoderwin.mak" CFG="encoderwin - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "encoderwin - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "encoderwin - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "encoderwin - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\..\include" /I "..\..\..\..\vorbis\include" /I "..\..\..\..\ogg\include" /I "..\wincompat" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c +# SUBTRACT CPP /YX /Yc /Yu +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib theora_static.lib ogg_static.lib vorbis_static.lib vorbisenc_static.lib /nologo /subsystem:console /machine:I386 /nodefaultlib:"LIBCMT" /out:"encoderwin.exe" /libpath:"..\..\Static_Release" /libpath:"..\..\..\..\ogg\win32\Static_Release" /libpath:"..\..\..\..\vorbis\win32\Vorbis_Static_Release" /libpath:"..\..\..\..\vorbis\win32\VorbisEnc_Static_Release" + +!ELSEIF "$(CFG)" == "encoderwin - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\..\include" /I "..\..\..\..\vorbis\include" /I "..\..\..\..\ogg\include" /I "..\wincompat" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c +# SUBTRACT CPP /YX /Yc /Yu +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib theora_static_d.lib ogg_static_d.lib vorbis_static_d.lib vorbisenc_static_d.lib /nologo /subsystem:console /debug /machine:I386 /nodefaultlib:"LIBCD" /out:"encoderwin.exe" /pdbtype:sept /libpath:"..\..\Static_Debug" /libpath:"..\..\..\..\ogg\win32\Static_Debug" /libpath:"..\..\..\..\vorbis\win32\Vorbis_Static_Debug" /libpath:"..\..\..\..\vorbis\win32\VorbisEnc_Static_Debug" +# SUBTRACT LINK32 /nodefaultlib + +!ENDIF + +# Begin Target + +# Name "encoderwin - Win32 Release" +# Name "encoderwin - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\..\examples\encoder_example.c +# End Source File +# Begin Source File + +SOURCE=..\wincompat\getopt.c +# End Source File +# Begin Source File + +SOURCE=..\wincompat\getopt_long.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# Begin Group "library" + +# PROP Default_Filter "" +# End Group +# Begin Source File + +SOURCE=.\ReadMe.txt +# End Source File +# End Target +# End Project diff --git a/cs/3rd party/libtheora/win32/experimental/transcoder/avi2vp3/avi2vp3.c b/cs/3rd party/libtheora/win32/experimental/transcoder/avi2vp3/avi2vp3.c new file mode 100644 index 000000000..08777e5a5 --- /dev/null +++ b/cs/3rd party/libtheora/win32/experimental/transcoder/avi2vp3/avi2vp3.c @@ -0,0 +1,82 @@ +#include +#include +#ifdef _WIN32 +#include +#else +typedef long DWORD; +#endif + +/*extremely crude app to dump vp3 frames from an avi file*/ +/*filenames are hardcoded*/ + +#include "avilib.h" + +int main(int argc, const char **argv) +{ + + FILE * f = fopen("outfile.vp3", "wb"); + + char * buffer; + int olength; + int length; + avi_t *avifile; + int chunksize; + int frame; + int frames; + int keyframegap = 0; + int maxkeyframegap = 0; + + DWORD initialticks; + + int framew = 0; + int frameh = 0; + double framerate = 0.0f; + double fps_numerator, fps_denominator; + + avifile = AVI_open_input_file("vp31.avi", 1); + frames = AVI_video_frames(avifile); + framew = AVI_video_width(avifile); + frameh = AVI_video_height(avifile); + framerate = AVI_frame_rate(avifile); + chunksize = AVI_max_video_chunk(avifile); + /* avilib only reports the max video chunk size if the file has an + idx table. We fall back to an arbitrary limit otherwise. Better + would be just to handle the chunks dynamically */ + if (chunksize <= 0) chunksize = 131072; + buffer = malloc(chunksize); + printf("Frames(%d) Video(%dx%d) %3.2f fps\n",frames,framew, frameh,framerate); + printf("Video Compressor: %s", AVI_video_compressor(avifile)); + fps_denominator = 1000000.0F; + fps_numerator = framerate * fps_denominator; + + sprintf(buffer,"AVI2VP31R W%d H%d F%.0f:%.0f Ip A0:0\n", framew, frameh, fps_numerator, fps_denominator); + fwrite(buffer, strlen(buffer), 1, f); + + for (frame = 0; frame < frames;) { + int keyframe; + olength = length; + length = AVI_frame_size(avifile, frame++); + if( !length ) { + length = olength; + } + AVI_read_frame(avifile, (char *) buffer, &keyframe); + fwrite("FRAME\n", 6, 1, f); + fwrite(&length, sizeof(int), 1, f); + fwrite(&keyframe, sizeof(int), 1, f); + printf("Frame size(%d) IsKeyframe(%d)\n", length, keyframe); + fwrite(buffer, 1, length, f); + if (!keyframe){ + keyframegap++; + } else { + if (keyframegap>maxkeyframegap) maxkeyframegap=keyframegap; + keyframegap = 0; + } + } + + fclose(f); + printf("Max keyframegap (%d)\n", maxkeyframegap); + + free(buffer); + + exit(0); +} diff --git a/cs/3rd party/libtheora/win32/experimental/transcoder/avi2vp3/avilib.c b/cs/3rd party/libtheora/win32/experimental/transcoder/avi2vp3/avilib.c new file mode 100644 index 000000000..3df78ff82 --- /dev/null +++ b/cs/3rd party/libtheora/win32/experimental/transcoder/avi2vp3/avilib.c @@ -0,0 +1,1839 @@ +/* + * avilib.c + * + * Copyright (C) Thomas Östreich - June 2001 + * multiple audio track support Copyright (C) 2002 Thomas Östreich + * + * Original code: + * Copyright (C) 1999 Rainer Johanni + * + * This file is part of transcode, a linux video stream processing tool + * + * transcode is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * transcode is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Make; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#include "avilib.h" +//#include + +#define INFO_LIST + +/* The following variable indicates the kind of error */ + +long AVI_errno; + +#define MAX_INFO_STRLEN 64 +static char id_str[MAX_INFO_STRLEN]; + +#define FRAME_RATE_SCALE 1000000 + +#ifndef PACKAGE +#define PACKAGE "my" +#define VERSION "0.00" +#endif + +#ifndef O_BINARY +/* win32 wants a binary flag to open(); this sets it to null + on platforms that don't have it. */ +#define O_BINARY 0 +#endif + +/******************************************************************* + * * + * Utilities for writing an AVI File * + * * + *******************************************************************/ + +static size_t avi_read(int fd, char *buf, size_t len) +{ + size_t n = 0; + size_t r = 0; + + while (r < len) { + n = read (fd, buf + r, len - r); + + if (n <= 0) + return r; + r += n; + } + + return r; +} + +static size_t avi_write (int fd, char *buf, size_t len) +{ + size_t n = 0; + size_t r = 0; + + while (r < len) { + n = write (fd, buf + r, len - r); + if (n < 0) + return n; + + r += n; + } + return r; +} + +/* HEADERBYTES: The number of bytes to reserve for the header */ + +#define HEADERBYTES 2048 + +/* AVI_MAX_LEN: The maximum length of an AVI file, we stay a bit below + the 2GB limit (Remember: 2*10^9 is smaller than 2 GB) */ + +#define AVI_MAX_LEN (UINT_MAX-(1<<20)*16-HEADERBYTES) + +#define PAD_EVEN(x) ( ((x)+1) & ~1 ) + + +/* Copy n into dst as a 4 byte, little endian number. + Should also work on big endian machines */ + +static void long2str(unsigned char *dst, int n) +{ + dst[0] = (n )&0xff; + dst[1] = (n>> 8)&0xff; + dst[2] = (n>>16)&0xff; + dst[3] = (n>>24)&0xff; +} + +/* Convert a string of 4 or 2 bytes to a number, + also working on big endian machines */ + +static unsigned long str2ulong(unsigned char *str) +{ + return ( str[0] | (str[1]<<8) | (str[2]<<16) | (str[3]<<24) ); +} +static unsigned long str2ushort(unsigned char *str) +{ + return ( str[0] | (str[1]<<8) ); +} + +/* Calculate audio sample size from number of bits and number of channels. + This may have to be adjusted for eg. 12 bits and stereo */ + +static int avi_sampsize(avi_t *AVI, int j) +{ + int s; + s = ((AVI->track[j].a_bits+7)/8)*AVI->track[j].a_chans; + // if(s==0) s=1; /* avoid possible zero divisions */ + if(s<4) s=4; /* avoid possible zero divisions */ + return s; +} + +/* Add a chunk (=tag and data) to the AVI file, + returns -1 on write error, 0 on success */ + +static int avi_add_chunk(avi_t *AVI, unsigned char *tag, unsigned char *data, int length) +{ + unsigned char c[8]; + + /* Copy tag and length int c, so that we need only 1 write system call + for these two values */ + + memcpy(c,tag,4); + long2str(c+4,length); + + /* Output tag, length and data, restore previous position + if the write fails */ + + length = PAD_EVEN(length); + + if( avi_write(AVI->fdes,(char *)c,8) != 8 || + avi_write(AVI->fdes,(char *)data,length) != length ) + { + lseek(AVI->fdes,AVI->pos,SEEK_SET); + AVI_errno = AVI_ERR_WRITE; + return -1; + } + + /* Update file position */ + + AVI->pos += 8 + length; + + //fprintf(stderr, "pos=%lu %s\n", AVI->pos, tag); + + return 0; +} + +static int avi_add_index_entry(avi_t *AVI, unsigned char *tag, long flags, unsigned long pos, unsigned long len) +{ + void *ptr; + + if(AVI->n_idx>=AVI->max_idx) { + ptr = realloc((void *)AVI->idx,(AVI->max_idx+4096)*16); + + if(ptr == 0) { + AVI_errno = AVI_ERR_NO_MEM; + return -1; + } + AVI->max_idx += 4096; + AVI->idx = (unsigned char((*)[16]) ) ptr; + } + + /* Add index entry */ + + // fprintf(stderr, "INDEX %s %ld %lu %lu\n", tag, flags, pos, len); + + memcpy(AVI->idx[AVI->n_idx],tag,4); + long2str(AVI->idx[AVI->n_idx]+ 4,flags); + long2str(AVI->idx[AVI->n_idx]+ 8, pos); + long2str(AVI->idx[AVI->n_idx]+12, len); + + /* Update counter */ + + AVI->n_idx++; + + if(len>AVI->max_len) AVI->max_len=len; + + return 0; +} + +/* + AVI_open_output_file: Open an AVI File and write a bunch + of zero bytes as space for the header. + + returns a pointer to avi_t on success, a zero pointer on error +*/ + +avi_t* AVI_open_output_file(char * filename) +{ + avi_t *AVI; + int i; + + int mask = 0; + + unsigned char AVI_header[HEADERBYTES]; + + /* Allocate the avi_t struct and zero it */ + + AVI = (avi_t *) malloc(sizeof(avi_t)); + if(AVI==0) + { + AVI_errno = AVI_ERR_NO_MEM; + return 0; + } + memset((void *)AVI,0,sizeof(avi_t)); + + /* Since Linux needs a long time when deleting big files, + we do not truncate the file when we open it. + Instead it is truncated when the AVI file is closed */ + + /* mask = umask (0); + umask (mask);*/ + + AVI->fdes = open(filename, O_RDWR|O_CREAT|O_BINARY, 0644 &~ mask); + if (AVI->fdes < 0) + { + AVI_errno = AVI_ERR_OPEN; + free(AVI); + return 0; + } + + /* Write out HEADERBYTES bytes, the header will go here + when we are finished with writing */ + + for (i=0;ifdes,(char *)AVI_header,HEADERBYTES); + if (i != HEADERBYTES) + { + close(AVI->fdes); + AVI_errno = AVI_ERR_WRITE; + free(AVI); + return 0; + } + + AVI->pos = HEADERBYTES; + AVI->mode = AVI_MODE_WRITE; /* open for writing */ + + //init + AVI->anum = 0; + AVI->aptr = 0; + + return AVI; +} + +void AVI_set_video(avi_t *AVI, int width, int height, double fps, char *compressor) +{ + /* may only be called if file is open for writing */ + + if(AVI->mode==AVI_MODE_READ) return; + + AVI->width = width; + AVI->height = height; + AVI->fps = fps; + + if(strncmp(compressor, "RGB", 3)==0) { + memset(AVI->compressor, 0, 4); + } else { + memcpy(AVI->compressor,compressor,4); + } + + AVI->compressor[4] = 0; + + avi_update_header(AVI); +} + +void AVI_set_audio(avi_t *AVI, int channels, long rate, int bits, int format, long mp3rate) +{ + /* may only be called if file is open for writing */ + + if(AVI->mode==AVI_MODE_READ) return; + + //inc audio tracks + AVI->aptr=AVI->anum; + ++AVI->anum; + + if(AVI->anum > AVI_MAX_TRACKS) { + fprintf(stderr, "error - only %d audio tracks supported\n", AVI_MAX_TRACKS); + exit(1); + } + + AVI->track[AVI->aptr].a_chans = channels; + AVI->track[AVI->aptr].a_rate = rate; + AVI->track[AVI->aptr].a_bits = bits; + AVI->track[AVI->aptr].a_fmt = format; + AVI->track[AVI->aptr].mp3rate = mp3rate; + + avi_update_header(AVI); +} + +#define OUT4CC(s) \ + if(nhb<=HEADERBYTES-4) memcpy(AVI_header+nhb,s,4); nhb += 4 + +#define OUTLONG(n) \ + if(nhb<=HEADERBYTES-4) long2str(AVI_header+nhb,n); nhb += 4 + +#define OUTSHRT(n) \ + if(nhb<=HEADERBYTES-2) { \ + AVI_header[nhb ] = (n )&0xff; \ + AVI_header[nhb+1] = (n>>8)&0xff; \ + } \ + nhb += 2 + + +//ThOe write preliminary AVI file header: 0 frames, max vid/aud size +int avi_update_header(avi_t *AVI) +{ + int njunk, sampsize, hasIndex, ms_per_frame, frate, flag; + int movi_len, hdrl_start, strl_start, j; + unsigned char AVI_header[HEADERBYTES]; + long nhb; + + //assume max size + movi_len = AVI_MAX_LEN - HEADERBYTES + 4; + + //assume index will be written + hasIndex=1; + + if(AVI->fps < 0.001) { + frate=0; + ms_per_frame=0; + } else { + frate = (int) (FRAME_RATE_SCALE*AVI->fps + 0.5); + ms_per_frame=(int) (1000000/AVI->fps + 0.5); + } + + /* Prepare the file header */ + + nhb = 0; + + /* The RIFF header */ + + OUT4CC ("RIFF"); + OUTLONG(movi_len); // assume max size + OUT4CC ("AVI "); + + /* Start the header list */ + + OUT4CC ("LIST"); + OUTLONG(0); /* Length of list in bytes, don't know yet */ + hdrl_start = nhb; /* Store start position */ + OUT4CC ("hdrl"); + + /* The main AVI header */ + + /* The Flags in AVI File header */ + +#define AVIF_HASINDEX 0x00000010 /* Index at end of file */ +#define AVIF_MUSTUSEINDEX 0x00000020 +#define AVIF_ISINTERLEAVED 0x00000100 +#define AVIF_TRUSTCKTYPE 0x00000800 /* Use CKType to find key frames */ +#define AVIF_WASCAPTUREFILE 0x00010000 +#define AVIF_COPYRIGHTED 0x00020000 + + OUT4CC ("avih"); + OUTLONG(56); /* # of bytes to follow */ + OUTLONG(ms_per_frame); /* Microseconds per frame */ + //ThOe ->0 + // OUTLONG(10000000); /* MaxBytesPerSec, I hope this will never be used */ + OUTLONG(0); + OUTLONG(0); /* PaddingGranularity (whatever that might be) */ + /* Other sources call it 'reserved' */ + flag = AVIF_ISINTERLEAVED; + if(hasIndex) flag |= AVIF_HASINDEX; + if(hasIndex && AVI->must_use_index) flag |= AVIF_MUSTUSEINDEX; + OUTLONG(flag); /* Flags */ + OUTLONG(0); // no frames yet + OUTLONG(0); /* InitialFrames */ + + OUTLONG(AVI->anum+1); + + OUTLONG(0); /* SuggestedBufferSize */ + OUTLONG(AVI->width); /* Width */ + OUTLONG(AVI->height); /* Height */ + /* MS calls the following 'reserved': */ + OUTLONG(0); /* TimeScale: Unit used to measure time */ + OUTLONG(0); /* DataRate: Data rate of playback */ + OUTLONG(0); /* StartTime: Starting time of AVI data */ + OUTLONG(0); /* DataLength: Size of AVI data chunk */ + + + /* Start the video stream list ---------------------------------- */ + + OUT4CC ("LIST"); + OUTLONG(0); /* Length of list in bytes, don't know yet */ + strl_start = nhb; /* Store start position */ + OUT4CC ("strl"); + + /* The video stream header */ + + OUT4CC ("strh"); + OUTLONG(56); /* # of bytes to follow */ + OUT4CC ("vids"); /* Type */ + OUT4CC (AVI->compressor); /* Handler */ + OUTLONG(0); /* Flags */ + OUTLONG(0); /* Reserved, MS says: wPriority, wLanguage */ + OUTLONG(0); /* InitialFrames */ + OUTLONG(FRAME_RATE_SCALE); /* Scale */ + OUTLONG(frate); /* Rate: Rate/Scale == samples/second */ + OUTLONG(0); /* Start */ + OUTLONG(0); // no frames yet + OUTLONG(0); /* SuggestedBufferSize */ + OUTLONG(-1); /* Quality */ + OUTLONG(0); /* SampleSize */ + OUTLONG(0); /* Frame */ + OUTLONG(0); /* Frame */ + // OUTLONG(0); /* Frame */ + //OUTLONG(0); /* Frame */ + + /* The video stream format */ + + OUT4CC ("strf"); + OUTLONG(40); /* # of bytes to follow */ + OUTLONG(40); /* Size */ + OUTLONG(AVI->width); /* Width */ + OUTLONG(AVI->height); /* Height */ + OUTSHRT(1); OUTSHRT(24); /* Planes, Count */ + OUT4CC (AVI->compressor); /* Compression */ + // ThOe (*3) + OUTLONG(AVI->width*AVI->height*3); /* SizeImage (in bytes?) */ + OUTLONG(0); /* XPelsPerMeter */ + OUTLONG(0); /* YPelsPerMeter */ + OUTLONG(0); /* ClrUsed: Number of colors used */ + OUTLONG(0); /* ClrImportant: Number of colors important */ + + /* Finish stream list, i.e. put number of bytes in the list to proper pos */ + + long2str(AVI_header+strl_start-4,nhb-strl_start); + + + /* Start the audio stream list ---------------------------------- */ + + for(j=0; janum; ++j) { + + sampsize = avi_sampsize(AVI, j); + + OUT4CC ("LIST"); + OUTLONG(0); /* Length of list in bytes, don't know yet */ + strl_start = nhb; /* Store start position */ + OUT4CC ("strl"); + + /* The audio stream header */ + + OUT4CC ("strh"); + OUTLONG(56); /* # of bytes to follow */ + OUT4CC ("auds"); + + // ----------- + // ThOe + OUTLONG(0); /* Format (Optionally) */ + // ----------- + + OUTLONG(0); /* Flags */ + OUTLONG(0); /* Reserved, MS says: wPriority, wLanguage */ + OUTLONG(0); /* InitialFrames */ + + // ThOe /4 + OUTLONG(sampsize/4); /* Scale */ + OUTLONG(1000*AVI->track[j].mp3rate/8); + OUTLONG(0); /* Start */ + OUTLONG(4*AVI->track[j].audio_bytes/sampsize); /* Length */ + OUTLONG(0); /* SuggestedBufferSize */ + OUTLONG(-1); /* Quality */ + + // ThOe /4 + OUTLONG(sampsize/4); /* SampleSize */ + + OUTLONG(0); /* Frame */ + OUTLONG(0); /* Frame */ + // OUTLONG(0); /* Frame */ + //OUTLONG(0); /* Frame */ + + /* The audio stream format */ + + OUT4CC ("strf"); + OUTLONG(16); /* # of bytes to follow */ + OUTSHRT(AVI->track[j].a_fmt); /* Format */ + OUTSHRT(AVI->track[j].a_chans); /* Number of channels */ + OUTLONG(AVI->track[j].a_rate); /* SamplesPerSec */ + // ThOe + OUTLONG(1000*AVI->track[j].mp3rate/8); + //ThOe (/4) + + OUTSHRT(sampsize/4); /* BlockAlign */ + + + OUTSHRT(AVI->track[j].a_bits); /* BitsPerSample */ + + /* Finish stream list, i.e. put number of bytes in the list to proper pos */ + + long2str(AVI_header+strl_start-4,nhb-strl_start); + } + + /* Finish header list */ + + long2str(AVI_header+hdrl_start-4,nhb-hdrl_start); + + + /* Calculate the needed amount of junk bytes, output junk */ + + njunk = HEADERBYTES - nhb - 8 - 12; + + /* Safety first: if njunk <= 0, somebody has played with + HEADERBYTES without knowing what (s)he did. + This is a fatal error */ + + if(njunk<=0) + { + fprintf(stderr,"AVI_close_output_file: # of header bytes too small\n"); + exit(1); + } + + OUT4CC ("JUNK"); + OUTLONG(njunk); + memset(AVI_header+nhb,0,njunk); + + //11/14/01 added id string + + if(njunk > strlen(id_str)+8) { + sprintf(id_str, "%s-%s", PACKAGE, VERSION); + memcpy(AVI_header+nhb, id_str, strlen(id_str)); + } + + nhb += njunk; + + /* Start the movi list */ + + OUT4CC ("LIST"); + OUTLONG(movi_len); /* Length of list in bytes */ + OUT4CC ("movi"); + + /* Output the header, truncate the file to the number of bytes + actually written, report an error if someting goes wrong */ + + if ( lseek(AVI->fdes,0,SEEK_SET)<0 || + avi_write(AVI->fdes,(char *)AVI_header,HEADERBYTES)!=HEADERBYTES || + lseek(AVI->fdes,AVI->pos,SEEK_SET)<0) + { + AVI_errno = AVI_ERR_CLOSE; + return -1; + } + + return 0; +} + +/* + Write the header of an AVI file and close it. + returns 0 on success, -1 on write error. +*/ + +static int avi_close_output_file(avi_t *AVI) +{ + + int ret, njunk, sampsize, hasIndex, ms_per_frame, frate, idxerror, flag; + unsigned long movi_len; + int hdrl_start, strl_start, j; + unsigned char AVI_header[HEADERBYTES]; + long nhb; + +#ifdef INFO_LIST + long info_len; +// time_t calptr; +#endif + + /* Calculate length of movi list */ + + movi_len = AVI->pos - HEADERBYTES + 4; + + /* Try to ouput the index entries. This may fail e.g. if no space + is left on device. We will report this as an error, but we still + try to write the header correctly (so that the file still may be + readable in the most cases */ + + idxerror = 0; + // fprintf(stderr, "pos=%lu, index_len=%ld \n", AVI->pos, AVI->n_idx*16); + ret = avi_add_chunk(AVI, (unsigned char *)"idx1", (void*)AVI->idx, AVI->n_idx*16); + hasIndex = (ret==0); + //fprintf(stderr, "pos=%lu, index_len=%d\n", AVI->pos, hasIndex); + + if(ret) { + idxerror = 1; + AVI_errno = AVI_ERR_WRITE_INDEX; + } + + /* Calculate Microseconds per frame */ + + if(AVI->fps < 0.001) { + frate=0; + ms_per_frame=0; + } else { + frate = (int) (FRAME_RATE_SCALE*AVI->fps + 0.5); + ms_per_frame=(int) (1000000/AVI->fps + 0.5); + } + + /* Prepare the file header */ + + nhb = 0; + + /* The RIFF header */ + + OUT4CC ("RIFF"); + OUTLONG(AVI->pos - 8); /* # of bytes to follow */ + OUT4CC ("AVI "); + + /* Start the header list */ + + OUT4CC ("LIST"); + OUTLONG(0); /* Length of list in bytes, don't know yet */ + hdrl_start = nhb; /* Store start position */ + OUT4CC ("hdrl"); + + /* The main AVI header */ + + /* The Flags in AVI File header */ + +#define AVIF_HASINDEX 0x00000010 /* Index at end of file */ +#define AVIF_MUSTUSEINDEX 0x00000020 +#define AVIF_ISINTERLEAVED 0x00000100 +#define AVIF_TRUSTCKTYPE 0x00000800 /* Use CKType to find key frames */ +#define AVIF_WASCAPTUREFILE 0x00010000 +#define AVIF_COPYRIGHTED 0x00020000 + + OUT4CC ("avih"); + OUTLONG(56); /* # of bytes to follow */ + OUTLONG(ms_per_frame); /* Microseconds per frame */ + //ThOe ->0 + // OUTLONG(10000000); /* MaxBytesPerSec, I hope this will never be used */ + OUTLONG(0); + OUTLONG(0); /* PaddingGranularity (whatever that might be) */ + /* Other sources call it 'reserved' */ + flag = AVIF_ISINTERLEAVED; + if(hasIndex) flag |= AVIF_HASINDEX; + if(hasIndex && AVI->must_use_index) flag |= AVIF_MUSTUSEINDEX; + OUTLONG(flag); /* Flags */ + OUTLONG(AVI->video_frames); /* TotalFrames */ + OUTLONG(0); /* InitialFrames */ + + OUTLONG(AVI->anum+1); +// if (AVI->track[0].audio_bytes) +// { OUTLONG(2); } /* Streams */ +// else +// { OUTLONG(1); } /* Streams */ + + OUTLONG(0); /* SuggestedBufferSize */ + OUTLONG(AVI->width); /* Width */ + OUTLONG(AVI->height); /* Height */ + /* MS calls the following 'reserved': */ + OUTLONG(0); /* TimeScale: Unit used to measure time */ + OUTLONG(0); /* DataRate: Data rate of playback */ + OUTLONG(0); /* StartTime: Starting time of AVI data */ + OUTLONG(0); /* DataLength: Size of AVI data chunk */ + + + /* Start the video stream list ---------------------------------- */ + + OUT4CC ("LIST"); + OUTLONG(0); /* Length of list in bytes, don't know yet */ + strl_start = nhb; /* Store start position */ + OUT4CC ("strl"); + + /* The video stream header */ + + OUT4CC ("strh"); + OUTLONG(56); /* # of bytes to follow */ + OUT4CC ("vids"); /* Type */ + OUT4CC (AVI->compressor); /* Handler */ + OUTLONG(0); /* Flags */ + OUTLONG(0); /* Reserved, MS says: wPriority, wLanguage */ + OUTLONG(0); /* InitialFrames */ + OUTLONG(FRAME_RATE_SCALE); /* Scale */ + OUTLONG(frate); /* Rate: Rate/Scale == samples/second */ + OUTLONG(0); /* Start */ + OUTLONG(AVI->video_frames); /* Length */ + OUTLONG(0); /* SuggestedBufferSize */ + OUTLONG(-1); /* Quality */ + OUTLONG(0); /* SampleSize */ + OUTLONG(0); /* Frame */ + OUTLONG(0); /* Frame */ + // OUTLONG(0); /* Frame */ + //OUTLONG(0); /* Frame */ + + /* The video stream format */ + + OUT4CC ("strf"); + OUTLONG(40); /* # of bytes to follow */ + OUTLONG(40); /* Size */ + OUTLONG(AVI->width); /* Width */ + OUTLONG(AVI->height); /* Height */ + OUTSHRT(1); OUTSHRT(24); /* Planes, Count */ + OUT4CC (AVI->compressor); /* Compression */ + // ThOe (*3) + OUTLONG(AVI->width*AVI->height*3); /* SizeImage (in bytes?) */ + OUTLONG(0); /* XPelsPerMeter */ + OUTLONG(0); /* YPelsPerMeter */ + OUTLONG(0); /* ClrUsed: Number of colors used */ + OUTLONG(0); /* ClrImportant: Number of colors important */ + + /* Finish stream list, i.e. put number of bytes in the list to proper pos */ + + long2str(AVI_header+strl_start-4,nhb-strl_start); + + /* Start the audio stream list ---------------------------------- */ + + for(j=0; janum; ++j) { + + //if (AVI->track[j].a_chans && AVI->track[j].audio_bytes) + { + + sampsize = avi_sampsize(AVI, j); + + OUT4CC ("LIST"); + OUTLONG(0); /* Length of list in bytes, don't know yet */ + strl_start = nhb; /* Store start position */ + OUT4CC ("strl"); + + /* The audio stream header */ + + OUT4CC ("strh"); + OUTLONG(56); /* # of bytes to follow */ + OUT4CC ("auds"); + + // ----------- + // ThOe + OUTLONG(0); /* Format (Optionally) */ + // ----------- + + OUTLONG(0); /* Flags */ + OUTLONG(0); /* Reserved, MS says: wPriority, wLanguage */ + OUTLONG(0); /* InitialFrames */ + + // ThOe /4 + OUTLONG(sampsize/4); /* Scale */ + OUTLONG(1000*AVI->track[j].mp3rate/8); + OUTLONG(0); /* Start */ + OUTLONG(4*AVI->track[j].audio_bytes/sampsize); /* Length */ + OUTLONG(0); /* SuggestedBufferSize */ + OUTLONG(-1); /* Quality */ + + // ThOe /4 + OUTLONG(sampsize/4); /* SampleSize */ + + OUTLONG(0); /* Frame */ + OUTLONG(0); /* Frame */ + // OUTLONG(0); /* Frame */ + //OUTLONG(0); /* Frame */ + + /* The audio stream format */ + + OUT4CC ("strf"); + OUTLONG(16); /* # of bytes to follow */ + OUTSHRT(AVI->track[j].a_fmt); /* Format */ + OUTSHRT(AVI->track[j].a_chans); /* Number of channels */ + OUTLONG(AVI->track[j].a_rate); /* SamplesPerSec */ + // ThOe + OUTLONG(1000*AVI->track[j].mp3rate/8); + //ThOe (/4) + + OUTSHRT(sampsize/4); /* BlockAlign */ + + + OUTSHRT(AVI->track[j].a_bits); /* BitsPerSample */ + + /* Finish stream list, i.e. put number of bytes in the list to proper pos */ + } + long2str(AVI_header+strl_start-4,nhb-strl_start); + } + + /* Finish header list */ + + long2str(AVI_header+hdrl_start-4,nhb-hdrl_start); + + + // add INFO list --- (0.6.0pre4) + +#ifdef INFO_LIST + OUT4CC ("LIST"); + + //FIXME + info_len = MAX_INFO_STRLEN + 12; + OUTLONG(info_len); + OUT4CC ("INFO"); + +// OUT4CC ("INAM"); +// OUTLONG(MAX_INFO_STRLEN); + +// sprintf(id_str, "\t"); +// memset(AVI_header+nhb, 0, MAX_INFO_STRLEN); +// memcpy(AVI_header+nhb, id_str, strlen(id_str)); +// nhb += MAX_INFO_STRLEN; + + OUT4CC ("ISFT"); + OUTLONG(MAX_INFO_STRLEN); + + sprintf(id_str, "%s-%s", PACKAGE, VERSION); + memset(AVI_header+nhb, 0, MAX_INFO_STRLEN); + memcpy(AVI_header+nhb, id_str, strlen(id_str)); + nhb += MAX_INFO_STRLEN; + +// OUT4CC ("ICMT"); +// OUTLONG(MAX_INFO_STRLEN); + +// calptr=time(NULL); +// sprintf(id_str, "\t%s %s", ctime(&calptr), ""); +// memset(AVI_header+nhb, 0, MAX_INFO_STRLEN); +// memcpy(AVI_header+nhb, id_str, 25); +// nhb += MAX_INFO_STRLEN; +#endif + + // ---------------------------- + + /* Calculate the needed amount of junk bytes, output junk */ + + njunk = HEADERBYTES - nhb - 8 - 12; + + /* Safety first: if njunk <= 0, somebody has played with + HEADERBYTES without knowing what (s)he did. + This is a fatal error */ + + if(njunk<=0) + { + fprintf(stderr,"AVI_close_output_file: # of header bytes too small\n"); + exit(1); + } + + OUT4CC ("JUNK"); + OUTLONG(njunk); + memset(AVI_header+nhb,0,njunk); + + nhb += njunk; + + /* Start the movi list */ + + OUT4CC ("LIST"); + OUTLONG(movi_len); /* Length of list in bytes */ + OUT4CC ("movi"); + + /* Output the header, truncate the file to the number of bytes + actually written, report an error if someting goes wrong */ + + if ( lseek(AVI->fdes,0,SEEK_SET)<0 || + avi_write(AVI->fdes,(char *)AVI_header,HEADERBYTES)!=HEADERBYTES + //|| ftruncate(AVI->fdes,AVI->pos)<0 + ) + { + AVI_errno = AVI_ERR_CLOSE; + return -1; + } + + if(idxerror) return -1; + + return 0; +} + +/* + AVI_write_data: + Add video or audio data to the file; + + Return values: + 0 No error; + -1 Error, AVI_errno is set appropriatly; + +*/ + +static int avi_write_data(avi_t *AVI, char *data, unsigned long length, int audio, int keyframe) +{ + int n; + + unsigned char astr[5]; + + /* Check for maximum file length */ + + if ( (AVI->pos + 8 + length + 8 + (AVI->n_idx+1)*16) > AVI_MAX_LEN ) { + AVI_errno = AVI_ERR_SIZELIM; + return -1; + } + + /* Add index entry */ + + //set tag for current audio track + sprintf((char *)astr, "0%1dwb", AVI->aptr+1); + + if(audio) + n = avi_add_index_entry(AVI,astr,0x00,AVI->pos,length); + else + n = avi_add_index_entry(AVI,(unsigned char *) "00db",((keyframe)?0x10:0x0),AVI->pos,length); + + if(n) return -1; + + /* Output tag and data */ + + if(audio) + n = avi_add_chunk(AVI,(unsigned char *) astr, (unsigned char *)data,length); + else + n = avi_add_chunk(AVI,(unsigned char *)"00db",(unsigned char *)data,length); + + if (n) return -1; + + return 0; +} + +int AVI_write_frame(avi_t *AVI, char *data, long bytes, int keyframe) +{ + unsigned long pos; + + if(AVI->mode==AVI_MODE_READ) { AVI_errno = AVI_ERR_NOT_PERM; return -1; } + + pos = AVI->pos; + + if(avi_write_data(AVI,data,bytes,0,keyframe)) return -1; + + AVI->last_pos = pos; + AVI->last_len = bytes; + AVI->video_frames++; + return 0; +} + +int AVI_dup_frame(avi_t *AVI) +{ + if(AVI->mode==AVI_MODE_READ) { AVI_errno = AVI_ERR_NOT_PERM; return -1; } + + if(AVI->last_pos==0) return 0; /* No previous real frame */ + if(avi_add_index_entry(AVI,(unsigned char *)"00db",0x10,AVI->last_pos,AVI->last_len)) return -1; + AVI->video_frames++; + AVI->must_use_index = 1; + return 0; +} + +int AVI_write_audio(avi_t *AVI, char *data, long bytes) +{ + if(AVI->mode==AVI_MODE_READ) { AVI_errno = AVI_ERR_NOT_PERM; return -1; } + + if( avi_write_data(AVI,data,bytes,1,0) ) return -1; + AVI->track[AVI->aptr].audio_bytes += bytes; + return 0; +} + + +int AVI_append_audio(avi_t *AVI, char *data, long bytes) +{ + + long i, length, pos; + unsigned char c[4]; + + if(AVI->mode==AVI_MODE_READ) { AVI_errno = AVI_ERR_NOT_PERM; return -1; } + + // update last index entry: + + --AVI->n_idx; + length = str2ulong(AVI->idx[AVI->n_idx]+12); + pos = str2ulong(AVI->idx[AVI->n_idx]+8); + + //update; + long2str(AVI->idx[AVI->n_idx]+12,length+bytes); + + ++AVI->n_idx; + + AVI->track[AVI->aptr].audio_bytes += bytes; + + //update chunk header + lseek(AVI->fdes, pos+4, SEEK_SET); + long2str(c, length+bytes); + avi_write(AVI->fdes,(char *) c, 4); + + lseek(AVI->fdes, pos+8+length, SEEK_SET); + + i=PAD_EVEN(length + bytes); + + bytes = i - length; + avi_write(AVI->fdes, data, bytes); + AVI->pos = pos + 8 + i; + + return 0; +} + + +long AVI_bytes_remain(avi_t *AVI) +{ + if(AVI->mode==AVI_MODE_READ) return 0; + + return ( AVI_MAX_LEN - (AVI->pos + 8 + 16*AVI->n_idx)); +} + +long AVI_bytes_written(avi_t *AVI) +{ + if(AVI->mode==AVI_MODE_READ) return 0; + + return (AVI->pos + 8 + 16*AVI->n_idx); +} + +int AVI_set_audio_track(avi_t *AVI, int track) +{ + + if(track < 0 || track + 1 > AVI->anum) return(-1); + + //this info is not written to file anyway + AVI->aptr=track; + return 0; +} + +int AVI_get_audio_track(avi_t *AVI) +{ + return(AVI->aptr); +} + + +/******************************************************************* + * * + * Utilities for reading video and audio from an AVI File * + * * + *******************************************************************/ + +int AVI_close(avi_t *AVI) +{ + int ret; + + /* If the file was open for writing, the header and index still have + to be written */ + + if(AVI->mode == AVI_MODE_WRITE) + ret = avi_close_output_file(AVI); + else + ret = 0; + + /* Even if there happened an error, we first clean up */ + + close(AVI->fdes); + if(AVI->idx) free(AVI->idx); + if(AVI->video_index) free(AVI->video_index); + //FIXME + //if(AVI->audio_index) free(AVI->audio_index); + free(AVI); + + return ret; +} + + +#define ERR_EXIT(x) \ +{ \ + AVI_close(AVI); \ + AVI_errno = x; \ + return 0; \ +} + +avi_t *AVI_open_input_file(char *filename, int getIndex) +{ + avi_t *AVI=NULL; + + /* Create avi_t structure */ + + AVI = (avi_t *) malloc(sizeof(avi_t)); + if(AVI==NULL) + { + AVI_errno = AVI_ERR_NO_MEM; + return 0; + } + memset((void *)AVI,0,sizeof(avi_t)); + + AVI->mode = AVI_MODE_READ; /* open for reading */ + + /* Open the file */ + + AVI->fdes = open(filename,O_RDONLY|O_BINARY); + if(AVI->fdes < 0) + { + AVI_errno = AVI_ERR_OPEN; + free(AVI); + return 0; + } + + avi_parse_input_file(AVI, getIndex); + + AVI->aptr=0; //reset + + return AVI; +} + +avi_t *AVI_open_fd(int fd, int getIndex) +{ + avi_t *AVI=NULL; + + /* Create avi_t structure */ + + AVI = (avi_t *) malloc(sizeof(avi_t)); + if(AVI==NULL) + { + AVI_errno = AVI_ERR_NO_MEM; + return 0; + } + memset((void *)AVI,0,sizeof(avi_t)); + + AVI->mode = AVI_MODE_READ; /* open for reading */ + + // file alread open + AVI->fdes = fd; + + avi_parse_input_file(AVI, getIndex); + + AVI->aptr=0; //reset + + return AVI; +} + +int avi_parse_input_file(avi_t *AVI, int getIndex) +{ + long i, n, rate, scale, idx_type; + unsigned char *hdrl_data; + long header_offset=0, hdrl_len=0; + long nvi, nai[AVI_MAX_TRACKS], ioff; + long tot[AVI_MAX_TRACKS]; + int j; + int lasttag = 0; + int vids_strh_seen = 0; + int vids_strf_seen = 0; + int auds_strh_seen = 0; + // int auds_strf_seen = 0; + int num_stream = 0; + char data[256]; + + /* Read first 12 bytes and check that this is an AVI file */ + + if( avi_read(AVI->fdes,data,12) != 12 ) ERR_EXIT(AVI_ERR_READ) + + if( strncasecmp(data ,"RIFF",4) !=0 || + strncasecmp(data+8,"AVI ",4) !=0 ) ERR_EXIT(AVI_ERR_NO_AVI) + + /* Go through the AVI file and extract the header list, + the start position of the 'movi' list and an optionally + present idx1 tag */ + + hdrl_data = 0; + + while(1) + { + if( avi_read(AVI->fdes,data,8) != 8 ) break; /* We assume it's EOF */ + + n = str2ulong((unsigned char *) data+4); + n = PAD_EVEN(n); + + if(strncasecmp(data,"LIST",4) == 0) + { + if( avi_read(AVI->fdes,data,4) != 4 ) ERR_EXIT(AVI_ERR_READ) + n -= 4; + if(strncasecmp(data,"hdrl",4) == 0) + { + hdrl_len = n; + hdrl_data = (unsigned char *) malloc(n); + if(hdrl_data==0) ERR_EXIT(AVI_ERR_NO_MEM); + + // offset of header + + header_offset = lseek(AVI->fdes,0,SEEK_CUR); + + if( avi_read(AVI->fdes,(char *)hdrl_data,n) != n ) ERR_EXIT(AVI_ERR_READ) + } + else if(strncasecmp(data,"movi",4) == 0) + { + AVI->movi_start = lseek(AVI->fdes,0,SEEK_CUR); + lseek(AVI->fdes,n,SEEK_CUR); + } + else + lseek(AVI->fdes,n,SEEK_CUR); + } + else if(strncasecmp(data,"idx1",4) == 0) + { + /* n must be a multiple of 16, but the reading does not + break if this is not the case */ + + AVI->n_idx = AVI->max_idx = n/16; + AVI->idx = (unsigned char((*)[16]) ) malloc(n); + if(AVI->idx==0) ERR_EXIT(AVI_ERR_NO_MEM) + if(avi_read(AVI->fdes, (char *) AVI->idx, n) != n ) ERR_EXIT(AVI_ERR_READ) + } + else + lseek(AVI->fdes,n,SEEK_CUR); + } + + if(!hdrl_data ) ERR_EXIT(AVI_ERR_NO_HDRL) + if(!AVI->movi_start) ERR_EXIT(AVI_ERR_NO_MOVI) + + /* Interpret the header list */ + + for(i=0;icompressor,hdrl_data+i+4,4); + AVI->compressor[4] = 0; + + // ThOe + AVI->v_codech_off = header_offset + i+4; + + scale = str2ulong((unsigned char *)hdrl_data+i+20); + rate = str2ulong(hdrl_data+i+24); + if(scale!=0) AVI->fps = (double)rate/(double)scale; + AVI->video_frames = str2ulong(hdrl_data+i+32); + AVI->video_strn = num_stream; + AVI->max_len = 0; + vids_strh_seen = 1; + lasttag = 1; /* vids */ + } + else if (strncasecmp ((char *) hdrl_data+i,"auds",4) ==0 && ! auds_strh_seen) + { + + //inc audio tracks + AVI->aptr=AVI->anum; + ++AVI->anum; + + if(AVI->anum > AVI_MAX_TRACKS) { + fprintf(stderr, "error - only %d audio tracks supported\n", AVI_MAX_TRACKS); + return(-1); + } + + AVI->track[AVI->aptr].audio_bytes = str2ulong(hdrl_data+i+32)*avi_sampsize(AVI, 0); + AVI->track[AVI->aptr].audio_strn = num_stream; + // auds_strh_seen = 1; + lasttag = 2; /* auds */ + + // ThOe + AVI->track[AVI->aptr].a_codech_off = header_offset + i; + + } + else + lasttag = 0; + num_stream++; + } + else if(strncasecmp((char *) hdrl_data+i,"strf",4)==0) + { + i += 8; + if(lasttag == 1) + { + AVI->width = str2ulong(hdrl_data+i+4); + AVI->height = str2ulong(hdrl_data+i+8); + vids_strf_seen = 1; + //ThOe + AVI->v_codecf_off = header_offset + i+16; + + memcpy(AVI->compressor2, hdrl_data+i+16, 4); + AVI->compressor2[4] = 0; + + } + else if(lasttag == 2) + { + AVI->track[AVI->aptr].a_fmt = str2ushort(hdrl_data+i ); + + //ThOe + AVI->track[AVI->aptr].a_codecf_off = header_offset + i; + + AVI->track[AVI->aptr].a_chans = str2ushort(hdrl_data+i+2); + AVI->track[AVI->aptr].a_rate = str2ulong (hdrl_data+i+4); + //ThOe: read mp3bitrate + AVI->track[AVI->aptr].mp3rate = 8*str2ulong(hdrl_data+i+8)/1000; + //:ThOe + AVI->track[AVI->aptr].a_bits = str2ushort(hdrl_data+i+14); + // auds_strf_seen = 1; + } + lasttag = 0; + } + else + { + i += 8; + lasttag = 0; + } + + i += n; + } + + free(hdrl_data); + + if(!vids_strh_seen || !vids_strf_seen) ERR_EXIT(AVI_ERR_NO_VIDS) + + AVI->video_tag[0] = AVI->video_strn/10 + '0'; + AVI->video_tag[1] = AVI->video_strn%10 + '0'; + AVI->video_tag[2] = 'd'; + AVI->video_tag[3] = 'b'; + + /* Audio tag is set to "99wb" if no audio present */ + if(!AVI->track[0].a_chans) AVI->track[0].audio_strn = 99; + + for(j=0; janum; ++j) { + AVI->track[j].audio_tag[0] = (j+1)/10 + '0'; + AVI->track[j].audio_tag[1] = (j+1)%10 + '0'; + AVI->track[j].audio_tag[2] = 'w'; + AVI->track[j].audio_tag[3] = 'b'; + } + + lseek(AVI->fdes,AVI->movi_start,SEEK_SET); + + /* get index if wanted */ + + if(!getIndex) return(0); + + /* if the file has an idx1, check if this is relative + to the start of the file or to the start of the movi list */ + + idx_type = 0; + + if(AVI->idx) + { + long pos, len; + + /* Search the first videoframe in the idx1 and look where + it is in the file */ + + for(i=0;in_idx;i++) + if( strncasecmp((char *) AVI->idx[i],(char *) AVI->video_tag,3)==0 ) break; + if(i>=AVI->n_idx) ERR_EXIT(AVI_ERR_NO_VIDS) + + pos = str2ulong(AVI->idx[i]+ 8); + len = str2ulong(AVI->idx[i]+12); + + lseek(AVI->fdes,pos,SEEK_SET); + if(avi_read(AVI->fdes,data,8)!=8) ERR_EXIT(AVI_ERR_READ) + if( strncasecmp((char *)data,(char *)AVI->idx[i],4)==0 && + str2ulong((unsigned char *)data+4)==len ) + { + idx_type = 1; /* Index from start of file */ + } + else + { + lseek(AVI->fdes,pos+AVI->movi_start-4,SEEK_SET); + if(avi_read(AVI->fdes,data,8)!=8) ERR_EXIT(AVI_ERR_READ) + if( strncasecmp((char *)data,(char *)AVI->idx[i],4)==0 && str2ulong((unsigned char *)data+4)==len ) + { + idx_type = 2; /* Index from start of movi list */ + } + } + /* idx_type remains 0 if neither of the two tests above succeeds */ + } + + if(idx_type == 0) + { + /* we must search through the file to get the index */ + + lseek(AVI->fdes, AVI->movi_start, SEEK_SET); + + AVI->n_idx = 0; + + while(1) + { + if( avi_read(AVI->fdes,data,8) != 8 ) break; + n = str2ulong((unsigned char *)data+4); + + /* The movi list may contain sub-lists, ignore them */ + + if(strncasecmp(data,"LIST",4)==0) + { + lseek(AVI->fdes,4,SEEK_CUR); + continue; + } + + /* Check if we got a tag ##db, ##dc or ##wb */ + + if( ( (data[2]=='d' || data[2]=='D') && + (data[3]=='b' || data[3]=='B' || data[3]=='c' || data[3]=='C') ) + || ( (data[2]=='w' || data[2]=='W') && + (data[3]=='b' || data[3]=='B') ) ) + { + avi_add_index_entry(AVI,(unsigned char *) data,0,lseek(AVI->fdes,0,SEEK_CUR)-8,n); + } + + lseek(AVI->fdes,PAD_EVEN(n),SEEK_CUR); + } + idx_type = 1; + } + + /* Now generate the video index and audio index arrays */ + + nvi = 0; + for(j=0; janum; ++j) nai[j] = 0; + + for(i=0;in_idx;i++) { + + if(strncasecmp((char *)AVI->idx[i],(char *) AVI->video_tag,3) == 0) nvi++; + + for(j=0; janum; ++j) if(strncasecmp((char *)AVI->idx[i], AVI->track[j].audio_tag,4) == 0) nai[j]++; + } + + AVI->video_frames = nvi; + for(j=0; janum; ++j) AVI->track[j].audio_chunks = nai[j]; + +// fprintf(stderr, "chunks = %ld %d %s\n", AVI->track[0].audio_chunks, AVI->anum, AVI->track[0].audio_tag); + + if(AVI->video_frames==0) ERR_EXIT(AVI_ERR_NO_VIDS); + AVI->video_index = (video_index_entry *) malloc(nvi*sizeof(video_index_entry)); + if(AVI->video_index==0) ERR_EXIT(AVI_ERR_NO_MEM); + + for(j=0; janum; ++j) { + if(AVI->track[j].audio_chunks) { + AVI->track[j].audio_index = (audio_index_entry *) malloc(nai[j]*sizeof(audio_index_entry)); + if(AVI->track[j].audio_index==0) ERR_EXIT(AVI_ERR_NO_MEM); + } + } + + nvi = 0; + for(j=0; janum; ++j) nai[j] = tot[j] = 0; + + ioff = idx_type == 1 ? 8 : AVI->movi_start+4; + + for(i=0;in_idx;i++) { + + //video + if(strncasecmp((char *)AVI->idx[i],(char *)AVI->video_tag,3) == 0) { + AVI->video_index[nvi].key = str2ulong(AVI->idx[i]+ 4); + AVI->video_index[nvi].pos = str2ulong(AVI->idx[i]+ 8)+ioff; + AVI->video_index[nvi].len = str2ulong(AVI->idx[i]+12); + nvi++; + } + + //audio + for(j=0; janum; ++j) { + + if(strncasecmp((char *)AVI->idx[i],AVI->track[j].audio_tag,4) == 0) { + AVI->track[j].audio_index[nai[j]].pos = str2ulong(AVI->idx[i]+ 8)+ioff; + AVI->track[j].audio_index[nai[j]].len = str2ulong(AVI->idx[i]+12); + AVI->track[j].audio_index[nai[j]].tot = tot[j]; + tot[j] += AVI->track[j].audio_index[nai[j]].len; + nai[j]++; + } + } + } + + + for(j=0; janum; ++j) AVI->track[j].audio_bytes = tot[j]; + + /* Reposition the file */ + + lseek(AVI->fdes,AVI->movi_start,SEEK_SET); + AVI->video_pos = 0; + + return(0); +} + +long AVI_video_frames(avi_t *AVI) +{ + return AVI->video_frames; +} +int AVI_video_width(avi_t *AVI) +{ + return AVI->width; +} +int AVI_video_height(avi_t *AVI) +{ + return AVI->height; +} +double AVI_frame_rate(avi_t *AVI) +{ + return AVI->fps; +} +char* AVI_video_compressor(avi_t *AVI) +{ + return AVI->compressor2; +} + +long AVI_max_video_chunk(avi_t *AVI) +{ + return AVI->max_len; +} + +int AVI_audio_tracks(avi_t *AVI) +{ + return(AVI->anum); +} + +int AVI_audio_channels(avi_t *AVI) +{ + return AVI->track[AVI->aptr].a_chans; +} + +long AVI_audio_mp3rate(avi_t *AVI) +{ + return AVI->track[AVI->aptr].mp3rate; +} + +int AVI_audio_bits(avi_t *AVI) +{ + return AVI->track[AVI->aptr].a_bits; +} + +int AVI_audio_format(avi_t *AVI) +{ + return AVI->track[AVI->aptr].a_fmt; +} + +long AVI_audio_rate(avi_t *AVI) +{ + return AVI->track[AVI->aptr].a_rate; +} + +long AVI_audio_bytes(avi_t *AVI) +{ + return AVI->track[AVI->aptr].audio_bytes; +} + +long AVI_audio_chunks(avi_t *AVI) +{ + return AVI->track[AVI->aptr].audio_chunks; +} + +long AVI_audio_codech_offset(avi_t *AVI) +{ + return AVI->track[AVI->aptr].a_codech_off; +} + +long AVI_audio_codecf_offset(avi_t *AVI) +{ + return AVI->track[AVI->aptr].a_codecf_off; +} + +long AVI_video_codech_offset(avi_t *AVI) +{ + return AVI->v_codech_off; +} + +long AVI_video_codecf_offset(avi_t *AVI) +{ + return AVI->v_codecf_off; +} + +long AVI_frame_size(avi_t *AVI, long frame) +{ + if(AVI->mode==AVI_MODE_WRITE) { AVI_errno = AVI_ERR_NOT_PERM; return -1; } + if(!AVI->video_index) { AVI_errno = AVI_ERR_NO_IDX; return -1; } + + if(frame < 0 || frame >= AVI->video_frames) return 0; + return(AVI->video_index[frame].len); +} + +long AVI_audio_size(avi_t *AVI, long frame) +{ + if(AVI->mode==AVI_MODE_WRITE) { AVI_errno = AVI_ERR_NOT_PERM; return -1; } + if(!AVI->track[AVI->aptr].audio_index) { AVI_errno = AVI_ERR_NO_IDX; return -1; } + + if(frame < 0 || frame >= AVI->track[AVI->aptr].audio_chunks) return 0; + return(AVI->track[AVI->aptr].audio_index[frame].len); +} + +long AVI_get_video_position(avi_t *AVI, long frame) +{ + if(AVI->mode==AVI_MODE_WRITE) { AVI_errno = AVI_ERR_NOT_PERM; return -1; } + if(!AVI->video_index) { AVI_errno = AVI_ERR_NO_IDX; return -1; } + + if(frame < 0 || frame >= AVI->video_frames) return 0; + return(AVI->video_index[frame].pos); +} + + +int AVI_seek_start(avi_t *AVI) +{ + if(AVI->mode==AVI_MODE_WRITE) { AVI_errno = AVI_ERR_NOT_PERM; return -1; } + + lseek(AVI->fdes,AVI->movi_start,SEEK_SET); + AVI->video_pos = 0; + return 0; +} + +int AVI_set_video_position(avi_t *AVI, long frame) +{ + if(AVI->mode==AVI_MODE_WRITE) { AVI_errno = AVI_ERR_NOT_PERM; return -1; } + if(!AVI->video_index) { AVI_errno = AVI_ERR_NO_IDX; return -1; } + + if (frame < 0 ) frame = 0; + AVI->video_pos = frame; + return 0; +} + +int AVI_set_audio_bitrate(avi_t *AVI, long bitrate) +{ + if(AVI->mode==AVI_MODE_READ) { AVI_errno = AVI_ERR_NOT_PERM; return -1; } + + AVI->track[AVI->aptr].mp3rate = bitrate; + return 0; +} + + +long AVI_read_frame(avi_t *AVI, char *vidbuf, int *keyframe) +{ + long n; + + if(AVI->mode==AVI_MODE_WRITE) { AVI_errno = AVI_ERR_NOT_PERM; return -1; } + if(!AVI->video_index) { AVI_errno = AVI_ERR_NO_IDX; return -1; } + + if(AVI->video_pos < 0 || AVI->video_pos >= AVI->video_frames) return -1; + n = AVI->video_index[AVI->video_pos].len; + + *keyframe = (AVI->video_index[AVI->video_pos].key==0x10) ? 1:0; + + lseek(AVI->fdes, AVI->video_index[AVI->video_pos].pos, SEEK_SET); + + if (avi_read(AVI->fdes,vidbuf,n) != n) + { + AVI_errno = AVI_ERR_READ; + return -1; + } + + AVI->video_pos++; + + return n; +} + +int AVI_set_audio_position(avi_t *AVI, long byte) +{ + long n0, n1, n; + + if(AVI->mode==AVI_MODE_WRITE) { AVI_errno = AVI_ERR_NOT_PERM; return -1; } + if(!AVI->track[AVI->aptr].audio_index) { AVI_errno = AVI_ERR_NO_IDX; return -1; } + + if(byte < 0) byte = 0; + + /* Binary search in the audio chunks */ + + n0 = 0; + n1 = AVI->track[AVI->aptr].audio_chunks; + + while(n0track[AVI->aptr].audio_index[n].tot>byte) + n1 = n; + else + n0 = n; + } + + AVI->track[AVI->aptr].audio_posc = n0; + AVI->track[AVI->aptr].audio_posb = byte - AVI->track[AVI->aptr].audio_index[n0].tot; + + return 0; +} + +long AVI_read_audio(avi_t *AVI, char *audbuf, long bytes) +{ + long nr, pos, left, todo; + + if(AVI->mode==AVI_MODE_WRITE) { AVI_errno = AVI_ERR_NOT_PERM; return -1; } + if(!AVI->track[AVI->aptr].audio_index) { AVI_errno = AVI_ERR_NO_IDX; return -1; } + + nr = 0; /* total number of bytes read */ + + while(bytes>0) + { + left = AVI->track[AVI->aptr].audio_index[AVI->track[AVI->aptr].audio_posc].len - AVI->track[AVI->aptr].audio_posb; + if(left==0) + { + if(AVI->track[AVI->aptr].audio_posc>=AVI->track[AVI->aptr].audio_chunks-1) return nr; + AVI->track[AVI->aptr].audio_posc++; + AVI->track[AVI->aptr].audio_posb = 0; + continue; + } + if(bytestrack[AVI->aptr].audio_index[AVI->track[AVI->aptr].audio_posc].pos + AVI->track[AVI->aptr].audio_posb; + lseek(AVI->fdes, pos, SEEK_SET); + if (avi_read(AVI->fdes,audbuf+nr,todo) != todo) + { + AVI_errno = AVI_ERR_READ; + return -1; + } + bytes -= todo; + nr += todo; + AVI->track[AVI->aptr].audio_posb += todo; + } + + return nr; +} + +/* AVI_read_data: Special routine for reading the next audio or video chunk + without having an index of the file. */ + +int AVI_read_data(avi_t *AVI, char *vidbuf, long max_vidbuf, + char *audbuf, long max_audbuf, + long *len) +{ + +/* + * Return codes: + * + * 1 = video data read + * 2 = audio data read + * 0 = reached EOF + * -1 = video buffer too small + * -2 = audio buffer too small + */ + + int n; + char data[8]; + + if(AVI->mode==AVI_MODE_WRITE) return 0; + + while(1) + { + /* Read tag and length */ + + if( avi_read(AVI->fdes,data,8) != 8 ) return 0; + + /* if we got a list tag, ignore it */ + + if(strncasecmp(data,"LIST",4) == 0) + { + lseek(AVI->fdes,4,SEEK_CUR); + continue; + } + + n = PAD_EVEN(str2ulong((unsigned char *)data+4)); + + if(strncasecmp(data,AVI->video_tag,3) == 0) + { + *len = n; + AVI->video_pos++; + if(n>max_vidbuf) + { + lseek(AVI->fdes,n,SEEK_CUR); + return -1; + } + if(avi_read(AVI->fdes,vidbuf,n) != n ) return 0; + return 1; + } + else if(strncasecmp(data,AVI->track[AVI->aptr].audio_tag,4) == 0) + { + *len = n; + if(n>max_audbuf) + { + lseek(AVI->fdes,n,SEEK_CUR); + return -2; + } + if(avi_read(AVI->fdes,audbuf,n) != n ) return 0; + return 2; + break; + } + else + if(lseek(AVI->fdes,n,SEEK_CUR)<0) return 0; + } +} + +/* AVI_print_error: Print most recent error (similar to perror) */ + +char *(avi_errors[]) = +{ + /* 0 */ "avilib - No Error", + /* 1 */ "avilib - AVI file size limit reached", + /* 2 */ "avilib - Error opening AVI file", + /* 3 */ "avilib - Error reading from AVI file", + /* 4 */ "avilib - Error writing to AVI file", + /* 5 */ "avilib - Error writing index (file may still be useable)", + /* 6 */ "avilib - Error closing AVI file", + /* 7 */ "avilib - Operation (read/write) not permitted", + /* 8 */ "avilib - Out of memory (malloc failed)", + /* 9 */ "avilib - Not an AVI file", + /* 10 */ "avilib - AVI file has no header list (corrupted?)", + /* 11 */ "avilib - AVI file has no MOVI list (corrupted?)", + /* 12 */ "avilib - AVI file has no video data", + /* 13 */ "avilib - operation needs an index", + /* 14 */ "avilib - Unkown Error" +}; +static int num_avi_errors = sizeof(avi_errors)/sizeof(char*); + +static char error_string[4096]; + +void AVI_print_error(char *str) +{ + int aerrno; + + aerrno = (AVI_errno>=0 && AVI_errno=0 && AVI_errno + * + * This file is part of transcode, a linux video stream processing tool + * + * transcode is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * transcode is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Make; see the file COPYING. If not, write to + * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef AVILIB_H +#define AVILIB_H + +#define AVI_MAX_TRACKS 8 + +typedef struct +{ + unsigned long key; + unsigned long pos; + unsigned long len; +} video_index_entry; + +typedef struct +{ + unsigned long pos; + unsigned long len; + unsigned long tot; +} audio_index_entry; + +typedef struct track_s +{ + + long a_fmt; /* Audio format, see #defines below */ + long a_chans; /* Audio channels, 0 for no audio */ + long a_rate; /* Rate in Hz */ + long a_bits; /* bits per audio sample */ + long mp3rate; /* mp3 bitrate kbs*/ + + long audio_strn; /* Audio stream number */ + long audio_bytes; /* Total number of bytes of audio data */ + long audio_chunks; /* Chunks of audio data in the file */ + + char audio_tag[4]; /* Tag of audio data */ + long audio_posc; /* Audio position: chunk */ + long audio_posb; /* Audio position: byte within chunk */ + + long a_codech_off; /* absolut offset of audio codec information */ + long a_codecf_off; /* absolut offset of audio codec information */ + + audio_index_entry *audio_index; + +} track_t; + +typedef struct +{ + + long fdes; /* File descriptor of AVI file */ + long mode; /* 0 for reading, 1 for writing */ + + long width; /* Width of a video frame */ + long height; /* Height of a video frame */ + double fps; /* Frames per second */ + char compressor[8]; /* Type of compressor, 4 bytes + padding for 0 byte */ + char compressor2[8]; /* Type of compressor, 4 bytes + padding for 0 byte */ + long video_strn; /* Video stream number */ + long video_frames; /* Number of video frames */ + char video_tag[4]; /* Tag of video data */ + long video_pos; /* Number of next frame to be read + (if index present) */ + + unsigned long max_len; /* maximum video chunk present */ + + track_t track[AVI_MAX_TRACKS]; // up to AVI_MAX_TRACKS audio tracks supported + + unsigned long pos; /* position in file */ + long n_idx; /* number of index entries actually filled */ + long max_idx; /* number of index entries actually allocated */ + + long v_codech_off; /* absolut offset of video codec (strh) info */ + long v_codecf_off; /* absolut offset of video codec (strf) info */ + + unsigned char (*idx)[16]; /* index entries (AVI idx1 tag) */ + video_index_entry *video_index; + + unsigned long last_pos; /* Position of last frame written */ + unsigned long last_len; /* Length of last frame written */ + int must_use_index; /* Flag if frames are duplicated */ + unsigned long movi_start; + + int anum; // total number of audio tracks + int aptr; // current audio working track + +} avi_t; + +#define AVI_MODE_WRITE 0 +#define AVI_MODE_READ 1 + +/* The error codes delivered by avi_open_input_file */ + +#define AVI_ERR_SIZELIM 1 /* The write of the data would exceed + the maximum size of the AVI file. + This is more a warning than an error + since the file may be closed safely */ + +#define AVI_ERR_OPEN 2 /* Error opening the AVI file - wrong path + name or file nor readable/writable */ + +#define AVI_ERR_READ 3 /* Error reading from AVI File */ + +#define AVI_ERR_WRITE 4 /* Error writing to AVI File, + disk full ??? */ + +#define AVI_ERR_WRITE_INDEX 5 /* Could not write index to AVI file + during close, file may still be + usable */ + +#define AVI_ERR_CLOSE 6 /* Could not write header to AVI file + or not truncate the file during close, + file is most probably corrupted */ + +#define AVI_ERR_NOT_PERM 7 /* Operation not permitted: + trying to read from a file open + for writing or vice versa */ + +#define AVI_ERR_NO_MEM 8 /* malloc failed */ + +#define AVI_ERR_NO_AVI 9 /* Not an AVI file */ + +#define AVI_ERR_NO_HDRL 10 /* AVI file has no has no header list, + corrupted ??? */ + +#define AVI_ERR_NO_MOVI 11 /* AVI file has no has no MOVI list, + corrupted ??? */ + +#define AVI_ERR_NO_VIDS 12 /* AVI file contains no video data */ + +#define AVI_ERR_NO_IDX 13 /* The file has been opened with + getIndex==0, but an operation has been + performed that needs an index */ + +/* Possible Audio formats */ + +#ifndef WAVE_FORMAT_PCM +#define WAVE_FORMAT_UNKNOWN (0x0000) +#define WAVE_FORMAT_PCM (0x0001) +#define WAVE_FORMAT_ADPCM (0x0002) +#define WAVE_FORMAT_IBM_CVSD (0x0005) +#define WAVE_FORMAT_ALAW (0x0006) +#define WAVE_FORMAT_MULAW (0x0007) +#define WAVE_FORMAT_OKI_ADPCM (0x0010) +#define WAVE_FORMAT_DVI_ADPCM (0x0011) +#define WAVE_FORMAT_DIGISTD (0x0015) +#define WAVE_FORMAT_DIGIFIX (0x0016) +#define WAVE_FORMAT_YAMAHA_ADPCM (0x0020) +#define WAVE_FORMAT_DSP_TRUESPEECH (0x0022) +#define WAVE_FORMAT_GSM610 (0x0031) +#define IBM_FORMAT_MULAW (0x0101) +#define IBM_FORMAT_ALAW (0x0102) +#define IBM_FORMAT_ADPCM (0x0103) +#endif + +avi_t* AVI_open_output_file(char * filename); +void AVI_set_video(avi_t *AVI, int width, int height, double fps, char *compressor); +void AVI_set_audio(avi_t *AVI, int channels, long rate, int bits, int format, long mp3rate); +int AVI_write_frame(avi_t *AVI, char *data, long bytes, int keyframe); +int AVI_dup_frame(avi_t *AVI); +int AVI_write_audio(avi_t *AVI, char *data, long bytes); +int AVI_append_audio(avi_t *AVI, char *data, long bytes); +long AVI_bytes_remain(avi_t *AVI); +int AVI_close(avi_t *AVI); +long AVI_bytes_written(avi_t *AVI); + +avi_t *AVI_open_input_file(char *filename, int getIndex); +avi_t *AVI_open_fd(int fd, int getIndex); +int avi_parse_input_file(avi_t *AVI, int getIndex); +long AVI_audio_mp3rate(avi_t *AVI); +long AVI_video_frames(avi_t *AVI); +int AVI_video_width(avi_t *AVI); +int AVI_video_height(avi_t *AVI); +double AVI_frame_rate(avi_t *AVI); +char* AVI_video_compressor(avi_t *AVI); + +int AVI_audio_channels(avi_t *AVI); +int AVI_audio_bits(avi_t *AVI); +int AVI_audio_format(avi_t *AVI); +long AVI_audio_rate(avi_t *AVI); +long AVI_audio_bytes(avi_t *AVI); +long AVI_audio_chunks(avi_t *AVI); + +long AVI_max_video_chunk(avi_t *AVI); + +long AVI_frame_size(avi_t *AVI, long frame); +long AVI_audio_size(avi_t *AVI, long frame); +int AVI_seek_start(avi_t *AVI); +int AVI_set_video_position(avi_t *AVI, long frame); +long AVI_get_video_position(avi_t *AVI, long frame); +long AVI_read_frame(avi_t *AVI, char *vidbuf, int *keyframe); + +int AVI_set_audio_position(avi_t *AVI, long byte); +int AVI_set_audio_bitrate(avi_t *AVI, long bitrate); + +long AVI_read_audio(avi_t *AVI, char *audbuf, long bytes); + +long AVI_audio_codech_offset(avi_t *AVI); +long AVI_audio_codecf_offset(avi_t *AVI); +long AVI_video_codech_offset(avi_t *AVI); +long AVI_video_codecf_offset(avi_t *AVI); + +int AVI_read_data(avi_t *AVI, char *vidbuf, long max_vidbuf, + char *audbuf, long max_audbuf, + long *len); + +void AVI_print_error(char *str); +char *AVI_strerror(); +char *AVI_syserror(); + +int AVI_scan(char *name); +int AVI_dump(char *name, int mode); + +char *AVI_codec2str(short cc); +int AVI_file_check(char *import_file); + +void AVI_info(avi_t *avifile); +uint64_t AVI_max_size(); +int avi_update_header(avi_t *AVI); + +int AVI_set_audio_track(avi_t *AVI, int track); +int AVI_get_audio_track(avi_t *AVI); +int AVI_audio_tracks(avi_t *AVI); + + +struct riff_struct +{ + unsigned char id[4]; /* RIFF */ + unsigned long len; + unsigned char wave_id[4]; /* WAVE */ +}; + + +struct chunk_struct +{ + unsigned char id[4]; + unsigned long len; +}; + +struct common_struct +{ + unsigned short wFormatTag; + unsigned short wChannels; + unsigned long dwSamplesPerSec; + unsigned long dwAvgBytesPerSec; + unsigned short wBlockAlign; + unsigned short wBitsPerSample; /* Only for PCM */ +}; + +struct wave_header +{ + struct riff_struct riff; + struct chunk_struct format; + struct common_struct common; + struct chunk_struct data; +}; + + + +struct AVIStreamHeader { + long fccType; + long fccHandler; + long dwFlags; + long dwPriority; + long dwInitialFrames; + long dwScale; + long dwRate; + long dwStart; + long dwLength; + long dwSuggestedBufferSize; + long dwQuality; + long dwSampleSize; +}; + +#endif diff --git a/cs/3rd party/libtheora/win32/experimental/transcoder/avi2vp3/outfile.vp3 b/cs/3rd party/libtheora/win32/experimental/transcoder/avi2vp3/outfile.vp3 new file mode 100644 index 0000000000000000000000000000000000000000..ed74aa99cec181f27f347d4182f56f868105e460 GIT binary patch literal 233132 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

    UGE-8B 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�Xtie#FL%6cy8Q7Xg=#g=cr$Iah#jr+0!g) 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

    =aQtbMGz`+NRoRuAY*KX;0b+?m-9{&+D88y|n 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

    N7h3WCf$A4~cN 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 ObZ8`=WR>$kqAHYvCgK6^NE3TTyILs067yAZt zb@}|wn+#e^lE%5CuoR4m!8ivK$9<_&_*Y4J&o>=HN@)_*X0XO{CUAbu$_M4f3|9Bt zO*2to>+UJknwkLxnJ?KlBCXM`Fk*b#{f7N(M3%g+cbp&KM78TwWqxwjfu3yE&9@89 z=jfH2Ma75Dz?XX@fLfDs)5m5cNi?Sf%J8y^Q}5<<&awVNz{u>>)7?vPr zfz`AoYvlaW@(bA)EBQoIX|tUwp(jX2Ma;l?xE4@$w8~8`em^lx<-j^u%@dm$l~cnE zO>k>tGaWx7|6DHeiZbqf2ewdtF4TFQAtEVB$=$Vyzs{mBBbxN9>uVeKW$*X*vfkPy zs?TWjuk14*H`nJ~ayRCd4a-;dp;6%Jl!9Re@mZ#uHS-e>u)E+_BWo>yjTF$s?5^Th z_ahUT23oK&Vt1b}@8!3ToMxr!XYrkO#jRaoQOKH60;_5!Rvwj0@E)#r(1!7A%yz(C z>D;%FVn6A++k&|P`7OyuP~J$nmZre(ZXbghWekE$||EsO@O0nC5}fuZJ-C)Tr$ z#Ymp9l@-s__2a9no-HpB)m-WvjtCZ)>|+3i6kwIe{YkYW)Ww^F{7Sdom+~{3zWA;_ zGG4kU0W~8{58A{Bzs@UOdB+@frVW0VDgwLVn|sWbcr}s_T>0qHOl)9rFjj+#i%lY8 zFI2XYcVsp?e<>?~QY~se>Ftw|MRVw7KYHFjNn%vHVBA^~9d4`EVaHESi>?2hJk(yv znwNjVKdxH1yaQNgN_dja)uWdn@@P_)%|0-}^#c7f3w8g`s@AeZDGZzJ(2>U_`8T^! zXXkpe(L_Vo6E7D+AEIscH0T8b`OKfPqss2r)NEZmPo8tcfRf3x+-nn@l-gMy*48IB zz8fX7`c4shc&2YttWp0FjP;6u& z8l3B~G6hEvW57MBSF3g)ZqEv)k&n?uK<$`lAaEv9Fe}T13ZE*U)`b!b_zt9NBxNd7 z<4$-VoL+-2@BssefZKY0fd14)GEXM9H3eGQ368XEo0MPGC2U_ge$%aee#In7*hdW) z>)Ex^fnhEUvegkq$HnJG`_w!BG8hUVf7ZhCx4-#tzkA)gLy~E_j#;9~PsLkre~q@J zA)d8#wJDBL4D1}c3s zB%Ko%hZ->9Sl(P6ULabj&LV{DnsuHyhHF>1Ir4G*v31N>b8{lk%YW1c*XyqTH^xVb z{g*oNhpoM>(cKN1V$M^7UEm@V)Pu0sue_rV4ce%(9_hp3#^n%c#Y00Iud2wE$RYFF z-Oxp2gX^f*ANFl;%ggzdlaniHY2P2Mq@^CAuum>0?A~1+Tz^-a+N-SXlgT()21Z!V zvF1o4Avia;hpK)aRDM*Lt!IhO}4VTsrSi=wSGGDO zSD!=f?lbr}1R8;EQ-czMHdUsuK!v2Ia|}7#;+>?_F!9>qHgE!B8g&*1P&IITTMa%B zc2iljuYV0d06R^4b!*-YR~7;6W%~IJeyIN2u;__eN2+D9_k~wtQJ~ zJob9%AdJh|@6L*G6UHlIMmA!&XfwKd=8pzYJG7O)k&ncDS0}TVK=vw|4;;d# z(2NjBR#dIM~Im*B@c_@DKAS1{Go6xUikM{;aXFK+9%tznM zA?@G0i8zxLUB3V#<3W z0g(Rxo5Q#uXv0TLQqft%n#CIaPl~eb_ea^YFF3L4|`h@y1>2RJa3w@;xC;RLy%@d~b3jl�-NznD^Ok(8ACz{j8)O68x7rHjrt|#pU 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�ssx5B{@fdUyg>TFITubec!NI{N2w2rZb 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 C6oyU! literal 0 HcmV?d00001 diff --git a/cs/3rd party/libtheora/win32/experimental/transcoder/readme.txt b/cs/3rd party/libtheora/win32/experimental/transcoder/readme.txt new file mode 100644 index 000000000..b10a292b4 --- /dev/null +++ b/cs/3rd party/libtheora/win32/experimental/transcoder/readme.txt @@ -0,0 +1,17 @@ +Quick hack at a transcoder tool from VP3 to Theora + +I actually built the avi2vp3 tool with codeWarrior, but it should compile under +VC as well. I have included a source avi file and the converted .vp3 output. +Output is a file with some header info matching YUVMPEG, and for each frame: + +FRAME header block matching YUV2MPEG +long (Intel aligned) keyframeflag describing in frame is a keyframe +long (Intel aligned) fsize storing frame size in bytes +bytes[fsize] with binary frame data + +The transcode tool is a modification of the current encoder. PUt it into the +win32/experimental subdirectory, and the paths should be correct. It produces +an apparently valid theora stream, but outputs garbage data. The code is packing +the binary frame data in a way that SHOULD work at least imo, but I am probably +missing some initialization issue (or vp3 is not transcodable to theora). + diff --git a/cs/3rd party/libtheora/win32/experimental/transcoder/transcoder.dsp b/cs/3rd party/libtheora/win32/experimental/transcoder/transcoder.dsp new file mode 100644 index 000000000..1970e4182 --- /dev/null +++ b/cs/3rd party/libtheora/win32/experimental/transcoder/transcoder.dsp @@ -0,0 +1,121 @@ +# Microsoft Developer Studio Project File - Name="transcoder" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=transcoder - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "transcoder.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "transcoder.mak" CFG="transcoder - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "transcoder - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "transcoder - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "transcoder - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\..\include" /I "..\..\..\..\vorbis\include" /I "..\..\..\..\ogg\include" /I "..\wincompat" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D GETOPT_API= /FD /c +# SUBTRACT CPP /YX /Yc /Yu +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib theora_static.lib ogg_static.lib vorbis_static.lib vorbisenc_static.lib /nologo /subsystem:console /machine:I386 /nodefaultlib:"LIBCMT" /out:"transcoder.exe" /libpath:"..\..\Static_Release" /libpath:"..\..\..\..\ogg\win32\Static_Release" /libpath:"..\..\..\..\vorbis\win32\Vorbis_Static_Release" /libpath:"..\..\..\..\vorbis\win32\VorbisEnc_Static_Release" + +!ELSEIF "$(CFG)" == "transcoder - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\..\include" /I "..\..\..\..\vorbis\include" /I "..\..\..\..\ogg\include" /I "..\wincompat" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D GETOPT_API= /FD /GZ /c +# SUBTRACT CPP /YX /Yc /Yu +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib theora_static_d.lib ogg_static_d.lib vorbis_static_d.lib vorbisenc_static_d.lib /nologo /subsystem:console /debug /machine:I386 /nodefaultlib:"LIBCD" /out:"transcoder.exe" /pdbtype:sept /libpath:"..\..\Static_Debug" /libpath:"..\..\..\..\ogg\win32\Static_Debug" /libpath:"..\..\..\..\vorbis\win32\Vorbis_Static_Debug" /libpath:"..\..\..\..\vorbis\win32\VorbisEnc_Static_Debug" +# SUBTRACT LINK32 /nodefaultlib + +!ENDIF + +# Begin Target + +# Name "transcoder - Win32 Release" +# Name "transcoder - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\wincompat\getopt.c +# End Source File +# Begin Source File + +SOURCE=..\wincompat\getopt_long.c +# End Source File +# Begin Source File + +SOURCE=.\transcoder_example.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# Begin Group "library" + +# PROP Default_Filter "" +# End Group +# Begin Source File + +SOURCE=.\ReadMe.txt +# End Source File +# End Target +# End Project diff --git a/cs/3rd party/libtheora/win32/experimental/transcoder/transcoder_example.c b/cs/3rd party/libtheora/win32/experimental/transcoder/transcoder_example.c new file mode 100644 index 000000000..28c2b52a1 --- /dev/null +++ b/cs/3rd party/libtheora/win32/experimental/transcoder/transcoder_example.c @@ -0,0 +1,926 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggTheora SOFTWARE 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 Theora SOURCE CODE IS COPYRIGHT (C) 2002-2004 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: example encoder application; makes an Ogg Theora/Vorbis + file from YUV4MPEG2 and WAV input + last mod: $Id: transcoder_example.c,v 1.4 2004/03/20 00:14:04 tterribe Exp $ + + ********************************************************************/ + +#define _GNU_SOURCE +#define _REENTRANT +#define _LARGEFILE_SOURCE +#define _LARGEFILE64_SOURCE +#define _FILE_OFFSET_BITS 64 + +#include +#include +#include +#include +#include +#include +#include +#include "theora/theora.h" +#include "vorbis/codec.h" +#include "vorbis/vorbisenc.h" + +#ifdef _WIN32 +/*supply missing headers and functions to Win32. going to hell, I know*/ +#include +#include + +static double rint(double x) +{ + if (x < 0.0) + return (double)(int)(x - 0.5); + else + return (double)(int)(x + 0.5); +} +#endif + +/*Copied from vorbis/sharedbook.c*/ +static int _ilog(unsigned int v){ + int ret=0; + while(v){ + ret++; + v>>=1; + } + return(ret); +} + + +const char *optstring = "o:a:A:v:V:"; +struct option options [] = { + {"output",required_argument,NULL,'o'}, + {"audio-rate-target",required_argument,NULL,'A'}, + {"video-rate-target",required_argument,NULL,'V'}, + {"audio-quality",required_argument,NULL,'a'}, + {"video-quality",required_argument,NULL,'v'}, + {NULL,0,NULL,0} +}; + +typedef struct TC_INSTANCE { + ogg_uint32_t LastKeyFrame ; + ogg_int64_t KeyFrameCount; + int ThisIsFirstFrame; + int ThisIsKeyFrame; + ogg_uint32_t CurrentFrame; + ogg_int64_t granulepos; + int keyframe_granule_shift; + char * in_bytes; + long in_bytecount; + ogg_uint32_t fps_denominator; + ogg_uint32_t fps_numerator; + oggpack_buffer opb_in; + oggpack_buffer opb_out; +} TC_INSTANCE; + +/* You'll go to Hell for using globals. */ + +FILE *audio=NULL; +FILE *video=NULL; + +int audio_ch=0; +int audio_hz=0; + +float audio_q=.1; +int audio_r=-1; + +int video_x=0; +int video_y=0; +int frame_x=0; +int frame_y=0; +int frame_x_offset=0; +int frame_y_offset=0; +int video_hzn=0; +int video_hzd=0; +int video_an=0; +int video_ad=0; + +int video_r=-1; +int video_q=16; + + char *vp3frame[2]; + int framebytecount[2]; + int frameiskey[2]; + + ogg_page audiopage; + ogg_page videopage; + +static void usage(void){ + fprintf(stderr, + "Usage: encoder_example [options] [audio_file] video_file\n\n" + "Options: \n\n" + " -o --output file name for encoded output;\n" + " If this option is not given, the\n" + " compressed data is sent to stdout.\n\n" + " -A --audio-rate-target bitrate target for Vorbis audio;\n" + " use -a and not -A if at all possible,\n" + " as -a gives higher quality for a given\n" + " bitrate.\n\n" + " -V --video-rate-target bitrate target for Theora video\n\n" + " -a --audio-quality Vorbis quality selector from -1 to 10\n" + " (-1 yields smallest files but lowest\n" + " fidelity; 10 yields highest fidelity\n" + " but large files. '2' is a reasonable\n" + " default).\n\n" + " -v --video-quality Theora quality selector fro 0 to 10\n" + " (0 yields smallest files but lowest\n" + " video quality. 10 yields highest\n" + " fidelity but large files).\n\n" + "encoder_example accepts only uncompressed RIFF WAV format audio and\n" + "YUV4MPEG2 uncompressed video.\n\n"); + exit(1); +} + +static void id_file(char *f){ + FILE *test; + unsigned char buffer[80]; + int ret; + + /* open it, look for magic */ + + if(!strcmp(f,"-")){ + /* stdin */ + test=stdin; + }else{ + test=fopen(f,"rb"); + if(!test){ + fprintf(stderr,"Unable to open file %s.\n",f); + exit(1); + } + } + + ret=fread(buffer,1,4,test); + if(ret<4){ + fprintf(stderr,"EOF determining file type of file %s.\n",f); + exit(1); + } + + if(!memcmp(buffer,"RIFF",4)){ + /* possible WAV file */ + + if(audio){ + /* umm, we already have one */ + fprintf(stderr,"Multiple RIFF WAVE files specified on command line.\n"); + exit(1); + } + + /* Parse the rest of the header */ + + ret=fread(buffer,1,4,test); + ret=fread(buffer,1,4,test); + if(ret<4)goto riff_err; + if(!memcmp(buffer,"WAVE",4)){ + + while(!feof(test)){ + ret=fread(buffer,1,4,test); + if(ret<4)goto riff_err; + if(!memcmp("fmt",buffer,3)){ + + /* OK, this is our audio specs chunk. Slurp it up. */ + + ret=fread(buffer,1,20,test); + if(ret<20)goto riff_err; + + if(memcmp(buffer+4,"\001\000",2)){ + fprintf(stderr,"The WAV file %s is in a compressed format; " + "can't read it.\n",f); + exit(1); + } + + audio=test; + audio_ch=buffer[6]+(buffer[7]<<8); + audio_hz=buffer[8]+(buffer[9]<<8)+ + (buffer[10]<<16)+(buffer[11]<<24); + + if(buffer[18]+(buffer[19]<<8)!=16){ + fprintf(stderr,"Can only read 16 bit WAV files for now.\n"); + exit(1); + } + + /* Now, align things to the beginning of the data */ + /* Look for 'dataxxxx' */ + while(!feof(test)){ + ret=fread(buffer,1,4,test); + if(ret<4)goto riff_err; + if(!memcmp("data",buffer,4)){ + /* We're there. Ignore the declared size for now. */ + ret=fread(buffer,1,4,test); + if(ret<4)goto riff_err; + + fprintf(stderr,"File %s is 16 bit %d channel %d Hz RIFF WAV audio.\n", + f,audio_ch,audio_hz); + + return; + } + } + } + } + } + + fprintf(stderr,"Couldn't find WAVE data in RIFF file %s.\n",f); + exit(1); + + } + if(!memcmp(buffer,"AVI2",4)){ + /* possible AVI2VP31 format file */ + /* read until newline, or 80 cols, whichever happens first */ + int i; + for(i=0;i<79;i++){ + ret=fread(buffer+i,1,1,test); + if(ret<1)goto yuv_err; + if(buffer[i]=='\n')break; + } + if(i==79){ + fprintf(stderr,"Error parsing %s header; not a VP31 raw frames file?\n",f); + } + buffer[i]='\0'; + + if(!memcmp(buffer,"VP31",4)){ + char interlace; + + if(video){ + /* umm, we already have one */ + fprintf(stderr,"Multiple video files specified on command line.\n"); + exit(1); + } + + if(buffer[4]!='R'){ + fprintf(stderr,"Incorrect file ; VP31 raw frames required.\n"); + } + + ret=sscanf(buffer,"VP31R W%d H%d F%d:%d I%c A%d:%d", + &frame_x,&frame_y,&video_hzn,&video_hzd,&interlace, + &video_an,&video_ad); + if(ret<7){ + fprintf(stderr,"Error parsing AVI2VP31R header in file %s.\n",f); + exit(1); + } + + if(interlace!='p'){ + fprintf(stderr,"Input video is interlaced; Theora handles only progressive scan\n"); + exit(1); + } + + video=test; + + fprintf(stderr,"File %s is %dx%d %.02f fps VP31 video.\n", + f,frame_x,frame_y,(double)video_hzn/video_hzd); + + return; + } + } + fprintf(stderr,"Input file %s is neither a WAV nor VP31 file.\n",f); + exit(1); + + riff_err: + fprintf(stderr,"EOF parsing RIFF file %s.\n",f); + exit(1); + yuv_err: + fprintf(stderr,"EOF parsing VP31 file %s.\n",f); + exit(1); + +} + +int spinner=0; +char *spinascii="|/-\\"; +void spinnit(void){ + spinner++; + if(spinner==4)spinner=0; + fprintf(stderr,"\r%c",spinascii[spinner]); +} + +int fetch_and_process_audio(FILE *audio,ogg_page *audiopage, + ogg_stream_state *vo, + vorbis_dsp_state *vd, + vorbis_block *vb, + int audioflag){ + ogg_packet op; + int i,j; + + while(audio && !audioflag){ + /* process any audio already buffered */ + spinnit(); + if(ogg_stream_pageout(vo,audiopage)>0) return 1; + if(ogg_stream_eos(vo))return 0; + + { + /* read and process more audio */ + signed char readbuffer[4096]; + int toread=4096/2/audio_ch; + int bytesread=fread(readbuffer,1,toread*2*audio_ch,audio); + int sampread=bytesread/2/audio_ch; + float **vorbis_buffer; + int count=0; + + if(bytesread<=0){ + /* end of file. this can be done implicitly, but it's + easier to see here in non-clever fashion. Tell the + library we're at end of stream so that it can handle the + last frame and mark end of stream in the output properly */ + vorbis_analysis_wrote(vd,0); + }else{ + vorbis_buffer=vorbis_analysis_buffer(vd,sampread); + /* uninterleave samples */ + for(i=0;iin_bytecount; + + if(!bytes)return(0); + + op->packet=ttc->in_bytes; + op->bytes=bytes; + op->b_o_s=0; + op->e_o_s=last_p; + + op->packetno=ttc->CurrentFrame; + op->granulepos=ttc->granulepos; + + return 1; +} + +void TranscodeKeyFrame(TC_INSTANCE *ttc){ + /* Keep track of the total number of Key Frames Coded */ + ttc->KeyFrameCount += 1; + ttc->LastKeyFrame = 1; +} + +void TranscodeFrame(TC_INSTANCE *ttc){ + ttc->LastKeyFrame++; +} + +void TranscodeFirstFrame(TC_INSTANCE *ttc){ + /* Keep track of the total number of Key Frames Coded. */ + ttc->KeyFrameCount = 1; + ttc->LastKeyFrame = 1; +} + +int theora_transcode_bufferin( TC_INSTANCE *ttc, int isKeyFrame, char * bytes, int bytecount){ + + /*transcode: record keyframe flag*/ + ttc->ThisIsKeyFrame = isKeyFrame; + + /* Special case for first frame */ + if ( ttc->ThisIsFirstFrame ){ + ttc->ThisIsFirstFrame = 0; + ttc->ThisIsKeyFrame = 0; + } else if ( ttc->ThisIsKeyFrame ) { + TranscodeKeyFrame(ttc); + ttc->ThisIsKeyFrame = 0; + } else { + /* Compress the frame. */ + TranscodeFrame( ttc ); + } + /*need to pack info here*/ + { + + int frame_type; + long total_bits; + long total_words; + int frac_bits; + + oggpackB_readinit(&ttc->opb_in,bytes,bytecount); + oggpackB_reset(&ttc->opb_out); + + /*Mark as video frame.*/ + oggpackB_write(&ttc->opb_out,0,1); + /*Copy frame type.*/ + frame_type=oggpackB_read1(&ttc->opb_in); + oggpackB_write(&ttc->opb_out,frame_type,1); + /*Skip an unused bit in the VP32 header.*/ + oggpackB_adv1(&ttc->opb_in); + /*Copy Q multiplier.*/ + oggpackB_write(&ttc->opb_out,oggpackB_read(&ttc->opb_in,6),6); + /*VP3 has no per-block Q multipliers*/ + oggpackB_write(&ttc->opb_out,0,1); + /*If the frame is a base/key/golden frame, copy a few extra bits.*/ + if(frame_type==0){ + /*These 13 bits are not included in a Theora frame header. + They were 0's and VP3 version info in VP32.*/ + oggpackB_adv(&ttc->opb_in,13); + /*Copy the key frame type and the spare configuration bits.*/ + oggpackB_write(&ttc->opb_out,oggpackB_read(&ttc->opb_in,3),3); + } + + /*Copy the rest of the bits over.*/ + total_bits=bytecount*8-oggpack_bits(&ttc->opb_in); + frac_bits=(int)(total_bits&31); + if(frac_bits){ + oggpackB_write(&ttc->opb_out,oggpackB_read(&ttc->opb_in,frac_bits), + frac_bits); + } + total_words=total_bits>>5; + while(total_words-->0){ + oggpackB_write(&ttc->opb_out,oggpackB_read(&ttc->opb_in,32),32); + } + + ttc->in_bytecount = oggpackB_bytes(&ttc->opb_out); + ttc->in_bytes = oggpackB_get_buffer(&ttc->opb_out); + } + + /* Update stats variables. */ + ttc->CurrentFrame++; + + ttc->granulepos= + ((ttc->CurrentFrame-ttc->LastKeyFrame-1)<keyframe_granule_shift)+ + ttc->LastKeyFrame-1; + + return 0; +} + +//static void _tp_writebuffer(oggpack_buffer *opb, const char *buf, const long len) + +int theora_transcoder_init(theora_info * ti, TC_INSTANCE * ttc){ + memset(ttc, 0, sizeof(*ttc)); + ttc->granulepos = -1; + ttc->keyframe_granule_shift=_ilog(ti->keyframe_frequency_force-1); + ttc->LastKeyFrame = 0; + ttc->KeyFrameCount = 0; + ttc->ThisIsFirstFrame = 1; + ttc->ThisIsKeyFrame = 0; + ttc->CurrentFrame = 1; + ttc->in_bytes = 0; + ttc->in_bytecount = 0; + ttc->fps_denominator = ti->fps_denominator; + ttc->fps_numerator = ti->fps_numerator; + oggpackB_writeinit(&ttc->opb_out); + return 0; +} + +int fetch_and_process_video(FILE *video,ogg_page *videopage, + ogg_stream_state *to, + TC_INSTANCE *ttc, + int videoflag){ + /* You'll go to Hell for using static variables */ + static int state=-1; + ogg_packet op; + int i; + int keyframeflag, framelength; + + + if(state==-1){ + /* initialize the double frame buffer */ + state=0; + } + + /* is there a video page flushed? If not, work until there is. */ + while(!videoflag){ + spinnit(); + + if(ogg_stream_pageout(to,videopage)>0) return 1; + if(ogg_stream_eos(to)) return 0; + + { + /* read and process more video */ + /* video strategy reads one frame ahead so we know when we're + at end of stream and can mark last video frame as such + (vorbis audio has to flush one frame past last video frame + due to overlap and thus doesn't need this extra work */ + + /* have two frame buffers full (if possible) before + proceeding. after first pass and until eos, one will + always be full when we get here */ + + for(i=state;i<2;i++){ + char c,frame[6]; + int ret=fread(frame,1,6,video); + + /* match and skip the frame header */ + if(ret<6)break; + if(memcmp(frame,"FRAME",5)){ + fprintf(stderr,"Loss of framing in VP31 input data\n"); + exit(1); + } + if(frame[5]!='\n'){ + int j; + for(j=0;j<79;j++) + if(fread(&c,1,1,video)&&c=='\n')break; + if(j==79){ + fprintf(stderr,"Error parsing VP31 frame header\n"); + exit(1); + } + } + + /*read the length*/ + ret=fread(&framelength, sizeof(int), 1, video); + + /*read the keyframeflag*/ + ret=fread(&keyframeflag, sizeof(int), 1, video); + + vp3frame[i] = malloc(framelength); + framebytecount[i] = framelength; + frameiskey[i] = keyframeflag; + + /* read the frame */ + ret=fread((char *) vp3frame[i], sizeof(char), framelength, video); + if(ret!=framelength) break; + + state++; + } + + if(state<1){ + /* can't get here unless VP31 stream has no video */ + fprintf(stderr,"Video input contains no frames.\n"); + exit(1); + } + + /* Theora is a one-frame-in,one-frame-out system; submit a frame + for compression and pull out the packet */ + + //theora_encode_YUVin(td,&yuv); + theora_transcode_bufferin( ttc, frameiskey[0], vp3frame[0], framebytecount[0]); + + /* if there's only one frame, it's the last in the stream */ + if(state<2) + theora_transcode_packetout(ttc,1,&op); + else + theora_transcode_packetout(ttc,0,&op); + + ogg_stream_packetin(to,&op); + + { + signed char *temp=vp3frame[0]; + vp3frame[0]=vp3frame[1]; + vp3frame[1] = temp; + free(temp); + + framebytecount[0]= framebytecount[1]; + frameiskey[0] = frameiskey[1]; + state--; + } + } + } + return videoflag; +} + +/* returns, in seconds, absolute time of current packet in given + logical stream */ +double transcode_granule_time(TC_INSTANCE *ttc,ogg_int64_t granulepos){ + if(granulepos>=0){ + ogg_int64_t iframe=granulepos>>ttc->keyframe_granule_shift; + ogg_int64_t pframe=granulepos-(iframe<keyframe_granule_shift); + + return (iframe+pframe)* + ((double)ttc->fps_denominator/ttc->fps_numerator); + + } + return(-1); +} + +int main(int argc,char *argv[]){ + int c,long_option_index,ret; + + ogg_stream_state to; /* take physical pages, weld into a logical + stream of packets */ + ogg_stream_state vo; /* take physical pages, weld into a logical + stream of packets */ + ogg_page og; /* one Ogg bitstream page. Vorbis packets are inside */ + ogg_packet op; /* one raw packet of data for decode */ + + theora_state td; + theora_info ti; + theora_comment tc; + + vorbis_info vi; /* struct that stores all the static vorbis bitstream + settings */ + vorbis_comment vc; /* struct that stores all the user comments */ + + vorbis_dsp_state vd; /* central working state for the packet->PCM decoder */ + vorbis_block vb; /* local working space for packet->PCM decode */ + + int audioflag=0; + int videoflag=0; + int akbps=0; + int vkbps=0; + + ogg_int64_t audio_bytesout=0; + ogg_int64_t video_bytesout=0; + double timebase; + + FILE* outfile = stdout; + + TC_INSTANCE ttc; + +#ifdef _WIN32 /* We need to set stdin/stdout to binary mode. Damn windows. */ + /* if we were reading/writing a file, it would also need to in + binary mode, eg, fopen("file.wav","wb"); */ + /* Beware the evil ifdef. We avoid these where we can, but this one we + cannot. Don't add any more, you'll probably go to hell if you do. */ + _setmode( _fileno( stdin ), _O_BINARY ); + _setmode( _fileno( stdout ), _O_BINARY ); +#endif + + while((c=getopt_long(argc,argv,optstring,options,&long_option_index))!=EOF){ + switch(c){ + case 'o': + outfile=fopen(optarg,"wb"); + if(outfile==NULL){ + fprintf(stderr,"Unable to open output file '%s'\n", optarg); + exit(1); + } + break;; + + case 'a': + audio_q=atof(optarg)*.099; + if(audio_q<-.1 || audio_q>1){ + fprintf(stderr,"Illegal audio quality (choose -1 through 10)\n"); + exit(1); + } + audio_r=-1; + break; + + case 'v': + video_q=rint(atof(optarg)*6.3); + if(video_q<0 || video_q>63){ + fprintf(stderr,"Illegal video quality (choose 0 through 10)\n"); + exit(1); + } + video_r=0; + break; + + case 'A': + audio_r=atof(optarg)*1000; + if(audio_q<0){ + fprintf(stderr,"Illegal audio quality (choose > 0 please)\n"); + exit(1); + } + audio_q=-99; + break; + + case 'V': + video_r=rint(atof(optarg)*1000); + if(video_r<45000 || video_r>2000000){ + fprintf(stderr,"Illegal video bitrate (choose 45kbps through 2000kbps)\n"); + exit(1); + } + video_q=0; + break; + default: + usage(); + } + } + + while(optind>4)<<4; + video_y=((frame_y + 15) >>4)<<4; + frame_x_offset=(video_x-frame_x)/2; + frame_y_offset=(video_y-frame_y)/2; + + theora_info_init(&ti); + ti.width=video_x; + ti.height=video_y; + ti.frame_width=frame_x; + ti.frame_height=frame_y; + ti.offset_x=frame_x_offset; + ti.offset_y=frame_y_offset; + ti.fps_numerator=video_hzn; + ti.fps_denominator=video_hzd; + ti.aspect_numerator=video_an; + ti.aspect_denominator=video_ad; + ti.colorspace=OC_CS_UNSPECIFIED; + ti.target_bitrate=video_r; + ti.quality=video_q; + + ti.dropframes_p=0; + ti.quick_p=1; + ti.keyframe_auto_p=1; + ti.keyframe_frequency=32768; + ti.keyframe_frequency_force=32768; + ti.keyframe_data_target_bitrate=video_r*1.5; + ti.keyframe_auto_threshold=80; + ti.keyframe_mindistance=8; + ti.noise_sensitivity=1; + + theora_encode_init(&td,&ti); + theora_transcoder_init(&ti, &ttc); + theora_info_clear(&ti); + + /* initialize Vorbis too, assuming we have audio to compress. */ + if(audio){ + vorbis_info_init(&vi); + if(audio_q>-99) + ret = vorbis_encode_init_vbr(&vi,audio_ch,audio_hz,audio_q); + else + ret = vorbis_encode_init(&vi,audio_ch,audio_hz,-1,audio_r,-1); + if(ret){ + fprintf(stderr,"The Vorbis encoder could not set up a mode according to\n" + "the requested quality or bitrate.\n\n"); + exit(1); + } + + vorbis_comment_init(&vc); + vorbis_analysis_init(&vd,&vi); + vorbis_block_init(&vd,&vb); + } + + /* write the bitstream header packets with proper page interleave */ + + /* first packet will get its own page automatically */ + theora_encode_header(&td,&op); + ogg_stream_packetin(&to,&op); + if(ogg_stream_pageout(&to,&og)!=1){ + fprintf(stderr,"Internal Ogg library error.\n"); + exit(1); + } + fwrite(og.header,1,og.header_len,outfile); + fwrite(og.body,1,og.body_len,outfile); + + /* create the remaining theora headers */ + theora_comment_init(&tc); + theora_encode_comment(&tc,&op); + ogg_stream_packetin(&to,&op); + theora_encode_tables(&td,&op); + ogg_stream_packetin(&to,&op); + + if(audio){ + ogg_packet header; + ogg_packet header_comm; + ogg_packet header_code; + + vorbis_analysis_headerout(&vd,&vc,&header,&header_comm,&header_code); + ogg_stream_packetin(&vo,&header); /* automatically placed in its own + page */ + if(ogg_stream_pageout(&vo,&og)!=1){ + fprintf(stderr,"Internal Ogg library error.\n"); + exit(1); + } + fwrite(og.header,1,og.header_len,outfile); + fwrite(og.body,1,og.body_len,outfile); + + /* remaining vorbis header packets */ + ogg_stream_packetin(&vo,&header_comm); + ogg_stream_packetin(&vo,&header_code); + } + + /* Flush the rest of our headers. This ensures + the actual data in each stream will start + on a new page, as per spec. */ + while(1){ + int result = ogg_stream_flush(&to,&og); + if(result<0){ + /* can't get here */ + fprintf(stderr,"Internal Ogg library error.\n"); + exit(1); + } + if(result==0)break; + fwrite(og.header,1,og.header_len,outfile); + fwrite(og.body,1,og.body_len,outfile); + } + if(audio){ + while(1){ + int result=ogg_stream_flush(&vo,&og); + if(result<0){ + /* can't get here */ + fprintf(stderr,"Internal Ogg library error.\n"); + exit(1); + } + if(result==0)break; + fwrite(og.header,1,og.header_len,outfile); + fwrite(og.body,1,og.body_len,outfile); + } + } + + /* setup complete. Raw processing loop */ + fprintf(stderr,"Compressing....\n"); + while(1){ + + + /* is there an audio page flushed? If not, fetch one if possible */ + audioflag=fetch_and_process_audio(audio,&audiopage,&vo,&vd,&vb,audioflag); + + /* is there a video page flushed? If not, fetch one if possible */ + videoflag=fetch_and_process_video(video,&videopage,&to,&ttc,videoflag); + + /* no pages of either? Must be end of stream. */ + if(!audioflag && !videoflag)break; + + /* which is earlier; the end of the audio page or the end of the + video page? Flush the earlier to stream */ + { + int audio_or_video=-1; + double audiotime= + audioflag?vorbis_granule_time(&vd,ogg_page_granulepos(&audiopage)):-1; + double videotime= + videoflag?transcode_granule_time(&ttc,ogg_page_granulepos(&videopage)):-1; + + if(!audioflag){ + audio_or_video=1; + } else if(!videoflag) { + audio_or_video=0; + } else { + if(audiotime +//__FBSDID("$FreeBSD: src/lib/libc/stdlib/getopt.c,v 1.6 2002/03/29 22:43:42 markm Exp $"); + +#include "namespace.h"*/ +#include +#include +#include +/*#include "un-namespace.h"*/ + +/*#include "libc_private.h"*/ + +int opterr = 1, /* if error message should be printed */ + optind = 1, /* index into parent argv vector */ + optopt, /* character checked for validity */ + optreset; /* reset getopt */ +char *optarg; /* argument associated with option */ + +#define BADCH (int)'?' +#define BADARG (int)':' +#define EMSG "" + +/* + * getopt -- + * Parse argc/argv argument vector. + */ +int +getopt(nargc, nargv, ostr) + int nargc; + char * const *nargv; + const char *ostr; +{ + static char *place = EMSG; /* option letter processing */ + char *oli; /* option letter list index */ + + if (optreset || !*place) { /* update scanning pointer */ + optreset = 0; + if (optind >= nargc || *(place = nargv[optind]) != '-') { + place = EMSG; + return (-1); + } + if (place[1] && *++place == '-') { /* found "--" */ + ++optind; + place = EMSG; + return (-1); + } + } /* option letter okay? */ + if ((optopt = (int)*place++) == (int)':' || + !(oli = strchr(ostr, optopt))) { + /* + * if the user didn't specify '-' as an option, + * assume it means -1. + */ + if (optopt == (int)'-') + return (-1); + if (!*place) + ++optind; + if (opterr && *ostr != ':' && optopt != BADCH) + (void)fprintf(stderr, "%s: illegal option -- %c\n", + "progname", optopt); + return (BADCH); + } + if (*++oli != ':') { /* don't need argument */ + optarg = NULL; + if (!*place) + ++optind; + } + else { /* need an argument */ + if (*place) /* no white space */ + optarg = place; + else if (nargc <= ++optind) { /* no arg */ + place = EMSG; + if (*ostr == ':') + return (BADARG); + if (opterr) + (void)fprintf(stderr, + "%s: option requires an argument -- %c\n", + "progname", optopt); + return (BADCH); + } + else /* white space */ + optarg = nargv[optind]; + place = EMSG; + ++optind; + } + return (optopt); /* dump back option letter */ +} diff --git a/cs/3rd party/libtheora/win32/experimental/wincompat/getopt.h b/cs/3rd party/libtheora/win32/experimental/wincompat/getopt.h new file mode 100644 index 000000000..d95d6cf8f --- /dev/null +++ b/cs/3rd party/libtheora/win32/experimental/wincompat/getopt.h @@ -0,0 +1,110 @@ +/* $NetBSD: getopt.h,v 1.4 2000/07/07 10:43:54 ad Exp $ */ +/* $FreeBSD: src/include/getopt.h,v 1.1 2002/09/29 04:14:30 eric Exp $ */ + +/*- + * Copyright (c) 2000 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Dieter Baron and Thomas Klausner. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD 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 NETBSD FOUNDATION, INC. 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. + */ + +#ifndef _GETOPT_H_ +#define _GETOPT_H_ + +#ifdef _WIN32 +/* from */ +# ifdef __cplusplus +# define __BEGIN_DECLS extern "C" { +# define __END_DECLS } +# else +# define __BEGIN_DECLS +# define __END_DECLS +# endif +# define __P(args) args +#endif + +/*#ifndef _WIN32 +#include +#include +#endif*/ + +#ifdef _WIN32 +# if !defined(GETOPT_API) +# define GETOPT_API __declspec(dllimport) +# endif +#endif + +/* + * Gnu like getopt_long() and BSD4.4 getsubopt()/optreset extensions + */ +#if !defined(_POSIX_SOURCE) && !defined(_XOPEN_SOURCE) +#define no_argument 0 +#define required_argument 1 +#define optional_argument 2 + +struct option { + /* name of long option */ + const char *name; + /* + * one of no_argument, required_argument, and optional_argument: + * whether option takes an argument + */ + int has_arg; + /* if not NULL, set *flag to val when option found */ + int *flag; + /* if flag not NULL, value to set *flag to; else return value */ + int val; +}; + +__BEGIN_DECLS +GETOPT_API int getopt_long __P((int, char * const *, const char *, + const struct option *, int *)); +__END_DECLS +#endif + +#ifdef _WIN32 +/* These are global getopt variables */ +__BEGIN_DECLS + +GETOPT_API extern int opterr, /* if error message should be printed */ + optind, /* index into parent argv vector */ + optopt, /* character checked for validity */ + optreset; /* reset getopt */ +GETOPT_API extern char* optarg; /* argument associated with option */ + +/* Original getopt */ +GETOPT_API int getopt __P((int, char * const *, const char *)); + +__END_DECLS +#endif + +#endif /* !_GETOPT_H_ */ diff --git a/cs/3rd party/libtheora/win32/experimental/wincompat/getopt_long.c b/cs/3rd party/libtheora/win32/experimental/wincompat/getopt_long.c new file mode 100644 index 000000000..b5ae0fa5b --- /dev/null +++ b/cs/3rd party/libtheora/win32/experimental/wincompat/getopt_long.c @@ -0,0 +1,547 @@ +/* $NetBSD: getopt_long.c,v 1.15 2002/01/31 22:43:40 tv Exp $ */ +/* $FreeBSD: src/lib/libc/stdlib/getopt_long.c,v 1.2 2002/10/16 22:18:42 alfred Exp $ */ + +/*- + * Copyright (c) 2000 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Dieter Baron and Thomas Klausner. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD 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 NETBSD FOUNDATION, INC. 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. + */ + + +#include +#include +#include + +#ifdef _WIN32 + +/* Windows needs warnx(). We change the definition though: + * 1. (another) global is defined, opterrmsg, which holds the error message + * 2. errors are always printed out on stderr w/o the program name + * Note that opterrmsg always gets set no matter what opterr is set to. The + * error message will not be printed if opterr is 0 as usual. + */ + +#include +#include + +GETOPT_API extern char opterrmsg[128]; +char opterrmsg[128]; /* last error message is stored here */ + +static void warnx(int print_error, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + if (fmt != NULL) + _vsnprintf(opterrmsg, 128, fmt, ap); + else + opterrmsg[0]='\0'; + va_end(ap); + if (print_error) { + fprintf(stderr, opterrmsg); + fprintf(stderr, "\n"); + } +} + +#endif /*_WIN32*/ + +/* not part of the original file */ +#ifndef _DIAGASSERT +#define _DIAGASSERT(X) +#endif + +#if HAVE_CONFIG_H && !HAVE_GETOPT_LONG && !HAVE_DECL_OPTIND +#define REPLACE_GETOPT +#endif + +#ifdef REPLACE_GETOPT +#ifdef __weak_alias +__weak_alias(getopt,_getopt) +#endif +int opterr = 1; /* if error message should be printed */ +int optind = 1; /* index into parent argv vector */ +int optopt = '?'; /* character checked for validity */ +int optreset; /* reset getopt */ +char *optarg; /* argument associated with option */ +#elif HAVE_CONFIG_H && !HAVE_DECL_OPTRESET +static int optreset; +#endif + +#ifdef __weak_alias +__weak_alias(getopt_long,_getopt_long) +#endif + +#if !HAVE_GETOPT_LONG +#define IGNORE_FIRST (*options == '-' || *options == '+') +#define PRINT_ERROR ((opterr) && ((*options != ':') \ + || (IGNORE_FIRST && options[1] != ':'))) +#define IS_POSIXLY_CORRECT (getenv("POSIXLY_CORRECT") != NULL) +#define PERMUTE (!IS_POSIXLY_CORRECT && !IGNORE_FIRST) +/* XXX: GNU ignores PC if *options == '-' */ +#define IN_ORDER (!IS_POSIXLY_CORRECT && *options == '-') + +/* return values */ +#define BADCH (int)'?' +#define BADARG ((IGNORE_FIRST && options[1] == ':') \ + || (*options == ':') ? (int)':' : (int)'?') +#define INORDER (int)1 + +#define EMSG "" + +static int getopt_internal(int, char * const *, const char *); +static int gcd(int, int); +static void permute_args(int, int, int, char * const *); + +static char *place = EMSG; /* option letter processing */ + +/* XXX: set optreset to 1 rather than these two */ +static int nonopt_start = -1; /* first non option argument (for permute) */ +static int nonopt_end = -1; /* first option after non options (for permute) */ + +/* Error messages */ +static const char recargchar[] = "option requires an argument -- %c"; +static const char recargstring[] = "option requires an argument -- %s"; +static const char ambig[] = "ambiguous option -- %.*s"; +static const char noarg[] = "option doesn't take an argument -- %.*s"; +static const char illoptchar[] = "unknown option -- %c"; +static const char illoptstring[] = "unknown option -- %s"; + + +/* + * Compute the greatest common divisor of a and b. + */ +static int +gcd(a, b) + int a; + int b; +{ + int c; + + c = a % b; + while (c != 0) { + a = b; + b = c; + c = a % b; + } + + return b; +} + +/* + * Exchange the block from nonopt_start to nonopt_end with the block + * from nonopt_end to opt_end (keeping the same order of arguments + * in each block). + */ +static void +permute_args(panonopt_start, panonopt_end, opt_end, nargv) + int panonopt_start; + int panonopt_end; + int opt_end; + char * const *nargv; +{ + int cstart, cyclelen, i, j, ncycle, nnonopts, nopts, pos; + char *swap; + + _DIAGASSERT(nargv != NULL); + + /* + * compute lengths of blocks and number and size of cycles + */ + nnonopts = panonopt_end - panonopt_start; + nopts = opt_end - panonopt_end; + ncycle = gcd(nnonopts, nopts); + cyclelen = (opt_end - panonopt_start) / ncycle; + + for (i = 0; i < ncycle; i++) { + cstart = panonopt_end+i; + pos = cstart; + for (j = 0; j < cyclelen; j++) { + if (pos >= panonopt_end) + pos -= nnonopts; + else + pos += nopts; + swap = nargv[pos]; + /* LINTED const cast */ + ((char **) nargv)[pos] = nargv[cstart]; + /* LINTED const cast */ + ((char **)nargv)[cstart] = swap; + } + } +} + +/* + * getopt_internal -- + * Parse argc/argv argument vector. Called by user level routines. + * Returns -2 if -- is found (can be long option or end of options marker). + */ +static int +getopt_internal(nargc, nargv, options) + int nargc; + char * const *nargv; + const char *options; +{ + char *oli; /* option letter list index */ + int optchar; + + _DIAGASSERT(nargv != NULL); + _DIAGASSERT(options != NULL); + + optarg = NULL; + + /* + * XXX Some programs (like rsyncd) expect to be able to + * XXX re-initialize optind to 0 and have getopt_long(3) + * XXX properly function again. Work around this braindamage. + */ + if (optind == 0) + optind = 1; + + if (optreset) + nonopt_start = nonopt_end = -1; +start: + if (optreset || !*place) { /* update scanning pointer */ + optreset = 0; + if (optind >= nargc) { /* end of argument vector */ + place = EMSG; + if (nonopt_end != -1) { + /* do permutation, if we have to */ + permute_args(nonopt_start, nonopt_end, + optind, nargv); + optind -= nonopt_end - nonopt_start; + } + else if (nonopt_start != -1) { + /* + * If we skipped non-options, set optind + * to the first of them. + */ + optind = nonopt_start; + } + nonopt_start = nonopt_end = -1; + return -1; + } + if ((*(place = nargv[optind]) != '-') + || (place[1] == '\0')) { /* found non-option */ + place = EMSG; + if (IN_ORDER) { + /* + * GNU extension: + * return non-option as argument to option 1 + */ + optarg = nargv[optind++]; + return INORDER; + } + if (!PERMUTE) { + /* + * if no permutation wanted, stop parsing + * at first non-option + */ + return -1; + } + /* do permutation */ + if (nonopt_start == -1) + nonopt_start = optind; + else if (nonopt_end != -1) { + permute_args(nonopt_start, nonopt_end, + optind, nargv); + nonopt_start = optind - + (nonopt_end - nonopt_start); + nonopt_end = -1; + } + optind++; + /* process next argument */ + goto start; + } + if (nonopt_start != -1 && nonopt_end == -1) + nonopt_end = optind; + if (place[1] && *++place == '-') { /* found "--" */ + place++; + return -2; + } + } + if ((optchar = (int)*place++) == (int)':' || + (oli = strchr(options + (IGNORE_FIRST ? 1 : 0), optchar)) == NULL) { + /* option letter unknown or ':' */ + if (!*place) + ++optind; +#ifndef _WIN32 + if (PRINT_ERROR) + warnx(illoptchar, optchar); +#else + warnx(PRINT_ERROR, illoptchar, optchar); +#endif + optopt = optchar; + return BADCH; + } + if (optchar == 'W' && oli[1] == ';') { /* -W long-option */ + /* XXX: what if no long options provided (called by getopt)? */ + if (*place) + return -2; + + if (++optind >= nargc) { /* no arg */ + place = EMSG; +#ifndef _WIN32 + if (PRINT_ERROR) + warnx(recargchar, optchar); +#else + warnx(PRINT_ERROR, recargchar, optchar); +#endif + optopt = optchar; + return BADARG; + } else /* white space */ + place = nargv[optind]; + /* + * Handle -W arg the same as --arg (which causes getopt to + * stop parsing). + */ + return -2; + } + if (*++oli != ':') { /* doesn't take argument */ + if (!*place) + ++optind; + } else { /* takes (optional) argument */ + optarg = NULL; + if (*place) /* no white space */ + optarg = place; + /* XXX: disable test for :: if PC? (GNU doesn't) */ + else if (oli[1] != ':') { /* arg not optional */ + if (++optind >= nargc) { /* no arg */ + place = EMSG; +#ifndef _WIN32 + if (PRINT_ERROR) + warnx(recargchar, optchar); +#else + warnx(PRINT_ERROR, recargchar, optchar); +#endif + optopt = optchar; + return BADARG; + } else + optarg = nargv[optind]; + } + place = EMSG; + ++optind; + } + /* dump back option letter */ + return optchar; +} + +#ifdef REPLACE_GETOPT +/* + * getopt -- + * Parse argc/argv argument vector. + * + * [eventually this will replace the real getopt] + */ +int +getopt(nargc, nargv, options) + int nargc; + char * const *nargv; + const char *options; +{ + int retval; + + _DIAGASSERT(nargv != NULL); + _DIAGASSERT(options != NULL); + + if ((retval = getopt_internal(nargc, nargv, options)) == -2) { + ++optind; + /* + * We found an option (--), so if we skipped non-options, + * we have to permute. + */ + if (nonopt_end != -1) { + permute_args(nonopt_start, nonopt_end, optind, + nargv); + optind -= nonopt_end - nonopt_start; + } + nonopt_start = nonopt_end = -1; + retval = -1; + } + return retval; +} +#endif + +/* + * getopt_long -- + * Parse argc/argv argument vector. + */ +int +getopt_long(nargc, nargv, options, long_options, idx) + int nargc; + char * const *nargv; + const char *options; + const struct option *long_options; + int *idx; +{ + int retval; + + _DIAGASSERT(nargv != NULL); + _DIAGASSERT(options != NULL); + _DIAGASSERT(long_options != NULL); + /* idx may be NULL */ + + if ((retval = getopt_internal(nargc, nargv, options)) == -2) { + char *current_argv, *has_equal; + size_t current_argv_len; + int i, match; + + current_argv = place; + match = -1; + + optind++; + place = EMSG; + + if (*current_argv == '\0') { /* found "--" */ + /* + * We found an option (--), so if we skipped + * non-options, we have to permute. + */ + if (nonopt_end != -1) { + permute_args(nonopt_start, nonopt_end, + optind, nargv); + optind -= nonopt_end - nonopt_start; + } + nonopt_start = nonopt_end = -1; + return -1; + } + if ((has_equal = strchr(current_argv, '=')) != NULL) { + /* argument found (--option=arg) */ + current_argv_len = has_equal - current_argv; + has_equal++; + } else + current_argv_len = strlen(current_argv); + + for (i = 0; long_options[i].name; i++) { + /* find matching long option */ + if (strncmp(current_argv, long_options[i].name, + current_argv_len)) + continue; + + if (strlen(long_options[i].name) == + (unsigned)current_argv_len) { + /* exact match */ + match = i; + break; + } + if (match == -1) /* partial match */ + match = i; + else { + /* ambiguous abbreviation */ +#ifndef _WIN32 + if (PRINT_ERROR) + warnx(ambig, (int)current_argv_len, + current_argv); +#else + warnx(PRINT_ERROR, ambig, (int)current_argv_len, + current_argv); +#endif + optopt = 0; + return BADCH; + } + } + if (match != -1) { /* option found */ + if (long_options[match].has_arg == no_argument + && has_equal) { +#ifndef _WIN32 + if (PRINT_ERROR) + warnx(noarg, (int)current_argv_len, + current_argv); +#else + warnx(PRINT_ERROR, noarg, (int)current_argv_len, + current_argv); +#endif + /* + * XXX: GNU sets optopt to val regardless of + * flag + */ + if (long_options[match].flag == NULL) + optopt = long_options[match].val; + else + optopt = 0; + return BADARG; + } + if (long_options[match].has_arg == required_argument || + long_options[match].has_arg == optional_argument) { + if (has_equal) + optarg = has_equal; + else if (long_options[match].has_arg == + required_argument) { + /* + * optional argument doesn't use + * next nargv + */ + optarg = nargv[optind++]; + } + } + if ((long_options[match].has_arg == required_argument) + && (optarg == NULL)) { + /* + * Missing argument; leading ':' + * indicates no error should be generated + */ +#ifndef _WIN32 + if (PRINT_ERROR) + warnx(recargstring, current_argv); +#else + warnx(PRINT_ERROR, recargstring, current_argv); +#endif + /* + * XXX: GNU sets optopt to val regardless + * of flag + */ + if (long_options[match].flag == NULL) + optopt = long_options[match].val; + else + optopt = 0; + --optind; + return BADARG; + } + } else { /* unknown option */ +#ifndef _WIN32 + if (PRINT_ERROR) + warnx(illoptstring, current_argv); +#else + warnx(PRINT_ERROR, illoptstring, current_argv); +#endif + optopt = 0; + return BADCH; + } + if (long_options[match].flag) { + *long_options[match].flag = long_options[match].val; + retval = 0; + } else + retval = long_options[match].val; + if (idx) + *idx = match; + } + return retval; +} +#endif /* !GETOPT_LONG */ diff --git a/cs/3rd party/libtheora/win32/experimental/wincompat/unistd.h b/cs/3rd party/libtheora/win32/experimental/wincompat/unistd.h new file mode 100644 index 000000000..e69de29bb diff --git a/cs/3rd party/libtheora/win32/getopt.c b/cs/3rd party/libtheora/win32/getopt.c new file mode 100644 index 000000000..dad25b656 --- /dev/null +++ b/cs/3rd party/libtheora/win32/getopt.c @@ -0,0 +1,1047 @@ +/* Getopt for GNU. + NOTE: getopt is now part of the C library, so if you don't know what + "Keep this file name-space clean" means, talk to drepper@gnu.org + before changing it! + + Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99 + Free Software Foundation, Inc. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* This tells Alpha OSF/1 not to define a getopt prototype in . + Ditto for AIX 3.2 and . */ +#ifndef _NO_PROTO +# define _NO_PROTO +#endif + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#if !defined __STDC__ || !__STDC__ +/* This is a separate conditional since some stdc systems + reject `defined (const)'. */ +# ifndef const +# define const +# endif +#endif + +#include + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#define GETOPT_INTERFACE_VERSION 2 +#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 +# include +# if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION +# define ELIDE_CODE +# endif +#endif + +#ifndef ELIDE_CODE + + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +/* Don't include stdlib.h for non-GNU C libraries because some of them + contain conflicting prototypes for getopt. */ +# include +# include +#endif /* GNU C library. */ + +#ifdef VMS +# include +# if HAVE_STRING_H - 0 +# include +# endif +#endif + +#ifndef _ +/* This is for other GNU distributions with internationalized messages. + When compiling libc, the _ macro is predefined. */ +# ifdef HAVE_LIBINTL_H +# include +# define _(msgid) gettext (msgid) +# else +# define _(msgid) (msgid) +# endif +#endif + +/* This version of `getopt' appears to the caller like standard Unix `getopt' + but it behaves differently for the user, since it allows the user + to intersperse the options with the other arguments. + + As `getopt' works, it permutes the elements of ARGV so that, + when it is done, all the options precede everything else. Thus + all application programs are extended to handle flexible argument order. + + Setting the environment variable POSIXLY_CORRECT disables permutation. + Then the behavior is completely standard. + + GNU application programs can use a third alternative mode in which + they can distinguish the relative order of options and other arguments. */ + +#include "getopt_win.h" + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +/* 1003.2 says this must be 1 before any call. */ +int optind = 1; + +/* Formerly, initialization of getopt depended on optind==0, which + causes problems with re-calling getopt as programs generally don't + know that. */ + +int __getopt_initialized; + +/* The next char to be scanned in the option-element + in which the last option character we returned was found. + This allows us to pick up the scan where we left off. + + If this is zero, or a null string, it means resume the scan + by advancing to the next ARGV-element. */ + +static char *nextchar; + +/* Callers store zero here to inhibit the error message + for unrecognized options. */ + +int opterr = 1; + +/* Set to an option character which was unrecognized. + This must be initialized on some systems to avoid linking in the + system's own getopt implementation. */ + +int optopt = '?'; + +/* Describe how to deal with options that follow non-option ARGV-elements. + + If the caller did not specify anything, + the default is REQUIRE_ORDER if the environment variable + POSIXLY_CORRECT is defined, PERMUTE otherwise. + + REQUIRE_ORDER means don't recognize them as options; + stop option processing when the first non-option is seen. + This is what Unix does. + This mode of operation is selected by either setting the environment + variable POSIXLY_CORRECT, or using `+' as the first character + of the list of option characters. + + PERMUTE is the default. We permute the contents of ARGV as we scan, + so that eventually all the non-options are at the end. This allows options + to be given in any order, even with programs that were not written to + expect this. + + RETURN_IN_ORDER is an option available to programs that were written + to expect options and other ARGV-elements in any order and that care about + the ordering of the two. We describe each non-option ARGV-element + as if it were the argument of an option with character code 1. + Using `-' as the first character of the list of option characters + selects this mode of operation. + + The special argument `--' forces an end of option-scanning regardless + of the value of `ordering'. In the case of RETURN_IN_ORDER, only + `--' can cause `getopt' to return -1 with `optind' != ARGC. */ + +static enum +{ + REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER +} ordering; + +/* Value of POSIXLY_CORRECT environment variable. */ +static char *posixly_correct; + +#ifdef __GNU_LIBRARY__ +/* We want to avoid inclusion of string.h with non-GNU libraries + because there are many ways it can cause trouble. + On some systems, it contains special magic macros that don't work + in GCC. */ +# include +# define my_index strchr +#else + +#include + +/* Avoid depending on library functions or files + whose names are inconsistent. */ + +#ifndef getenv +extern char *getenv (); +#endif + +static char * +my_index (str, chr) + const char *str; + int chr; +{ + while (*str) + { + if (*str == chr) + return (char *) str; + str++; + } + return 0; +} + +/* If using GCC, we can safely declare strlen this way. + If not using GCC, it is ok not to declare it. */ +#ifdef __GNUC__ +/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. + That was relevant to code that was here before. */ +# if (!defined __STDC__ || !__STDC__) && !defined strlen +/* gcc with -traditional declares the built-in strlen to return int, + and has done so at least since version 2.4.5. -- rms. */ +extern int strlen (const char *); +# endif /* not __STDC__ */ +#endif /* __GNUC__ */ + +#endif /* not __GNU_LIBRARY__ */ + +/* Handle permutation of arguments. */ + +/* Describe the part of ARGV that contains non-options that have + been skipped. `first_nonopt' is the index in ARGV of the first of them; + `last_nonopt' is the index after the last of them. */ + +static int first_nonopt; +static int last_nonopt; + +#ifdef _LIBC +/* Bash 2.0 gives us an environment variable containing flags + indicating ARGV elements that should not be considered arguments. */ + +/* Defined in getopt_init.c */ +extern char *__getopt_nonoption_flags; + +static int nonoption_flags_max_len; +static int nonoption_flags_len; + +static int original_argc; +static char *const *original_argv; + +/* Make sure the environment variable bash 2.0 puts in the environment + is valid for the getopt call we must make sure that the ARGV passed + to getopt is that one passed to the process. */ +static void +__attribute__ ((unused)) +store_args_and_env (int argc, char *const *argv) +{ + /* XXX This is no good solution. We should rather copy the args so + that we can compare them later. But we must not use malloc(3). */ + original_argc = argc; + original_argv = argv; +} +# ifdef text_set_element +text_set_element (__libc_subinit, store_args_and_env); +# endif /* text_set_element */ + +# define SWAP_FLAGS(ch1, ch2) \ + if (nonoption_flags_len > 0) \ + { \ + char __tmp = __getopt_nonoption_flags[ch1]; \ + __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ + __getopt_nonoption_flags[ch2] = __tmp; \ + } +#else /* !_LIBC */ +# define SWAP_FLAGS(ch1, ch2) +#endif /* _LIBC */ + +/* Exchange two adjacent subsequences of ARGV. + One subsequence is elements [first_nonopt,last_nonopt) + which contains all the non-options that have been skipped so far. + The other is elements [last_nonopt,optind), which contains all + the options processed since those non-options were skipped. + + `first_nonopt' and `last_nonopt' are relocated so that they describe + the new indices of the non-options in ARGV after they are moved. */ + +#if defined __STDC__ && __STDC__ +static void exchange (char **); +#endif + +static void +exchange (argv) + char **argv; +{ + int bottom = first_nonopt; + int middle = last_nonopt; + int top = optind; + char *tem; + + /* Exchange the shorter segment with the far end of the longer segment. + That puts the shorter segment into the right place. + It leaves the longer segment in the right place overall, + but it consists of two parts that need to be swapped next. */ + +#ifdef _LIBC + /* First make sure the handling of the `__getopt_nonoption_flags' + string can work normally. Our top argument must be in the range + of the string. */ + if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len) + { + /* We must extend the array. The user plays games with us and + presents new arguments. */ + char *new_str = malloc (top + 1); + if (new_str == NULL) + nonoption_flags_len = nonoption_flags_max_len = 0; + else + { + memset (__mempcpy (new_str, __getopt_nonoption_flags, + nonoption_flags_max_len), + '\0', top + 1 - nonoption_flags_max_len); + nonoption_flags_max_len = top + 1; + __getopt_nonoption_flags = new_str; + } + } +#endif + + while (top > middle && middle > bottom) + { + if (top - middle > middle - bottom) + { + /* Bottom segment is the short one. */ + int len = middle - bottom; + register int i; + + /* Swap it with the top part of the top segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[top - (middle - bottom) + i]; + argv[top - (middle - bottom) + i] = tem; + SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); + } + /* Exclude the moved bottom segment from further swapping. */ + top -= len; + } + else + { + /* Top segment is the short one. */ + int len = top - middle; + register int i; + + /* Swap it with the bottom part of the bottom segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[middle + i]; + argv[middle + i] = tem; + SWAP_FLAGS (bottom + i, middle + i); + } + /* Exclude the moved top segment from further swapping. */ + bottom += len; + } + } + + /* Update records for the slots the non-options now occupy. */ + + first_nonopt += (optind - last_nonopt); + last_nonopt = optind; +} + +/* Initialize the internal data when the first call is made. */ + +#if defined __STDC__ && __STDC__ +static const char *_getopt_initialize (int, char *const *, const char *); +#endif +static const char * +_getopt_initialize (argc, argv, optstring) + int argc; + char *const *argv; + const char *optstring; +{ + /* Start processing options with ARGV-element 1 (since ARGV-element 0 + is the program name); the sequence of previously skipped + non-option ARGV-elements is empty. */ + + first_nonopt = last_nonopt = optind; + + nextchar = NULL; + + posixly_correct = getenv ("POSIXLY_CORRECT"); + + /* Determine how to handle the ordering of options and nonoptions. */ + + if (optstring[0] == '-') + { + ordering = RETURN_IN_ORDER; + ++optstring; + } + else if (optstring[0] == '+') + { + ordering = REQUIRE_ORDER; + ++optstring; + } + else if (posixly_correct != NULL) + ordering = REQUIRE_ORDER; + else + ordering = PERMUTE; + +#ifdef _LIBC + if (posixly_correct == NULL + && argc == original_argc && argv == original_argv) + { + if (nonoption_flags_max_len == 0) + { + if (__getopt_nonoption_flags == NULL + || __getopt_nonoption_flags[0] == '\0') + nonoption_flags_max_len = -1; + else + { + const char *orig_str = __getopt_nonoption_flags; + int len = nonoption_flags_max_len = strlen (orig_str); + if (nonoption_flags_max_len < argc) + nonoption_flags_max_len = argc; + __getopt_nonoption_flags = + (char *) malloc (nonoption_flags_max_len); + if (__getopt_nonoption_flags == NULL) + nonoption_flags_max_len = -1; + else + memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), + '\0', nonoption_flags_max_len - len); + } + } + nonoption_flags_len = nonoption_flags_max_len; + } + else + nonoption_flags_len = 0; +#endif + + return optstring; +} + +/* Scan elements of ARGV (whose length is ARGC) for option characters + given in OPTSTRING. + + If an element of ARGV starts with '-', and is not exactly "-" or "--", + then it is an option element. The characters of this element + (aside from the initial '-') are option characters. If `getopt' + is called repeatedly, it returns successively each of the option characters + from each of the option elements. + + If `getopt' finds another option character, it returns that character, + updating `optind' and `nextchar' so that the next call to `getopt' can + resume the scan with the following option character or ARGV-element. + + If there are no more option characters, `getopt' returns -1. + Then `optind' is the index in ARGV of the first ARGV-element + that is not an option. (The ARGV-elements have been permuted + so that those that are not options now come last.) + + OPTSTRING is a string containing the legitimate option characters. + If an option character is seen that is not listed in OPTSTRING, + return '?' after printing an error message. If you set `opterr' to + zero, the error message is suppressed but we still return '?'. + + If a char in OPTSTRING is followed by a colon, that means it wants an arg, + so the following text in the same ARGV-element, or the text of the following + ARGV-element, is returned in `optarg'. Two colons mean an option that + wants an optional arg; if there is text in the current ARGV-element, + it is returned in `optarg', otherwise `optarg' is set to zero. + + If OPTSTRING starts with `-' or `+', it requests different methods of + handling the non-option ARGV-elements. + See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. + + Long-named options begin with `--' instead of `-'. + Their names may be abbreviated as long as the abbreviation is unique + or is an exact match for some defined option. If they have an + argument, it follows the option name in the same ARGV-element, separated + from the option name by a `=', or else the in next ARGV-element. + When `getopt' finds a long-named option, it returns 0 if that option's + `flag' field is nonzero, the value of the option's `val' field + if the `flag' field is zero. + + The elements of ARGV aren't really const, because we permute them. + But we pretend they're const in the prototype to be compatible + with other systems. + + LONGOPTS is a vector of `struct option' terminated by an + element containing a name which is zero. + + LONGIND returns the index in LONGOPT of the long-named option found. + It is only valid when a long-named option has been found by the most + recent call. + + If LONG_ONLY is nonzero, '-' as well as '--' can introduce + long-named options. */ + +int +_getopt_internal (argc, argv, optstring, longopts, longind, long_only) + int argc; + char *const *argv; + const char *optstring; + const struct option *longopts; + int *longind; + int long_only; +{ + optarg = NULL; + + if (optind == 0 || !__getopt_initialized) + { + if (optind == 0) + optind = 1; /* Don't scan ARGV[0], the program name. */ + optstring = _getopt_initialize (argc, argv, optstring); + __getopt_initialized = 1; + } + + /* Test whether ARGV[optind] points to a non-option argument. + Either it does not have option syntax, or there is an environment flag + from the shell indicating it is not an option. The later information + is only used when the used in the GNU libc. */ +#ifdef _LIBC +# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ + || (optind < nonoption_flags_len \ + && __getopt_nonoption_flags[optind] == '1')) +#else +# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') +#endif + + if (nextchar == NULL || *nextchar == '\0') + { + /* Advance to the next ARGV-element. */ + + /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been + moved back by the user (who may also have changed the arguments). */ + if (last_nonopt > optind) + last_nonopt = optind; + if (first_nonopt > optind) + first_nonopt = optind; + + if (ordering == PERMUTE) + { + /* If we have just processed some options following some non-options, + exchange them so that the options come first. */ + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (last_nonopt != optind) + first_nonopt = optind; + + /* Skip any additional non-options + and extend the range of non-options previously skipped. */ + + while (optind < argc && NONOPTION_P) + optind++; + last_nonopt = optind; + } + + /* The special ARGV-element `--' means premature end of options. + Skip it like a null option, + then exchange with previous non-options as if it were an option, + then skip everything else like a non-option. */ + + if (optind != argc && !strcmp (argv[optind], "--")) + { + optind++; + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (first_nonopt == last_nonopt) + first_nonopt = optind; + last_nonopt = argc; + + optind = argc; + } + + /* If we have done all the ARGV-elements, stop the scan + and back over any non-options that we skipped and permuted. */ + + if (optind == argc) + { + /* Set the next-arg-index to point at the non-options + that we previously skipped, so the caller will digest them. */ + if (first_nonopt != last_nonopt) + optind = first_nonopt; + return -1; + } + + /* If we have come to a non-option and did not permute it, + either stop the scan or describe it to the caller and pass it by. */ + + if (NONOPTION_P) + { + if (ordering == REQUIRE_ORDER) + return -1; + optarg = argv[optind++]; + return 1; + } + + /* We have found another option-ARGV-element. + Skip the initial punctuation. */ + + nextchar = (argv[optind] + 1 + + (longopts != NULL && argv[optind][1] == '-')); + } + + /* Decode the current option-ARGV-element. */ + + /* Check whether the ARGV-element is a long option. + + If long_only and the ARGV-element has the form "-f", where f is + a valid short option, don't consider it an abbreviated form of + a long option that starts with f. Otherwise there would be no + way to give the -f short option. + + On the other hand, if there's a long option "fubar" and + the ARGV-element is "-fu", do consider that an abbreviation of + the long option, just like "--fu", and not "-f" with arg "u". + + This distinction seems to be the most useful approach. */ + + if (longopts != NULL + && (argv[optind][1] == '-' + || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = -1; + int option_index; + + for (nameend = nextchar; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, nextchar, nameend - nextchar)) + { + if ((unsigned int) (nameend - nextchar) + == (unsigned int) strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else + /* Second or later nonexact match found. */ + ambig = 1; + } + + if (ambig && !exact) + { + if (opterr) + fprintf (stderr, _("%s: option `%s' is ambiguous\n"), + argv[0], argv[optind]); + nextchar += strlen (nextchar); + optind++; + optopt = 0; + return '?'; + } + + if (pfound != NULL) + { + option_index = indfound; + optind++; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + optarg = nameend + 1; + else + { + if (opterr) + { + if (argv[optind - 1][1] == '-') + /* --option */ + fprintf (stderr, + _("%s: option `--%s' doesn't allow an argument\n"), + argv[0], pfound->name); + else + /* +option or -option */ + fprintf (stderr, + _("%s: option `%c%s' doesn't allow an argument\n"), + argv[0], argv[optind - 1][0], pfound->name); + } + + nextchar += strlen (nextchar); + + optopt = pfound->val; + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (optind < argc) + optarg = argv[optind++]; + else + { + if (opterr) + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[optind - 1]); + nextchar += strlen (nextchar); + optopt = pfound->val; + return optstring[0] == ':' ? ':' : '?'; + } + } + nextchar += strlen (nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + + /* Can't find it as a long option. If this is not getopt_long_only, + or the option starts with '--' or is not a valid short + option, then it's an error. + Otherwise interpret it as a short option. */ + if (!long_only || argv[optind][1] == '-' + || my_index (optstring, *nextchar) == NULL) + { + if (opterr) + { + if (argv[optind][1] == '-') + /* --option */ + fprintf (stderr, _("%s: unrecognized option `--%s'\n"), + argv[0], nextchar); + else + /* +option or -option */ + fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), + argv[0], argv[optind][0], nextchar); + } + nextchar = (char *) ""; + optind++; + optopt = 0; + return '?'; + } + } + + /* Look at and handle the next short option-character. */ + + { + char c = *nextchar++; + char *temp = my_index (optstring, c); + + /* Increment `optind' when we start to process its last character. */ + if (*nextchar == '\0') + ++optind; + + if (temp == NULL || c == ':') + { + if (opterr) + { + if (posixly_correct) + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, _("%s: illegal option -- %c\n"), + argv[0], c); + else + fprintf (stderr, _("%s: invalid option -- %c\n"), + argv[0], c); + } + optopt = c; + return '?'; + } + /* Convenience. Treat POSIX -W foo same as long option --foo */ + if (temp[0] == 'W' && temp[1] == ';') + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = 0; + int option_index; + + /* This is an option that requires an argument. */ + if (*nextchar != '\0') + { + optarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + optind++; + } + else if (optind == argc) + { + if (opterr) + { + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, _("%s: option requires an argument -- %c\n"), + argv[0], c); + } + optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + return c; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + + /* optarg is now the argument, see if it's in the + table of longopts. */ + + for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, nextchar, nameend - nextchar)) + { + if ((unsigned int) (nameend - nextchar) == strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else + /* Second or later nonexact match found. */ + ambig = 1; + } + if (ambig && !exact) + { + if (opterr) + fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), + argv[0], argv[optind]); + nextchar += strlen (nextchar); + optind++; + return '?'; + } + if (pfound != NULL) + { + option_index = indfound; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + optarg = nameend + 1; + else + { + if (opterr) + fprintf (stderr, _("\ +%s: option `-W %s' doesn't allow an argument\n"), + argv[0], pfound->name); + + nextchar += strlen (nextchar); + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (optind < argc) + optarg = argv[optind++]; + else + { + if (opterr) + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[optind - 1]); + nextchar += strlen (nextchar); + return optstring[0] == ':' ? ':' : '?'; + } + } + nextchar += strlen (nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + nextchar = NULL; + return 'W'; /* Let the application handle it. */ + } + if (temp[1] == ':') + { + if (temp[2] == ':') + { + /* This is an option that accepts an argument optionally. */ + if (*nextchar != '\0') + { + optarg = nextchar; + optind++; + } + else + optarg = NULL; + nextchar = NULL; + } + else + { + /* This is an option that requires an argument. */ + if (*nextchar != '\0') + { + optarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + optind++; + } + else if (optind == argc) + { + if (opterr) + { + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, + _("%s: option requires an argument -- %c\n"), + argv[0], c); + } + optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + nextchar = NULL; + } + } + return c; + } +} + +int +getopt (argc, argv, optstring) + int argc; + char *const *argv; + const char *optstring; +{ + return _getopt_internal (argc, argv, optstring, + (const struct option *) 0, + (int *) 0, + 0); +} + +#endif /* Not ELIDE_CODE. */ + +#ifdef TEST + +/* Compile with -DTEST to make an executable for use in testing + the above definition of `getopt'. */ + +int +main (argc, argv) + int argc; + char **argv; +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + + c = getopt (argc, argv, "abc:d:0123456789"); + if (c == -1) + break; + + switch (c) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case '?': + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif /* TEST */ diff --git a/cs/3rd party/libtheora/win32/getopt1.c b/cs/3rd party/libtheora/win32/getopt1.c new file mode 100644 index 000000000..dee63255b --- /dev/null +++ b/cs/3rd party/libtheora/win32/getopt1.c @@ -0,0 +1,188 @@ +/* getopt_long and getopt_long_only entry points for GNU getopt. + Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "getopt_win.h" + +#if !defined __STDC__ || !__STDC__ +/* This is a separate conditional since some stdc systems + reject `defined (const)'. */ +#ifndef const +#define const +#endif +#endif + +#include + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#define GETOPT_INTERFACE_VERSION 2 +#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 +#include +#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION +#define ELIDE_CODE +#endif +#endif + +#ifndef ELIDE_CODE + + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +#include +#endif + +#ifndef NULL +#define NULL 0 +#endif + +int +getopt_long (argc, argv, options, long_options, opt_index) + int argc; + char *const *argv; + const char *options; + const struct option *long_options; + int *opt_index; +{ + return _getopt_internal (argc, argv, options, long_options, opt_index, 0); +} + +/* Like getopt_long, but '-' as well as '--' can indicate a long option. + If an option that starts with '-' (not '--') doesn't match a long option, + but does match a short option, it is parsed as a short option + instead. */ + +int +getopt_long_only (argc, argv, options, long_options, opt_index) + int argc; + char *const *argv; + const char *options; + const struct option *long_options; + int *opt_index; +{ + return _getopt_internal (argc, argv, options, long_options, opt_index, 1); +} + + +#endif /* Not ELIDE_CODE. */ + +#ifdef TEST + +#include + +int +main (argc, argv) + int argc; + char **argv; +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + int option_index = 0; + static struct option long_options[] = + { + {"add", 1, 0, 0}, + {"append", 0, 0, 0}, + {"delete", 1, 0, 0}, + {"verbose", 0, 0, 0}, + {"create", 0, 0, 0}, + {"file", 1, 0, 0}, + {0, 0, 0, 0} + }; + + c = getopt_long (argc, argv, "abc:d:0123456789", + long_options, &option_index); + if (c == -1) + break; + + switch (c) + { + case 0: + printf ("option %s", long_options[option_index].name); + if (optarg) + printf (" with arg %s", optarg); + printf ("\n"); + break; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case 'd': + printf ("option d with value `%s'\n", optarg); + break; + + case '?': + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif /* TEST */ diff --git a/cs/3rd party/libtheora/win32/getopt_win.h b/cs/3rd party/libtheora/win32/getopt_win.h new file mode 100644 index 000000000..b0147e9d2 --- /dev/null +++ b/cs/3rd party/libtheora/win32/getopt_win.h @@ -0,0 +1,169 @@ +/* Declarations for getopt. + Copyright (C) 1989,90,91,92,93,94,96,97,98 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _GETOPT_H + +#ifndef __need_getopt +# define _GETOPT_H 1 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +extern char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +extern int optind; + +/* Callers store zero here to inhibit the error message `getopt' prints + for unrecognized options. */ + +extern int opterr; + +/* Set to an option character which was unrecognized. */ + +extern int optopt; + +#ifndef __need_getopt +/* Describe the long-named options requested by the application. + The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector + of `struct option' terminated by an element containing a name which is + zero. + + The field `has_arg' is: + no_argument (or 0) if the option does not take an argument, + required_argument (or 1) if the option requires an argument, + optional_argument (or 2) if the option takes an optional argument. + + If the field `flag' is not NULL, it points to a variable that is set + to the value given in the field `val' when the option is found, but + left unchanged if the option is not found. + + To have a long-named option do something other than set an `int' to + a compiled-in constant, such as set a value from `optarg', set the + option's `flag' field to zero and its `val' field to a nonzero + value (the equivalent single-letter option character, if there is + one). For long options that have a zero `flag' field, `getopt' + returns the contents of the `val' field. */ + +struct option +{ +# if defined __STDC__ && __STDC__ + const char *name; +# else + char *name; +# endif + /* has_arg can't be an enum because some compilers complain about + type mismatches in all the code that assumes it is an int. */ + int has_arg; + int *flag; + int val; +}; + +/* Names for the values of the `has_arg' field of `struct option'. */ + +# define no_argument 0 +# define required_argument 1 +# define optional_argument 2 +#endif /* need getopt */ + + +/* Get definitions and prototypes for functions to process the + arguments in ARGV (ARGC of them, minus the program name) for + options given in OPTS. + + Return the option character from OPTS just read. Return -1 when + there are no more options. For unrecognized options, or options + missing arguments, `optopt' is set to the option letter, and '?' is + returned. + + The OPTS string is a list of characters which are recognized option + letters, optionally followed by colons, specifying that that letter + takes an argument, to be placed in `optarg'. + + If a letter in OPTS is followed by two colons, its argument is + optional. This behavior is specific to the GNU `getopt'. + + The argument `--' causes premature termination of argument + scanning, explicitly telling `getopt' that there are no more + options. + + If OPTS begins with `--', then non-option arguments are treated as + arguments to the option '\0'. This behavior is specific to the GNU + `getopt'. */ + +#if defined __STDC__ && __STDC__ +# ifdef __GNU_LIBRARY__ +/* Many other libraries have conflicting prototypes for getopt, with + differences in the consts, in stdlib.h. To avoid compilation + errors, only prototype getopt for the GNU C library. */ +extern int getopt (int __argc, char *const *__argv, const char *__shortopts); +# else /* not __GNU_LIBRARY__ */ +extern int getopt (); +# endif /* __GNU_LIBRARY__ */ + +# ifndef __need_getopt +extern int getopt_long (int __argc, char *const *__argv, const char *__shortopts, + const struct option *__longopts, int *__longind); +extern int getopt_long_only (int __argc, char *const *__argv, + const char *__shortopts, + const struct option *__longopts, int *__longind); + +/* Internal only. Users should not call this directly. */ +extern int _getopt_internal (int __argc, char *const *__argv, + const char *__shortopts, + const struct option *__longopts, int *__longind, + int __long_only); +# endif +#else /* not __STDC__ */ +extern int getopt (); +# ifndef __need_getopt +extern int getopt_long (); +extern int getopt_long_only (); + +extern int _getopt_internal (); +# endif +#endif /* __STDC__ */ + +#ifdef __cplusplus +} +#endif + +/* Make sure we later can get all the definitions and declarations. */ +#undef __need_getopt + +#endif /* getopt.h */ diff --git a/cs/3rd party/libtheora/win32/theora_static.dsp b/cs/3rd party/libtheora/win32/theora_static.dsp new file mode 100644 index 000000000..546ed2523 --- /dev/null +++ b/cs/3rd party/libtheora/win32/theora_static.dsp @@ -0,0 +1,336 @@ +# Microsoft Developer Studio Project File - Name="theora_static" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=theora_static - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "theora_static.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "theora_static.mak" CFG="theora_static - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "theora_static - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "theora_static - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "theora_static - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Static_Release" +# PROP Intermediate_Dir "Static_Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c +# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\ogg\include" /I "..\..\theora\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /YX /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ELSEIF "$(CFG)" == "theora_static - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Static_Debug" +# PROP Intermediate_Dir "Static_Debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\..\ogg\include" /I "..\..\theora\include" /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"Static_Debug\theora_static_d.lib" + +!ENDIF + +# Begin Target + +# Name "theora_static - Win32 Release" +# Name "theora_static - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\lib\enc\dct.c +# End Source File +# Begin Source File + +SOURCE=..\lib\enc\dct_decode.c +# End Source File +# Begin Source File + +SOURCE=..\lib\enc\dct_encode.c +# End Source File +# Begin Source File + +SOURCE=..\lib\enc\dct_encode.c +# End Source File +# Begin Source File + +SOURCE=..\lib\enc\encapiwrapper.c +# End Source File +# Begin Source File + +SOURCE=..\lib\enc\encode.c +# End Source File +# Begin Source File + +SOURCE=..\lib\enc\encoder_huffman.c +# End Source File +# Begin Source File + +SOURCE=..\lib\enc\encoder_idct.c +# End Source File +# Begin Source File + +SOURCE=..\lib\enc\encoder_toplevel.c +# End Source File +# Begin Source File + +SOURCE=..\lib\enc\encoder_quant.c +# End Source File +# Begin Source File + +SOURCE=..\lib\enc\frarray.c +# End Source File +# Begin Source File + +SOURCE=..\lib\enc\frinit.c +# End Source File +# Begin Source File + +SOURCE=..\lib\enc\mathops.c +# End Source File +# Begin Source File + +SOURCE=..\lib\enc\mcenc.c +# End Source File +# Begin Source File + +SOURCE=..\lib\enc\mode.c +# End Source File +# Begin Source File + +SOURCE=..\lib\enc\reconstruct.c +# End Source File +# Begin Source File + +SOURCE=..\lib\enc\x86_32_vs\dsp_mmx.c +# End Source File +# Begin Source File + +SOURCE=..\lib\enc\x86_32_vs\fdct_mmx.c +# End Source File +# Begin Source File + +SOURCE=..\lib\enc\x86_32_vs\recon_mmx.c +# End Source File +# Begin Source File + +SOURCE=..\lib\dec\apiwrapper.c +# End Source File +# Begin Source File + +SOURCE=..\lib\dec\bitpack.c +# End Source File +# Begin Source File + +SOURCE=..\lib\dec\decapiwrapper.c +# End Source File +# Begin Source File + +SOURCE=..\lib\dec\decinfo.c +# End Source File +# Begin Source File + +SOURCE=..\lib\dec\decode.c +# End Source File +# Begin Source File + +SOURCE=..\lib\dec\dequant.c +# End Source File +# Begin Source File + +SOURCE=..\lib\dec\fragment.c +# End Source File +# Begin Source File + +SOURCE=..\lib\dec\huffdec.c +# End Source File +# Begin Source File + +SOURCE=..\lib\dec\idct.c +# End Source File +# Begin Source File + +SOURCE=..\lib\dec\info.c +# End Source File +# Begin Source File + +SOURCE=..\lib\dec\internal.c +# End Source File +# Begin Source File + +SOURCE=..\lib\dec\quant.c +# End Source File +# Begin Source File + +SOURCE=..\lib\dec\state.c +# End Source File +# Begin Source File + +SOURCE=..\lib\dec\x86_vc\mmxfrag.c +# End Source File +# Begin Source File + +SOURCE=..\lib\dec\x86_vc\mmxidct.c +# End Source File +# Begin Source File + +SOURCE=..\lib\dec\x86_vc\mmxloopfilter.c +# End Source File +# Begin Source File + +SOURCE=..\lib\dec\x86_vc\mmxstate.c +# End Source File +# Begin Source File + +SOURCE=..\lib\dec\x86_vc\x86stat.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\lib\dec\apiwrapper.h +# End Source File +# Begin Source File + +SOURCE=..\lib\enc\block_inline.h +# End Source File +# Begin Source File + +SOURCE=..\include\theora\codec.h +# End Source File +# Begin Source File + +SOURCE=..\lib\enc\codec_internal.h +# End Source File +# Begin Source File + +SOURCE=..\lib\cpu.h +# End Source File +# Begin Source File + +SOURCE=..\lib\dec\dct.h +# End Source File +# Begin Source File + +SOURCE=..\lib\dec\decint.h +# End Source File +# Begin Source File + +SOURCE=..\lib\dec\dequant.h +# End Source File +# Begin Source File + +SOURCE=..\lib\enc\dsp.h +# End Source File +# Begin Source File + +SOURCE=..\lib\enc\encoder_huffman.h +# End Source File +# Begin Source File + +SOURCE=..\lib\enc\encoder_lookup.h +# End Source File +# Begin Source File + +SOURCE=..\lib\dec\enquant.h +# End Source File +# Begin Source File + +SOURCE=..\lib\dec\huffdec.h +# End Source File +# Begin Source File + +SOURCE=..\lib\dec\huffman.h +# End Source File +# Begin Source File + +SOURCE=..\lib\enc\hufftables.h +# End Source File +# Begin Source File + +SOURCE=..\lib\dec\idct.h +# End Source File +# Begin Source File + +SOURCE=..\lib\internal.h +# End Source File +# Begin Source File + +SOURCE=..\lib\dec\ocintrin.h +# End Source File +# Begin Source File + +SOURCE=..\lib\enc\pp.h +# End Source File +# Begin Source File + +SOURCE=..\lib\dec\quant.h +# End Source File +# Begin Source File + +SOURCE=..\lib\enc\quant_lookup.h +# End Source File +# Begin Source File + +SOURCE=..\include\theora\theora.h +# End Source File +# Begin Source File + +SOURCE=..\include\theora\theoradec.h +# End Source File +# Begin Source File + +SOURCE=..\lib\enc\toplevel_lookup.h +# End Source File +# End Group +# End Target +# End Project diff --git a/cs/3rd party/libtheora/win32/xmingw32/libtheoradec-all.def b/cs/3rd party/libtheora/win32/xmingw32/libtheoradec-all.def new file mode 100644 index 000000000..c75356253 --- /dev/null +++ b/cs/3rd party/libtheora/win32/xmingw32/libtheoradec-all.def @@ -0,0 +1,58 @@ +EXPORTS +; Old alpha API + theora_version_string @ 1 + theora_version_number @ 2 + + theora_decode_header @ 3 + theora_decode_init @ 4 + theora_decode_packetin @ 5 + theora_decode_YUVout @ 6 + + theora_control @ 7 + + theora_packet_isheader @ 8 + theora_packet_iskeyframe @ 9 + + theora_granule_shift @ 10 + theora_granule_frame @ 11 + theora_granule_time @ 12 + + theora_info_init @ 13 + theora_info_clear @ 14 + + theora_clear @ 15 + + theora_comment_init @ 16 + theora_comment_add @ 17 + theora_comment_add_tag @ 18 + theora_comment_query @ 19 + theora_comment_query_count @ 20 + theora_comment_clear @ 21 + +; New theora-exp API + th_version_string @ 22 + th_version_number @ 23 + + th_decode_headerin @ 24 + th_decode_alloc @ 25 + th_setup_free @ 26 + th_decode_ctl @ 27 + th_decode_packetin @ 28 + th_decode_ycbcr_out @ 29 + th_decode_free @ 30 + + th_packet_isheader @ 31 + th_packet_iskeyframe @ 32 + + th_granule_frame @ 33 + th_granule_time @ 34 + + th_info_init @ 35 + th_info_clear @ 36 + + th_comment_init @ 37 + th_comment_add @ 38 + th_comment_add_tag @ 39 + th_comment_query @ 40 + th_comment_query_count @ 41 + th_comment_clear @ 42 diff --git a/cs/3rd party/libtheora/win32/xmingw32/libtheoradec-all.rc b/cs/3rd party/libtheora/win32/xmingw32/libtheoradec-all.rc new file mode 100644 index 000000000..f6a5c60bc --- /dev/null +++ b/cs/3rd party/libtheora/win32/xmingw32/libtheoradec-all.rc @@ -0,0 +1,39 @@ +#include + +/*See "VERSIONINFO Resource" in MSDN, + http://msdn2.microsoft.com/en-us/library/Aa381058.aspx */ +VS_VERSION_INFO VERSIONINFO +FILEVERSION TH_VERSION_FIELD +PRODUCTVERSION TH_VERSION_FIELD +FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#if defined(_DEBUG) +FILEFLAGS VS_FF_DEBUG +#else +FILEFLAGS 0 +#endif +FILEOS VOS__WINDOWS32 +FILETYPE VFT_DLL +FILESUBTYPE 0 +BEGIN + BLOCK "StringFileInfo" + BEGIN + /*0x040904B0 == US English, Unicode*/ + BLOCK "0x040904B0" + BEGIN + VALUE "Comments","Xiph.Org " TH_DEC_INTERNAL_NAME ".dll" + VALUE "CompanyName","The Xiph.Org Foundation" + VALUE "FileDescription","Xiph.Org Theora Decoder Library" + VALUE "FileVersion",TH_VERSION_STRING + VALUE "InternalName",TH_DEC_INTERNAL_NAME + VALUE "LegalCopyright","Copyright (C) 2002-2007 Xiph.Org Foundation" + VALUE "OriginalFilename",TH_DEC_INTERNAL_NAME ".dll" + VALUE "ProductName","libtheora" + VALUE "ProductVersion",TH_VERSION_STRING + END + END + BLOCK "VarFileInfo" + BEGIN + /*0x0409, 1200 == US English, Unicode*/ + VALUE "Translation",0x0409,1200 + END +END diff --git a/cs/3rd party/libtheora/win32/xmingw32/libtheoradec.rc b/cs/3rd party/libtheora/win32/xmingw32/libtheoradec.rc new file mode 100644 index 000000000..3ed5da2ab --- /dev/null +++ b/cs/3rd party/libtheora/win32/xmingw32/libtheoradec.rc @@ -0,0 +1,3 @@ +#define TH_DEC_INTERNAL_NAME "libtheoradec" +#undef _DEBUG +#include "libtheoradec-all.rc" diff --git a/cs/3rd party/libtheora/win32/xmingw32/libtheoradec70.rc b/cs/3rd party/libtheora/win32/xmingw32/libtheoradec70.rc new file mode 100644 index 000000000..ee82820c8 --- /dev/null +++ b/cs/3rd party/libtheora/win32/xmingw32/libtheoradec70.rc @@ -0,0 +1,3 @@ +#define TH_DEC_INTERNAL_NAME "libtheoradec70" +#undef _DEBUG +#include "libtheoradec-all.rc" diff --git a/cs/3rd party/libtheora/win32/xmingw32/libtheoradec70d.rc b/cs/3rd party/libtheora/win32/xmingw32/libtheoradec70d.rc new file mode 100644 index 000000000..783800d18 --- /dev/null +++ b/cs/3rd party/libtheora/win32/xmingw32/libtheoradec70d.rc @@ -0,0 +1,3 @@ +#define TH_DEC_INTERNAL_NAME "libtheoradec70d" +#define _DEBUG (1) +#include "libtheoradec-all.rc" diff --git a/cs/3rd party/libtheora/win32/xmingw32/libtheoradec71.rc b/cs/3rd party/libtheora/win32/xmingw32/libtheoradec71.rc new file mode 100644 index 000000000..0becd1902 --- /dev/null +++ b/cs/3rd party/libtheora/win32/xmingw32/libtheoradec71.rc @@ -0,0 +1,3 @@ +#define TH_DEC_INTERNAL_NAME "libtheoradec71" +#undef _DEBUG +#include "libtheoradec-all.rc" diff --git a/cs/3rd party/libtheora/win32/xmingw32/libtheoradec71d.rc b/cs/3rd party/libtheora/win32/xmingw32/libtheoradec71d.rc new file mode 100644 index 000000000..e1a039804 --- /dev/null +++ b/cs/3rd party/libtheora/win32/xmingw32/libtheoradec71d.rc @@ -0,0 +1,3 @@ +#define TH_DEC_INTERNAL_NAME "libtheoradec71d" +#define _DEBUG (1) +#include "libtheoradec-all.rc" diff --git a/cs/3rd party/libtheora/win32/xmingw32/libtheoradec80.rc b/cs/3rd party/libtheora/win32/xmingw32/libtheoradec80.rc new file mode 100644 index 000000000..932cce927 --- /dev/null +++ b/cs/3rd party/libtheora/win32/xmingw32/libtheoradec80.rc @@ -0,0 +1,3 @@ +#define TH_DEC_INTERNAL_NAME "libtheoradec80" +#undef _DEBUG +#include "libtheoradec-all.rc" diff --git a/cs/3rd party/libtheora/win32/xmingw32/libtheoradec80d.rc b/cs/3rd party/libtheora/win32/xmingw32/libtheoradec80d.rc new file mode 100644 index 000000000..1ff551294 --- /dev/null +++ b/cs/3rd party/libtheora/win32/xmingw32/libtheoradec80d.rc @@ -0,0 +1,3 @@ +#define TH_DEC_INTERNAL_NAME "libtheoradec80d" +#define _DEBUG (1) +#include "libtheoradec-all.rc" diff --git a/cs/3rd party/libtheora/win32/xmingw32/libtheoradecd.rc b/cs/3rd party/libtheora/win32/xmingw32/libtheoradecd.rc new file mode 100644 index 000000000..5cfaf6e66 --- /dev/null +++ b/cs/3rd party/libtheora/win32/xmingw32/libtheoradecd.rc @@ -0,0 +1,3 @@ +#define TH_DEC_INTERNAL_NAME "libtheoradecd" +#define _DEBUG (1) +#include "libtheoradec-all.rc" diff --git a/cs/3rd party/libtheora/win32/xmingw32/libtheoraenc-all.def b/cs/3rd party/libtheora/win32/xmingw32/libtheoraenc-all.def new file mode 100644 index 000000000..90130fd4b --- /dev/null +++ b/cs/3rd party/libtheora/win32/xmingw32/libtheoraenc-all.def @@ -0,0 +1,17 @@ +EXPORTS +; Old alpha API + theora_encode_init @ 1 + theora_encode_YUVin @ 2 + theora_encode_packetout @ 3 + theora_encode_header @ 4 + theora_encode_comment @ 5 + theora_encode_tables @ 6 +; New theora-exp API + th_encode_alloc @ 7 + th_encode_ctl @ 8 + th_encode_flushheader @ 9 + th_encode_ycbcr_in @ 10 + th_encode_packetout @ 11 + th_encode_free @ 12 + TH_VP31_QUANT_INFO @ 13 + TH_VP31_HUFF_CODES @ 14 diff --git a/cs/3rd party/libtheora/win32/xmingw32/libtheoraenc-all.rc b/cs/3rd party/libtheora/win32/xmingw32/libtheoraenc-all.rc new file mode 100644 index 000000000..5c96b09e1 --- /dev/null +++ b/cs/3rd party/libtheora/win32/xmingw32/libtheoraenc-all.rc @@ -0,0 +1,39 @@ +#include + +/*See "VERSIONINFO Resource" in MSDN, + http://msdn2.microsoft.com/en-us/library/Aa381058.aspx */ +VS_VERSION_INFO VERSIONINFO +FILEVERSION TH_VERSION_FIELD +PRODUCTVERSION TH_VERSION_FIELD +FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#if defined(_DEBUG) +FILEFLAGS VS_FF_DEBUG +#else +FILEFLAGS 0 +#endif +FILEOS VOS__WINDOWS32 +FILETYPE VFT_DLL +FILESUBTYPE 0 +BEGIN + BLOCK "StringFileInfo" + BEGIN + /*0x040904B0 == US English, Unicode*/ + BLOCK "0x040904B0" + BEGIN + VALUE "Comments","Xiph.Org " TH_ENC_INTERNAL_NAME ".dll" + VALUE "CompanyName","The Xiph.Org Foundation" + VALUE "FileDescription","Xiph.Org Theora Encoder Library" + VALUE "FileVersion",TH_VERSION_STRING + VALUE "InternalName",TH_ENC_INTERNAL_NAME + VALUE "LegalCopyright","Copyright (C) 2002-2007 Xiph.Org Foundation" + VALUE "OriginalFilename",TH_ENC_INTERNAL_NAME ".dll" + VALUE "ProductName","libtheora" + VALUE "ProductVersion",TH_VERSION_STRING + END + END + BLOCK "VarFileInfo" + BEGIN + /*0x0409, 1200 == US English, Unicode*/ + VALUE "Translation",0x0409,1200 + END +END diff --git a/cs/3rd party/libtheora/win32/xmingw32/libtheoraenc.rc b/cs/3rd party/libtheora/win32/xmingw32/libtheoraenc.rc new file mode 100644 index 000000000..26a356dca --- /dev/null +++ b/cs/3rd party/libtheora/win32/xmingw32/libtheoraenc.rc @@ -0,0 +1,3 @@ +#define TH_ENC_INTERNAL_NAME "libtheoraenc" +#undef _DEBUG +#include "libtheoraenc-all.rc" diff --git a/cs/3rd party/libtheora/win32/xmingw32/libtheoraenc70.rc b/cs/3rd party/libtheora/win32/xmingw32/libtheoraenc70.rc new file mode 100644 index 000000000..12cf7c174 --- /dev/null +++ b/cs/3rd party/libtheora/win32/xmingw32/libtheoraenc70.rc @@ -0,0 +1,3 @@ +#define TH_ENC_INTERNAL_NAME "libtheoraenc70" +#undef _DEBUG +#include "libtheoraenc-all.rc" diff --git a/cs/3rd party/libtheora/win32/xmingw32/libtheoraenc70d.rc b/cs/3rd party/libtheora/win32/xmingw32/libtheoraenc70d.rc new file mode 100644 index 000000000..0fdb70b01 --- /dev/null +++ b/cs/3rd party/libtheora/win32/xmingw32/libtheoraenc70d.rc @@ -0,0 +1,3 @@ +#define TH_ENC_INTERNAL_NAME "libtheoraenc70d" +#define _DEBUG (1) +#include "libtheoraenc-all.rc" diff --git a/cs/3rd party/libtheora/win32/xmingw32/libtheoraenc71.rc b/cs/3rd party/libtheora/win32/xmingw32/libtheoraenc71.rc new file mode 100644 index 000000000..86075168a --- /dev/null +++ b/cs/3rd party/libtheora/win32/xmingw32/libtheoraenc71.rc @@ -0,0 +1,3 @@ +#define TH_ENC_INTERNAL_NAME "libtheoraenc71" +#undef _DEBUG +#include "libtheoraenc-all.rc" diff --git a/cs/3rd party/libtheora/win32/xmingw32/libtheoraenc71d.rc b/cs/3rd party/libtheora/win32/xmingw32/libtheoraenc71d.rc new file mode 100644 index 000000000..3ef2ef163 --- /dev/null +++ b/cs/3rd party/libtheora/win32/xmingw32/libtheoraenc71d.rc @@ -0,0 +1,3 @@ +#define TH_ENC_INTERNAL_NAME "libtheoraenc71d" +#define _DEBUG (1) +#include "libtheoraenc-all.rc" diff --git a/cs/3rd party/libtheora/win32/xmingw32/libtheoraenc80.rc b/cs/3rd party/libtheora/win32/xmingw32/libtheoraenc80.rc new file mode 100644 index 000000000..66ef776f4 --- /dev/null +++ b/cs/3rd party/libtheora/win32/xmingw32/libtheoraenc80.rc @@ -0,0 +1,3 @@ +#define TH_ENC_INTERNAL_NAME "libtheoraenc80" +#undef _DEBUG +#include "libtheoraenc-all.rc" diff --git a/cs/3rd party/libtheora/win32/xmingw32/libtheoraenc80d.rc b/cs/3rd party/libtheora/win32/xmingw32/libtheoraenc80d.rc new file mode 100644 index 000000000..dcca72c6c --- /dev/null +++ b/cs/3rd party/libtheora/win32/xmingw32/libtheoraenc80d.rc @@ -0,0 +1,3 @@ +#define TH_ENC_INTERNAL_NAME "libtheoraenc80d" +#define _DEBUG (1) +#include "libtheoraenc-all.rc" diff --git a/cs/3rd party/libtheora/win32/xmingw32/libtheoraencd.rc b/cs/3rd party/libtheora/win32/xmingw32/libtheoraencd.rc new file mode 100644 index 000000000..fe2a56bfe --- /dev/null +++ b/cs/3rd party/libtheora/win32/xmingw32/libtheoraencd.rc @@ -0,0 +1,3 @@ +#define TH_ENC_INTERNAL_NAME "libtheoraencd" +#define _DEBUG (1) +#include "libtheoraenc-all.rc" diff --git a/cs/3rd party/libtheora_static.vcxproj b/cs/3rd party/libtheora_static.vcxproj new file mode 100644 index 000000000..3890a1d8d --- /dev/null +++ b/cs/3rd party/libtheora_static.vcxproj @@ -0,0 +1,210 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Mixed + Win32 + + + Mixed + x64 + + + Release + Win32 + + + Release + x64 + + + + {653F3841-3F26-49B9-AFCF-091DB4B67031} + libtheora + Win32Proj + 8.1 + + + + StaticLibrary + MultiByte + true + v140 + + + StaticLibrary + MultiByte + v141 + + + StaticLibrary + MultiByte + v141 + + + StaticLibrary + MultiByte + true + v141 + + + StaticLibrary + MultiByte + v141 + + + StaticLibrary + MultiByte + v141 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + libtheora\include;libtheora\lib;libogg\include;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_BIND_TO_CURRENT_CRT_VERSION;_USRDLL;LIBTHEORA_EXPORTS;DEBUG;OC_X86_ASM;%(PreprocessorDefinitions) + NotUsing + StreamingSIMDExtensions2 + + + + + libtheora\include;libtheora\lib;libogg\include;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_BIND_TO_CURRENT_CRT_VERSION;_USRDLL;LIBTHEORA_EXPORTS;DEBUG;OC_X86_ASM;%(PreprocessorDefinitions) + NotUsing + + + + + libtheora\include;libtheora\lib;libogg\include;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_BIND_TO_CURRENT_CRT_VERSION;_USRDLL;LIBTHEORA_EXPORTS;DEBUG;%(PreprocessorDefinitions) + NotUsing + + + + + libtheora\include;libtheora\lib;libogg\include;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_BIND_TO_CURRENT_CRT_VERSION;_USRDLL;LIBTHEORA_EXPORTS;DEBUG;%(PreprocessorDefinitions) + NotUsing + + + + + libtheora\include;libtheora\lib;libogg\include;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_BIND_TO_CURRENT_CRT_VERSION;_USRDLL;LIBTHEORA_EXPORTS;OC_X86_ASM;%(PreprocessorDefinitions) + 4244;4267;4057;4100;4245;%(DisableSpecificWarnings) + NotUsing + StreamingSIMDExtensions2 + Speed + + + + + libtheora\include;libtheora\lib;libogg\include;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_BIND_TO_CURRENT_CRT_VERSION;_USRDLL;LIBTHEORA_EXPORTS;%(PreprocessorDefinitions) + 4244;4267;4057;4100;4245;%(DisableSpecificWarnings) + NotUsing + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cs/3rd party/libvorbis/.gitignore b/cs/3rd party/libvorbis/.gitignore new file mode 100644 index 000000000..0c201cb46 --- /dev/null +++ b/cs/3rd party/libvorbis/.gitignore @@ -0,0 +1,40 @@ +*.o +*.lo +*.la +.libs +.deps +aclocal.m4 +configure +Makefile +Makefile.in +autom4te.cache +compile +config.guess +config.h +config.h.in +config.h.in~ +config.log +config.status +config.sub +depcomp +install-sh +libtool +ltmain.sh +missing +stamp-h1 +m4/libtool.m4 +m4/ltoptions.m4 +m4/ltsugar.m4 +m4/ltversion.m4 +m4/lt~obsolete.m4 +libvorbis.spec +vorbis-uninstalled.pc +vorbis.pc +vorbisenc-uninstalled.pc +vorbisenc.pc +vorbisfile-uninstalled.pc +vorbisfile.pc +doc/Doxyfile +doc/doxygen-build.stamp +lib/test_sharedbook +test/test diff --git a/cs/3rd party/libvorbis/AUTHORS b/cs/3rd party/libvorbis/AUTHORS new file mode 100644 index 000000000..0da10363c --- /dev/null +++ b/cs/3rd party/libvorbis/AUTHORS @@ -0,0 +1,3 @@ +Monty + +and the rest of the Xiph.org Foundation. diff --git a/cs/3rd party/libvorbis/CHANGES b/cs/3rd party/libvorbis/CHANGES new file mode 100644 index 000000000..c98ccfc22 --- /dev/null +++ b/cs/3rd party/libvorbis/CHANGES @@ -0,0 +1,152 @@ +libvorbis 1.3.5 (2015-03-03) -- "Xiph.Org libVorbis I 20150105 (⛄⛄⛄⛄)" + +* Tolerate single-entry codebooks. +* Fix decoder crash with invalid input. +* Fix encoder crash with non-positive sample rates. +# Fix issues in vorbisfile's seek bisection code. +* Spec errata. +* Reject multiple headers of the same type. +* Various build fixes and code cleanup. + +libvorbis 1.3.4 (2014-01-22) -- "Xiph.Org libVorbis I 20140122 (Turpakäräjiin)" + +* Reduce codebook footprint in library code. +* Various build and documentation fixes. + +libvorbis 1.3.3 (2012-02-03) -- "Xiph.Org libVorbis I 20120203 (Omnipresent)" + +* vorbis: additional proofing against invalid/malicious + streams in decode (see SVN for details). +* vorbis: fix a memory leak in vorbis_commentheader_out(). +* updates, corrections and clarifications in the Vorbis I specification + document +* win32: fixed project configuration which referenced two CRT versions + in output binaries. +* build warning fixes + +libvorbis 1.3.2 (2010-11-01) -- "Xiph.Org libVorbis I 20101101 (Schaufenugget)" + + * vorbis: additional proofing against invalid/malicious + streams in floor, residue, and bos/eos packet trimming + code (see SVN for details). + * vorbis: Added programming documentation tree for the + low-level calls + * vorbisfile: Correct handling of serial numbers array + element [0] on non-seekable streams + * vorbisenc: Back out an [old] AoTuV HF weighting that was + first enabled in 1.3.0; there are a few samples where I + really don't like the effect it causes. + * vorbis: return correct timestamp for granule positions + with high bit set. + * vorbisfile: the [undocumented] half-rate decode api made no + attempt to keep the pcm offset tracking consistent in seeks. + Fix and add a testing mode to seeking_example.c to torture + test seeking in halfrate mode. Also remove requirement that + halfrate mode only work with seekable files. + * vorbisfile: Fix a chaining bug in raw_seeks where seeking + out of the current link would fail due to not + reinitializing the decode machinery. + * vorbisfile: improve seeking strategy. Reduces the + necessary number of seek callbacks in an open or seek + operation by well over 2/3. + +libvorbis 1.3.1 (2010-02-26) -- "Xiph.Org libVorbis I 20100325 (Everywhere)" + + * tweak + minor arithmetic fix in floor1 fit + * revert noise norm to conservative 1.2.3 behavior pending + more listening testing + +libvorbis 1.3.0 (2010-02-25) -- unreleased staging snapshot + + * Optimized surround support for 5.1 encoding at 44.1/48kHz + * Added encoder control call to disable channel coupling + * Correct an overflow bug in very low-bitrate encoding on 32 bit + machines that caused inflated bitrates + * Numerous API hardening, leak and build fixes + * Correct bug in 22kHz compand setup that could cause a crash + * Correct bug in 16kHz codebooks that could cause unstable pure + tones at high bitrates + +libvorbis 1.2.3 (2009-07-09) -- "Xiph.Org libVorbis I 20090709" + + * correct a vorbisfile bug that prevented proper playback of + Vorbis files where all audio in a logical stream is in a + single page + * Additional decode setup hardening against malicious streams + * Add 'OV_EXCLUDE_STATIC_CALLBACKS' define for developers who + wish to avoid unused symbol warnings from the static callbacks + defined in vorbisfile.h + +libvorbis 1.2.2 (2009-06-24) -- "Xiph.Org libVorbis I 20090624" + + * define VENDOR and ENCODER strings + * seek correctly in files bigger than 2 GB (Windows) + * fix regression from CVE-2008-1420; 1.0b1 files work again + * mark all tables as constant to reduce memory occupation + * additional decoder hardening against malicious streams + * substantially reduce amount of seeking performed by Vorbisfile + * Multichannel decode bugfix + * build system updates + * minor specification clarifications/fixes + +libvorbis 1.2.1 (unreleased) -- "Xiph.Org libVorbis I 20080501" + + * Improved robustness with corrupt streams. + * New ov_read_filter() vorbisfile call allows filtering decoded + audio as floats before converting to integer samples. + * Fix an encoder bug with multichannel streams. + * Replaced RTP payload format draft with RFC 5215. + * Bare bones self test under 'make check'. + * Fix a problem encoding some streams between 14 and 28 kHz. + * Fix a numerical instability in the edge extrapolation filter. + * Build system improvements. + * Specification correction. + +libvorbis 1.2.0 (2007-07-25) -- "Xiph.Org libVorbis I 20070622" + + * new ov_fopen() convenience call that avoids the common + stdio conflicts with ov_open() and MSVC runtimes. + * libvorbisfile now handles multiplexed streams + * improve robustness to corrupt input streams + * fix a minor encoder bug + * updated RTP draft + * build system updates + * minor corrections to the specification + +libvorbis 1.1.2 (2005-11-27) -- "Xiph.Org libVorbis I 20050304" + + * fix a serious encoder bug with gcc 4 optimized builds + * documentation and spec fixes + * updated VS2003 and XCode builds + * new draft RTP encapsulation spec + +libvorbis 1.1.1 (2005-06-27) -- "Xiph.Org libVorbis I 20050304" + + * bug fix to the bitrate management encoder interface + * bug fix to properly set packetno field in the encoder + * new draft RTP encapsulation spec + * library API documentation improvements + +libvorbis 1.1.0 (2004-09-22) -- "Xiph.Org libVorbis I 20040629" + + * merges tuning improvements from Aoyumi's aoTuV with fixups + * new managed bitrate (CBR) mode support + * new vorbis_encoder_ctl() interface + * extensive documentation updates + * application/ogg mimetype is now official + * autotools cleanup from Thomas Vander Stichele + * SymbianOS build support from Colin Ward at CSIRO + * various bugfixes + * various packaging improvements + +libvorbis 1.0.1 (2003-11-17) -- "Xiph.Org libVorbis I 20030909" + + * numerous bug fixes + * specification corrections + * new crosslap and halfrate APIs for game use + * packaging and build updates + +libvorbis 1.0.0 (2002-07-19) -- "Xiph.Org libVorbis I 20020717" + + * first stable release + diff --git a/cs/3rd party/libvorbis/CMakeLists.txt b/cs/3rd party/libvorbis/CMakeLists.txt new file mode 100644 index 000000000..bbc045ba6 --- /dev/null +++ b/cs/3rd party/libvorbis/CMakeLists.txt @@ -0,0 +1,81 @@ +cmake_minimum_required(VERSION 2.8.7) +project(vorbis) + +# Required modules +include(GNUInstallDirs) +include(CheckIncludeFiles) + +# Build options +option(BUILD_SHARED_LIBS "Build shared library" OFF) +if(APPLE) + option(BUILD_FRAMEWORK "Build Framework bundle for OSX" OFF) +endif() + +if(BUILD_FRAMEWORK) + set(BUILD_SHARED_LIBS TRUE) +endif() + +# Extract project version from configure.ac +file(READ configure.ac CONFIGURE_AC_CONTENTS) +string(REGEX MATCH "AC_INIT\\(\\[libvorbis\\],\\[([0-9]*).([0-9]*).([0-9]*)" DUMMY ${CONFIGURE_AC_CONTENTS}) +set(PROJECT_VERSION_MAJOR ${CMAKE_MATCH_1}) +set(PROJECT_VERSION_MINOR ${CMAKE_MATCH_2}) +set(PROJECT_VERSION_PATCH ${CMAKE_MATCH_3}) +set(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}) + +# Helper function to get version-info +function(get_version_info result current_var_name age_var_name revision_var_name) + string(REGEX MATCH "${current_var_name}=([0-9]*)" DUMMY ${CONFIGURE_AC_CONTENTS}) + set(VERSION_INFO_CURRENT ${CMAKE_MATCH_1}) + + string(REGEX MATCH "${age_var_name}=([0-9]*)" DUMMY ${CONFIGURE_AC_CONTENTS}) + set(VERSION_INFO_AGE ${CMAKE_MATCH_1}) + + string(REGEX MATCH "${revision_var_name}=([0-9]*)" DUMMY ${CONFIGURE_AC_CONTENTS}) + set(VERSION_INFO_REVISION ${CMAKE_MATCH_1}) + + math(EXPR VERSION_INFO_CURRENT_MINUS_AGE "${VERSION_INFO_CURRENT} - ${VERSION_INFO_AGE}") + + set(${result} "${VERSION_INFO_CURRENT_MINUS_AGE}.${VERSION_INFO_AGE}.${VERSION_INFO_REVISION}" PARENT_SCOPE) +endfunction() + +# Helper function to configure pkg-config files +function(configure_pkg_config_file pkg_config_file_in) + set(prefix ${CMAKE_INSTALL_PREFIX}) + set(exec_prefix ${CMAKE_INSTALL_FULL_BINDIR}) + set(libdir ${CMAKE_INSTALL_FULL_LIBDIR}) + set(includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR}) + set(VERSION ${PROJECT_VERSION}) + string(REPLACE ".in" "" pkg_config_file ${pkg_config_file_in}) + configure_file(${pkg_config_file_in} ${pkg_config_file} @ONLY) +endfunction() + +message(STATUS "Configuring ${PROJECT_NAME} ${PROJECT_VERSION}") + +# Find ogg dependency +if(NOT OGG_ROOT) + find_package(PkgConfig QUIET) + pkg_check_modules(PC_OGG QUIET ogg) + find_path(OGG_INCLUDE_DIRS NAMES ogg/ogg.h HINTS ${PC_OGG_INCLUDE_DIRS} PATH_SUFFIXES ogg) + find_library(OGG_LIBRARIES NAMES ogg HINTS ${PC_OGG_LIBRARY_DIRS}) +else() + find_path(OGG_INCLUDE_DIRS NAMES ogg/ogg.h HINTS ${OGG_ROOT}/include PATH_SUFFIXES ogg) + find_library(OGG_LIBRARIES NAMES ogg HINTS ${OGG_ROOT}/lib ${OGG_ROOT}/lib64) +endif() +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(OGG DEFAULT_MSG OGG_INCLUDE_DIRS OGG_LIBRARIES) + +add_subdirectory(lib) + +configure_pkg_config_file(vorbis.pc.in) +configure_pkg_config_file(vorbisenc.pc.in) +configure_pkg_config_file(vorbisfile.pc.in) + +install( + FILES + ${CMAKE_CURRENT_BINARY_DIR}/vorbis.pc + ${CMAKE_CURRENT_BINARY_DIR}/vorbisenc.pc + ${CMAKE_CURRENT_BINARY_DIR}/vorbisfile.pc + DESTINATION + ${CMAKE_INSTALL_LIBDIR}/pkgconfig +) diff --git a/cs/3rd party/libvorbis/COPYING b/cs/3rd party/libvorbis/COPYING new file mode 100644 index 000000000..8f1d18cc2 --- /dev/null +++ b/cs/3rd party/libvorbis/COPYING @@ -0,0 +1,28 @@ +Copyright (c) 2002-2015 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/cs/3rd party/libvorbis/Makefile.am b/cs/3rd party/libvorbis/Makefile.am new file mode 100644 index 000000000..c35131a6e --- /dev/null +++ b/cs/3rd party/libvorbis/Makefile.am @@ -0,0 +1,47 @@ +## Process this file with automake to produce Makefile.in + +AUTOMAKE_OPTIONS = foreign 1.11 dist-zip dist-xz + +ACLOCAL_AMFLAGS = -I m4 + +SUBDIRS = m4 include vq lib test doc + +if BUILD_EXAMPLES +SUBDIRS += examples +endif + +m4datadir = $(datadir)/aclocal +m4data_DATA = vorbis.m4 + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = vorbis.pc vorbisenc.pc vorbisfile.pc + +EXTRA_DIST = \ + CHANGES COPYING \ + autogen.sh \ + libvorbis.spec libvorbis.spec.in \ + vorbis.m4 \ + vorbis.pc.in vorbisenc.pc.in vorbisfile.pc.in \ + vorbis-uninstalled.pc.in \ + vorbisenc-uninstalled.pc.in \ + vorbisfile-uninstalled.pc.in \ + symbian \ + macosx win32 + + +DISTCHECK_CONFIGURE_FLAGS = --enable-docs + +dist-hook: + for item in $(EXTRA_DIST); do \ + if test -d $$item; then \ + echo -n "cleaning $$item dir for distribution..."; \ + rm -rf `find $(distdir)/$$item -name .svn`; \ + echo "OK"; \ + fi; \ + done + +debug: + $(MAKE) all CFLAGS="@DEBUG@" + +profile: + $(MAKE) all CFLAGS="@PROFILE@" diff --git a/cs/3rd party/libvorbis/README.md b/cs/3rd party/libvorbis/README.md new file mode 100644 index 000000000..1748ee289 --- /dev/null +++ b/cs/3rd party/libvorbis/README.md @@ -0,0 +1,149 @@ +# Vorbis + +[![Travis Build Status](https://travis-ci.org/xiph/vorbis.svg?branch=master)](https://travis-ci.org/xiph/vorbis) +[![Jenkins Build Status](https://mf4.xiph.org/jenkins/job/libvorbis/badge/icon)](https://mf4.xiph.org/jenkins/job/libvorbis/) +[![AppVeyor Build status](https://ci.appveyor.com/api/projects/status/github/xiph/vorbis?branch=master&svg=true)](https://ci.appveyor.com/project/rillian/vorbis) + +Vorbis is a general purpose audio and music encoding format +contemporary to MPEG-4's AAC and TwinVQ, the next generation beyond +MPEG audio layer 3. Unlike the MPEG sponsored formats (and other +proprietary formats such as RealAudio G2 and Windows' flavor of the +month), the Vorbis CODEC specification belongs to the public domain. +All the technical details are published and documented, and any +software entity may make full use of the format without license +fee, royalty or patent concerns. + +This package contains: + +- libvorbis, a BSD-style license software implementation of + the Vorbis specification by the Xiph.Org Foundation + (https://www.xiph.org/) + +- libvorbisfile, a BSD-style license convenience library + built on Vorbis designed to simplify common uses + +- libvorbisenc, a BSD-style license library that provides a simple, + programmatic encoding setup interface + +- example code making use of libogg, libvorbis, libvorbisfile and + libvorbisenc + +## What's here ## + +This source distribution includes libvorbis and an example +encoder/player to demonstrate use of libvorbis as well as +documentation on the Ogg Vorbis audio coding format. + +You'll need libogg (distributed separately) to compile this library. +A more comprehensive set of utilities is available in the vorbis-tools +package. + +Directory: + +- `lib` The source for the libraries, a BSD-license implementation of the public domain Ogg Vorbis audio encoding format. + +- `include` Library API headers + +- `debian` Rules/spec files for building Debian .deb packages + +- `doc` Vorbis documentation + +- `examples` Example code illustrating programmatic use of libvorbis, libvorbisfile and libvorbisenc + +- `macosx` Project files for MacOS X. + +- `win32` Win32 projects files and build automation + +- `vq` Internal utilities for training/building new LSP/residue and auxiliary codebooks. + +## Contact ## + +The Ogg homepage is located at 'https://www.xiph.org/ogg/'. +Vorbis's homepage is located at 'https://www.xiph.org/vorbis/'. +Up to date technical documents, contact information, source code and +pre-built utilities may be found there. + +The user website for Ogg Vorbis software and audio is http://vorbis.com/ + +## Building ## + +#### Building from master #### + +Development source is under git revision control at +https://git.xiph.org/vorbis.git. You will also need the +newest versions of autoconf, automake, libtool and pkg-config in +order to compile Vorbis from development source. A configure script +is provided for you in the source tarball distributions. + + ./autogen.sh + ./configure + make + +and as root if desired: + + make install + +This will install the Vorbis libraries (static and shared) into +/usr/local/lib, includes into /usr/local/include and API manpages +(once we write some) into /usr/local/man. + +Documentation building requires xsltproc and pdfxmltex. + +#### Building from tarball distributions #### + + ./configure + make + +and optionally (as root): + + make install + +#### Building RPM packages #### + +after normal configuring: + + make dist + rpm -ta libvorbis-.tar.gz + +## Building with CMake ## + +Ogg supports building using [CMake](http://www.cmake.org/). CMake is a meta build system that generates native projects for each platform. +To generate projects just run cmake replacing `YOUR-PROJECT-GENERATOR` with a proper generator from a list [here](http://www.cmake.org/cmake/help/v3.2/manual/cmake-generators.7.html): + + cmake -G YOUR-PROJECT-GENERATOR . + +Note that by default cmake generates projects that will build static libraries. +To generate projects that will build dynamic library use `BUILD_SHARED_LIBS` option like this: + + cmake -G YOUR-PROJECT-GENERATOR -DBUILD_SHARED_LIBS=1 . + +After projects are generated use them as usual + +#### Building on Windows #### + +Use proper generator for your Visual Studio version like: + + cmake -G "Visual Studio 12 2013" . + +#### Building on Mac OS X #### + +Use Xcode generator. To build framework run: + + cmake -G Xcode -DBUILD_FRAMEWORK=1 . + +#### Building on Linux #### + +Use Makefile generator which is default one. + + cmake . + make + +## License ## + +THIS FILE IS PART OF THE OggVorbis SOFTWARE 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 SOURCE CODE IS COPYRIGHT (C) 1994-2015 +by the Xiph.Org Foundation https://www.xiph.org/ diff --git a/cs/3rd party/libvorbis/appveyor.yml b/cs/3rd party/libvorbis/appveyor.yml new file mode 100644 index 000000000..158b9e628 --- /dev/null +++ b/cs/3rd party/libvorbis/appveyor.yml @@ -0,0 +1,32 @@ +image: Visual Studio 2015 +configuration: +- Debug + +platform: +- Win32 + +environment: + matrix: + - BUILD_SYSTEM: MSVC + - BUILD_SYSTEM: CMAKE + +install: +- git clone -q https://github.com/xiph/ogg.git %APPVEYOR_BUILD_FOLDER%\..\libogg +- if "%BUILD_SYSTEM%"=="MSVC" msbuild "%APPVEYOR_BUILD_FOLDER%\..\libogg\win32\VS2015\libogg_static.sln" /m /v:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" /property:Configuration=%CONFIGURATION%;Platform=%PLATFORM% +- if "%BUILD_SYSTEM%"=="CMAKE" mkdir "%APPVEYOR_BUILD_FOLDER%\..\libogg\build" +- if "%BUILD_SYSTEM%"=="CMAKE" pushd "%APPVEYOR_BUILD_FOLDER%\..\libogg\build" +- if "%BUILD_SYSTEM%"=="CMAKE" cmake -A "%PLATFORM%" -G "Visual Studio 14 2015" -DCMAKE_INSTALL_PREFIX="%APPVEYOR_BUILD_FOLDER%\..\libogg\install" .. +- if "%BUILD_SYSTEM%"=="CMAKE" cmake --build . --config "%CONFIGURATION%" --target install -- /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" +- if "%BUILD_SYSTEM%"=="CMAKE" popd + +before_build: +- if "%BUILD_SYSTEM%" == "CMAKE" mkdir "%APPVEYOR_BUILD_FOLDER%\build" +- if "%BUILD_SYSTEM%" == "CMAKE" pushd "%APPVEYOR_BUILD_FOLDER%\build" +- if "%BUILD_SYSTEM%" == "CMAKE" cmake -A "%PLATFORM%" -G "Visual Studio 14 2015" -DOGG_ROOT=%APPVEYOR_BUILD_FOLDER%\..\libogg\install .. +- if "%BUILD_SYSTEM%" == "CMAKE" popd + +build_script: +- if "%BUILD_SYSTEM%"=="MSVC" msbuild "%APPVEYOR_BUILD_FOLDER%\win32\VS2010\vorbis_dynamic.sln" /m /v:minimal /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" /property:Configuration=%CONFIGURATION%;Platform=%PLATFORM% +- if "%BUILD_SYSTEM%" == "CMAKE" pushd "%APPVEYOR_BUILD_FOLDER%\build" +- if "%BUILD_SYSTEM%" == "CMAKE" cmake --build . --config "%CONFIGURATION%" -- /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" +- if "%BUILD_SYSTEM%" == "CMAKE" popd diff --git a/cs/3rd party/libvorbis/autogen.sh b/cs/3rd party/libvorbis/autogen.sh new file mode 100644 index 000000000..d859d327b --- /dev/null +++ b/cs/3rd party/libvorbis/autogen.sh @@ -0,0 +1,12 @@ +#!/bin/sh +# Run this to set up the build system: configure, makefiles, etc. +set -e + +package="vorbis" + +srcdir=`dirname $0` +test -n "$srcdir" && cd "$srcdir" + +echo "Updating build configuration files for $package, please wait...." + +autoreconf -if diff --git a/cs/3rd party/libvorbis/configure.ac b/cs/3rd party/libvorbis/configure.ac new file mode 100644 index 000000000..86851b927 --- /dev/null +++ b/cs/3rd party/libvorbis/configure.ac @@ -0,0 +1,304 @@ +dnl Process this file with autoconf to produce a configure script + +dnl ------------------------------------------------ +dnl Initialization and Versioning +dnl ------------------------------------------------ + + +AC_INIT([libvorbis],[1.3.5],[vorbis-dev@xiph.org]) + +AC_CONFIG_MACRO_DIR([m4]) + +AC_CONFIG_SRCDIR([lib/mdct.c]) + +AC_CANONICAL_TARGET([]) + +AM_INIT_AUTOMAKE +AM_MAINTAINER_MODE + +dnl Add parameters for aclocal +AC_SUBST(ACLOCAL_AMFLAGS, "-I m4") + +dnl enable silent rules on automake 1.11 and later +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) + +dnl Library versioning +dnl - library source changed -> increment REVISION +dnl - interfaces added/removed/changed -> increment CURRENT, REVISION = 0 +dnl - interfaces added -> increment AGE +dnl - interfaces removed -> AGE = 0 + +V_LIB_CURRENT=4 +V_LIB_REVISION=8 +V_LIB_AGE=4 + +VF_LIB_CURRENT=6 +VF_LIB_REVISION=7 +VF_LIB_AGE=3 + +VE_LIB_CURRENT=2 +VE_LIB_REVISION=11 +VE_LIB_AGE=0 + +AC_SUBST(V_LIB_CURRENT) +AC_SUBST(V_LIB_REVISION) +AC_SUBST(V_LIB_AGE) +AC_SUBST(VF_LIB_CURRENT) +AC_SUBST(VF_LIB_REVISION) +AC_SUBST(VF_LIB_AGE) +AC_SUBST(VE_LIB_CURRENT) +AC_SUBST(VE_LIB_REVISION) +AC_SUBST(VE_LIB_AGE) + +dnl -------------------------------------------------- +dnl Check for programs +dnl -------------------------------------------------- + +dnl save $CFLAGS since AC_PROG_CC likes to insert "-g -O2" +dnl if $CFLAGS is blank +cflags_save="$CFLAGS" +AC_PROG_CC +AC_PROG_CPP +CFLAGS="$cflags_save" + +AC_C_INLINE + +AC_LIBTOOL_WIN32_DLL +AC_PROG_LIBTOOL +AM_PROG_CC_C_O + +dnl Check for doxygen +if test "x$enable_docs" = xyes; then + AC_CHECK_PROG(HAVE_DOXYGEN, doxygen, true, false) + if test $HAVE_DOXYGEN = "false"; then + AC_MSG_WARN([*** doxygen not found, API documentation will not be built]) + fi +else + HAVE_DOXYGEN=false +fi +AM_CONDITIONAL(HAVE_DOXYGEN,$HAVE_DOXYGEN) + +dnl latex tools for the specification document +AC_ARG_ENABLE(docs, + AC_HELP_STRING([--enable-docs], [build the documentation])) + +if test "x$enable_docs" = xyes; then + AC_CHECK_PROGS([PDFLATEX], pdflatex, [/bin/false]) + AC_CHECK_PROGS([HTLATEX], htlatex, [/bin/false]) + if test "x$PDFLATEX" = x/bin/false || test "x$HTLATEX" = x/bin/false; then + enable_docs=no + AC_MSG_WARN([Documentation will not be built!]) + fi +fi + +AM_CONDITIONAL(BUILD_DOCS, [test "x$enable_docs" = xyes]) + +AC_ARG_ENABLE(examples, + AS_HELP_STRING([--enable-examples], [build the examples])) + +AM_CONDITIONAL(BUILD_EXAMPLES, [test "x$enable_examples" = xyes]) + +dnl -------------------------------------------------- +dnl Set build flags based on environment +dnl -------------------------------------------------- + +dnl Set some target options + +cflags_save="$CFLAGS" +if test -z "$GCC"; then + case $host in + *-*-irix*) + dnl If we're on IRIX, we wanna use cc even if gcc + dnl is there (unless the user has overriden us)... + if test -z "$CC"; then + CC=cc + fi + DEBUG="-g -signed" + CFLAGS="-O2 -w -signed" + PROFILE="-p -g3 -O2 -signed" ;; + sparc-sun-solaris*) + DEBUG="-v -g" + CFLAGS="-xO4 -fast -w -fsimple -native -xcg92" + PROFILE="-v -xpg -g -xO4 -fast -native -fsimple -xcg92 -Dsuncc" ;; + *) + DEBUG="-g" + CFLAGS="-O" + PROFILE="-g -p" ;; + esac +else + + AC_MSG_CHECKING([GCC version]) + GCC_VERSION=`$CC -dumpversion` + AC_MSG_RESULT([$GCC_VERSION]) + case $host in + *86-*-linux*) + DEBUG="-g -Wall -Wextra -D_REENTRANT -D__NO_MATH_INLINES -fsigned-char" + CFLAGS="-O3 -Wall -Wextra -ffast-math -mno-ieee-fp -D_REENTRANT -fsigned-char" +# PROFILE="-Wall -Wextra -pg -g -O3 -ffast-math -D_REENTRANT -fsigned-char -fno-inline -static" + PROFILE="-Wall -Wextra -pg -g -O3 -ffast-math -mno-ieee-fp -D_REENTRANT -fsigned-char -fno-inline" + + # glibc < 2.1.3 has a serious FP bug in the math inline header + # that will cripple Vorbis. Look to see if the magic FP stack + # clobber is missing in the mathinline header, thus indicating + # the buggy version + + AC_EGREP_CPP(log10.*fldlg2.*fxch,[ + #define __LIBC_INTERNAL_MATH_INLINES 1 + #define __OPTIMIZE__ + #include + ],bad=maybe,bad=no) + if test ${bad} = "maybe" ;then + AC_EGREP_CPP(log10.*fldlg2.*fxch.*st\([[0123456789]]*\), + [ + #define __LIBC_INTERNAL_MATH_INLINES 1 + #define __OPTIMIZE__ + #include + ],bad=no,bad=yes) + fi + if test ${bad} = "yes" ;then + AC_MSG_WARN([ ]) + AC_MSG_WARN([********************************************************]) + AC_MSG_WARN([* The glibc headers on this machine have a serious bug *]) + AC_MSG_WARN([* in /usr/include/bits/mathinline.h This bug affects *]) + AC_MSG_WARN([* all floating point code, not just Ogg, built on this *]) + AC_MSG_WARN([* machine. Upgrading to glibc 2.1.3 is strongly urged *]) + AC_MSG_WARN([* to correct the problem. Note that upgrading glibc *]) + AC_MSG_WARN([* will not fix any previously built programs; this is *]) + AC_MSG_WARN([* a compile-time bug. *]) + AC_MSG_WARN([* To work around the problem for this build of Ogg, *]) + AC_MSG_WARN([* autoconf is disabling all math inlining. This will *]) + AC_MSG_WARN([* hurt Ogg performace but is necessary for an Ogg that *]) + AC_MSG_WARN([* will actually work. Once glibc is upgraded, rerun *]) + AC_MSG_WARN([* configure and make to build with inlining. *]) + AC_MSG_WARN([********************************************************]) + AC_MSG_WARN([ ]) + + CFLAGS=${OPT}" -D__NO_MATH_INLINES" + PROFILE=${PROFILE}" -D__NO_MATH_INLINES" + fi;; + powerpc-*-linux*spe) + DEBUG="-g -Wall -Wextra -D_REENTRANT -D__NO_MATH_INLINES" + CFLAGS="-O3 -Wall -Wextra -ffast-math -mfused-madd -D_REENTRANT" + PROFILE="-pg -g -O3 -ffast-math -mfused-madd -D_REENTRANT";; + powerpc-*-linux*) + DEBUG="-g -Wall -Wextra -D_REENTRANT -D__NO_MATH_INLINES" + CFLAGS="-O3 -Wall -Wextra -ffast-math -mfused-madd -mcpu=750 -D_REENTRANT" + PROFILE="-pg -g -O3 -ffast-math -mfused-madd -mcpu=750 -D_REENTRANT";; + *-*-linux*) + DEBUG="-g -Wall -Wextra -D_REENTRANT -D__NO_MATH_INLINES -fsigned-char" + CFLAGS="-O3 -Wall -Wextra -ffast-math -D_REENTRANT -fsigned-char" + PROFILE="-pg -g -O3 -ffast-math -D_REENTRANT -fsigned-char";; + sparc-sun-*) + sparc_cpu="" + AC_MSG_CHECKING([if gcc supports -mv8]) + old_cflags="$CFLAGS" + CFLAGS="$CFLAGS -mv8" + AC_TRY_COMPILE(, [return 0;], [ + AC_MSG_RESULT([yes]) + sparc_cpu="-mv8" + ]) + CFLAGS="$old_cflags" + DEBUG="-g -Wall -Wextra -D__NO_MATH_INLINES -fsigned-char $sparc_cpu" + CFLAGS="-O3 -Wall -Wextra -ffast-math -D__NO_MATH_INLINES -fsigned-char $sparc_cpu" + PROFILE="-pg -g -O3 -D__NO_MATH_INLINES -fsigned-char $sparc_cpu" ;; + *-*-darwin*) + DEBUG="-DDARWIN -fno-common -force_cpusubtype_ALL -Wall -g -O0 -fsigned-char" + CFLAGS="-DDARWIN -fno-common -force_cpusubtype_ALL -Wall -g -O3 -ffast-math -fsigned-char" + PROFILE="-DDARWIN -fno-common -force_cpusubtype_ALL -Wall -g -pg -O3 -ffast-math -fsigned-char";; + *-*-os2*) + # Use -W instead of -Wextra because gcc on OS/2 is an old version. + DEBUG="-g -Wall -W -D_REENTRANT -D__NO_MATH_INLINES -fsigned-char" + CFLAGS="-O3 -Wall -W -ffast-math -D_REENTRANT -fsigned-char" + PROFILE="-pg -g -O3 -ffast-math -D_REENTRANT -fsigned-char";; + *) + DEBUG="-g -Wall -Wextra -D__NO_MATH_INLINES -fsigned-char" + CFLAGS="-O3 -Wall -Wextra -D__NO_MATH_INLINES -fsigned-char" + PROFILE="-O3 -g -pg -D__NO_MATH_INLINES -fsigned-char" ;; + esac + + AC_ADD_CFLAGS([-Wdeclaration-after-statement]) +fi +CFLAGS="$CFLAGS $cflags_save" + +dnl -------------------------------------------------- +dnl Check for headers +dnl -------------------------------------------------- + +AC_CHECK_HEADER(memory.h,CFLAGS="$CFLAGS -DUSE_MEMORY_H",:) + +dnl -------------------------------------------------- +dnl Check for typedefs, structures, etc +dnl -------------------------------------------------- + +dnl none + +dnl -------------------------------------------------- +dnl Check for libraries +dnl -------------------------------------------------- + +AC_CHECK_LIB(m, cos, VORBIS_LIBS="-lm", VORBIS_LIBS="") +AC_CHECK_LIB(pthread, pthread_create, pthread_lib="-lpthread", :) + +PKG_PROG_PKG_CONFIG + +HAVE_OGG=no +if test "x$PKG_CONFIG" != "x" +then + PKG_CHECK_MODULES(OGG, ogg >= 1.0, HAVE_OGG=yes, HAVE_OGG=no) +fi +if test "x$HAVE_OGG" = "xno" +then + dnl fall back to the old school test + XIPH_PATH_OGG(, AC_MSG_ERROR(must have Ogg installed!)) + libs_save=$LIBS + LIBS="$OGG_LIBS $VORBIS_LIBS" + AC_CHECK_FUNC(oggpack_writealign, , AC_MSG_ERROR(Ogg >= 1.0 required !)) + LIBS=$libs_save +fi + +dnl -------------------------------------------------- +dnl Check for library functions +dnl -------------------------------------------------- + +AC_FUNC_ALLOCA +AC_FUNC_MEMCMP + +dnl -------------------------------------------------- +dnl Do substitutions +dnl -------------------------------------------------- + +AC_SUBST(VORBIS_LIBS) +AC_SUBST(DEBUG) +AC_SUBST(PROFILE) +AC_SUBST(pthread_lib) + +dnl The following line causes the libtool distributed with the source +dnl to be replaced if the build system has a more recent version. +AC_SUBST(LIBTOOL_DEPS) + +AC_CONFIG_FILES([ +Makefile +m4/Makefile +lib/Makefile +lib/modes/Makefile +lib/books/Makefile +lib/books/coupled/Makefile +lib/books/uncoupled/Makefile +lib/books/floor/Makefile +doc/Makefile doc/vorbisfile/Makefile doc/vorbisenc/Makefile doc/libvorbis/Makefile +doc/Doxyfile +include/Makefile include/vorbis/Makefile +examples/Makefile +test/Makefile +vq/Makefile +libvorbis.spec +vorbis.pc +vorbisenc.pc +vorbisfile.pc +vorbis-uninstalled.pc +vorbisenc-uninstalled.pc +vorbisfile-uninstalled.pc +]) +AC_CONFIG_HEADERS([config.h]) + +AC_OUTPUT diff --git a/cs/3rd party/libvorbis/debian/changelog b/cs/3rd party/libvorbis/debian/changelog new file mode 100644 index 000000000..fae34ba76 --- /dev/null +++ b/cs/3rd party/libvorbis/debian/changelog @@ -0,0 +1,208 @@ +libvorbis (1.2.0.dfsg-3.1) unstable; urgency=high + + * Non-maintainer upload by the security team + * Fix integer overflows (and possible DoS attacks) via crafted + OGG files (Closes: #482518) + Fixes: CVE-2008-1423, CVE-2008-1420, CVE-2008-1419 + + -- Steffen Joeris Mon, 26 May 2008 12:48:06 +0000 + +libvorbis (1.2.0.dfsg-3) unstable; urgency=low + + * Use dpkg-gensymbols, with symbol files obtained from Mole (stripping + debian revision and .dfsg suffix). + + * Install upstream CHANGES file as changelog.gz. (Closes: #302037) + + * Bump debian/compat to 5, and Standards-Version to 3.7.3 (no changes + needed). + + * Use quilt.make in debian/rules. + + -- Adeodato Simó Thu, 27 Dec 2007 14:33:45 +0100 + +libvorbis (1.2.0.dfsg-2) unstable; urgency=high + + * Bump shlibs for libvorbis0a due to new vorbis_synthesis_idheader header. + (Closes: #436083) + + -- Adeodato Simó Tue, 14 Aug 2007 20:55:54 +0200 + +libvorbis (1.2.0.dfsg-1) unstable; urgency=low + + [ Adeodato Simó ] + * Use ${binary:Version} instead of ${Source-Version}. + + [ Clint Adams ] + * New upstream release. + - Remove upstream_r13198-fix_segfault_in_ov_time_seek.diff . + * Bump shlibs for libvorbisfile3 to >= 1.2.0 due to new ov_fopen + function. + + -- Clint Adams Fri, 27 Jul 2007 02:57:44 -0400 + +libvorbis (1.1.2.dfsg-2) unstable; urgency=low + + * Bump to Standards-Version 3.7.2. + * Add upstream_r13198-fix_segfault_in_ov_time_seek.diff. closes: #281995. + + -- Clint Adams Fri, 29 Jun 2007 09:46:12 -0400 + +libvorbis (1.1.2.dfsg-1.2) unstable; urgency=high + + * Fix shlibs files for libvorbisenc and libvorbisfile, which were broken + by my first NMU to have dependencies for libvorbis0a. Closes: #395048 + + -- Joey Hess Tue, 24 Oct 2006 19:55:19 -0400 + +libvorbis (1.1.2.dfsg-1.1) unstable; urgency=low + + * NMU + * Remove draft RFC files, as they are not under a free license. + Closes: #390660 + * Repackage the source package without these files. + * Add README.Source documenting how the upstream source is repackaged. + * Modify dh_makeshlibs call to avoid generating a shlibs file that has + an unncessarily tight versioned dependency on this new pseudo-version + of libvorbis. + + -- Joey Hess Sun, 15 Oct 2006 17:21:37 -0400 + +libvorbis (1.1.2-1) unstable; urgency=low + + * Switch maintenance to the Debian Xiph.org Maintainers (alioth/pkg-xiph). + + * New upstream release packaged. (Closes: #327586) + + * Move HTML documentation from /usr/share/doc/libvorbis-dev itself to an + html/ subdirectory of it. + + * Update debian/control: + + drop unnecessary build-dependency on devscripts. + + drop version restriction on debhelper and libogg-dev build-dependencies, + since they're already satisfied with stable. + + * Overhaul debian/rules, and switch to quilt for patch management. + + * Add debian/compat file, instead of exporting DH_COMPAT. + + * Update download URL in debian/copyright. + + * Add debian/watch file. + + * Bumped Standards-Version to 3.6.2 (no changes required). + + -- Adeodato Simó Thu, 26 Jan 2006 01:35:39 +0100 + +libvorbis (1.1.0-1) unstable; urgency=low + + * New upstream. + + -- Christopher L Cheney Thu, 17 Mar 2005 21:30:00 -0600 + +libvorbis (1.0.1-1) unstable; urgency=low + + * New upstream. + * Improved descriptions. (Closes: #166649) + * Updated DEB_BUILD_OPTIONS support. (Closes: #188464) + + -- Christopher L Cheney Tue, 9 Dec 2003 01:00:00 -0600 + +libvorbis (1.0.0-3) unstable; urgency=low + + * Add libvorbis0 conflict to libvorbis0a. + + -- Christopher L Cheney Wed, 12 Mar 2003 17:00:00 -0600 + +libvorbis (1.0.0-2) unstable; urgency=low + + * Rename libvorbis0 -> libvorbis0a to keep packages from upgrading to it + by mistake. (Closes: #156227, #156365, #161961, #171548, #172466, + #172469, #178756) + * GNU config automated update: config.sub (20020621 to 20030103), + config.guess (20020529 to 20030110) + + -- Christopher L Cheney Sat, 8 Mar 2003 13:00:00 -0600 + +libvorbis (1.0.0-1) unstable; urgency=low + + * New upstream. + * Split libvorbis package into libvorbis libvorbisenc libvorbisfile due to + shared object major versions going out of sync. + + -- Christopher L Cheney Fri, 19 Jul 2002 09:00:00 -0500 + +libvorbis (1.0rc3-1) unstable; urgency=low + + * New upstream. (Closes: #121995, #123472) + * added autotools target (config.* updater) to rules + + -- Christopher L Cheney Mon, 24 Dec 2001 11:00:00 -0600 + +libvorbis (1.0rc2-1) unstable; urgency=low + + * New upstream. + + -- Christopher L Cheney Sun, 12 Aug 2001 22:00:00 -0500 + +libvorbis (1.0rc1-1) unstable; urgency=low + + * New upstream. (Closes: #84977, #95330) + * Upstream says lame at fault. See bug details. (Closes: #98010) + * Fixed versioned depends. + * Changed clean method to distclean. + + -- Christopher L Cheney Sun, 17 Jun 2001 20:00:00 -0500 + +libvorbis (1.0beta4-1) unstable; urgency=low + + * New upstream. + * Appears to be fixed, can't reproduce bug (closes: #78848) + + -- Christopher L Cheney Mon, 26 Feb 2001 08:00:00 -0600 + +libvorbis (1.0beta3-3) unstable; urgency=low + + * Fixed Build-Depends libogg-dev version dependency. + * Fixed Sections. + * Updated to Standards-Version to 3.5.1.0 + + -- Christopher L Cheney Sat, 17 Feb 2001 18:14:53 -0600 + +libvorbis (1.0beta3-2) unstable; urgency=low + + * Added dependency for libogg-dev (closes: #78262) + * Added dependency for libogg-dev (closes: #81432) + * Corrected development library package name (closes: #82464) + + -- Christopher L Cheney Sat, 3 Feb 2001 13:29:30 -0600 + +libvorbis (1.0beta3-1) unstable; urgency=low + + * New Maintainer. + * Upstream source was reorganized. + * Package split according to the upstream reorganization. + + -- Christopher L Cheney Tue, 31 Oct 2000 15:08:22 -0600 + +vorbis (1.0beta2-1) unstable; urgency=low + + * New upstream version. Closes: #67326, #68416 + * Changed xmms-vorbis to Architechture: any. Closes: #67395 + * Added Build-deps. Closes: #66628 + * Moved vorbize to vorbis-tools along with oggenc and vorbiscomment + + -- Michael Beattie Wed, 9 Aug 2000 00:30:15 +1200 + +vorbis (1.0beta1-1) unstable; urgency=low + + * First Beta, Ready for debian release. + + -- Michael Beattie Fri, 30 Jun 2000 19:26:59 +1200 + +vorbis (0.0-1) unstable; urgency=low + + * Initial Release. + * Initial package, not placed in archive. + + -- Michael Beattie Mon, 26 Jun 2000 18:59:56 +1200 diff --git a/cs/3rd party/libvorbis/debian/control b/cs/3rd party/libvorbis/debian/control new file mode 100644 index 000000000..b3f26469e --- /dev/null +++ b/cs/3rd party/libvorbis/debian/control @@ -0,0 +1,60 @@ +Source: libvorbis +Section: libs +Priority: optional +Maintainer: Christopher L Cheney +Build-Depends: autotools-dev, debhelper (>> 4.0.18), devscripts, libogg-dev (>> 1.1.0) +Standards-Version: 3.6.1.0 + +Package: libvorbis0a +Architecture: any +Section: libs +Depends: ${shlibs:Depends} +Conflicts: libvorbis0 +Replaces: libvorbis0 +Description: The Vorbis General Audio Compression Codec + Ogg Vorbis is a fully open, non-proprietary, patent-and-royalty-free, + general-purpose compressed audio format for audio and music at fixed + and variable bitrates from 16 to 128 kbps/channel. + . + The Vorbis library is the primary Ogg Vorbis library. + +Package: libvorbisenc2 +Architecture: any +Section: libs +Depends: ${shlibs:Depends} +Conflicts: libvorbis0 (<< 1.0.0) +Replaces: libvorbis0 (<< 1.0.0) +Description: The Vorbis General Audio Compression Codec + Ogg Vorbis is a fully open, non-proprietary, patent-and-royalty-free, + general-purpose compressed audio format for audio and music at fixed + and variable bitrates from 16 to 128 kbps/channel. + . + The Vorbisenc library provides a convenient API for setting up an encoding + environment using libvorbis. + +Package: libvorbisfile3 +Architecture: any +Section: libs +Depends: ${shlibs:Depends} +Conflicts: libvorbis0 (<< 1.0.0) +Replaces: libvorbis0 (<< 1.0.0) +Description: The Vorbis General Audio Compression Codec + Ogg Vorbis is a fully open, non-proprietary, patent-and-royalty-free, + general-purpose compressed audio format for audio and music at fixed + and variable bitrates from 16 to 128 kbps/channel. + . + The Vorbisfile library provides a convenient high-level API for decoding + and basic manipulation of all Vorbis I audio streams. + +Package: libvorbis-dev +Architecture: any +Section: libdevel +Depends: libogg-dev, libvorbis0a (= ${Source-Version}), libvorbisenc2 (= ${Source-Version}), libvorbisfile3 (= ${Source-Version}) +Description: The Vorbis General Audio Compression Codec (development files) + Ogg Vorbis is a fully open, non-proprietary, patent-and-royalty-free, + general-purpose compressed audio format for audio and music at fixed + and variable bitrates from 16 to 128 kbps/channel. + . + This package contains the header files and documentation needed to develop + applications with libvorbis. + diff --git a/cs/3rd party/libvorbis/debian/copyright b/cs/3rd party/libvorbis/debian/copyright new file mode 100644 index 000000000..2080282ea --- /dev/null +++ b/cs/3rd party/libvorbis/debian/copyright @@ -0,0 +1,38 @@ +This package was debianized by Christopher L Cheney on +Tue, 31 Oct 2000 15:08:22 -0600. + +It was downloaded from http://www.vorbis.com/download_unix.psp + +Upstream Author: Monty + +Copyright: + +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 REGENTS 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/cs/3rd party/libvorbis/debian/libvorbis-dev.docs b/cs/3rd party/libvorbis/debian/libvorbis-dev.docs new file mode 100644 index 000000000..d1df5710a --- /dev/null +++ b/cs/3rd party/libvorbis/debian/libvorbis-dev.docs @@ -0,0 +1 @@ +debian/tmp/usr/share/doc/libvorbis-*/* diff --git a/cs/3rd party/libvorbis/debian/libvorbis-dev.examples b/cs/3rd party/libvorbis/debian/libvorbis-dev.examples new file mode 100644 index 000000000..1ae77b56a --- /dev/null +++ b/cs/3rd party/libvorbis/debian/libvorbis-dev.examples @@ -0,0 +1,2 @@ +examples/*.c +examples/*.pl diff --git a/cs/3rd party/libvorbis/debian/libvorbis-dev.install b/cs/3rd party/libvorbis/debian/libvorbis-dev.install new file mode 100644 index 000000000..db22e5020 --- /dev/null +++ b/cs/3rd party/libvorbis/debian/libvorbis-dev.install @@ -0,0 +1,16 @@ +debian/tmp/usr/include/vorbis/codec.h +debian/tmp/usr/include/vorbis/vorbisenc.h +debian/tmp/usr/include/vorbis/vorbisfile.h +debian/tmp/usr/lib/libvorbis.a +debian/tmp/usr/lib/libvorbis.la +debian/tmp/usr/lib/libvorbis.so +debian/tmp/usr/lib/libvorbisenc.a +debian/tmp/usr/lib/libvorbisenc.la +debian/tmp/usr/lib/libvorbisenc.so +debian/tmp/usr/lib/libvorbisfile.a +debian/tmp/usr/lib/libvorbisfile.la +debian/tmp/usr/lib/libvorbisfile.so +debian/tmp/usr/lib/pkgconfig/vorbis.pc +debian/tmp/usr/lib/pkgconfig/vorbisenc.pc +debian/tmp/usr/lib/pkgconfig/vorbisfile.pc +debian/tmp/usr/share/aclocal/vorbis.m4 diff --git a/cs/3rd party/libvorbis/debian/libvorbis0a.install b/cs/3rd party/libvorbis/debian/libvorbis0a.install new file mode 100644 index 000000000..ad38b8b6d --- /dev/null +++ b/cs/3rd party/libvorbis/debian/libvorbis0a.install @@ -0,0 +1 @@ +debian/tmp/usr/lib/libvorbis.so.* diff --git a/cs/3rd party/libvorbis/debian/libvorbisenc2.install b/cs/3rd party/libvorbis/debian/libvorbisenc2.install new file mode 100644 index 000000000..eb70258f3 --- /dev/null +++ b/cs/3rd party/libvorbis/debian/libvorbisenc2.install @@ -0,0 +1 @@ +debian/tmp/usr/lib/libvorbisenc.so.* diff --git a/cs/3rd party/libvorbis/debian/libvorbisfile3.install b/cs/3rd party/libvorbis/debian/libvorbisfile3.install new file mode 100644 index 000000000..83bf445e6 --- /dev/null +++ b/cs/3rd party/libvorbis/debian/libvorbisfile3.install @@ -0,0 +1 @@ +debian/tmp/usr/lib/libvorbisfile.so.* diff --git a/cs/3rd party/libvorbis/debian/rules b/cs/3rd party/libvorbis/debian/rules new file mode 100644 index 000000000..419ca7a32 --- /dev/null +++ b/cs/3rd party/libvorbis/debian/rules @@ -0,0 +1,154 @@ +#!/usr/bin/make -f +# Sample debian/rules that uses debhelper. +# GNU copyright 1997 to 1999 by Joey Hess. +# +# Modified to make a template file for a multi-binary package with separated +# build-arch and build-indep targets by Bill Allombert 2001 + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +# This is the debhelper compatibility version to use. +export DH_COMPAT=4 + +# This has to be exported to make some magic below work. +export DH_OPTIONS + +# These are used for cross-compiling and for saving the configure script +# from having to guess our platform (since we know it already) +DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) +DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) + +objdir = $(CURDIR)/obj-$(DEB_BUILD_GNU_TYPE) + +CFLAGS = -Wall -g + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif +ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) + INSTALL_PROGRAM += -s +endif + +configure: configure-stamp +configure-stamp: + dh_testdir + + # make build directory + mkdir $(objdir) + + # run configure with build tree $(objdir) + # change ../configure to ../autogen.sh for CVS build + cd $(objdir) && \ + ../configure --build=$(DEB_BUILD_GNU_TYPE) --host=$(DEB_HOST_GNU_TYPE) \ + --prefix=/usr --enable-static + + touch configure-stamp + +#Architecture +build: build-arch build-indep + +build-arch: build-arch-stamp +build-arch-stamp: configure-stamp + + cd $(objdir) && \ + $(MAKE) + + touch build-arch-stamp + +build-indep: build-indep-stamp +build-indep-stamp: configure-stamp + + # Add here commands to compile the indep part of the package. + #$(MAKE) doc + touch build-indep-stamp + +debian-clean: + dh_testdir + dh_testroot + + dh_clean + +clean: + dh_testdir + dh_testroot + rm -f build-arch-stamp build-indep-stamp configure-stamp + + # Remove build tree + rm -rf $(objdir) + + # if Makefile exists run distclean + if test -f Makefile; then \ + $(MAKE) distclean; \ + fi + + #if test -d CVS; then \ + $(MAKE) cvs-clean ;\ + fi + + dh_clean + +install: install-indep install-arch +install-indep: + dh_testdir + dh_testroot +# dh_clean -k -i +# dh_installdirs -i + +# dh_install -i --list-missing + +install-arch: + dh_testdir + dh_testroot + dh_clean -k -s + dh_installdirs -s + + cd $(objdir) && \ + $(MAKE) install DESTDIR=$(CURDIR)/debian/tmp + + dh_install -s --list-missing + +# Must not depend on anything. This is to be called by +# binary-arch/binary-indep +# in another 'make' thread. +binary-common: + dh_testdir + dh_testroot + dh_installchangelogs CHANGES + dh_installdocs + dh_installexamples +# dh_installmenu +# dh_installdebconf +# dh_installlogrotate +# dh_installemacsen +# dh_installpam +# dh_installmime +# dh_installinit +# dh_installcron +# dh_installinfo + dh_installman + dh_link + dh_strip + dh_compress + dh_fixperms +# dh_perl +# dh_python + dh_makeshlibs -V + dh_installdeb + dh_shlibdeps -ldebian/libvorbis0a/usr/lib + dh_gencontrol + dh_md5sums + dh_builddeb + +# Build architecture independant packages using the common target. +binary-indep: build-indep install-indep +# $(MAKE) -f debian/rules DH_OPTIONS=-i binary-common + +# Build architecture dependant packages using the common target. +binary-arch: build-arch install-arch + $(MAKE) -f debian/rules DH_OPTIONS=-a binary-common + +binary: binary-arch binary-indep +.PHONY: build clean binary-indep binary-arch binary install install-indep install-arch configure diff --git a/cs/3rd party/libvorbis/debian/watch b/cs/3rd party/libvorbis/debian/watch new file mode 100644 index 000000000..1bcd74cf9 --- /dev/null +++ b/cs/3rd party/libvorbis/debian/watch @@ -0,0 +1,3 @@ +version=2 + +http://downloads.xiph.org/releases/vorbis/libvorbis-(.*)\.tar\.gz debian uupdate diff --git a/cs/3rd party/libvorbis/doc/01-introduction.tex b/cs/3rd party/libvorbis/doc/01-introduction.tex new file mode 100644 index 000000000..b522730f8 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/01-introduction.tex @@ -0,0 +1,529 @@ +% -*- mode: latex; TeX-master: "Vorbis_I_spec"; -*- +%!TEX root = Vorbis_I_spec.tex +% $Id$ +\section{Introduction and Description} \label{vorbis:spec:intro} + +\subsection{Overview} + +This document provides a high level description of the Vorbis codec's +construction. A bit-by-bit specification appears beginning in +\xref{vorbis:spec:codec}. +The later sections assume a high-level +understanding of the Vorbis decode process, which is +provided here. + +\subsubsection{Application} +Vorbis is a general purpose perceptual audio CODEC intended to allow +maximum encoder flexibility, thus allowing it to scale competitively +over an exceptionally wide range of bitrates. At the high +quality/bitrate end of the scale (CD or DAT rate stereo, 16/24 bits) +it is in the same league as MPEG-2 and MPC. Similarly, the 1.0 +encoder can encode high-quality CD and DAT rate stereo at below 48kbps +without resampling to a lower rate. Vorbis is also intended for +lower and higher sample rates (from 8kHz telephony to 192kHz digital +masters) and a range of channel representations (monaural, +polyphonic, stereo, quadraphonic, 5.1, ambisonic, or up to 255 +discrete channels). + + +\subsubsection{Classification} +Vorbis I is a forward-adaptive monolithic transform CODEC based on the +Modified Discrete Cosine Transform. The codec is structured to allow +addition of a hybrid wavelet filterbank in Vorbis II to offer better +transient response and reproduction using a transform better suited to +localized time events. + + +\subsubsection{Assumptions} + +The Vorbis CODEC design assumes a complex, psychoacoustically-aware +encoder and simple, low-complexity decoder. Vorbis decode is +computationally simpler than mp3, although it does require more +working memory as Vorbis has no static probability model; the vector +codebooks used in the first stage of decoding from the bitstream are +packed in their entirety into the Vorbis bitstream headers. In +packed form, these codebooks occupy only a few kilobytes; the extent +to which they are pre-decoded into a cache is the dominant factor in +decoder memory usage. + + +Vorbis provides none of its own framing, synchronization or protection +against errors; it is solely a method of accepting input audio, +dividing it into individual frames and compressing these frames into +raw, unformatted 'packets'. The decoder then accepts these raw +packets in sequence, decodes them, synthesizes audio frames from +them, and reassembles the frames into a facsimile of the original +audio stream. Vorbis is a free-form variable bit rate (VBR) codec and packets have no +minimum size, maximum size, or fixed/expected size. Packets +are designed that they may be truncated (or padded) and remain +decodable; this is not to be considered an error condition and is used +extensively in bitrate management in peeling. Both the transport +mechanism and decoder must allow that a packet may be any size, or +end before or after packet decode expects. + +Vorbis packets are thus intended to be used with a transport mechanism +that provides free-form framing, sync, positioning and error correction +in accordance with these design assumptions, such as Ogg (for file +transport) or RTP (for network multicast). For purposes of a few +examples in this document, we will assume that Vorbis is to be +embedded in an Ogg stream specifically, although this is by no means a +requirement or fundamental assumption in the Vorbis design. + +The specification for embedding Vorbis into +an Ogg transport stream is in \xref{vorbis:over:ogg}. + + + +\subsubsection{Codec Setup and Probability Model} + +Vorbis' heritage is as a research CODEC and its current design +reflects a desire to allow multiple decades of continuous encoder +improvement before running out of room within the codec specification. +For these reasons, configurable aspects of codec setup intentionally +lean toward the extreme of forward adaptive. + +The single most controversial design decision in Vorbis (and the most +unusual for a Vorbis developer to keep in mind) is that the entire +probability model of the codec, the Huffman and VQ codebooks, is +packed into the bitstream header along with extensive CODEC setup +parameters (often several hundred fields). This makes it impossible, +as it would be with MPEG audio layers, to embed a simple frame type +flag in each audio packet, or begin decode at any frame in the stream +without having previously fetched the codec setup header. + + +\begin{note} +Vorbis \emph{can} initiate decode at any arbitrary packet within a +bitstream so long as the codec has been initialized/setup with the +setup headers. +\end{note} + +Thus, Vorbis headers are both required for decode to begin and +relatively large as bitstream headers go. The header size is +unbounded, although for streaming a rule-of-thumb of 4kB or less is +recommended (and Xiph.Org's Vorbis encoder follows this suggestion). + +Our own design work indicates the primary liability of the +required header is in mindshare; it is an unusual design and thus +causes some amount of complaint among engineers as this runs against +current design trends (and also points out limitations in some +existing software/interface designs, such as Windows' ACM codec +framework). However, we find that it does not fundamentally limit +Vorbis' suitable application space. + + +\subsubsection{Format Specification} +The Vorbis format is well-defined by its decode specification; any +encoder that produces packets that are correctly decoded by the +reference Vorbis decoder described below may be considered a proper +Vorbis encoder. A decoder must faithfully and completely implement +the specification defined below (except where noted) to be considered +a proper Vorbis decoder. + +\subsubsection{Hardware Profile} +Although Vorbis decode is computationally simple, it may still run +into specific limitations of an embedded design. For this reason, +embedded designs are allowed to deviate in limited ways from the +`full' decode specification yet still be certified compliant. These +optional omissions are labelled in the spec where relevant. + + +\subsection{Decoder Configuration} + +Decoder setup consists of configuration of multiple, self-contained +component abstractions that perform specific functions in the decode +pipeline. Each different component instance of a specific type is +semantically interchangeable; decoder configuration consists both of +internal component configuration, as well as arrangement of specific +instances into a decode pipeline. Componentry arrangement is roughly +as follows: + +\begin{center} +\includegraphics[width=\textwidth]{components} +\captionof{figure}{decoder pipeline configuration} +\end{center} + +\subsubsection{Global Config} +Global codec configuration consists of a few audio related fields +(sample rate, channels), Vorbis version (always '0' in Vorbis I), +bitrate hints, and the lists of component instances. All other +configuration is in the context of specific components. + +\subsubsection{Mode} + +Each Vorbis frame is coded according to a master 'mode'. A bitstream +may use one or many modes. + +The mode mechanism is used to encode a frame according to one of +multiple possible methods with the intention of choosing a method best +suited to that frame. Different modes are, e.g. how frame size +is changed from frame to frame. The mode number of a frame serves as a +top level configuration switch for all other specific aspects of frame +decode. + +A 'mode' configuration consists of a frame size setting, window type +(always 0, the Vorbis window, in Vorbis I), transform type (always +type 0, the MDCT, in Vorbis I) and a mapping number. The mapping +number specifies which mapping configuration instance to use for +low-level packet decode and synthesis. + + +\subsubsection{Mapping} + +A mapping contains a channel coupling description and a list of +'submaps' that bundle sets of channel vectors together for grouped +encoding and decoding. These submaps are not references to external +components; the submap list is internal and specific to a mapping. + +A 'submap' is a configuration/grouping that applies to a subset of +floor and residue vectors within a mapping. The submap functions as a +last layer of indirection such that specific special floor or residue +settings can be applied not only to all the vectors in a given mode, +but also specific vectors in a specific mode. Each submap specifies +the proper floor and residue instance number to use for decoding that +submap's spectral floor and spectral residue vectors. + +As an example: + +Assume a Vorbis stream that contains six channels in the standard 5.1 +format. The sixth channel, as is normal in 5.1, is bass only. +Therefore it would be wasteful to encode a full-spectrum version of it +as with the other channels. The submapping mechanism can be used to +apply a full range floor and residue encoding to channels 0 through 4, +and a bass-only representation to the bass channel, thus saving space. +In this example, channels 0-4 belong to submap 0 (which indicates use +of a full-range floor) and channel 5 belongs to submap 1, which uses a +bass-only representation. + + +\subsubsection{Floor} + +Vorbis encodes a spectral 'floor' vector for each PCM channel. This +vector is a low-resolution representation of the audio spectrum for +the given channel in the current frame, generally used akin to a +whitening filter. It is named a 'floor' because the Xiph.Org +reference encoder has historically used it as a unit-baseline for +spectral resolution. + +A floor encoding may be of two types. Floor 0 uses a packed LSP +representation on a dB amplitude scale and Bark frequency scale. +Floor 1 represents the curve as a piecewise linear interpolated +representation on a dB amplitude scale and linear frequency scale. +The two floors are semantically interchangeable in +encoding/decoding. However, floor type 1 provides more stable +inter-frame behavior, and so is the preferred choice in all +coupled-stereo and high bitrate modes. Floor 1 is also considerably +less expensive to decode than floor 0. + +Floor 0 is not to be considered deprecated, but it is of limited +modern use. No known Vorbis encoder past Xiph.Org's own beta 4 makes +use of floor 0. + +The values coded/decoded by a floor are both compactly formatted and +make use of entropy coding to save space. For this reason, a floor +configuration generally refers to multiple codebooks in the codebook +component list. Entropy coding is thus provided as an abstraction, +and each floor instance may choose from any and all available +codebooks when coding/decoding. + + +\subsubsection{Residue} +The spectral residue is the fine structure of the audio spectrum +once the floor curve has been subtracted out. In simplest terms, it +is coded in the bitstream using cascaded (multi-pass) vector +quantization according to one of three specific packing/coding +algorithms numbered 0 through 2. The packing algorithm details are +configured by residue instance. As with the floor components, the +final VQ/entropy encoding is provided by external codebook instances +and each residue instance may choose from any and all available +codebooks. + +\subsubsection{Codebooks} + +Codebooks are a self-contained abstraction that perform entropy +decoding and, optionally, use the entropy-decoded integer value as an +offset into an index of output value vectors, returning the indicated +vector of values. + +The entropy coding in a Vorbis I codebook is provided by a standard +Huffman binary tree representation. This tree is tightly packed using +one of several methods, depending on whether codeword lengths are +ordered or unordered, or the tree is sparse. + +The codebook vector index is similarly packed according to index +characteristic. Most commonly, the vector index is encoded as a +single list of values of possible values that are then permuted into +a list of n-dimensional rows (lattice VQ). + + + +\subsection{High-level Decode Process} + +\subsubsection{Decode Setup} + +Before decoding can begin, a decoder must initialize using the +bitstream headers matching the stream to be decoded. Vorbis uses +three header packets; all are required, in-order, by this +specification. Once set up, decode may begin at any audio packet +belonging to the Vorbis stream. In Vorbis I, all packets after the +three initial headers are audio packets. + +The header packets are, in order, the identification +header, the comments header, and the setup header. + +\paragraph{Identification Header} +The identification header identifies the bitstream as Vorbis, Vorbis +version, and the simple audio characteristics of the stream such as +sample rate and number of channels. + +\paragraph{Comment Header} +The comment header includes user text comments (``tags'') and a vendor +string for the application/library that produced the bitstream. The +encoding and proper use of the comment header is described in \xref{vorbis:spec:comment}. + +\paragraph{Setup Header} +The setup header includes extensive CODEC setup information as well as +the complete VQ and Huffman codebooks needed for decode. + + +\subsubsection{Decode Procedure} + +The decoding and synthesis procedure for all audio packets is +fundamentally the same. +\begin{enumerate} +\item decode packet type flag +\item decode mode number +\item decode window shape (long windows only) +\item decode floor +\item decode residue into residue vectors +\item inverse channel coupling of residue vectors +\item generate floor curve from decoded floor data +\item compute dot product of floor and residue, producing audio spectrum vector +\item inverse monolithic transform of audio spectrum vector, always an MDCT in Vorbis I +\item overlap/add left-hand output of transform with right-hand output of previous frame +\item store right hand-data from transform of current frame for future lapping +\item if not first frame, return results of overlap/add as audio result of current frame +\end{enumerate} + +Note that clever rearrangement of the synthesis arithmetic is +possible; as an example, one can take advantage of symmetries in the +MDCT to store the right-hand transform data of a partial MDCT for a +50\% inter-frame buffer space savings, and then complete the transform +later before overlap/add with the next frame. This optimization +produces entirely equivalent output and is naturally perfectly legal. +The decoder must be \emph{entirely mathematically equivalent} to the +specification, it need not be a literal semantic implementation. + +\paragraph{Packet type decode} + +Vorbis I uses four packet types. The first three packet types mark each +of the three Vorbis headers described above. The fourth packet type +marks an audio packet. All other packet types are reserved; packets +marked with a reserved type should be ignored. + +Following the three header packets, all packets in a Vorbis I stream +are audio. The first step of audio packet decode is to read and +verify the packet type; \emph{a non-audio packet when audio is expected +indicates stream corruption or a non-compliant stream. The decoder +must ignore the packet and not attempt decoding it to +audio}. + + + + +\paragraph{Mode decode} +Vorbis allows an encoder to set up multiple, numbered packet 'modes', +as described earlier, all of which may be used in a given Vorbis +stream. The mode is encoded as an integer used as a direct offset into +the mode instance index. + + +\paragraph{Window shape decode (long windows only)} \label{vorbis:spec:window} + +Vorbis frames may be one of two PCM sample sizes specified during +codec setup. In Vorbis I, legal frame sizes are powers of two from 64 +to 8192 samples. Aside from coupling, Vorbis handles channels as +independent vectors and these frame sizes are in samples per channel. + +Vorbis uses an overlapping transform, namely the MDCT, to blend one +frame into the next, avoiding most inter-frame block boundary +artifacts. The MDCT output of one frame is windowed according to MDCT +requirements, overlapped 50\% with the output of the previous frame and +added. The window shape assures seamless reconstruction. + +This is easy to visualize in the case of equal sized-windows: + +\begin{center} +\includegraphics[width=\textwidth]{window1} +\captionof{figure}{overlap of two equal-sized windows} +\end{center} + +And slightly more complex in the case of overlapping unequal sized +windows: + +\begin{center} +\includegraphics[width=\textwidth]{window2} +\captionof{figure}{overlap of a long and a short window} +\end{center} + +In the unequal-sized window case, the window shape of the long window +must be modified for seamless lapping as above. It is possible to +correctly infer window shape to be applied to the current window from +knowing the sizes of the current, previous and next window. It is +legal for a decoder to use this method. However, in the case of a long +window (short windows require no modification), Vorbis also codes two +flag bits to specify pre- and post- window shape. Although not +strictly necessary for function, this minor redundancy allows a packet +to be fully decoded to the point of lapping entirely independently of +any other packet, allowing easier abstraction of decode layers as well +as allowing a greater level of easy parallelism in encode and +decode. + +A description of valid window functions for use with an inverse MDCT +can be found in \cite{Sporer/Brandenburg/Edler}. Vorbis windows +all use the slope function +\[ y = \sin(.5*\pi \, \sin^2((x+.5)/n*\pi)) . \] + + + +\paragraph{floor decode} +Each floor is encoded/decoded in channel order, however each floor +belongs to a 'submap' that specifies which floor configuration to +use. All floors are decoded before residue decode begins. + + +\paragraph{residue decode} + +Although the number of residue vectors equals the number of channels, +channel coupling may mean that the raw residue vectors extracted +during decode do not map directly to specific channels. When channel +coupling is in use, some vectors will correspond to coupled magnitude +or angle. The coupling relationships are described in the codec setup +and may differ from frame to frame, due to different mode numbers. + +Vorbis codes residue vectors in groups by submap; the coding is done +in submap order from submap 0 through n-1. This differs from floors +which are coded using a configuration provided by submap number, but +are coded individually in channel order. + + + +\paragraph{inverse channel coupling} + +A detailed discussion of stereo in the Vorbis codec can be found in +the document \href{stereo.html}{Stereo Channel Coupling in the +Vorbis CODEC}. Vorbis is not limited to only stereo coupling, but +the stereo document also gives a good overview of the generic coupling +mechanism. + +Vorbis coupling applies to pairs of residue vectors at a time; +decoupling is done in-place a pair at a time in the order and using +the vectors specified in the current mapping configuration. The +decoupling operation is the same for all pairs, converting square +polar representation (where one vector is magnitude and the second +angle) back to Cartesian representation. + +After decoupling, in order, each pair of vectors on the coupling list, +the resulting residue vectors represent the fine spectral detail +of each output channel. + + + +\paragraph{generate floor curve} + +The decoder may choose to generate the floor curve at any appropriate +time. It is reasonable to generate the output curve when the floor +data is decoded from the raw packet, or it can be generated after +inverse coupling and applied to the spectral residue directly, +combining generation and the dot product into one step and eliminating +some working space. + +Both floor 0 and floor 1 generate a linear-range, linear-domain output +vector to be multiplied (dot product) by the linear-range, +linear-domain spectral residue. + + + +\paragraph{compute floor/residue dot product} + +This step is straightforward; for each output channel, the decoder +multiplies the floor curve and residue vectors element by element, +producing the finished audio spectrum of each channel. + +% TODO/FIXME: The following two paragraphs have identical twins +% in section 4 (under "dot product") +One point is worth mentioning about this dot product; a common mistake +in a fixed point implementation might be to assume that a 32 bit +fixed-point representation for floor and residue and direct +multiplication of the vectors is sufficient for acceptable spectral +depth in all cases because it happens to mostly work with the current +Xiph.Org reference encoder. + +However, floor vector values can span \~{}140dB (\~{}24 bits unsigned), and +the audio spectrum vector should represent a minimum of 120dB (\~{}21 +bits with sign), even when output is to a 16 bit PCM device. For the +residue vector to represent full scale if the floor is nailed to +$-140$dB, it must be able to span 0 to $+140$dB. For the residue vector +to reach full scale if the floor is nailed at 0dB, it must be able to +represent $-140$dB to $+0$dB. Thus, in order to handle full range +dynamics, a residue vector may span $-140$dB to $+140$dB entirely within +spec. A 280dB range is approximately 48 bits with sign; thus the +residue vector must be able to represent a 48 bit range and the dot +product must be able to handle an effective 48 bit times 24 bit +multiplication. This range may be achieved using large (64 bit or +larger) integers, or implementing a movable binary point +representation. + + + +\paragraph{inverse monolithic transform (MDCT)} + +The audio spectrum is converted back into time domain PCM audio via an +inverse Modified Discrete Cosine Transform (MDCT). A detailed +description of the MDCT is available in \cite{Sporer/Brandenburg/Edler}. + +Note that the PCM produced directly from the MDCT is not yet finished +audio; it must be lapped with surrounding frames using an appropriate +window (such as the Vorbis window) before the MDCT can be considered +orthogonal. + + + +\paragraph{overlap/add data} +Windowed MDCT output is overlapped and added with the right hand data +of the previous window such that the 3/4 point of the previous window +is aligned with the 1/4 point of the current window (as illustrated in +the window overlap diagram). At this point, the audio data between the +center of the previous frame and the center of the current frame is +now finished and ready to be returned. + + +\paragraph{cache right hand data} +The decoder must cache the right hand portion of the current frame to +be lapped with the left hand portion of the next frame. + + + +\paragraph{return finished audio data} + +The overlapped portion produced from overlapping the previous and +current frame data is finished data to be returned by the decoder. +This data spans from the center of the previous window to the center +of the current window. In the case of same-sized windows, the amount +of data to return is one-half block consisting of and only of the +overlapped portions. When overlapping a short and long window, much of +the returned range is not actually overlap. This does not damage +transform orthogonality. Pay attention however to returning the +correct data range; the amount of data to be returned is: + +\begin{Verbatim}[commandchars=\\\{\}] +window\_blocksize(previous\_window)/4+window\_blocksize(current\_window)/4 +\end{Verbatim} + +from the center of the previous window to the center of the current +window. + +Data is not returned from the first frame; it must be used to 'prime' +the decode engine. The encoder accounts for this priming when +calculating PCM offsets; after the first frame, the proper PCM output +offset is '0' (as no data has been returned yet). diff --git a/cs/3rd party/libvorbis/doc/02-bitpacking.tex b/cs/3rd party/libvorbis/doc/02-bitpacking.tex new file mode 100644 index 000000000..c9a9fefb4 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/02-bitpacking.tex @@ -0,0 +1,247 @@ +% -*- mode: latex; TeX-master: "Vorbis_I_spec"; -*- +%!TEX root = Vorbis_I_spec.tex +% $Id$ +\section{Bitpacking Convention} \label{vorbis:spec:bitpacking} + +\subsection{Overview} + +The Vorbis codec uses relatively unstructured raw packets containing +arbitrary-width binary integer fields. Logically, these packets are a +bitstream in which bits are coded one-by-one by the encoder and then +read one-by-one in the same monotonically increasing order by the +decoder. Most current binary storage arrangements group bits into a +native word size of eight bits (octets), sixteen bits, thirty-two bits +or, less commonly other fixed word sizes. The Vorbis bitpacking +convention specifies the correct mapping of the logical packet +bitstream into an actual representation in fixed-width words. + + +\subsubsection{octets, bytes and words} + +In most contemporary architectures, a 'byte' is synonymous with an +'octet', that is, eight bits. This has not always been the case; +seven, ten, eleven and sixteen bit 'bytes' have been used. For +purposes of the bitpacking convention, a byte implies the native, +smallest integer storage representation offered by a platform. On +modern platforms, this is generally assumed to be eight bits (not +necessarily because of the processor but because of the +filesystem/memory architecture. Modern filesystems invariably offer +bytes as the fundamental atom of storage). A 'word' is an integer +size that is a grouped multiple of this smallest size. + +The most ubiquitous architectures today consider a 'byte' to be an +octet (eight bits) and a word to be a group of two, four or eight +bytes (16, 32 or 64 bits). Note however that the Vorbis bitpacking +convention is still well defined for any native byte size; Vorbis uses +the native bit-width of a given storage system. This document assumes +that a byte is one octet for purposes of example. + +\subsubsection{bit order} + +A byte has a well-defined 'least significant' bit (LSb), which is the +only bit set when the byte is storing the two's complement integer +value +1. A byte's 'most significant' bit (MSb) is at the opposite +end of the byte. Bits in a byte are numbered from zero at the LSb to +$n$ ($n=7$ in an octet) for the +MSb. + + + +\subsubsection{byte order} + +Words are native groupings of multiple bytes. Several byte orderings +are possible in a word; the common ones are 3-2-1-0 ('big endian' or +'most significant byte first' in which the highest-valued byte comes +first), 0-1-2-3 ('little endian' or 'least significant byte first' in +which the lowest value byte comes first) and less commonly 3-1-2-0 and +0-2-1-3 ('mixed endian'). + +The Vorbis bitpacking convention specifies storage and bitstream +manipulation at the byte, not word, level, thus host word ordering is +of a concern only during optimization when writing high performance +code that operates on a word of storage at a time rather than by byte. +Logically, bytes are always coded and decoded in order from byte zero +through byte $n$. + + + +\subsubsection{coding bits into byte sequences} + +The Vorbis codec has need to code arbitrary bit-width integers, from +zero to 32 bits wide, into packets. These integer fields are not +aligned to the boundaries of the byte representation; the next field +is written at the bit position at which the previous field ends. + +The encoder logically packs integers by writing the LSb of a binary +integer to the logical bitstream first, followed by next least +significant bit, etc, until the requested number of bits have been +coded. When packing the bits into bytes, the encoder begins by +placing the LSb of the integer to be written into the least +significant unused bit position of the destination byte, followed by +the next-least significant bit of the source integer and so on up to +the requested number of bits. When all bits of the destination byte +have been filled, encoding continues by zeroing all bits of the next +byte and writing the next bit into the bit position 0 of that byte. +Decoding follows the same process as encoding, but by reading bits +from the byte stream and reassembling them into integers. + + + +\subsubsection{signedness} + +The signedness of a specific number resulting from decode is to be +interpreted by the decoder given decode context. That is, the three +bit binary pattern 'b111' can be taken to represent either 'seven' as +an unsigned integer, or '-1' as a signed, two's complement integer. +The encoder and decoder are responsible for knowing if fields are to +be treated as signed or unsigned. + + + +\subsubsection{coding example} + +Code the 4 bit integer value '12' [b1100] into an empty bytestream. +Bytestream result: + +\begin{Verbatim}[commandchars=\\\{\}] + | + V + + 7 6 5 4 3 2 1 0 +byte 0 [0 0 0 0 1 1 0 0] <- +byte 1 [ ] +byte 2 [ ] +byte 3 [ ] + ... +byte n [ ] bytestream length == 1 byte + +\end{Verbatim} + + +Continue by coding the 3 bit integer value '-1' [b111]: + +\begin{Verbatim}[commandchars=\\\{\}] + | + V + + 7 6 5 4 3 2 1 0 +byte 0 [0 1 1 1 1 1 0 0] <- +byte 1 [ ] +byte 2 [ ] +byte 3 [ ] + ... +byte n [ ] bytestream length == 1 byte +\end{Verbatim} + + +Continue by coding the 7 bit integer value '17' [b0010001]: + +\begin{Verbatim}[commandchars=\\\{\}] + | + V + + 7 6 5 4 3 2 1 0 +byte 0 [1 1 1 1 1 1 0 0] +byte 1 [0 0 0 0 1 0 0 0] <- +byte 2 [ ] +byte 3 [ ] + ... +byte n [ ] bytestream length == 2 bytes + bit cursor == 6 +\end{Verbatim} + + +Continue by coding the 13 bit integer value '6969' [b110 11001110 01]: + +\begin{Verbatim}[commandchars=\\\{\}] + | + V + + 7 6 5 4 3 2 1 0 +byte 0 [1 1 1 1 1 1 0 0] +byte 1 [0 1 0 0 1 0 0 0] +byte 2 [1 1 0 0 1 1 1 0] +byte 3 [0 0 0 0 0 1 1 0] <- + ... +byte n [ ] bytestream length == 4 bytes + +\end{Verbatim} + + + + +\subsubsection{decoding example} + +Reading from the beginning of the bytestream encoded in the above example: + +\begin{Verbatim}[commandchars=\\\{\}] + | + V + + 7 6 5 4 3 2 1 0 +byte 0 [1 1 1 1 1 1 0 0] <- +byte 1 [0 1 0 0 1 0 0 0] +byte 2 [1 1 0 0 1 1 1 0] +byte 3 [0 0 0 0 0 1 1 0] bytestream length == 4 bytes + +\end{Verbatim} + + +We read two, two-bit integer fields, resulting in the returned numbers +'b00' and 'b11'. Two things are worth noting here: + +\begin{itemize} +\item Although these four bits were originally written as a single +four-bit integer, reading some other combination of bit-widths from the +bitstream is well defined. There are no artificial alignment +boundaries maintained in the bitstream. + +\item The second value is the +two-bit-wide integer 'b11'. This value may be interpreted either as +the unsigned value '3', or the signed value '-1'. Signedness is +dependent on decode context. +\end{itemize} + + + + +\subsubsection{end-of-packet alignment} + +The typical use of bitpacking is to produce many independent +byte-aligned packets which are embedded into a larger byte-aligned +container structure, such as an Ogg transport bitstream. Externally, +each bytestream (encoded bitstream) must begin and end on a byte +boundary. Often, the encoded bitstream is not an integer number of +bytes, and so there is unused (uncoded) space in the last byte of a +packet. + +Unused space in the last byte of a bytestream is always zeroed during +the coding process. Thus, should this unused space be read, it will +return binary zeroes. + +Attempting to read past the end of an encoded packet results in an +'end-of-packet' condition. End-of-packet is not to be considered an +error; it is merely a state indicating that there is insufficient +remaining data to fulfill the desired read size. Vorbis uses truncated +packets as a normal mode of operation, and as such, decoders must +handle reading past the end of a packet as a typical mode of +operation. Any further read operations after an 'end-of-packet' +condition shall also return 'end-of-packet'. + + + +\subsubsection{reading zero bits} + +Reading a zero-bit-wide integer returns the value '0' and does not +increment the stream cursor. Reading to the end of the packet (but +not past, such that an 'end-of-packet' condition has not triggered) +and then reading a zero bit integer shall succeed, returning 0, and +not trigger an end-of-packet condition. Reading a zero-bit-wide +integer after a previous read sets 'end-of-packet' shall also fail +with 'end-of-packet'. + + + + + + diff --git a/cs/3rd party/libvorbis/doc/03-codebook.tex b/cs/3rd party/libvorbis/doc/03-codebook.tex new file mode 100644 index 000000000..4ba5e31d1 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/03-codebook.tex @@ -0,0 +1,457 @@ +% -*- mode: latex; TeX-master: "Vorbis_I_spec"; -*- +%!TEX root = Vorbis_I_spec.tex +% $Id$ +\section{Probability Model and Codebooks} \label{vorbis:spec:codebook} + +\subsection{Overview} + +Unlike practically every other mainstream audio codec, Vorbis has no +statically configured probability model, instead packing all entropy +decoding configuration, VQ and Huffman, into the bitstream itself in +the third header, the codec setup header. This packed configuration +consists of multiple 'codebooks', each containing a specific +Huffman-equivalent representation for decoding compressed codewords as +well as an optional lookup table of output vector values to which a +decoded Huffman value is applied as an offset, generating the final +decoded output corresponding to a given compressed codeword. + +\subsubsection{Bitwise operation} +The codebook mechanism is built on top of the vorbis bitpacker. Both +the codebooks themselves and the codewords they decode are unrolled +from a packet as a series of arbitrary-width values read from the +stream according to \xref{vorbis:spec:bitpacking}. + + + + +\subsection{Packed codebook format} + +For purposes of the examples below, we assume that the storage +system's native byte width is eight bits. This is not universally +true; see \xref{vorbis:spec:bitpacking} for discussion +relating to non-eight-bit bytes. + +\subsubsection{codebook decode} + +A codebook begins with a 24 bit sync pattern, 0x564342: + +\begin{Verbatim}[commandchars=\\\{\}] +byte 0: [ 0 1 0 0 0 0 1 0 ] (0x42) +byte 1: [ 0 1 0 0 0 0 1 1 ] (0x43) +byte 2: [ 0 1 0 1 0 1 1 0 ] (0x56) +\end{Verbatim} + +16 bit \varname{[codebook\_dimensions]} and 24 bit \varname{[codebook\_entries]} fields: + +\begin{Verbatim}[commandchars=\\\{\}] + +byte 3: [ X X X X X X X X ] +byte 4: [ X X X X X X X X ] [codebook\_dimensions] (16 bit unsigned) + +byte 5: [ X X X X X X X X ] +byte 6: [ X X X X X X X X ] +byte 7: [ X X X X X X X X ] [codebook\_entries] (24 bit unsigned) + +\end{Verbatim} + +Next is the \varname{[ordered]} bit flag: + +\begin{Verbatim}[commandchars=\\\{\}] + +byte 8: [ X ] [ordered] (1 bit) + +\end{Verbatim} + +Each entry, numbering a +total of \varname{[codebook\_entries]}, is assigned a codeword length. +We now read the list of codeword lengths and store these lengths in +the array \varname{[codebook\_codeword\_lengths]}. Decode of lengths is +according to whether the \varname{[ordered]} flag is set or unset. + +\begin{itemize} +\item + If the \varname{[ordered]} flag is unset, the codeword list is not + length ordered and the decoder needs to read each codeword length + one-by-one. + + The decoder first reads one additional bit flag, the + \varname{[sparse]} flag. This flag determines whether or not the + codebook contains unused entries that are not to be included in the + codeword decode tree: + +\begin{Verbatim}[commandchars=\\\{\}] +byte 8: [ X 1 ] [sparse] flag (1 bit) +\end{Verbatim} + + The decoder now performs for each of the \varname{[codebook\_entries]} + codebook entries: + +\begin{Verbatim}[commandchars=\\\{\}] + + 1) if([sparse] is set) \{ + + 2) [flag] = read one bit; + 3) if([flag] is set) \{ + + 4) [length] = read a five bit unsigned integer; + 5) codeword length for this entry is [length]+1; + + \} else \{ + + 6) this entry is unused. mark it as such. + + \} + + \} else the sparse flag is not set \{ + + 7) [length] = read a five bit unsigned integer; + 8) the codeword length for this entry is [length]+1; + + \} + +\end{Verbatim} + +\item + If the \varname{[ordered]} flag is set, the codeword list for this + codebook is encoded in ascending length order. Rather than reading + a length for every codeword, the encoder reads the number of + codewords per length. That is, beginning at entry zero: + +\begin{Verbatim}[commandchars=\\\{\}] + 1) [current\_entry] = 0; + 2) [current\_length] = read a five bit unsigned integer and add 1; + 3) [number] = read \link{vorbis:spec:ilog}{ilog}([codebook\_entries] - [current\_entry]) bits as an unsigned integer + 4) set the entries [current\_entry] through [current\_entry]+[number]-1, inclusive, + of the [codebook\_codeword\_lengths] array to [current\_length] + 5) set [current\_entry] to [number] + [current\_entry] + 6) increment [current\_length] by 1 + 7) if [current\_entry] is greater than [codebook\_entries] ERROR CONDITION; + the decoder will not be able to read this stream. + 8) if [current\_entry] is less than [codebook\_entries], repeat process starting at 3) + 9) done. +\end{Verbatim} + +\end{itemize} + +After all codeword lengths have been decoded, the decoder reads the +vector lookup table. Vorbis I supports three lookup types: +\begin{enumerate} +\item +No lookup +\item +Implicitly populated value mapping (lattice VQ) +\item +Explicitly populated value mapping (tessellated or 'foam' +VQ) +\end{enumerate} + + +The lookup table type is read as a four bit unsigned integer: +\begin{Verbatim}[commandchars=\\\{\}] + 1) [codebook\_lookup\_type] = read four bits as an unsigned integer +\end{Verbatim} + +Codebook decode precedes according to \varname{[codebook\_lookup\_type]}: +\begin{itemize} +\item +Lookup type zero indicates no lookup to be read. Proceed past +lookup decode. +\item +Lookup types one and two are similar, differing only in the +number of lookup values to be read. Lookup type one reads a list of +values that are permuted in a set pattern to build a list of vectors, +each vector of order \varname{[codebook\_dimensions]} scalars. Lookup +type two builds the same vector list, but reads each scalar for each +vector explicitly, rather than building vectors from a smaller list of +possible scalar values. Lookup decode proceeds as follows: + +\begin{Verbatim}[commandchars=\\\{\}] + 1) [codebook\_minimum\_value] = \link{vorbis:spec:float32:unpack}{float32\_unpack}( read 32 bits as an unsigned integer) + 2) [codebook\_delta\_value] = \link{vorbis:spec:float32:unpack}{float32\_unpack}( read 32 bits as an unsigned integer) + 3) [codebook\_value\_bits] = read 4 bits as an unsigned integer and add 1 + 4) [codebook\_sequence\_p] = read 1 bit as a boolean flag + + if ( [codebook\_lookup\_type] is 1 ) \{ + + 5) [codebook\_lookup\_values] = \link{vorbis:spec:lookup1:values}{lookup1\_values}(\varname{[codebook\_entries]}, \varname{[codebook\_dimensions]} ) + + \} else \{ + + 6) [codebook\_lookup\_values] = \varname{[codebook\_entries]} * \varname{[codebook\_dimensions]} + + \} + + 7) read a total of [codebook\_lookup\_values] unsigned integers of [codebook\_value\_bits] each; + store these in order in the array [codebook\_multiplicands] +\end{Verbatim} +\item +A \varname{[codebook\_lookup\_type]} of greater than two is reserved +and indicates a stream that is not decodable by the specification in this +document. + +\end{itemize} + + +An 'end of packet' during any read operation in the above steps is +considered an error condition rendering the stream undecodable. + +\paragraph{Huffman decision tree representation} + +The \varname{[codebook\_codeword\_lengths]} array and +\varname{[codebook\_entries]} value uniquely define the Huffman decision +tree used for entropy decoding. + +Briefly, each used codebook entry (recall that length-unordered +codebooks support unused codeword entries) is assigned, in order, the +lowest valued unused binary Huffman codeword possible. Assume the +following codeword length list: + +\begin{Verbatim}[commandchars=\\\{\}] +entry 0: length 2 +entry 1: length 4 +entry 2: length 4 +entry 3: length 4 +entry 4: length 4 +entry 5: length 2 +entry 6: length 3 +entry 7: length 3 +\end{Verbatim} + +Assigning codewords in order (lowest possible value of the appropriate +length to highest) results in the following codeword list: + +\begin{Verbatim}[commandchars=\\\{\}] +entry 0: length 2 codeword 00 +entry 1: length 4 codeword 0100 +entry 2: length 4 codeword 0101 +entry 3: length 4 codeword 0110 +entry 4: length 4 codeword 0111 +entry 5: length 2 codeword 10 +entry 6: length 3 codeword 110 +entry 7: length 3 codeword 111 +\end{Verbatim} + + +\begin{note} +Unlike most binary numerical values in this document, we +intend the above codewords to be read and used bit by bit from left to +right, thus the codeword '001' is the bit string 'zero, zero, one'. +When determining 'lowest possible value' in the assignment definition +above, the leftmost bit is the MSb. +\end{note} + +It is clear that the codeword length list represents a Huffman +decision tree with the entry numbers equivalent to the leaves numbered +left-to-right: + +\begin{center} +\includegraphics[width=10cm]{hufftree} +\captionof{figure}{huffman tree illustration} +\end{center} + + +As we assign codewords in order, we see that each choice constructs a +new leaf in the leftmost possible position. + +Note that it's possible to underspecify or overspecify a Huffman tree +via the length list. In the above example, if codeword seven were +eliminated, it's clear that the tree is unfinished: + +\begin{center} +\includegraphics[width=10cm]{hufftree-under} +\captionof{figure}{underspecified huffman tree illustration} +\end{center} + + +Similarly, in the original codebook, it's clear that the tree is fully +populated and a ninth codeword is impossible. Both underspecified and +overspecified trees are an error condition rendering the stream +undecodable. + +Codebook entries marked 'unused' are simply skipped in the assigning +process. They have no codeword and do not appear in the decision +tree, thus it's impossible for any bit pattern read from the stream to +decode to that entry number. + +\paragraph{Errata 20150226: Single entry codebooks} + +A 'single-entry codebook' is a codebook with one active codeword +entry. A single-entry codebook may be either a fully populated +codebook with only one declared entry, or a sparse codebook with only +one entry marked used. The Vorbis I spec provides no means to specify +a codeword length of zero, and as a result, a single-entry codebook is +inherently malformed because it is underpopulated. The original +specification did not address directly the matter of single-entry +codebooks; they were implicitly illegal as it was not possible to +write such a codebook with a valid tree structure. + +In r14811 of the libvorbis reference implementation, Xiph added an +additional check to the codebook implementation to reject +underpopulated Huffman trees. This change led to the discovery of +single-entry books used 'in the wild' when the new, stricter checks +rejected a number of apparently working streams. + +In order to minimize breakage of deployed (if technically erroneous) +streams, r16073 of the reference implementation explicitly +special-cased single-entry codebooks to tolerate the single-entry +case. Commit r16073 also added the following to the specification: + +\blockquote{\sout{Take special care that a codebook with a single used + entry is handled properly; it consists of a single codework of + zero bits and ’reading’ a value out of such a codebook always + returns the single used value and sinks zero bits. +}} + +The intent was to clarify the spec and codify current practice. +However, this addition is erroneously at odds with the intent of preserving +usability of existing streams using single-entry codebooks, disagrees +with the code changes that reinstated decoding, and does not address how +single-entry codebooks should be encoded. + +As such, the above addition made in r16037 is struck from the +specification and replaced by the following: + +\blockquote{It is possible to declare a Vorbis codebook containing a + single codework entry. A single-entry codebook may be either a + fully populated codebook with \varname{[codebook\_entries]} set to + 1, or a sparse codebook marking only one entry used. Note that it + is not possible to also encode a \varname{[codeword\_length]} of + zero for the single used codeword, as the unsigned value written to + the stream is \varname{[codeword\_length]-1}. Instead, encoder + implementations should indicate a \varname{[codeword\_length]} of 1 + and 'write' the codeword to a stream during audio encoding by + writing a single zero bit. + + Decoder implementations shall reject a codebook if it contains only + one used entry and the encoded \varname{[codeword\_length]} of that + entry is not 1. 'Reading' a value from single-entry codebook always + returns the single used codeword value and sinks one bit. Decoders + should tolerate that the bit read from the stream be '1' instead of + '0'; both values shall return the single used codeword.} + +\paragraph{VQ lookup table vector representation} + +Unpacking the VQ lookup table vectors relies on the following values: +\begin{programlisting} +the [codebook\_multiplicands] array +[codebook\_minimum\_value] +[codebook\_delta\_value] +[codebook\_sequence\_p] +[codebook\_lookup\_type] +[codebook\_entries] +[codebook\_dimensions] +[codebook\_lookup\_values] +\end{programlisting} + +\bigskip + +Decoding (unpacking) a specific vector in the vector lookup table +proceeds according to \varname{[codebook\_lookup\_type]}. The unpacked +vector values are what a codebook would return during audio packet +decode in a VQ context. + +\paragraph{Vector value decode: Lookup type 1} + +Lookup type one specifies a lattice VQ lookup table built +algorithmically from a list of scalar values. Calculate (unpack) the +final values of a codebook entry vector from the entries in +\varname{[codebook\_multiplicands]} as follows (\varname{[value\_vector]} +is the output vector representing the vector of values for entry number +\varname{[lookup\_offset]} in this codebook): + +\begin{Verbatim}[commandchars=\\\{\}] + 1) [last] = 0; + 2) [index\_divisor] = 1; + 3) iterate [i] over the range 0 ... [codebook\_dimensions]-1 (once for each scalar value in the value vector) \{ + + 4) [multiplicand\_offset] = ( [lookup\_offset] divided by [index\_divisor] using integer + division ) integer modulo [codebook\_lookup\_values] + + 5) vector [value\_vector] element [i] = + ( [codebook\_multiplicands] array element number [multiplicand\_offset] ) * + [codebook\_delta\_value] + [codebook\_minimum\_value] + [last]; + + 6) if ( [codebook\_sequence\_p] is set ) then set [last] = vector [value\_vector] element [i] + + 7) [index\_divisor] = [index\_divisor] * [codebook\_lookup\_values] + + \} + + 8) vector calculation completed. +\end{Verbatim} + + + +\paragraph{Vector value decode: Lookup type 2} + +Lookup type two specifies a VQ lookup table in which each scalar in +each vector is explicitly set by the \varname{[codebook\_multiplicands]} +array in a one-to-one mapping. Calculate [unpack] the +final values of a codebook entry vector from the entries in +\varname{[codebook\_multiplicands]} as follows (\varname{[value\_vector]} +is the output vector representing the vector of values for entry number +\varname{[lookup\_offset]} in this codebook): + +\begin{Verbatim}[commandchars=\\\{\}] + 1) [last] = 0; + 2) [multiplicand\_offset] = [lookup\_offset] * [codebook\_dimensions] + 3) iterate [i] over the range 0 ... [codebook\_dimensions]-1 (once for each scalar value in the value vector) \{ + + 4) vector [value\_vector] element [i] = + ( [codebook\_multiplicands] array element number [multiplicand\_offset] ) * + [codebook\_delta\_value] + [codebook\_minimum\_value] + [last]; + + 5) if ( [codebook\_sequence\_p] is set ) then set [last] = vector [value\_vector] element [i] + + 6) increment [multiplicand\_offset] + + \} + + 7) vector calculation completed. +\end{Verbatim} + + + + + + + + + +\subsection{Use of the codebook abstraction} + +The decoder uses the codebook abstraction much as it does the +bit-unpacking convention; a specific codebook reads a +codeword from the bitstream, decoding it into an entry number, and then +returns that entry number to the decoder (when used in a scalar +entropy coding context), or uses that entry number as an offset into +the VQ lookup table, returning a vector of values (when used in a context +desiring a VQ value). Scalar or VQ context is always explicit; any call +to the codebook mechanism requests either a scalar entry number or a +lookup vector. + +Note that VQ lookup type zero indicates that there is no lookup table; +requesting decode using a codebook of lookup type 0 in any context +expecting a vector return value (even in a case where a vector of +dimension one) is forbidden. If decoder setup or decode requests such +an action, that is an error condition rendering the packet +undecodable. + +Using a codebook to read from the packet bitstream consists first of +reading and decoding the next codeword in the bitstream. The decoder +reads bits until the accumulated bits match a codeword in the +codebook. This process can be though of as logically walking the +Huffman decode tree by reading one bit at a time from the bitstream, +and using the bit as a decision boolean to take the 0 branch (left in +the above examples) or the 1 branch (right in the above examples). +Walking the tree finishes when the decode process hits a leaf in the +decision tree; the result is the entry number corresponding to that +leaf. Reading past the end of a packet propagates the 'end-of-stream' +condition to the decoder. + +When used in a scalar context, the resulting codeword entry is the +desired return value. + +When used in a VQ context, the codeword entry number is used as an +offset into the VQ lookup table. The value returned to the decoder is +the vector of scalars corresponding to this offset. diff --git a/cs/3rd party/libvorbis/doc/04-codec.tex b/cs/3rd party/libvorbis/doc/04-codec.tex new file mode 100644 index 000000000..7edaebb6c --- /dev/null +++ b/cs/3rd party/libvorbis/doc/04-codec.tex @@ -0,0 +1,661 @@ + +% -*- mode: latex; TeX-master: "Vorbis_I_spec"; -*- +%!TEX root = Vorbis_I_spec.tex +% $Id$ +\section{Codec Setup and Packet Decode} \label{vorbis:spec:codec} + +\subsection{Overview} + +This document serves as the top-level reference document for the +bit-by-bit decode specification of Vorbis I. This document assumes a +high-level understanding of the Vorbis decode process, which is +provided in \xref{vorbis:spec:intro}. \xref{vorbis:spec:bitpacking} covers reading and writing bit fields from +and to bitstream packets. + + + +\subsection{Header decode and decode setup} + +A Vorbis bitstream begins with three header packets. The header +packets are, in order, the identification header, the comments header, +and the setup header. All are required for decode compliance. An +end-of-packet condition during decoding the first or third header +packet renders the stream undecodable. End-of-packet decoding the +comment header is a non-fatal error condition. + +\subsubsection{Common header decode} + +Each header packet begins with the same header fields. + + +\begin{Verbatim}[commandchars=\\\{\}] + 1) [packet\_type] : 8 bit value + 2) 0x76, 0x6f, 0x72, 0x62, 0x69, 0x73: the characters 'v','o','r','b','i','s' as six octets +\end{Verbatim} + +Decode continues according to packet type; the identification header +is type 1, the comment header type 3 and the setup header type 5 +(these types are all odd as a packet with a leading single bit of '0' +is an audio packet). The packets must occur in the order of +identification, comment, setup. + + + +\subsubsection{Identification header} + +The identification header is a short header of only a few fields used +to declare the stream definitively as Vorbis, and provide a few externally +relevant pieces of information about the audio stream. The +identification header is coded as follows: + +\begin{Verbatim}[commandchars=\\\{\}] + 1) [vorbis\_version] = read 32 bits as unsigned integer + 2) [audio\_channels] = read 8 bit integer as unsigned + 3) [audio\_sample\_rate] = read 32 bits as unsigned integer + 4) [bitrate\_maximum] = read 32 bits as signed integer + 5) [bitrate\_nominal] = read 32 bits as signed integer + 6) [bitrate\_minimum] = read 32 bits as signed integer + 7) [blocksize\_0] = 2 exponent (read 4 bits as unsigned integer) + 8) [blocksize\_1] = 2 exponent (read 4 bits as unsigned integer) + 9) [framing\_flag] = read one bit +\end{Verbatim} + +\varname{[vorbis\_version]} is to read '0' in order to be compatible +with this document. Both \varname{[audio\_channels]} and +\varname{[audio\_sample\_rate]} must read greater than zero. Allowed final +blocksize values are 64, 128, 256, 512, 1024, 2048, 4096 and 8192 in +Vorbis I. \varname{[blocksize\_0]} must be less than or equal to +\varname{[blocksize\_1]}. The framing bit must be nonzero. Failure to +meet any of these conditions renders a stream undecodable. + +The bitrate fields above are used only as hints. The nominal bitrate +field especially may be considerably off in purely VBR streams. The +fields are meaningful only when greater than zero. + +\begin{itemize} + \item All three fields set to the same value implies a fixed rate, or tightly bounded, nearly fixed-rate bitstream + \item Only nominal set implies a VBR or ABR stream that averages the nominal bitrate + \item Maximum and or minimum set implies a VBR bitstream that obeys the bitrate limits + \item None set indicates the encoder does not care to speculate. +\end{itemize} + + + + +\subsubsection{Comment header} +Comment header decode and data specification is covered in +\xref{vorbis:spec:comment}. + + +\subsubsection{Setup header} + +Vorbis codec setup is configurable to an extreme degree: + +\begin{center} +\includegraphics[width=\textwidth]{components} +\captionof{figure}{decoder pipeline configuration} +\end{center} + + +The setup header contains the bulk of the codec setup information +needed for decode. The setup header contains, in order, the lists of +codebook configurations, time-domain transform configurations +(placeholders in Vorbis I), floor configurations, residue +configurations, channel mapping configurations and mode +configurations. It finishes with a framing bit of '1'. Header decode +proceeds in the following order: + +\paragraph{Codebooks} + +\begin{enumerate} +\item \varname{[vorbis\_codebook\_count]} = read eight bits as unsigned integer and add one +\item Decode \varname{[vorbis\_codebook\_count]} codebooks in order as defined +in \xref{vorbis:spec:codebook}. Save each configuration, in +order, in an array of +codebook configurations \varname{[vorbis\_codebook\_configurations]}. +\end{enumerate} + + + +\paragraph{Time domain transforms} + +These hooks are placeholders in Vorbis I. Nevertheless, the +configuration placeholder values must be read to maintain bitstream +sync. + +\begin{enumerate} +\item \varname{[vorbis\_time\_count]} = read 6 bits as unsigned integer and add one +\item read \varname{[vorbis\_time\_count]} 16 bit values; each value should be zero. If any value is nonzero, this is an error condition and the stream is undecodable. +\end{enumerate} + + + +\paragraph{Floors} + +Vorbis uses two floor types; header decode is handed to the decode +abstraction of the appropriate type. + +\begin{enumerate} + \item \varname{[vorbis\_floor\_count]} = read 6 bits as unsigned integer and add one + \item For each \varname{[i]} of \varname{[vorbis\_floor\_count]} floor numbers: + \begin{enumerate} + \item read the floor type: vector \varname{[vorbis\_floor\_types]} element \varname{[i]} = +read 16 bits as unsigned integer + \item If the floor type is zero, decode the floor +configuration as defined in \xref{vorbis:spec:floor0}; save +this +configuration in slot \varname{[i]} of the floor configuration array \varname{[vorbis\_floor\_configurations]}. + \item If the floor type is one, +decode the floor configuration as defined in \xref{vorbis:spec:floor1}; save this configuration in slot \varname{[i]} of the floor configuration array \varname{[vorbis\_floor\_configurations]}. + \item If the the floor type is greater than one, this stream is undecodable; ERROR CONDITION + \end{enumerate} + +\end{enumerate} + + + +\paragraph{Residues} + +Vorbis uses three residue types; header decode of each type is identical. + + +\begin{enumerate} +\item \varname{[vorbis\_residue\_count]} = read 6 bits as unsigned integer and add one + +\item For each of \varname{[vorbis\_residue\_count]} residue numbers: + \begin{enumerate} + \item read the residue type; vector \varname{[vorbis\_residue\_types]} element \varname{[i]} = read 16 bits as unsigned integer + \item If the residue type is zero, +one or two, decode the residue configuration as defined in \xref{vorbis:spec:residue}; save this configuration in slot \varname{[i]} of the residue configuration array \varname{[vorbis\_residue\_configurations]}. + \item If the the residue type is greater than two, this stream is undecodable; ERROR CONDITION + \end{enumerate} + +\end{enumerate} + + + +\paragraph{Mappings} + +Mappings are used to set up specific pipelines for encoding +multichannel audio with varying channel mapping applications. Vorbis I +uses a single mapping type (0), with implicit PCM channel mappings. + +% FIXME/TODO: LaTeX cannot nest enumerate that deeply, so I have to use +% itemize at the innermost level. However, it would be much better to +% rewrite this pseudocode using listings or algoritmicx or some other +% package geared towards this. +\begin{enumerate} + \item \varname{[vorbis\_mapping\_count]} = read 6 bits as unsigned integer and add one + \item For each \varname{[i]} of \varname{[vorbis\_mapping\_count]} mapping numbers: + \begin{enumerate} + \item read the mapping type: 16 bits as unsigned integer. There's no reason to save the mapping type in Vorbis I. + \item If the mapping type is nonzero, the stream is undecodable + \item If the mapping type is zero: + \begin{enumerate} + \item read 1 bit as a boolean flag + \begin{enumerate} + \item if set, \varname{[vorbis\_mapping\_submaps]} = read 4 bits as unsigned integer and add one + \item if unset, \varname{[vorbis\_mapping\_submaps]} = 1 + \end{enumerate} + + + \item read 1 bit as a boolean flag + \begin{enumerate} + \item if set, square polar channel mapping is in use: + \begin{itemize} + \item \varname{[vorbis\_mapping\_coupling\_steps]} = read 8 bits as unsigned integer and add one + \item for \varname{[j]} each of \varname{[vorbis\_mapping\_coupling\_steps]} steps: + \begin{itemize} + \item vector \varname{[vorbis\_mapping\_magnitude]} element \varname{[j]}= read \link{vorbis:spec:ilog}{ilog}(\varname{[audio\_channels]} - 1) bits as unsigned integer + \item vector \varname{[vorbis\_mapping\_angle]} element \varname{[j]}= read \link{vorbis:spec:ilog}{ilog}(\varname{[audio\_channels]} - 1) bits as unsigned integer + \item the numbers read in the above two steps are channel numbers representing the channel to treat as magnitude and the channel to treat as angle, respectively. If for any coupling step the angle channel number equals the magnitude channel number, the magnitude channel number is greater than \varname{[audio\_channels]}-1, or the angle channel is greater than \varname{[audio\_channels]}-1, the stream is undecodable. + \end{itemize} + + + \end{itemize} + + + \item if unset, \varname{[vorbis\_mapping\_coupling\_steps]} = 0 + \end{enumerate} + + + \item read 2 bits (reserved field); if the value is nonzero, the stream is undecodable + \item if \varname{[vorbis\_mapping\_submaps]} is greater than one, we read channel multiplex settings. For each \varname{[j]} of \varname{[audio\_channels]} channels: + \begin{enumerate} + \item vector \varname{[vorbis\_mapping\_mux]} element \varname{[j]} = read 4 bits as unsigned integer + \item if the value is greater than the highest numbered submap (\varname{[vorbis\_mapping\_submaps]} - 1), this in an error condition rendering the stream undecodable + \end{enumerate} + + \item for each submap \varname{[j]} of \varname{[vorbis\_mapping\_submaps]} submaps, read the floor and residue numbers for use in decoding that submap: + \begin{enumerate} + \item read and discard 8 bits (the unused time configuration placeholder) + \item read 8 bits as unsigned integer for the floor number; save in vector \varname{[vorbis\_mapping\_submap\_floor]} element \varname{[j]} + \item verify the floor number is not greater than the highest number floor configured for the bitstream. If it is, the bitstream is undecodable + \item read 8 bits as unsigned integer for the residue number; save in vector \varname{[vorbis\_mapping\_submap\_residue]} element \varname{[j]} + \item verify the residue number is not greater than the highest number residue configured for the bitstream. If it is, the bitstream is undecodable + \end{enumerate} + + \item save this mapping configuration in slot \varname{[i]} of the mapping configuration array \varname{[vorbis\_mapping\_configurations]}. + \end{enumerate} + + \end{enumerate} + +\end{enumerate} + + + +\paragraph{Modes} + +\begin{enumerate} + \item \varname{[vorbis\_mode\_count]} = read 6 bits as unsigned integer and add one + \item For each of \varname{[vorbis\_mode\_count]} mode numbers: + \begin{enumerate} + \item \varname{[vorbis\_mode\_blockflag]} = read 1 bit + \item \varname{[vorbis\_mode\_windowtype]} = read 16 bits as unsigned integer + \item \varname{[vorbis\_mode\_transformtype]} = read 16 bits as unsigned integer + \item \varname{[vorbis\_mode\_mapping]} = read 8 bits as unsigned integer + \item verify ranges; zero is the only legal value in Vorbis I for +\varname{[vorbis\_mode\_windowtype]} +and \varname{[vorbis\_mode\_transformtype]}. \varname{[vorbis\_mode\_mapping]} must not be greater than the highest number mapping in use. Any illegal values render the stream undecodable. + \item save this mode configuration in slot \varname{[i]} of the mode configuration array +\varname{[vorbis\_mode\_configurations]}. + \end{enumerate} + +\item read 1 bit as a framing flag. If unset, a framing error occurred and the stream is not +decodable. +\end{enumerate} + +After reading mode descriptions, setup header decode is complete. + + + + + + + + +\subsection{Audio packet decode and synthesis} + +Following the three header packets, all packets in a Vorbis I stream +are audio. The first step of audio packet decode is to read and +verify the packet type. \emph{A non-audio packet when audio is expected +indicates stream corruption or a non-compliant stream. The decoder +must ignore the packet and not attempt decoding it to audio}. + + +\subsubsection{packet type, mode and window decode} + +\begin{enumerate} + \item read 1 bit \varname{[packet\_type]}; check that packet type is 0 (audio) + \item read \link{vorbis:spec:ilog}{ilog}([vorbis\_mode\_count]-1) bits +\varname{[mode\_number]} + \item decode blocksize \varname{[n]} is equal to \varname{[blocksize\_0]} if +\varname{[vorbis\_mode\_blockflag]} is 0, else \varname{[n]} is equal to \varname{[blocksize\_1]}. + \item perform window selection and setup; this window is used later by the inverse MDCT: + \begin{enumerate} + \item if this is a long window (the \varname{[vorbis\_mode\_blockflag]} flag of this mode is +set): + \begin{enumerate} + \item read 1 bit for \varname{[previous\_window\_flag]} + \item read 1 bit for \varname{[next\_window\_flag]} + \item if \varname{[previous\_window\_flag]} is not set, the left half + of the window will be a hybrid window for lapping with a + short block. See \xref{vorbis:spec:window} for an illustration of overlapping +dissimilar + windows. Else, the left half window will have normal long + shape. + \item if \varname{[next\_window\_flag]} is not set, the right half of + the window will be a hybrid window for lapping with a short + block. See \xref{vorbis:spec:window} for an +illustration of overlapping dissimilar + windows. Else, the left right window will have normal long + shape. + \end{enumerate} + + \item if this is a short window, the window is always the same + short-window shape. + \end{enumerate} + +\end{enumerate} + +Vorbis windows all use the slope function $y=\sin(\frac{\pi}{2} * \sin^2((x+0.5)/n * \pi))$, +where $n$ is window size and $x$ ranges $0 \ldots n-1$, but dissimilar +lapping requirements can affect overall shape. Window generation +proceeds as follows: + +\begin{enumerate} + \item \varname{[window\_center]} = \varname{[n]} / 2 + \item if (\varname{[vorbis\_mode\_blockflag]} is set and \varname{[previous\_window\_flag]} is +not set) then + \begin{enumerate} + \item \varname{[left\_window\_start]} = \varname{[n]}/4 - +\varname{[blocksize\_0]}/4 + \item \varname{[left\_window\_end]} = \varname{[n]}/4 + \varname{[blocksize\_0]}/4 + \item \varname{[left\_n]} = \varname{[blocksize\_0]}/2 + \end{enumerate} + else + \begin{enumerate} + \item \varname{[left\_window\_start]} = 0 + \item \varname{[left\_window\_end]} = \varname{[window\_center]} + \item \varname{[left\_n]} = \varname{[n]}/2 + \end{enumerate} + + \item if (\varname{[vorbis\_mode\_blockflag]} is set and \varname{[next\_window\_flag]} is not +set) then + \begin{enumerate} + \item \varname{[right\_window\_start]} = \varname{[n]*3}/4 - +\varname{[blocksize\_0]}/4 + \item \varname{[right\_window\_end]} = \varname{[n]*3}/4 + +\varname{[blocksize\_0]}/4 + \item \varname{[right\_n]} = \varname{[blocksize\_0]}/2 + \end{enumerate} + else + \begin{enumerate} + \item \varname{[right\_window\_start]} = \varname{[window\_center]} + \item \varname{[right\_window\_end]} = \varname{[n]} + \item \varname{[right\_n]} = \varname{[n]}/2 + \end{enumerate} + + \item window from range 0 ... \varname{[left\_window\_start]}-1 inclusive is zero + \item for \varname{[i]} in range \varname{[left\_window\_start]} ... +\varname{[left\_window\_end]}-1, window(\varname{[i]}) = $\sin(\frac{\pi}{2} * \sin^2($ (\varname{[i]}-\varname{[left\_window\_start]}+0.5) / \varname{[left\_n]} $* \frac{\pi}{2})$ ) + \item window from range \varname{[left\_window\_end]} ... \varname{[right\_window\_start]}-1 +inclusive is one\item for \varname{[i]} in range \varname{[right\_window\_start]} ... \varname{[right\_window\_end]}-1, window(\varname{[i]}) = $\sin(\frac{\pi}{2} * \sin^2($ (\varname{[i]}-\varname{[right\_window\_start]}+0.5) / \varname{[right\_n]} $ * \frac{\pi}{2} + \frac{\pi}{2})$ ) +\item window from range \varname{[right\_window\_start]} ... \varname{[n]}-1 is +zero +\end{enumerate} + +An end-of-packet condition up to this point should be considered an +error that discards this packet from the stream. An end of packet +condition past this point is to be considered a possible nominal +occurrence. + + + +\subsubsection{floor curve decode} + +From this point on, we assume out decode context is using mode number +\varname{[mode\_number]} from configuration array +\varname{[vorbis\_mode\_configurations]} and the map number +\varname{[vorbis\_mode\_mapping]} (specified by the current mode) taken +from the mapping configuration array +\varname{[vorbis\_mapping\_configurations]}. + +Floor curves are decoded one-by-one in channel order. + +For each floor \varname{[i]} of \varname{[audio\_channels]} + \begin{enumerate} + \item \varname{[submap\_number]} = element \varname{[i]} of vector [vorbis\_mapping\_mux] + \item \varname{[floor\_number]} = element \varname{[submap\_number]} of vector +[vorbis\_submap\_floor] + \item if the floor type of this +floor (vector \varname{[vorbis\_floor\_types]} element +\varname{[floor\_number]}) is zero then decode the floor for +channel \varname{[i]} according to the +\xref{vorbis:spec:floor0-decode} + \item if the type of this floor +is one then decode the floor for channel \varname{[i]} according +to the \xref{vorbis:spec:floor1-decode} + \item save the needed decoded floor information for channel for later synthesis + \item if the decoded floor returned 'unused', set vector \varname{[no\_residue]} element +\varname{[i]} to true, else set vector \varname{[no\_residue]} element \varname{[i]} to +false + \end{enumerate} + + +An end-of-packet condition during floor decode shall result in packet +decode zeroing all channel output vectors and skipping to the +add/overlap output stage. + + + +\subsubsection{nonzero vector propagate} + +A possible result of floor decode is that a specific vector is marked +'unused' which indicates that that final output vector is all-zero +values (and the floor is zero). The residue for that vector is not +coded in the stream, save for one complication. If some vectors are +used and some are not, channel coupling could result in mixing a +zeroed and nonzeroed vector to produce two nonzeroed vectors. + +for each \varname{[i]} from 0 ... \varname{[vorbis\_mapping\_coupling\_steps]}-1 + +\begin{enumerate} + \item if either \varname{[no\_residue]} entry for channel +(\varname{[vorbis\_mapping\_magnitude]} element \varname{[i]}) +or channel +(\varname{[vorbis\_mapping\_angle]} element \varname{[i]}) +are set to false, then both must be set to false. Note that an 'unused' +floor has no decoded floor information; it is important that this is +remembered at floor curve synthesis time. +\end{enumerate} + + + + +\subsubsection{residue decode} + +Unlike floors, which are decoded in channel order, the residue vectors +are decoded in submap order. + +for each submap \varname{[i]} in order from 0 ... \varname{[vorbis\_mapping\_submaps]}-1 + +\begin{enumerate} + \item \varname{[ch]} = 0 + \item for each channel \varname{[j]} in order from 0 ... \varname{[audio\_channels]} - 1 + \begin{enumerate} + \item if channel \varname{[j]} in submap \varname{[i]} (vector \varname{[vorbis\_mapping\_mux]} element \varname{[j]} is equal to \varname{[i]}) + \begin{enumerate} + \item if vector \varname{[no\_residue]} element \varname{[j]} is true + \begin{enumerate} + \item vector \varname{[do\_not\_decode\_flag]} element \varname{[ch]} is set + \end{enumerate} + else + \begin{enumerate} + \item vector \varname{[do\_not\_decode\_flag]} element \varname{[ch]} is unset + \end{enumerate} + + \item increment \varname{[ch]} + \end{enumerate} + + \end{enumerate} + \item \varname{[residue\_number]} = vector \varname{[vorbis\_mapping\_submap\_residue]} element \varname{[i]} + \item \varname{[residue\_type]} = vector \varname{[vorbis\_residue\_types]} element \varname{[residue\_number]} + \item decode \varname{[ch]} vectors using residue \varname{[residue\_number]}, according to type \varname{[residue\_type]}, also passing vector \varname{[do\_not\_decode\_flag]} to indicate which vectors in the bundle should not be decoded. Correct per-vector decode length is \varname{[n]}/2. + \item \varname{[ch]} = 0 + \item for each channel \varname{[j]} in order from 0 ... \varname{[audio\_channels]} + \begin{enumerate} + \item if channel \varname{[j]} is in submap \varname{[i]} (vector \varname{[vorbis\_mapping\_mux]} element \varname{[j]} is equal to \varname{[i]}) + \begin{enumerate} + \item residue vector for channel \varname{[j]} is set to decoded residue vector \varname{[ch]} + \item increment \varname{[ch]} + \end{enumerate} + + \end{enumerate} + +\end{enumerate} + + + +\subsubsection{inverse coupling} + +for each \varname{[i]} from \varname{[vorbis\_mapping\_coupling\_steps]}-1 descending to 0 + +\begin{enumerate} + \item \varname{[magnitude\_vector]} = the residue vector for channel +(vector \varname{[vorbis\_mapping\_magnitude]} element \varname{[i]}) + \item \varname{[angle\_vector]} = the residue vector for channel (vector +\varname{[vorbis\_mapping\_angle]} element \varname{[i]}) + \item for each scalar value \varname{[M]} in vector \varname{[magnitude\_vector]} and the corresponding scalar value \varname{[A]} in vector \varname{[angle\_vector]}: + \begin{enumerate} + \item if (\varname{[M]} is greater than zero) + \begin{enumerate} + \item if (\varname{[A]} is greater than zero) + \begin{enumerate} + \item \varname{[new\_M]} = \varname{[M]} + \item \varname{[new\_A]} = \varname{[M]}-\varname{[A]} + \end{enumerate} + else + \begin{enumerate} + \item \varname{[new\_A]} = \varname{[M]} + \item \varname{[new\_M]} = \varname{[M]}+\varname{[A]} + \end{enumerate} + + \end{enumerate} + else + \begin{enumerate} + \item if (\varname{[A]} is greater than zero) + \begin{enumerate} + \item \varname{[new\_M]} = \varname{[M]} + \item \varname{[new\_A]} = \varname{[M]}+\varname{[A]} + \end{enumerate} + else + \begin{enumerate} + \item \varname{[new\_A]} = \varname{[M]} + \item \varname{[new\_M]} = \varname{[M]}-\varname{[A]} + \end{enumerate} + + \end{enumerate} + + \item set scalar value \varname{[M]} in vector \varname{[magnitude\_vector]} to \varname{[new\_M]} + \item set scalar value \varname{[A]} in vector \varname{[angle\_vector]} to \varname{[new\_A]} + \end{enumerate} + +\end{enumerate} + + + + +\subsubsection{dot product} + +For each channel, synthesize the floor curve from the decoded floor +information, according to packet type. Note that the vector synthesis +length for floor computation is \varname{[n]}/2. + +For each channel, multiply each element of the floor curve by each +element of that channel's residue vector. The result is the dot +product of the floor and residue vectors for each channel; the produced +vectors are the length \varname{[n]}/2 audio spectrum for each +channel. + +% TODO/FIXME: The following two paragraphs have identical twins +% in section 1 (under "compute floor/residue dot product") +One point is worth mentioning about this dot product; a common mistake +in a fixed point implementation might be to assume that a 32 bit +fixed-point representation for floor and residue and direct +multiplication of the vectors is sufficient for acceptable spectral +depth in all cases because it happens to mostly work with the current +Xiph.Org reference encoder. + +However, floor vector values can span \~140dB (\~24 bits unsigned), and +the audio spectrum vector should represent a minimum of 120dB (\~21 +bits with sign), even when output is to a 16 bit PCM device. For the +residue vector to represent full scale if the floor is nailed to +$-140$dB, it must be able to span 0 to $+140$dB. For the residue vector +to reach full scale if the floor is nailed at 0dB, it must be able to +represent $-140$dB to $+0$dB. Thus, in order to handle full range +dynamics, a residue vector may span $-140$dB to $+140$dB entirely within +spec. A 280dB range is approximately 48 bits with sign; thus the +residue vector must be able to represent a 48 bit range and the dot +product must be able to handle an effective 48 bit times 24 bit +multiplication. This range may be achieved using large (64 bit or +larger) integers, or implementing a movable binary point +representation. + + + +\subsubsection{inverse MDCT} + +Convert the audio spectrum vector of each channel back into time +domain PCM audio via an inverse Modified Discrete Cosine Transform +(MDCT). A detailed description of the MDCT is available in \cite{Sporer/Brandenburg/Edler}. The window +function used for the MDCT is the function described earlier. + + + +\subsubsection{overlap\_add} + +Windowed MDCT output is overlapped and added with the right hand data +of the previous window such that the 3/4 point of the previous window +is aligned with the 1/4 point of the current window (as illustrated in +\xref{vorbis:spec:window}). The overlapped portion +produced from overlapping the previous and current frame data is +finished data to be returned by the decoder. This data spans from the +center of the previous window to the center of the current window. In +the case of same-sized windows, the amount of data to return is +one-half block consisting of and only of the overlapped portions. When +overlapping a short and long window, much of the returned range does not +actually overlap. This does not damage transform orthogonality. Pay +attention however to returning the correct data range; the amount of +data to be returned is: + +\begin{programlisting} +window_blocksize(previous_window)/4+window_blocksize(current_window)/4 +\end{programlisting} + +from the center (element windowsize/2) of the previous window to the +center (element windowsize/2-1, inclusive) of the current window. + +Data is not returned from the first frame; it must be used to 'prime' +the decode engine. The encoder accounts for this priming when +calculating PCM offsets; after the first frame, the proper PCM output +offset is '0' (as no data has been returned yet). + + + +\subsubsection{output channel order} + +Vorbis I specifies only a channel mapping type 0. In mapping type 0, +channel mapping is implicitly defined as follows for standard audio +applications. As of revision 16781 (20100113), the specification adds +defined channel locations for 6.1 and 7.1 surround. Ordering/location +for greater-than-eight channels remains 'left to the implementation'. + +These channel orderings refer to order within the encoded stream. It +is naturally possible for a decoder to produce output with channels in +any order. Any such decoder should explicitly document channel +reordering behavior. + +\begin{description} %[style=nextline] + \item[one channel] + the stream is monophonic + +\item[two channels] + the stream is stereo. channel order: left, right + +\item[three channels] + the stream is a 1d-surround encoding. channel order: left, +center, right + +\item[four channels] + the stream is quadraphonic surround. channel order: front left, +front right, rear left, rear right + +\item[five channels] + the stream is five-channel surround. channel order: front left, +center, front right, rear left, rear right + +\item[six channels] + the stream is 5.1 surround. channel order: front left, center, +front right, rear left, rear right, LFE + +\item[seven channels] + the stream is 6.1 surround. channel order: front left, center, +front right, side left, side right, rear center, LFE + +\item[eight channels] + the stream is 7.1 surround. channel order: front left, center, +front right, side left, side right, rear left, rear right, +LFE + +\item[greater than eight channels] + channel use and order is defined by the application + +\end{description} + +Applications using Vorbis for dedicated purposes may define channel +mapping as seen fit. Future channel mappings (such as three and four +channel \href{http://www.ambisonic.net/}{Ambisonics}) will +make use of channel mappings other than mapping 0. + + diff --git a/cs/3rd party/libvorbis/doc/05-comment.tex b/cs/3rd party/libvorbis/doc/05-comment.tex new file mode 100644 index 000000000..f06f6b757 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/05-comment.tex @@ -0,0 +1,240 @@ +% -*- mode: latex; TeX-master: "Vorbis_I_spec"; -*- +%!TEX root = Vorbis_I_spec.tex +% $Id$ +\section{comment field and header specification} \label{vorbis:spec:comment} + +\subsection{Overview} + +The Vorbis text comment header is the second (of three) header +packets that begin a Vorbis bitstream. It is meant for short text +comments, not arbitrary metadata; arbitrary metadata belongs in a +separate logical bitstream (usually an XML stream type) that provides +greater structure and machine parseability. + +The comment field is meant to be used much like someone jotting a +quick note on the bottom of a CDR. It should be a little information to +remember the disc by and explain it to others; a short, to-the-point +text note that need not only be a couple words, but isn't going to be +more than a short paragraph. The essentials, in other words, whatever +they turn out to be, eg: + +\begin{quote} +Honest Bob and the Factory-to-Dealer-Incentives, \textit{``I'm Still +Around''}, opening for Moxy Fr\"{u}vous, 1997. +\end{quote} + + + + +\subsection{Comment encoding} + +\subsubsection{Structure} + +The comment header is logically a list of eight-bit-clean vectors; the +number of vectors is bounded to $2^{32}-1$ and the length of each vector +is limited to $2^{32}-1$ bytes. The vector length is encoded; the vector +contents themselves are not null terminated. In addition to the vector +list, there is a single vector for vendor name (also 8 bit clean, +length encoded in 32 bits). For example, the 1.0 release of libvorbis +set the vendor string to ``Xiph.Org libVorbis I 20020717''. + +The vector lengths and number of vectors are stored lsb first, according +to the bit packing conventions of the vorbis codec. However, since data +in the comment header is octet-aligned, they can simply be read as +unaligned 32 bit little endian unsigned integers. + +The comment header is decoded as follows: + +\begin{programlisting} + 1) [vendor\_length] = read an unsigned integer of 32 bits + 2) [vendor\_string] = read a UTF-8 vector as [vendor\_length] octets + 3) [user\_comment\_list\_length] = read an unsigned integer of 32 bits + 4) iterate [user\_comment\_list\_length] times { + 5) [length] = read an unsigned integer of 32 bits + 6) this iteration's user comment = read a UTF-8 vector as [length] octets + } + 7) [framing\_bit] = read a single bit as boolean + 8) if ( [framing\_bit] unset or end-of-packet ) then ERROR + 9) done. +\end{programlisting} + + + + +\subsubsection{Content vector format} + +The comment vectors are structured similarly to a UNIX environment variable. +That is, comment fields consist of a field name and a corresponding value and +look like: + +\begin{quote} +\begin{programlisting} +comment[0]="ARTIST=me"; +comment[1]="TITLE=the sound of Vorbis"; +\end{programlisting} +\end{quote} + +The field name is case-insensitive and may consist of ASCII 0x20 +through 0x7D, 0x3D ('=') excluded. ASCII 0x41 through 0x5A inclusive +(characters A-Z) is to be considered equivalent to ASCII 0x61 through +0x7A inclusive (characters a-z). + + +The field name is immediately followed by ASCII 0x3D ('='); +this equals sign is used to terminate the field name. + + +0x3D is followed by 8 bit clean UTF-8 encoded value of the +field contents to the end of the field. + + +\paragraph{Field names} + +Below is a proposed, minimal list of standard field names with a +description of intended use. No single or group of field names is +mandatory; a comment header may contain one, all or none of the names +in this list. + +\begin{description} %[style=nextline] +\item[TITLE] + Track/Work name + +\item[VERSION] + The version field may be used to differentiate multiple +versions of the same track title in a single collection. (e.g. remix +info) + +\item[ALBUM] + The collection name to which this track belongs + +\item[TRACKNUMBER] + The track number of this piece if part of a specific larger collection or album + +\item[ARTIST] + The artist generally considered responsible for the work. In popular music this is usually the performing band or singer. For classical music it would be the composer. For an audio book it would be the author of the original text. + +\item[PERFORMER] + The artist(s) who performed the work. In classical music this would be the conductor, orchestra, soloists. In an audio book it would be the actor who did the reading. In popular music this is typically the same as the ARTIST and is omitted. + +\item[COPYRIGHT] + Copyright attribution, e.g., '2001 Nobody's Band' or '1999 Jack Moffitt' + +\item[LICENSE] + License information, eg, 'All Rights Reserved', 'Any +Use Permitted', a URL to a license such as a Creative Commons license +("www.creativecommons.org/blahblah/license.html") or the EFF Open +Audio License ('distributed under the terms of the Open Audio +License. see http://www.eff.org/IP/Open\_licenses/eff\_oal.html for +details'), etc. + +\item[ORGANIZATION] + Name of the organization producing the track (i.e. +the 'record label') + +\item[DESCRIPTION] + A short text description of the contents + +\item[GENRE] + A short text indication of music genre + +\item[DATE] + Date the track was recorded + +\item[LOCATION] + Location where track was recorded + +\item[CONTACT] + Contact information for the creators or distributors of the track. This could be a URL, an email address, the physical address of the producing label. + +\item[ISRC] + International Standard Recording Code for the +track; see \href{http://www.ifpi.org/isrc/}{the ISRC +intro page} for more information on ISRC numbers. + +\end{description} + + + +\paragraph{Implications} + +Field names should not be 'internationalized'; this is a +concession to simplicity not an attempt to exclude the majority of +the world that doesn't speak English. Field \emph{contents}, +however, use the UTF-8 character encoding to allow easy representation +of any language. + +We have the length of the entirety of the field and restrictions on +the field name so that the field name is bounded in a known way. Thus +we also have the length of the field contents. + +Individual 'vendors' may use non-standard field names within +reason. The proper use of comment fields should be clear through +context at this point. Abuse will be discouraged. + +There is no vendor-specific prefix to 'nonstandard' field names. +Vendors should make some effort to avoid arbitrarily polluting the +common namespace. We will generally collect the more useful tags +here to help with standardization. + +Field names are not required to be unique (occur once) within a +comment header. As an example, assume a track was recorded by three +well know artists; the following is permissible, and encouraged: + +\begin{quote} +\begin{programlisting} +ARTIST=Dizzy Gillespie +ARTIST=Sonny Rollins +ARTIST=Sonny Stitt +\end{programlisting} +\end{quote} + + + + + + + +\subsubsection{Encoding} + +The comment header comprises the entirety of the second bitstream +header packet. Unlike the first bitstream header packet, it is not +generally the only packet on the second page and may not be restricted +to within the second bitstream page. The length of the comment header +packet is (practically) unbounded. The comment header packet is not +optional; it must be present in the bitstream even if it is +effectively empty. + +The comment header is encoded as follows (as per Ogg's standard +bitstream mapping which renders least-significant-bit of the word to be +coded into the least significant available bit of the current +bitstream octet first): + +\begin{enumerate} + \item + Vendor string length (32 bit unsigned quantity specifying number of octets) + + \item + Vendor string ([vendor string length] octets coded from beginning of string to end of string, not null terminated) + + \item + Number of comment fields (32 bit unsigned quantity specifying number of fields) + + \item + Comment field 0 length (if [Number of comment fields] $>0$; 32 bit unsigned quantity specifying number of octets) + + \item + Comment field 0 ([Comment field 0 length] octets coded from beginning of string to end of string, not null terminated) + + \item + Comment field 1 length (if [Number of comment fields] $>1$...)... + +\end{enumerate} + + +This is actually somewhat easier to describe in code; implementation of the above can be found in \filename{vorbis/lib/info.c}, \function{\_vorbis\_pack\_comment()} and \function{\_vorbis\_unpack\_comment()}. + + + + + + diff --git a/cs/3rd party/libvorbis/doc/06-floor0.tex b/cs/3rd party/libvorbis/doc/06-floor0.tex new file mode 100644 index 000000000..954f786a2 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/06-floor0.tex @@ -0,0 +1,202 @@ +% -*- mode: latex; TeX-master: "Vorbis_I_spec"; -*- +%!TEX root = Vorbis_I_spec.tex +% $Id$ +\section{Floor type 0 setup and decode} \label{vorbis:spec:floor0} + +\subsection{Overview} + +Vorbis floor type zero uses Line Spectral Pair (LSP, also alternately +known as Line Spectral Frequency or LSF) representation to encode a +smooth spectral envelope curve as the frequency response of the LSP +filter. This representation is equivalent to a traditional all-pole +infinite impulse response filter as would be used in linear predictive +coding; LSP representation may be converted to LPC representation and +vice-versa. + + + +\subsection{Floor 0 format} + +Floor zero configuration consists of six integer fields and a list of +VQ codebooks for use in coding/decoding the LSP filter coefficient +values used by each frame. + +\subsubsection{header decode} + +Configuration information for instances of floor zero decodes from the +codec setup header (third packet). configuration decode proceeds as +follows: + +\begin{Verbatim}[commandchars=\\\{\}] + 1) [floor0\_order] = read an unsigned integer of 8 bits + 2) [floor0\_rate] = read an unsigned integer of 16 bits + 3) [floor0\_bark\_map\_size] = read an unsigned integer of 16 bits + 4) [floor0\_amplitude\_bits] = read an unsigned integer of six bits + 5) [floor0\_amplitude\_offset] = read an unsigned integer of eight bits + 6) [floor0\_number\_of\_books] = read an unsigned integer of four bits and add 1 + 7) array [floor0\_book\_list] = read a list of [floor0\_number\_of\_books] unsigned integers of eight bits each; +\end{Verbatim} + +An end-of-packet condition during any of these bitstream reads renders +this stream undecodable. In addition, any element of the array +\varname{[floor0\_book\_list]} that is greater than the maximum codebook +number for this bitstream is an error condition that also renders the +stream undecodable. + + + +\subsubsection{packet decode} \label{vorbis:spec:floor0-decode} + +Extracting a floor0 curve from an audio packet consists of first +decoding the curve amplitude and \varname{[floor0\_order]} LSP +coefficient values from the bitstream, and then computing the floor +curve, which is defined as the frequency response of the decoded LSP +filter. + +Packet decode proceeds as follows: +\begin{Verbatim}[commandchars=\\\{\}] + 1) [amplitude] = read an unsigned integer of [floor0\_amplitude\_bits] bits + 2) if ( [amplitude] is greater than zero ) \{ + 3) [coefficients] is an empty, zero length vector + 4) [booknumber] = read an unsigned integer of \link{vorbis:spec:ilog}{ilog}( [floor0\_number\_of\_books] ) bits + 5) if ( [booknumber] is greater than the highest number decode codebook ) then packet is undecodable + 6) [last] = zero; + 7) vector [temp\_vector] = read vector from bitstream using codebook number [floor0\_book\_list] element [booknumber] in VQ context. + 8) add the scalar value [last] to each scalar in vector [temp\_vector] + 9) [last] = the value of the last scalar in vector [temp\_vector] + 10) concatenate [temp\_vector] onto the end of the [coefficients] vector + 11) if (length of vector [coefficients] is less than [floor0\_order], continue at step 6 + + \} + + 12) done. + +\end{Verbatim} + +Take note of the following properties of decode: +\begin{itemize} + \item An \varname{[amplitude]} value of zero must result in a return code that indicates this channel is unused in this frame (the output of the channel will be all-zeroes in synthesis). Several later stages of decode don't occur for an unused channel. + \item An end-of-packet condition during decode should be considered a +nominal occruence; if end-of-packet is reached during any read +operation above, floor decode is to return 'unused' status as if the +\varname{[amplitude]} value had read zero at the beginning of decode. + + \item The book number used for decode +can, in fact, be stored in the bitstream in \link{vorbis:spec:ilog}{ilog}( \varname{[floor0\_number\_of\_books]} - +1 ) bits. Nevertheless, the above specification is correct and values +greater than the maximum possible book value are reserved. + + \item The number of scalars read into the vector \varname{[coefficients]} +may be greater than \varname{[floor0\_order]}, the number actually +required for curve computation. For example, if the VQ codebook used +for the floor currently being decoded has a +\varname{[codebook\_dimensions]} value of three and +\varname{[floor0\_order]} is ten, the only way to fill all the needed +scalars in \varname{[coefficients]} is to to read a total of twelve +scalars as four vectors of three scalars each. This is not an error +condition, and care must be taken not to allow a buffer overflow in +decode. The extra values are not used and may be ignored or discarded. +\end{itemize} + + + + +\subsubsection{curve computation} \label{vorbis:spec:floor0-synth} + +Given an \varname{[amplitude]} integer and \varname{[coefficients]} +vector from packet decode as well as the [floor0\_order], +[floor0\_rate], [floor0\_bark\_map\_size], [floor0\_amplitude\_bits] and +[floor0\_amplitude\_offset] values from floor setup, and an output +vector size \varname{[n]} specified by the decode process, we compute a +floor output vector. + +If the value \varname{[amplitude]} is zero, the return value is a +length \varname{[n]} vector with all-zero scalars. Otherwise, begin by +assuming the following definitions for the given vector to be +synthesized: + + \begin{displaymath} + \mathrm{map}_i = \left\{ + \begin{array}{ll} + \min ( + \mathtt{floor0\texttt{\_}bark\texttt{\_}map\texttt{\_}size} - 1, + foobar + ) & \textrm{for } i \in [0,n-1] \\ + -1 & \textrm{for } i = n + \end{array} + \right. + \end{displaymath} + + where + + \begin{displaymath} + foobar = + \left\lfloor + \mathrm{bark}\left(\frac{\mathtt{floor0\texttt{\_}rate} \cdot i}{2n}\right) \cdot \frac{\mathtt{floor0\texttt{\_}bark\texttt{\_}map\texttt{\_}size}} {\mathrm{bark}(.5 \cdot \mathtt{floor0\texttt{\_}rate})} + \right\rfloor + \end{displaymath} + + and + + \begin{displaymath} + \mathrm{bark}(x) = 13.1 \arctan (.00074x) + 2.24 \arctan (.0000000185x^2) + .0001x + \end{displaymath} + +The above is used to synthesize the LSP curve on a Bark-scale frequency +axis, then map the result to a linear-scale frequency axis. +Similarly, the below calculation synthesizes the output LSP curve \varname{[output]} on a log +(dB) amplitude scale, mapping it to linear amplitude in the last step: + +\begin{enumerate} + \item \varname{[i]} = 0 + \item \varname{[$\omega$]} = $\pi$ * map element \varname{[i]} / \varname{[floor0\_bark\_map\_size]} + \item if ( \varname{[floor0\_order]} is odd ) { + \begin{enumerate} + \item calculate \varname{[p]} and \varname{[q]} according to: + \begin{eqnarray*} + p & = & (1 - \cos^2\omega)\prod_{j=0}^{\frac{\mathtt{floor0\texttt{\_}order}-3}{2}} 4 (\cos([\mathtt{coefficients}]_{2j+1}) - \cos \omega)^2 \\ + q & = & \frac{1}{4} \prod_{j=0}^{\frac{\mathtt{floor0\texttt{\_}order}-1}{2}} 4 (\cos([\mathtt{coefficients}]_{2j}) - \cos \omega)^2 + \end{eqnarray*} + + \end{enumerate} + } else \varname{[floor0\_order]} is even { + \begin{enumerate}[resume] + \item calculate \varname{[p]} and \varname{[q]} according to: + \begin{eqnarray*} + p & = & \frac{(1 - \cos\omega)}{2} \prod_{j=0}^{\frac{\mathtt{floor0\texttt{\_}order}-2}{2}} 4 (\cos([\mathtt{coefficients}]_{2j+1}) - \cos \omega)^2 \\ + q & = & \frac{(1 + \cos\omega)}{2} \prod_{j=0}^{\frac{\mathtt{floor0\texttt{\_}order}-2}{2}} 4 (\cos([\mathtt{coefficients}]_{2j}) - \cos \omega)^2 + \end{eqnarray*} + + \end{enumerate} + } + + \item calculate \varname{[linear\_floor\_value]} according to: + \begin{displaymath} + \exp \left( .11512925 \left(\frac{\mathtt{amplitude} \cdot \mathtt{floor0\texttt{\_}amplitute\texttt{\_}offset}}{(2^{\mathtt{floor0\texttt{\_}amplitude\texttt{\_}bits}}-1)\sqrt{p+q}} + - \mathtt{floor0\texttt{\_}amplitude\texttt{\_}offset} \right) \right) + \end{displaymath} + + \item \varname{[iteration\_condition]} = map element \varname{[i]} + \item \varname{[output]} element \varname{[i]} = \varname{[linear\_floor\_value]} + \item increment \varname{[i]} + \item if ( map element \varname{[i]} is equal to \varname{[iteration\_condition]} ) continue at step 5 + \item if ( \varname{[i]} is less than \varname{[n]} ) continue at step 2 + \item done +\end{enumerate} + +\paragraph{Errata 20150227: Bark scale computation} + +Due to a typo when typesetting this version of the specification from the original HTML document, the Bark scale computation previously erroneously read: + + \begin{displaymath} + \hbox{\sout{$ + \mathrm{bark}(x) = 13.1 \arctan (.00074x) + 2.24 \arctan (.0000000185x^2 + .0001x) + $}} + \end{displaymath} + +Note that the last parenthesis is misplaced. This document now uses the correct equation as it appeared in the original HTML spec document: + + \begin{displaymath} + \mathrm{bark}(x) = 13.1 \arctan (.00074x) + 2.24 \arctan (.0000000185x^2) + .0001x + \end{displaymath} + diff --git a/cs/3rd party/libvorbis/doc/07-floor1.tex b/cs/3rd party/libvorbis/doc/07-floor1.tex new file mode 100644 index 000000000..ce45c4b1e --- /dev/null +++ b/cs/3rd party/libvorbis/doc/07-floor1.tex @@ -0,0 +1,405 @@ +% -*- mode: latex; TeX-master: "Vorbis_I_spec"; -*- +%!TEX root = Vorbis_I_spec.tex +% $Id$ +\section{Floor type 1 setup and decode} \label{vorbis:spec:floor1} + +\subsection{Overview} + +Vorbis floor type one uses a piecewise straight-line representation to +encode a spectral envelope curve. The representation plots this curve +mechanically on a linear frequency axis and a logarithmic (dB) +amplitude axis. The integer plotting algorithm used is similar to +Bresenham's algorithm. + + + +\subsection{Floor 1 format} + +\subsubsection{model} + +Floor type one represents a spectral curve as a series of +line segments. Synthesis constructs a floor curve using iterative +prediction in a process roughly equivalent to the following simplified +description: + +\begin{itemize} + \item the first line segment (base case) is a logical line spanning +from x_0,y_0 to x_1,y_1 where in the base case x_0=0 and x_1=[n], the +full range of the spectral floor to be computed. + +\item the induction step chooses a point x_new within an existing +logical line segment and produces a y_new value at that point computed +from the existing line's y value at x_new (as plotted by the line) and +a difference value decoded from the bitstream packet. + +\item floor computation produces two new line segments, one running from +x_0,y_0 to x_new,y_new and from x_new,y_new to x_1,y_1. This step is +performed logically even if y_new represents no change to the +amplitude value at x_new so that later refinement is additionally +bounded at x_new. + +\item the induction step repeats, using a list of x values specified in +the codec setup header at floor 1 initialization time. Computation +is completed at the end of the x value list. + +\end{itemize} + + +Consider the following example, with values chosen for ease of +understanding rather than representing typical configuration: + +For the below example, we assume a floor setup with an [n] of 128. +The list of selected X values in increasing order is +0,16,32,48,64,80,96,112 and 128. In list order, the values interleave +as 0, 128, 64, 32, 96, 16, 48, 80 and 112. The corresponding +list-order Y values as decoded from an example packet are 110, 20, -5, +-45, 0, -25, -10, 30 and -10. We compute the floor in the following +way, beginning with the first line: + +\begin{center} +\includegraphics[width=8cm]{floor1-1} +\captionof{figure}{graph of example floor} +\end{center} + +We now draw new logical lines to reflect the correction to new_Y, and +iterate for X positions 32 and 96: + +\begin{center} +\includegraphics[width=8cm]{floor1-2} +\captionof{figure}{graph of example floor} +\end{center} + +Although the new Y value at X position 96 is unchanged, it is still +used later as an endpoint for further refinement. From here on, the +pattern should be clear; we complete the floor computation as follows: + +\begin{center} +\includegraphics[width=8cm]{floor1-3} +\captionof{figure}{graph of example floor} +\end{center} + +\begin{center} +\includegraphics[width=8cm]{floor1-4} +\captionof{figure}{graph of example floor} +\end{center} + +A more efficient algorithm with carefully defined integer rounding +behavior is used for actual decode, as described later. The actual +algorithm splits Y value computation and line plotting into two steps +with modifications to the above algorithm to eliminate noise +accumulation through integer roundoff/truncation. + + + +\subsubsection{header decode} + +A list of floor X values is stored in the packet header in interleaved +format (used in list order during packet decode and synthesis). This +list is split into partitions, and each partition is assigned to a +partition class. X positions 0 and [n] are implicit and do not belong +to an explicit partition or partition class. + +A partition class consists of a representation vector width (the +number of Y values which the partition class encodes at once), a +'subclass' value representing the number of alternate entropy books +the partition class may use in representing Y values, the list of +[subclass] books and a master book used to encode which alternate +books were chosen for representation in a given packet. The +master/subclass mechanism is meant to be used as a flexible +representation cascade while still using codebooks only in a scalar +context. + +\begin{Verbatim}[commandchars=\\\{\}] + + 1) [floor1\_partitions] = read 5 bits as unsigned integer + 2) [maximum\_class] = -1 + 3) iterate [i] over the range 0 ... [floor1\_partitions]-1 \{ + + 4) vector [floor1\_partition\_class\_list] element [i] = read 4 bits as unsigned integer + + \} + + 5) [maximum\_class] = largest integer scalar value in vector [floor1\_partition\_class\_list] + 6) iterate [i] over the range 0 ... [maximum\_class] \{ + + 7) vector [floor1\_class\_dimensions] element [i] = read 3 bits as unsigned integer and add 1 + 8) vector [floor1\_class\_subclasses] element [i] = read 2 bits as unsigned integer + 9) if ( vector [floor1\_class\_subclasses] element [i] is nonzero ) \{ + + 10) vector [floor1\_class\_masterbooks] element [i] = read 8 bits as unsigned integer + + \} + + 11) iterate [j] over the range 0 ... (2 exponent [floor1\_class\_subclasses] element [i]) - 1 \{ + + 12) array [floor1\_subclass\_books] element [i],[j] = + read 8 bits as unsigned integer and subtract one + \} + \} + + 13) [floor1\_multiplier] = read 2 bits as unsigned integer and add one + 14) [rangebits] = read 4 bits as unsigned integer + 15) vector [floor1\_X\_list] element [0] = 0 + 16) vector [floor1\_X\_list] element [1] = 2 exponent [rangebits]; + 17) [floor1\_values] = 2 + 18) iterate [i] over the range 0 ... [floor1\_partitions]-1 \{ + + 19) [current\_class\_number] = vector [floor1\_partition\_class\_list] element [i] + 20) iterate [j] over the range 0 ... ([floor1\_class\_dimensions] element [current\_class\_number])-1 \{ + 21) vector [floor1\_X\_list] element ([floor1\_values]) = + read [rangebits] bits as unsigned integer + 22) increment [floor1\_values] by one + \} + \} + + 23) done +\end{Verbatim} + +An end-of-packet condition while reading any aspect of a floor 1 +configuration during setup renders a stream undecodable. In addition, +a \varname{[floor1\_class\_masterbooks]} or +\varname{[floor1\_subclass\_books]} scalar element greater than the +highest numbered codebook configured in this stream is an error +condition that renders the stream undecodable. Vector +[floor1\_x\_list] is limited to a maximum length of 65 elements; a +setup indicating more than 65 total elements (including elements 0 and +1 set prior to the read loop) renders the stream undecodable. All +vector [floor1\_x\_list] element values must be unique within the +vector; a non-unique value renders the stream undecodable. + +\subsubsection{packet decode} \label{vorbis:spec:floor1-decode} + +Packet decode begins by checking the \varname{[nonzero]} flag: + +\begin{Verbatim}[commandchars=\\\{\}] + 1) [nonzero] = read 1 bit as boolean +\end{Verbatim} + +If \varname{[nonzero]} is unset, that indicates this channel contained +no audio energy in this frame. Decode immediately returns a status +indicating this floor curve (and thus this channel) is unused this +frame. (A return status of 'unused' is different from decoding a +floor that has all points set to minimum representation amplitude, +which happens to be approximately -140dB). + + +Assuming \varname{[nonzero]} is set, decode proceeds as follows: + +\begin{Verbatim}[commandchars=\\\{\}] + 1) [range] = vector \{ 256, 128, 86, 64 \} element ([floor1\_multiplier]-1) + 2) vector [floor1\_Y] element [0] = read \link{vorbis:spec:ilog}{ilog}([range]-1) bits as unsigned integer + 3) vector [floor1\_Y] element [1] = read \link{vorbis:spec:ilog}{ilog}([range]-1) bits as unsigned integer + 4) [offset] = 2; + 5) iterate [i] over the range 0 ... [floor1\_partitions]-1 \{ + + 6) [class] = vector [floor1\_partition\_class] element [i] + 7) [cdim] = vector [floor1\_class\_dimensions] element [class] + 8) [cbits] = vector [floor1\_class\_subclasses] element [class] + 9) [csub] = (2 exponent [cbits])-1 + 10) [cval] = 0 + 11) if ( [cbits] is greater than zero ) \{ + + 12) [cval] = read from packet using codebook number + (vector [floor1\_class\_masterbooks] element [class]) in scalar context + \} + + 13) iterate [j] over the range 0 ... [cdim]-1 \{ + + 14) [book] = array [floor1\_subclass\_books] element [class],([cval] bitwise AND [csub]) + 15) [cval] = [cval] right shifted [cbits] bits + 16) if ( [book] is not less than zero ) \{ + + 17) vector [floor1\_Y] element ([j]+[offset]) = read from packet using codebook + [book] in scalar context + + \} else [book] is less than zero \{ + + 18) vector [floor1\_Y] element ([j]+[offset]) = 0 + + \} + \} + + 19) [offset] = [offset] + [cdim] + + \} + + 20) done +\end{Verbatim} + +An end-of-packet condition during curve decode should be considered a +nominal occurrence; if end-of-packet is reached during any read +operation above, floor decode is to return 'unused' status as if the +\varname{[nonzero]} flag had been unset at the beginning of decode. + + +Vector \varname{[floor1\_Y]} contains the values from packet decode +needed for floor 1 synthesis. + + + +\subsubsection{curve computation} \label{vorbis:spec:floor1-synth} + +Curve computation is split into two logical steps; the first step +derives final Y amplitude values from the encoded, wrapped difference +values taken from the bitstream. The second step plots the curve +lines. Also, although zero-difference values are used in the +iterative prediction to find final Y values, these points are +conditionally skipped during final line computation in step two. +Skipping zero-difference values allows a smoother line fit. + +Although some aspects of the below algorithm look like inconsequential +optimizations, implementors are warned to follow the details closely. +Deviation from implementing a strictly equivalent algorithm can result +in serious decoding errors. + +{\em Additional note:} Although \varname{[floor1\_final\_Y]} values in +the prediction loop and at the end of step 1 are inherently limited by +the prediction algorithm to [0, \varname{[range]}), it is possible to + abuse the setup and codebook machinery to produce negative or + over-range results. We suggest that decoder implementations guard + the values in vector \varname{[floor1\_final\_Y]} by clamping each + element to [0, \varname{[range]}) after step 1. Variants of this + suggestion are acceptable as valid floor1 setups cannot produce + out of range values. + +\begin{description} +\item[step 1: amplitude value synthesis] + +Unwrap the always-positive-or-zero values read from the packet into ++/- difference values, then apply to line prediction. + +\begin{Verbatim}[commandchars=\\\{\}] + 1) [range] = vector \{ 256, 128, 86, 64 \} element ([floor1\_multiplier]-1) + 2) vector [floor1\_step2\_flag] element [0] = set + 3) vector [floor1\_step2\_flag] element [1] = set + 4) vector [floor1\_final\_Y] element [0] = vector [floor1\_Y] element [0] + 5) vector [floor1\_final\_Y] element [1] = vector [floor1\_Y] element [1] + 6) iterate [i] over the range 2 ... [floor1\_values]-1 \{ + + 7) [low\_neighbor\_offset] = \link{vorbis:spec:low:neighbor}{low\_neighbor}([floor1\_X\_list],[i]) + 8) [high\_neighbor\_offset] = \link{vorbis:spec:high:neighbor}{high\_neighbor}([floor1\_X\_list],[i]) + + 9) [predicted] = \link{vorbis:spec:render:point}{render\_point}( vector [floor1\_X\_list] element [low\_neighbor\_offset], + vector [floor1\_final\_Y] element [low\_neighbor\_offset], + vector [floor1\_X\_list] element [high\_neighbor\_offset], + vector [floor1\_final\_Y] element [high\_neighbor\_offset], + vector [floor1\_X\_list] element [i] ) + + 10) [val] = vector [floor1\_Y] element [i] + 11) [highroom] = [range] - [predicted] + 12) [lowroom] = [predicted] + 13) if ( [highroom] is less than [lowroom] ) \{ + + 14) [room] = [highroom] * 2 + + \} else [highroom] is not less than [lowroom] \{ + + 15) [room] = [lowroom] * 2 + + \} + + 16) if ( [val] is nonzero ) \{ + + 17) vector [floor1\_step2\_flag] element [low\_neighbor\_offset] = set + 18) vector [floor1\_step2\_flag] element [high\_neighbor\_offset] = set + 19) vector [floor1\_step2\_flag] element [i] = set + 20) if ( [val] is greater than or equal to [room] ) \{ + + 21) if ( [highroom] is greater than [lowroom] ) \{ + + 22) vector [floor1\_final\_Y] element [i] = [val] - [lowroom] + [predicted] + + \} else [highroom] is not greater than [lowroom] \{ + + 23) vector [floor1\_final\_Y] element [i] = [predicted] - [val] + [highroom] - 1 + + \} + + \} else [val] is less than [room] \{ + + 24) if ([val] is odd) \{ + + 25) vector [floor1\_final\_Y] element [i] = + [predicted] - (([val] + 1) divided by 2 using integer division) + + \} else [val] is even \{ + + 26) vector [floor1\_final\_Y] element [i] = + [predicted] + ([val] / 2 using integer division) + + \} + + \} + + \} else [val] is zero \{ + + 27) vector [floor1\_step2\_flag] element [i] = unset + 28) vector [floor1\_final\_Y] element [i] = [predicted] + + \} + + \} + + 29) done + +\end{Verbatim} + + + +\item[step 2: curve synthesis] + +Curve synthesis generates a return vector \varname{[floor]} of length +\varname{[n]} (where \varname{[n]} is provided by the decode process +calling to floor decode). Floor 1 curve synthesis makes use of the +\varname{[floor1\_X\_list]}, \varname{[floor1\_final\_Y]} and +\varname{[floor1\_step2\_flag]} vectors, as well as [floor1\_multiplier] +and [floor1\_values] values. + +Decode begins by sorting the scalars from vectors +\varname{[floor1\_X\_list]}, \varname{[floor1\_final\_Y]} and +\varname{[floor1\_step2\_flag]} together into new vectors +\varname{[floor1\_X\_list]'}, \varname{[floor1\_final\_Y]'} and +\varname{[floor1\_step2\_flag]'} according to ascending sort order of the +values in \varname{[floor1\_X\_list]}. That is, sort the values of +\varname{[floor1\_X\_list]} and then apply the same permutation to +elements of the other two vectors so that the X, Y and step2\_flag +values still match. + +Then compute the final curve in one pass: + +\begin{Verbatim}[commandchars=\\\{\}] + 1) [hx] = 0 + 2) [lx] = 0 + 3) [ly] = vector [floor1\_final\_Y]' element [0] * [floor1\_multiplier] + 4) iterate [i] over the range 1 ... [floor1\_values]-1 \{ + + 5) if ( [floor1\_step2\_flag]' element [i] is set ) \{ + + 6) [hy] = [floor1\_final\_Y]' element [i] * [floor1\_multiplier] + 7) [hx] = [floor1\_X\_list]' element [i] + 8) \link{vorbis:spec:render:line}{render\_line}( [lx], [ly], [hx], [hy], [floor] ) + 9) [lx] = [hx] + 10) [ly] = [hy] + \} + \} + + 11) if ( [hx] is less than [n] ) \{ + + 12) \link{vorbis:spec:render:line}{render\_line}( [hx], [hy], [n], [hy], [floor] ) + + \} + + 13) if ( [hx] is greater than [n] ) \{ + + 14) truncate vector [floor] to [n] elements + + \} + + 15) for each scalar in vector [floor], perform a lookup substitution using + the scalar value from [floor] as an offset into the vector \link{vorbis:spec:floor1:inverse:dB:table}{[floor1\_inverse\_dB\_static\_table]} + + 16) done + +\end{Verbatim} + +\end{description} diff --git a/cs/3rd party/libvorbis/doc/08-residue.tex b/cs/3rd party/libvorbis/doc/08-residue.tex new file mode 100644 index 000000000..b2e63d207 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/08-residue.tex @@ -0,0 +1,452 @@ +% -*- mode: latex; TeX-master: "Vorbis_I_spec"; -*- +%!TEX root = Vorbis_I_spec.tex +% $Id$ +\section{Residue setup and decode} \label{vorbis:spec:residue} + +\subsection{Overview} + +A residue vector represents the fine detail of the audio spectrum of +one channel in an audio frame after the encoder subtracts the floor +curve and performs any channel coupling. A residue vector may +represent spectral lines, spectral magnitude, spectral phase or +hybrids as mixed by channel coupling. The exact semantic content of +the vector does not matter to the residue abstraction. + +Whatever the exact qualities, the Vorbis residue abstraction codes the +residue vectors into the bitstream packet, and then reconstructs the +vectors during decode. Vorbis makes use of three different encoding +variants (numbered 0, 1 and 2) of the same basic vector encoding +abstraction. + + + +\subsection{Residue format} + +Residue format partitions each vector in the vector bundle into chunks, +classifies each chunk, encodes the chunk classifications and finally +encodes the chunks themselves using the the specific VQ arrangement +defined for each selected classification. +The exact interleaving and partitioning vary by residue encoding number, +however the high-level process used to classify and encode the residue +vector is the same in all three variants. + +A set of coded residue vectors are all of the same length. High level +coding structure, ignoring for the moment exactly how a partition is +encoded and simply trusting that it is, is as follows: + +\begin{itemize} +\item Each vector is partitioned into multiple equal sized chunks +according to configuration specified. If we have a vector size of +\emph{n}, a partition size \emph{residue\_partition\_size}, and a total +of \emph{ch} residue vectors, the total number of partitioned chunks +coded is \emph{n}/\emph{residue\_partition\_size}*\emph{ch}. It is +important to note that the integer division truncates. In the below +example, we assume an example \emph{residue\_partition\_size} of 8. + +\item Each partition in each vector has a classification number that +specifies which of multiple configured VQ codebook setups are used to +decode that partition. The classification numbers of each partition +can be thought of as forming a vector in their own right, as in the +illustration below. Just as the residue vectors are coded in grouped +partitions to increase encoding efficiency, the classification vector +is also partitioned into chunks. The integer elements of each scalar +in a classification chunk are built into a single scalar that +represents the classification numbers in that chunk. In the below +example, the classification codeword encodes two classification +numbers. + +\item The values in a residue vector may be encoded monolithically in a +single pass through the residue vector, but more often efficient +codebook design dictates that each vector is encoded as the additive +sum of several passes through the residue vector using more than one +VQ codebook. Thus, each residue value potentially accumulates values +from multiple decode passes. The classification value associated with +a partition is the same in each pass, thus the classification codeword +is coded only in the first pass. + +\end{itemize} + + +\begin{center} +\includegraphics[width=\textwidth]{residue-pack} +\captionof{figure}{illustration of residue vector format} +\end{center} + + + +\subsection{residue 0} + +Residue 0 and 1 differ only in the way the values within a residue +partition are interleaved during partition encoding (visually treated +as a black box--or cyan box or brown box--in the above figure). + +Residue encoding 0 interleaves VQ encoding according to the +dimension of the codebook used to encode a partition in a specific +pass. The dimension of the codebook need not be the same in multiple +passes, however the partition size must be an even multiple of the +codebook dimension. + +As an example, assume a partition vector of size eight, to be encoded +by residue 0 using codebook sizes of 8, 4, 2 and 1: + +\begin{programlisting} + + original residue vector: [ 0 1 2 3 4 5 6 7 ] + +codebook dimensions = 8 encoded as: [ 0 1 2 3 4 5 6 7 ] + +codebook dimensions = 4 encoded as: [ 0 2 4 6 ], [ 1 3 5 7 ] + +codebook dimensions = 2 encoded as: [ 0 4 ], [ 1 5 ], [ 2 6 ], [ 3 7 ] + +codebook dimensions = 1 encoded as: [ 0 ], [ 1 ], [ 2 ], [ 3 ], [ 4 ], [ 5 ], [ 6 ], [ 7 ] + +\end{programlisting} + +It is worth mentioning at this point that no configurable value in the +residue coding setup is restricted to a power of two. + + + +\subsection{residue 1} + +Residue 1 does not interleave VQ encoding. It represents partition +vector scalars in order. As with residue 0, however, partition length +must be an integer multiple of the codebook dimension, although +dimension may vary from pass to pass. + +As an example, assume a partition vector of size eight, to be encoded +by residue 0 using codebook sizes of 8, 4, 2 and 1: + +\begin{programlisting} + + original residue vector: [ 0 1 2 3 4 5 6 7 ] + +codebook dimensions = 8 encoded as: [ 0 1 2 3 4 5 6 7 ] + +codebook dimensions = 4 encoded as: [ 0 1 2 3 ], [ 4 5 6 7 ] + +codebook dimensions = 2 encoded as: [ 0 1 ], [ 2 3 ], [ 4 5 ], [ 6 7 ] + +codebook dimensions = 1 encoded as: [ 0 ], [ 1 ], [ 2 ], [ 3 ], [ 4 ], [ 5 ], [ 6 ], [ 7 ] + +\end{programlisting} + + + +\subsection{residue 2} + +Residue type two can be thought of as a variant of residue type 1. +Rather than encoding multiple passed-in vectors as in residue type 1, +the \emph{ch} passed in vectors of length \emph{n} are first +interleaved and flattened into a single vector of length +\emph{ch}*\emph{n}. Encoding then proceeds as in type 1. Decoding is +as in type 1 with decode interleave reversed. If operating on a single +vector to begin with, residue type 1 and type 2 are equivalent. + +\begin{center} +\includegraphics[width=\textwidth]{residue2} +\captionof{figure}{illustration of residue type 2} +\end{center} + + +\subsection{Residue decode} + +\subsubsection{header decode} + +Header decode for all three residue types is identical. +\begin{programlisting} + 1) [residue\_begin] = read 24 bits as unsigned integer + 2) [residue\_end] = read 24 bits as unsigned integer + 3) [residue\_partition\_size] = read 24 bits as unsigned integer and add one + 4) [residue\_classifications] = read 6 bits as unsigned integer and add one + 5) [residue\_classbook] = read 8 bits as unsigned integer +\end{programlisting} + +\varname{[residue\_begin]} and +\varname{[residue\_end]} select the specific sub-portion of +each vector that is actually coded; it implements akin to a bandpass +where, for coding purposes, the vector effectively begins at element +\varname{[residue\_begin]} and ends at +\varname{[residue\_end]}. Preceding and following values in +the unpacked vectors are zeroed. Note that for residue type 2, these +values as well as \varname{[residue\_partition\_size]}apply to +the interleaved vector, not the individual vectors before interleave. +\varname{[residue\_partition\_size]} is as explained above, +\varname{[residue\_classifications]} is the number of possible +classification to which a partition can belong and +\varname{[residue\_classbook]} is the codebook number used to +code classification codewords. The number of dimensions in book +\varname{[residue\_classbook]} determines how many +classification values are grouped into a single classification +codeword. Note that the number of entries and dimensions in book +\varname{[residue\_classbook]}, along with +\varname{[residue\_classifications]}, overdetermines to +possible number of classification codewords. +If \varname{[residue\_classifications]}\^{}\varname{[residue\_classbook]}.dimensions +exceeds \varname{[residue\_classbook]}.entries, the +bitstream should be regarded to be undecodable. + +Next we read a bitmap pattern that specifies which partition classes +code values in which passes. + +\begin{programlisting} + 1) iterate [i] over the range 0 ... [residue\_classifications]-1 { + + 2) [high\_bits] = 0 + 3) [low\_bits] = read 3 bits as unsigned integer + 4) [bitflag] = read one bit as boolean + 5) if ( [bitflag] is set ) then [high\_bits] = read five bits as unsigned integer + 6) vector [residue\_cascade] element [i] = [high\_bits] * 8 + [low\_bits] + } + 7) done +\end{programlisting} + +Finally, we read in a list of book numbers, each corresponding to +specific bit set in the cascade bitmap. We loop over the possible +codebook classifications and the maximum possible number of encoding +stages (8 in Vorbis I, as constrained by the elements of the cascade +bitmap being eight bits): + +\begin{programlisting} + 1) iterate [i] over the range 0 ... [residue\_classifications]-1 { + + 2) iterate [j] over the range 0 ... 7 { + + 3) if ( vector [residue\_cascade] element [i] bit [j] is set ) { + + 4) array [residue\_books] element [i][j] = read 8 bits as unsigned integer + + } else { + + 5) array [residue\_books] element [i][j] = unused + + } + } + } + + 6) done +\end{programlisting} + +An end-of-packet condition at any point in header decode renders the +stream undecodable. In addition, any codebook number greater than the +maximum numbered codebook set up in this stream also renders the +stream undecodable. All codebooks in array [residue\_books] are +required to have a value mapping. The presence of codebook in array +[residue\_books] without a value mapping (maptype equals zero) renders +the stream undecodable. + + + +\subsubsection{packet decode} + +Format 0 and 1 packet decode is identical except for specific +partition interleave. Format 2 packet decode can be built out of the +format 1 decode process. Thus we describe first the decode +infrastructure identical to all three formats. + +In addition to configuration information, the residue decode process +is passed the number of vectors in the submap bundle and a vector of +flags indicating if any of the vectors are not to be decoded. If the +passed in number of vectors is 3 and vector number 1 is marked 'do not +decode', decode skips vector 1 during the decode loop. However, even +'do not decode' vectors are allocated and zeroed. + +Depending on the values of \varname{[residue\_begin]} and +\varname{[residue\_end]}, it is obvious that the encoded +portion of a residue vector may be the entire possible residue vector +or some other strict subset of the actual residue vector size with +zero padding at either uncoded end. However, it is also possible to +set \varname{[residue\_begin]} and +\varname{[residue\_end]} to specify a range partially or +wholly beyond the maximum vector size. Before beginning residue +decode, limit \varname{[residue\_begin]} and +\varname{[residue\_end]} to the maximum possible vector size +as follows. We assume that the number of vectors being encoded, +\varname{[ch]} is provided by the higher level decoding +process. + +\begin{programlisting} + 1) [actual\_size] = current blocksize/2; + 2) if residue encoding is format 2 + 3) [actual\_size] = [actual\_size] * [ch]; + 4) [limit\_residue\_begin] = maximum of ([residue\_begin],[actual\_size]); + 5) [limit\_residue\_end] = maximum of ([residue\_end],[actual\_size]); +\end{programlisting} + +The following convenience values are conceptually useful to clarifying +the decode process: + +\begin{programlisting} + 1) [classwords\_per\_codeword] = [codebook\_dimensions] value of codebook [residue\_classbook] + 2) [n\_to\_read] = [limit\_residue\_end] - [limit\_residue\_begin] + 3) [partitions\_to\_read] = [n\_to\_read] / [residue\_partition\_size] +\end{programlisting} + +Packet decode proceeds as follows, matching the description offered earlier in the document. +\begin{programlisting} + 1) allocate and zero all vectors that will be returned. + 2) if ([n\_to\_read] is zero), stop; there is no residue to decode. + 3) iterate [pass] over the range 0 ... 7 { + + 4) [partition\_count] = 0 + + 5) while [partition\_count] is less than [partitions\_to\_read] + + 6) if ([pass] is zero) { + + 7) iterate [j] over the range 0 .. [ch]-1 { + + 8) if vector [j] is not marked 'do not decode' { + + 9) [temp] = read from packet using codebook [residue\_classbook] in scalar context + 10) iterate [i] descending over the range [classwords\_per\_codeword]-1 ... 0 { + + 11) array [classifications] element [j],([i]+[partition\_count]) = + [temp] integer modulo [residue\_classifications] + 12) [temp] = [temp] / [residue\_classifications] using integer division + + } + + } + + } + + } + + 13) iterate [i] over the range 0 .. ([classwords\_per\_codeword] - 1) while [partition\_count] + is also less than [partitions\_to\_read] { + + 14) iterate [j] over the range 0 .. [ch]-1 { + + 15) if vector [j] is not marked 'do not decode' { + + 16) [vqclass] = array [classifications] element [j],[partition\_count] + 17) [vqbook] = array [residue\_books] element [vqclass],[pass] + 18) if ([vqbook] is not 'unused') { + + 19) decode partition into output vector number [j], starting at scalar + offset [limit\_residue\_begin]+[partition\_count]*[residue\_partition\_size] using + codebook number [vqbook] in VQ context + } + } + + 20) increment [partition\_count] by one + + } + } + } + + 21) done + +\end{programlisting} + +An end-of-packet condition during packet decode is to be considered a +nominal occurrence. Decode returns the result of vector decode up to +that point. + + + +\subsubsection{format 0 specifics} + +Format zero decodes partitions exactly as described earlier in the +'Residue Format: residue 0' section. The following pseudocode +presents the same algorithm. Assume: + +\begin{itemize} +\item \varname{[n]} is the value in \varname{[residue\_partition\_size]} +\item \varname{[v]} is the residue vector +\item \varname{[offset]} is the beginning read offset in [v] +\end{itemize} + + +\begin{programlisting} + 1) [step] = [n] / [codebook\_dimensions] + 2) iterate [i] over the range 0 ... [step]-1 { + + 3) vector [entry\_temp] = read vector from packet using current codebook in VQ context + 4) iterate [j] over the range 0 ... [codebook\_dimensions]-1 { + + 5) vector [v] element ([offset]+[i]+[j]*[step]) = + vector [v] element ([offset]+[i]+[j]*[step]) + + vector [entry\_temp] element [j] + + } + + } + + 6) done + +\end{programlisting} + + + +\subsubsection{format 1 specifics} + +Format 1 decodes partitions exactly as described earlier in the +'Residue Format: residue 1' section. The following pseudocode +presents the same algorithm. Assume: + +\begin{itemize} +\item \varname{[n]} is the value in +\varname{[residue\_partition\_size]} +\item \varname{[v]} is the residue vector +\item \varname{[offset]} is the beginning read offset in [v] +\end{itemize} + + +\begin{programlisting} + 1) [i] = 0 + 2) vector [entry\_temp] = read vector from packet using current codebook in VQ context + 3) iterate [j] over the range 0 ... [codebook\_dimensions]-1 { + + 4) vector [v] element ([offset]+[i]) = + vector [v] element ([offset]+[i]) + + vector [entry\_temp] element [j] + 5) increment [i] + + } + + 6) if ( [i] is less than [n] ) continue at step 2 + 7) done +\end{programlisting} + + + +\subsubsection{format 2 specifics} + +Format 2 is reducible to format 1. It may be implemented as an additional step prior to and an additional post-decode step after a normal format 1 decode. + + +Format 2 handles 'do not decode' vectors differently than residue 0 or +1; if all vectors are marked 'do not decode', no decode occurrs. +However, if at least one vector is to be decoded, all the vectors are +decoded. We then request normal format 1 to decode a single vector +representing all output channels, rather than a vector for each +channel. After decode, deinterleave the vector into independent vectors, one for each output channel. That is: + +\begin{enumerate} + \item If all vectors 0 through \emph{ch}-1 are marked 'do not decode', allocate and clear a single vector \varname{[v]}of length \emph{ch*n} and skip step 2 below; proceed directly to the post-decode step. + \item Rather than performing format 1 decode to produce \emph{ch} vectors of length \emph{n} each, call format 1 decode to produce a single vector \varname{[v]} of length \emph{ch*n}. + \item Post decode: Deinterleave the single vector \varname{[v]} returned by format 1 decode as described above into \emph{ch} independent vectors, one for each outputchannel, according to: + \begin{programlisting} + 1) iterate [i] over the range 0 ... [n]-1 { + + 2) iterate [j] over the range 0 ... [ch]-1 { + + 3) output vector number [j] element [i] = vector [v] element ([i] * [ch] + [j]) + + } + } + + 4) done + \end{programlisting} + +\end{enumerate} + + + + + + + diff --git a/cs/3rd party/libvorbis/doc/09-helper.tex b/cs/3rd party/libvorbis/doc/09-helper.tex new file mode 100644 index 000000000..f2d964bcc --- /dev/null +++ b/cs/3rd party/libvorbis/doc/09-helper.tex @@ -0,0 +1,181 @@ +% -*- mode: latex; TeX-master: "Vorbis_I_spec"; -*- +%!TEX root = Vorbis_I_spec.tex +% $Id$ +\section{Helper equations} \label{vorbis:spec:helper} + +\subsection{Overview} + +The equations below are used in multiple places by the Vorbis codec +specification. Rather than cluttering up the main specification +documents, they are defined here and referenced where appropriate. + + +\subsection{Functions} + +\subsubsection{ilog} \label{vorbis:spec:ilog} + +The "ilog(x)" function returns the position number (1 through n) of the highest set bit in the two's complement integer value +\varname{[x]}. Values of \varname{[x]} less than zero are defined to return zero. + +\begin{programlisting} + 1) [return\_value] = 0; + 2) if ( [x] is greater than zero ) { + + 3) increment [return\_value]; + 4) logical shift [x] one bit to the right, padding the MSb with zero + 5) repeat at step 2) + + } + + 6) done +\end{programlisting} + +Examples: + +\begin{itemize} + \item ilog(0) = 0; + \item ilog(1) = 1; + \item ilog(2) = 2; + \item ilog(3) = 2; + \item ilog(4) = 3; + \item ilog(7) = 3; + \item ilog(negative number) = 0; +\end{itemize} + + + + +\subsubsection{float32\_unpack} \label{vorbis:spec:float32:unpack} + +"float32\_unpack(x)" is intended to translate the packed binary +representation of a Vorbis codebook float value into the +representation used by the decoder for floating point numbers. For +purposes of this example, we will unpack a Vorbis float32 into a +host-native floating point number. + +\begin{programlisting} + 1) [mantissa] = [x] bitwise AND 0x1fffff (unsigned result) + 2) [sign] = [x] bitwise AND 0x80000000 (unsigned result) + 3) [exponent] = ( [x] bitwise AND 0x7fe00000) shifted right 21 bits (unsigned result) + 4) if ( [sign] is nonzero ) then negate [mantissa] + 5) return [mantissa] * ( 2 ^ ( [exponent] - 788 ) ) +\end{programlisting} + + + +\subsubsection{lookup1\_values} \label{vorbis:spec:lookup1:values} + +"lookup1\_values(codebook\_entries,codebook\_dimensions)" is used to +compute the correct length of the value index for a codebook VQ lookup +table of lookup type 1. The values on this list are permuted to +construct the VQ vector lookup table of size +\varname{[codebook\_entries]}. + +The return value for this function is defined to be 'the greatest +integer value for which \varname{[return\_value]} to the power of +\varname{[codebook\_dimensions]} is less than or equal to +\varname{[codebook\_entries]}'. + + + +\subsubsection{low\_neighbor} \label{vorbis:spec:low:neighbor} + +"low\_neighbor(v,x)" finds the position \varname{n} in vector \varname{[v]} of +the greatest value scalar element for which \varname{n} is less than +\varname{[x]} and vector \varname{[v]} element \varname{n} is less +than vector \varname{[v]} element \varname{[x]}. + +\subsubsection{high\_neighbor} \label{vorbis:spec:high:neighbor} + +"high\_neighbor(v,x)" finds the position \varname{n} in vector [v] of +the lowest value scalar element for which \varname{n} is less than +\varname{[x]} and vector \varname{[v]} element \varname{n} is greater +than vector \varname{[v]} element \varname{[x]}. + + + +\subsubsection{render\_point} \label{vorbis:spec:render:point} + +"render\_point(x0,y0,x1,y1,X)" is used to find the Y value at point X +along the line specified by x0, x1, y0 and y1. This function uses an +integer algorithm to solve for the point directly without calculating +intervening values along the line. + +\begin{programlisting} + 1) [dy] = [y1] - [y0] + 2) [adx] = [x1] - [x0] + 3) [ady] = absolute value of [dy] + 4) [err] = [ady] * ([X] - [x0]) + 5) [off] = [err] / [adx] using integer division + 6) if ( [dy] is less than zero ) { + + 7) [Y] = [y0] - [off] + + } else { + + 8) [Y] = [y0] + [off] + + } + + 9) done +\end{programlisting} + + + +\subsubsection{render\_line} \label{vorbis:spec:render:line} + +Floor decode type one uses the integer line drawing algorithm of +"render\_line(x0, y0, x1, y1, v)" to construct an integer floor +curve for contiguous piecewise line segments. Note that it has not +been relevant elsewhere, but here we must define integer division as +rounding division of both positive and negative numbers toward zero. + + +\begin{programlisting} + 1) [dy] = [y1] - [y0] + 2) [adx] = [x1] - [x0] + 3) [ady] = absolute value of [dy] + 4) [base] = [dy] / [adx] using integer division + 5) [x] = [x0] + 6) [y] = [y0] + 7) [err] = 0 + + 8) if ( [dy] is less than 0 ) { + + 9) [sy] = [base] - 1 + + } else { + + 10) [sy] = [base] + 1 + + } + + 11) [ady] = [ady] - (absolute value of [base]) * [adx] + 12) vector [v] element [x] = [y] + + 13) iterate [x] over the range [x0]+1 ... [x1]-1 { + + 14) [err] = [err] + [ady]; + 15) if ( [err] >= [adx] ) { + + 16) [err] = [err] - [adx] + 17) [y] = [y] + [sy] + + } else { + + 18) [y] = [y] + [base] + + } + + 19) vector [v] element [x] = [y] + + } +\end{programlisting} + + + + + + + + diff --git a/cs/3rd party/libvorbis/doc/10-tables.tex b/cs/3rd party/libvorbis/doc/10-tables.tex new file mode 100644 index 000000000..b91d44955 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/10-tables.tex @@ -0,0 +1,77 @@ +% -*- mode: latex; TeX-master: "Vorbis_I_spec"; -*- +%!TEX root = Vorbis_I_spec.tex +% $Id$ +\section{Tables} \label{vorbis:spec:tables} + +\subsection{floor1\_inverse\_dB\_table} \label{vorbis:spec:floor1:inverse:dB:table} + +The vector \varname{[floor1\_inverse\_dB\_table]} is a 256 element static +lookup table consisting of the following values (read left to right +then top to bottom): + +\begin{Verbatim} + 1.0649863e-07, 1.1341951e-07, 1.2079015e-07, 1.2863978e-07, + 1.3699951e-07, 1.4590251e-07, 1.5538408e-07, 1.6548181e-07, + 1.7623575e-07, 1.8768855e-07, 1.9988561e-07, 2.1287530e-07, + 2.2670913e-07, 2.4144197e-07, 2.5713223e-07, 2.7384213e-07, + 2.9163793e-07, 3.1059021e-07, 3.3077411e-07, 3.5226968e-07, + 3.7516214e-07, 3.9954229e-07, 4.2550680e-07, 4.5315863e-07, + 4.8260743e-07, 5.1396998e-07, 5.4737065e-07, 5.8294187e-07, + 6.2082472e-07, 6.6116941e-07, 7.0413592e-07, 7.4989464e-07, + 7.9862701e-07, 8.5052630e-07, 9.0579828e-07, 9.6466216e-07, + 1.0273513e-06, 1.0941144e-06, 1.1652161e-06, 1.2409384e-06, + 1.3215816e-06, 1.4074654e-06, 1.4989305e-06, 1.5963394e-06, + 1.7000785e-06, 1.8105592e-06, 1.9282195e-06, 2.0535261e-06, + 2.1869758e-06, 2.3290978e-06, 2.4804557e-06, 2.6416497e-06, + 2.8133190e-06, 2.9961443e-06, 3.1908506e-06, 3.3982101e-06, + 3.6190449e-06, 3.8542308e-06, 4.1047004e-06, 4.3714470e-06, + 4.6555282e-06, 4.9580707e-06, 5.2802740e-06, 5.6234160e-06, + 5.9888572e-06, 6.3780469e-06, 6.7925283e-06, 7.2339451e-06, + 7.7040476e-06, 8.2047000e-06, 8.7378876e-06, 9.3057248e-06, + 9.9104632e-06, 1.0554501e-05, 1.1240392e-05, 1.1970856e-05, + 1.2748789e-05, 1.3577278e-05, 1.4459606e-05, 1.5399272e-05, + 1.6400004e-05, 1.7465768e-05, 1.8600792e-05, 1.9809576e-05, + 2.1096914e-05, 2.2467911e-05, 2.3928002e-05, 2.5482978e-05, + 2.7139006e-05, 2.8902651e-05, 3.0780908e-05, 3.2781225e-05, + 3.4911534e-05, 3.7180282e-05, 3.9596466e-05, 4.2169667e-05, + 4.4910090e-05, 4.7828601e-05, 5.0936773e-05, 5.4246931e-05, + 5.7772202e-05, 6.1526565e-05, 6.5524908e-05, 6.9783085e-05, + 7.4317983e-05, 7.9147585e-05, 8.4291040e-05, 8.9768747e-05, + 9.5602426e-05, 0.00010181521, 0.00010843174, 0.00011547824, + 0.00012298267, 0.00013097477, 0.00013948625, 0.00014855085, + 0.00015820453, 0.00016848555, 0.00017943469, 0.00019109536, + 0.00020351382, 0.00021673929, 0.00023082423, 0.00024582449, + 0.00026179955, 0.00027881276, 0.00029693158, 0.00031622787, + 0.00033677814, 0.00035866388, 0.00038197188, 0.00040679456, + 0.00043323036, 0.00046138411, 0.00049136745, 0.00052329927, + 0.00055730621, 0.00059352311, 0.00063209358, 0.00067317058, + 0.00071691700, 0.00076350630, 0.00081312324, 0.00086596457, + 0.00092223983, 0.00098217216, 0.0010459992, 0.0011139742, + 0.0011863665, 0.0012634633, 0.0013455702, 0.0014330129, + 0.0015261382, 0.0016253153, 0.0017309374, 0.0018434235, + 0.0019632195, 0.0020908006, 0.0022266726, 0.0023713743, + 0.0025254795, 0.0026895994, 0.0028643847, 0.0030505286, + 0.0032487691, 0.0034598925, 0.0036847358, 0.0039241906, + 0.0041792066, 0.0044507950, 0.0047400328, 0.0050480668, + 0.0053761186, 0.0057254891, 0.0060975636, 0.0064938176, + 0.0069158225, 0.0073652516, 0.0078438871, 0.0083536271, + 0.0088964928, 0.009474637, 0.010090352, 0.010746080, + 0.011444421, 0.012188144, 0.012980198, 0.013823725, + 0.014722068, 0.015678791, 0.016697687, 0.017782797, + 0.018938423, 0.020169149, 0.021479854, 0.022875735, + 0.024362330, 0.025945531, 0.027631618, 0.029427276, + 0.031339626, 0.033376252, 0.035545228, 0.037855157, + 0.040315199, 0.042935108, 0.045725273, 0.048696758, + 0.051861348, 0.055231591, 0.058820850, 0.062643361, + 0.066714279, 0.071049749, 0.075666962, 0.080584227, + 0.085821044, 0.091398179, 0.097337747, 0.10366330, + 0.11039993, 0.11757434, 0.12521498, 0.13335215, + 0.14201813, 0.15124727, 0.16107617, 0.17154380, + 0.18269168, 0.19456402, 0.20720788, 0.22067342, + 0.23501402, 0.25028656, 0.26655159, 0.28387361, + 0.30232132, 0.32196786, 0.34289114, 0.36517414, + 0.38890521, 0.41417847, 0.44109412, 0.46975890, + 0.50028648, 0.53279791, 0.56742212, 0.60429640, + 0.64356699, 0.68538959, 0.72993007, 0.77736504, + 0.82788260, 0.88168307, 0.9389798, 1. +\end{Verbatim} diff --git a/cs/3rd party/libvorbis/doc/Doxyfile.in b/cs/3rd party/libvorbis/doc/Doxyfile.in new file mode 100644 index 000000000..cdb894fa6 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/Doxyfile.in @@ -0,0 +1,1142 @@ +# Doxyfile 1.3.7 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = @PACKAGE@ + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = @VERSION@ + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = vorbis + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 2 levels of 10 sub-directories under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of source +# files, where putting all generated files in the same directory would otherwise +# cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, +# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en +# (Japanese with English messages), Korean, Korean-en, Norwegian, Polish, Portuguese, +# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). +#This tag is now obsolete, according to doxygen 1.5.2 +#USE_WINDOWS_ENCODING = NO + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is used +# as the annotated text. Otherwise, the brief description is used as-is. If left +# blank, the following values are used ("$name" is automatically replaced with the +# name of the entity): "The $name class" "The $name widget" "The $name file" +# "is" "provides" "specifies" "contains" "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited +# members of a class in the documentation of that class as if those members were +# ordinary class members. Constructors, destructors and assignment operators of +# the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = YES + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources +# only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = @top_srcdir@/include/vorbis + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp +# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories +# that are symbolic links (a Unix filesystem feature) are excluded from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. + +INPUT_FILTER = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = NO + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = YES + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_PREDEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse the +# parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or +# super classes. Setting the tag to NO turns the diagrams off. Note that this +# option is superseded by the HAVE_DOT option below. This is only a fallback. It is +# recommended to install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found on the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. +#This tag is now obsolete, according to doxygen 1.5.2 +#MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. +#This tag is now obsolete, according to doxygen 1.5.2 +#MAX_DOT_GRAPH_HEIGHT = 1024 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes that +# lay further from the root node will be omitted. Note that setting this option to +# 1 or 2 may greatly reduce the computation time needed for large code bases. Also +# note that a graph may be further truncated if the graph's image dimensions are +# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). +# If 0 is used for the depth value (the default), the graph is not depth-constrained. +#This tag is now obsolete, according to doxygen 1.5.2 +#MAX_DOT_GRAPH_DEPTH = 0 + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO diff --git a/cs/3rd party/libvorbis/doc/Makefile.am b/cs/3rd party/libvorbis/doc/Makefile.am new file mode 100644 index 000000000..0e96ba1e7 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/Makefile.am @@ -0,0 +1,148 @@ +## Process this with automake to create Makefile.in + +SUBDIRS = libvorbis vorbisfile vorbisenc + +docdir = $(datadir)/doc/$(PACKAGE)-$(VERSION) + +### all of the static docs, commited to SVN and included as is +static_docs = \ + rfc5215.xml \ + rfc5215.txt \ + eightphase.png \ + fish_xiph_org.png \ + floor1_inverse_dB_table.html \ + floorval.png \ + fourphase.png \ + framing.html \ + helper.html \ + index.html \ + oggstream.html \ + programming.html \ + squarepolar.png \ + stereo.html \ + stream.png \ + v-comment.html \ + vorbis-clip.txt \ + vorbis-errors.txt \ + vorbis-fidelity.html + +# bits needed by the spec +SPEC_PNG = \ + components.png \ + floor1-1.png \ + floor1-2.png \ + floor1-3.png \ + floor1-4.png \ + hufftree.png \ + hufftree-under.png \ + residue-pack.png \ + residue2.png \ + window1.png \ + window2.png \ + Vorbis_I_spec0x.png \ + Vorbis_I_spec1x.png \ + Vorbis_I_spec2x.png \ + Vorbis_I_spec3x.png \ + Vorbis_I_spec4x.png \ + Vorbis_I_spec5x.png \ + Vorbis_I_spec6x.png \ + Vorbis_I_spec7x.png \ + Vorbis_I_spec8x.png \ + Vorbis_I_spec9x.png \ + Vorbis_I_spec10x.png \ + Vorbis_I_spec11x.png \ + Vorbis_I_spec12x.png \ + Vorbis_I_spec13x.png \ + Vorbis_I_spec14x.png + +SPEC_TEX = \ + Vorbis_I_spec.tex \ + 01-introduction.tex \ + 02-bitpacking.tex \ + 03-codebook.tex \ + 04-codec.tex \ + 05-comment.tex \ + 06-floor0.tex \ + 07-floor1.tex \ + 08-residue.tex \ + 09-helper.tex \ + 10-tables.tex \ + a1-encapsulation-ogg.tex \ + a2-encapsulation-rtp.tex \ + footer.tex + +built_docs = Vorbis_I_spec.pdf Vorbis_I_spec.html Vorbis_I_spec.css + +# conditionally make the generated documentation +if BUILD_DOCS +doc_DATA = $(static_docs) $(SPEC_PNG) $(built_docs) doxygen-build.stamp +else +doc_DATA = $(static_docs) doxygen-build.stamp +endif + +EXTRA_DIST = $(static_docs) $(built_docs) \ + $(SPEC_TEX) $(SPEC_PNG) $(SPEC_PDF) Vorbis_I_spec.cfg Doxyfile.in + +# these are expensive; only remove if we have to +MAINTAINERCLEANFILES = $(built_docs) +CLEANFILES = $(SPEC_TEX:%.tex=%.aux) \ + Vorbis_I_spec.4ct Vorbis_I_spec.4tc \ + Vorbis_I_spec.dvi Vorbis_I_spec.idv \ + Vorbis_I_spec.lg Vorbis_I_spec.log \ + Vorbis_I_spec.out Vorbis_I_spec.tmp \ + Vorbis_I_spec.toc Vorbis_I_spec.xref \ + zzVorbis_I_spec.ps +DISTCLEANFILES = $(built_docs) + + +# explicit rules for generating docs +if BUILD_DOCS +Vorbis_I_spec.html Vorbis_I_spec.css: $(SPEC_TEX) $(SPEC_PNG) fish_xiph_org.png + htlatex $< + +Vorbis_I_spec.pdf: $(SPEC_TEX) $(SPEC_PNG) + pdflatex $< + pdflatex $< + pdflatex $< +else +Vorbis_I_spec.html: NO_DOCS_ERROR +Vorbis_I_spec.pdf: NO_DOCS_ERROR +NO_DOCS_ERROR: + @echo + @echo "*** Documentation has not been built! ***" + @echo "Try re-running after passing --enable-docs to configure." + @echo +endif + +if HAVE_DOXYGEN +doxygen-build.stamp: Doxyfile $(top_srcdir)/include/vorbis/*.h + doxygen + touch doxygen-build.stamp +else +doxygen-build.stamp: + echo "*** Warning: Documentation build is disabled." + touch doxygen-build.stamp +endif + +install-data-local: doxygen-build.stamp + $(mkinstalldirs) $(DESTDIR)$(docdir) + if test -d vorbis; then \ + for dir in vorbis/*; do \ + if test -d $$dir; then \ + b=`basename $$dir`; \ + $(mkinstalldirs) $(DESTDIR)$(docdir)/$$b; \ + for f in $$dir/*; do \ + $(INSTALL_DATA) $$f $(DESTDIR)$(docdir)/$$b; \ + done \ + fi \ + done \ + fi + +uninstall-local: + rm -rf $(DESTDIR)$(docdir) + +clean-local: + if test -d vorbis; then rm -rf vorbis; fi + if test -f doxygen-build.stamp; then rm -f doxygen-build.stamp; fi + + diff --git a/cs/3rd party/libvorbis/doc/Vorbis_I_spec.cfg b/cs/3rd party/libvorbis/doc/Vorbis_I_spec.cfg new file mode 100644 index 000000000..6fca7cece --- /dev/null +++ b/cs/3rd party/libvorbis/doc/Vorbis_I_spec.cfg @@ -0,0 +1,4 @@ +\Preamble{html} +\begin{document} + \DeclareGraphicsExtensions{.png} +\EndPreamble diff --git a/cs/3rd party/libvorbis/doc/Vorbis_I_spec.css b/cs/3rd party/libvorbis/doc/Vorbis_I_spec.css new file mode 100644 index 000000000..5331f1841 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/Vorbis_I_spec.css @@ -0,0 +1,144 @@ + +/* start css.sty */ +.cmex-10{font-size:83%;} +.cmssbx-10x-x-120{ font-family: sans-serif; font-weight: bold;} +.cmssbx-10x-x-120{ font-family: sans-serif; font-weight: bold;} +.cmssbx-10x-x-248{font-size:206%; font-family: sans-serif; font-weight: bold;} +.cmssbx-10x-x-248{ font-family: sans-serif; font-weight: bold;} +.cmr-17{font-size:141%;} +.cmmi-12{font-style: italic;} +.cmtt-12{font-family: monospace;} +.cmtt-12{font-family: monospace;} +.cmtt-12{font-family: monospace;} +.cmbx-12{ font-weight: bold;} +.cmti-12{ font-style: italic;} +.cmr-8{font-size:66%;} +.cmr-6{font-size:50%;} +.cmmi-8{font-size:66%;font-style: italic;} +.cmsy-8{font-size:66%;} +.cmsy-6{font-size:50%;} +.cmtt-8{font-size:66%;font-family: monospace;} +.cmtt-8{font-family: monospace;} +.cmtt-8{font-family: monospace;} +.cmtt-8x-x-75{font-size:50%;font-family: monospace;} +.cmtt-8x-x-75{font-family: monospace;} +.cmtt-8x-x-75{font-family: monospace;} +p.noindent { text-indent: 0em } +td p.noindent { text-indent: 0em; margin-top:0em; } +p.nopar { text-indent: 0em; } +p.indent{ text-indent: 1.5em } +@media print {div.crosslinks {visibility:hidden;}} +a img { border-top: 0; border-left: 0; border-right: 0; } +center { margin-top:1em; margin-bottom:1em; } +td center { margin-top:0em; margin-bottom:0em; } +.Canvas { position:relative; } +img.math{vertical-align:middle;} +li p.indent { text-indent: 0em } +li p:first-child{ margin-top:0em; } +li p:last-child, li div:last-child { margin-bottom:0.5em; } +li p~ul:last-child, li p~ol:last-child{ margin-bottom:0.5em; } +.enumerate1 {list-style-type:decimal;} +.enumerate2 {list-style-type:lower-alpha;} +.enumerate3 {list-style-type:lower-roman;} +.enumerate4 {list-style-type:upper-alpha;} +div.newtheorem { margin-bottom: 2em; margin-top: 2em;} +.obeylines-h,.obeylines-v {white-space: nowrap; } +div.obeylines-v p { margin-top:0; margin-bottom:0; } +.overline{ text-decoration:overline; } +.overline img{ border-top: 1px solid black; } +td.displaylines {text-align:center; white-space:nowrap;} +.centerline {text-align:center;} +.rightline {text-align:right;} +div.verbatim {font-family: monospace; white-space: nowrap; text-align:left; clear:both; } +.fbox {padding-left:3.0pt; padding-right:3.0pt; text-indent:0pt; border:solid black 0.4pt; } +div.fbox {display:table} +div.center div.fbox {text-align:center; clear:both; padding-left:3.0pt; padding-right:3.0pt; text-indent:0pt; border:solid black 0.4pt; } +div.minipage{width:100%;} +div.center, div.center div.center {text-align: center; margin-left:1em; margin-right:1em;} +div.center div {text-align: left;} +div.flushright, div.flushright div.flushright {text-align: right;} +div.flushright div {text-align: left;} +div.flushleft {text-align: left;} +.underline{ text-decoration:underline; } +.underline img{ border-bottom: 1px solid black; margin-bottom:1pt; } +.framebox-c, .framebox-l, .framebox-r { padding-left:3.0pt; padding-right:3.0pt; text-indent:0pt; border:solid black 0.4pt; } +.framebox-c {text-align:center;} +.framebox-l {text-align:left;} +.framebox-r {text-align:right;} +span.thank-mark{ vertical-align: super } +span.footnote-mark sup.textsuperscript, span.footnote-mark a sup.textsuperscript{ font-size:80%; } +div.tabular, div.center div.tabular {text-align: center; margin-top:0.5em; margin-bottom:0.5em; } +table.tabular td p{margin-top:0em;} +table.tabular {margin-left: auto; margin-right: auto;} +td p:first-child{ margin-top:0em; } +td p:last-child{ margin-bottom:0em; } +div.td00{ margin-left:0pt; margin-right:0pt; } +div.td01{ margin-left:0pt; margin-right:5pt; } +div.td10{ margin-left:5pt; margin-right:0pt; } +div.td11{ margin-left:5pt; margin-right:5pt; } +table[rules] {border-left:solid black 0.4pt; border-right:solid black 0.4pt; } +td.td00{ padding-left:0pt; padding-right:0pt; } +td.td01{ padding-left:0pt; padding-right:5pt; } +td.td10{ padding-left:5pt; padding-right:0pt; } +td.td11{ padding-left:5pt; padding-right:5pt; } +table[rules] {border-left:solid black 0.4pt; border-right:solid black 0.4pt; } +.hline hr, .cline hr{ height : 1px; margin:0px; } +.tabbing-right {text-align:right;} +span.TEX {letter-spacing: -0.125em; } +span.TEX span.E{ position:relative;top:0.5ex;left:-0.0417em;} +a span.TEX span.E {text-decoration: none; } +span.LATEX span.A{ position:relative; top:-0.5ex; left:-0.4em; font-size:85%;} +span.LATEX span.TEX{ position:relative; left: -0.4em; } +div.float, div.figure {margin-left: auto; margin-right: auto;} +div.float img {text-align:center;} +div.figure img {text-align:center;} +.marginpar {width:20%; float:right; text-align:left; margin-left:auto; margin-top:0.5em; font-size:85%; text-decoration:underline;} +.marginpar p{margin-top:0.4em; margin-bottom:0.4em;} +table.equation {width:100%;} +.equation td{text-align:center; } +td.equation { margin-top:1em; margin-bottom:1em; } +td.equation-label { width:5%; text-align:center; } +td.eqnarray4 { width:5%; white-space: normal; } +td.eqnarray2 { width:5%; } +table.eqnarray-star, table.eqnarray {width:100%;} +div.eqnarray{text-align:center;} +div.array {text-align:center;} +div.pmatrix {text-align:center;} +table.pmatrix {width:100%;} +span.pmatrix img{vertical-align:middle;} +div.pmatrix {text-align:center;} +table.pmatrix {width:100%;} +span.bar-css {text-decoration:overline;} +img.cdots{vertical-align:middle;} +.partToc a, .partToc, .likepartToc a, .likepartToc {line-height: 200%; font-weight:bold; font-size:110%;} +.chapterToc a, .chapterToc, .likechapterToc a, .likechapterToc, .appendixToc a, .appendixToc {line-height: 200%; font-weight:bold;} +.index-item, .index-subitem, .index-subsubitem {display:block} +div.caption {text-indent:-2em; margin-left:3em; margin-right:1em; text-align:left;} +div.caption span.id{font-weight: bold; white-space: nowrap; } +h1.partHead{text-align: center} +p.bibitem { text-indent: -2em; margin-left: 2em; margin-top:0.6em; margin-bottom:0.6em; } +p.bibitem-p { text-indent: 0em; margin-left: 2em; margin-top:0.6em; margin-bottom:0.6em; } +.paragraphHead, .likeparagraphHead { margin-top:2em; font-weight: bold;} +.subparagraphHead, .likesubparagraphHead { font-weight: bold;} +.quote {margin-bottom:0.25em; margin-top:0.25em; margin-left:1em; margin-right:1em; text-align:justify;} +.verse{white-space:nowrap; margin-left:2em} +div.maketitle {text-align:center;} +h2.titleHead{text-align:center;} +div.maketitle{ margin-bottom: 2em; } +div.author, div.date {text-align:center;} +div.thanks{text-align:left; margin-left:10%; font-size:85%; font-style:italic; } +div.author{white-space: nowrap;} +.quotation {margin-bottom:0.25em; margin-top:0.25em; margin-left:1em; } +.abstract p {margin-left:5%; margin-right:5%;} +div.abstract {width:100%;} +span.footnote-mark sup.textsuperscript, span.footnote-mark a sup.textsuperscript{ font-size:80%; } +.figure img.graphics {margin-left:10%;} +P.fancyvrb {white-space: nowrap; margin:0em;} +dt.enumerate-enumitem{float:left; clear:left; margin-left:1em; margin-right:1em;} +.uline{ text-decoration:underline; } +.uuline{ text-decoration:underline; } +span.sout {text-decoration: line-through } +span.xout {text-decoration: line-through } +span.uwave {text-decoration:underline } +/* end css.sty */ + diff --git a/cs/3rd party/libvorbis/doc/Vorbis_I_spec.html b/cs/3rd party/libvorbis/doc/Vorbis_I_spec.html new file mode 100644 index 000000000..145d88b8d --- /dev/null +++ b/cs/3rd party/libvorbis/doc/Vorbis_I_spec.html @@ -0,0 +1,13243 @@ + + +Vorbis I specification + + + + + + + + +

    +

    Contents

    +
    1 Introduction and Description +
      1.1 Overview +
       1.1.1 Application +
       1.1.2 Classification +
       1.1.3 Assumptions +
       1.1.4 Codec Setup and Probability Model +
       1.1.5 Format Specification +
       1.1.6 Hardware Profile +
      1.2 Decoder Configuration +
       1.2.1 Global Config +
       1.2.2 Mode +
       1.2.3 Mapping + + + +
       1.2.4 Floor +
       1.2.5 Residue +
       1.2.6 Codebooks +
      1.3 High-level Decode Process +
       1.3.1 Decode Setup +
       1.3.2 Decode Procedure +
     2 Bitpacking Convention +
      2.1 Overview +
       2.1.1 octets, bytes and words +
       2.1.2 bit order +
       2.1.3 byte order +
       2.1.4 coding bits into byte sequences +
       2.1.5 signedness +
       2.1.6 coding example +
       2.1.7 decoding example +
       2.1.8 end-of-packet alignment +
       2.1.9 reading zero bits +
     3 Probability Model and Codebooks +
      3.1 Overview +
       3.1.1 Bitwise operation +
      3.2 Packed codebook format +
       3.2.1 codebook decode +
      3.3 Use of the codebook abstraction +
     4 Codec Setup and Packet Decode +
      4.1 Overview +
      4.2 Header decode and decode setup +
       4.2.1 Common header decode +
       4.2.2 Identification header +
       4.2.3 Comment header + + + +
       4.2.4 Setup header +
      4.3 Audio packet decode and synthesis +
       4.3.1 packet type, mode and window decode +
       4.3.2 floor curve decode +
       4.3.3 nonzero vector propagate +
       4.3.4 residue decode +
       4.3.5 inverse coupling +
       4.3.6 dot product +
       4.3.7 inverse MDCT +
       4.3.8 overlap_add +
       4.3.9 output channel order +
     5 comment field and header specification +
      5.1 Overview +
      5.2 Comment encoding +
       5.2.1 Structure +
       5.2.2 Content vector format +
       5.2.3 Encoding +
     6 Floor type 0 setup and decode +
      6.1 Overview +
      6.2 Floor 0 format +
       6.2.1 header decode +
       6.2.2 packet decode +
       6.2.3 curve computation +
     7 Floor type 1 setup and decode +
      7.1 Overview +
      7.2 Floor 1 format +
       7.2.1 model +
       7.2.2 header decode +
       7.2.3 packet decode + + + +
       7.2.4 curve computation +
     8 Residue setup and decode +
      8.1 Overview +
      8.2 Residue format +
      8.3 residue 0 +
      8.4 residue 1 +
      8.5 residue 2 +
      8.6 Residue decode +
       8.6.1 header decode +
       8.6.2 packet decode +
       8.6.3 format 0 specifics +
       8.6.4 format 1 specifics +
       8.6.5 format 2 specifics +
     9 Helper equations +
      9.1 Overview +
      9.2 Functions +
       9.2.1 ilog +
       9.2.2 float32_unpack +
       9.2.3 lookup1_values +
       9.2.4 low_neighbor +
       9.2.5 high_neighbor +
       9.2.6 render_point +
       9.2.7 render_line +
     10 Tables +
      10.1 floor1_inverse_dB_table +
     A Embedding Vorbis into an Ogg stream +
      A.1 Overview +
       A.1.1 Restrictions +
       A.1.2 MIME type + + + +
      A.2 Encapsulation +
     B Vorbis encapsulation in RTP +
    + + + +

    1. Introduction and Description

    +

    +

    1.1. Overview

    +

    This document provides a high level description of the Vorbis codec’s construction. A bit-by-bit +specification appears beginning in section 4, “Codec Setup and Packet Decode”. The later +sections assume a high-level understanding of the Vorbis decode process, which is provided +here. +

    +

    1.1.1. Application
    +

    Vorbis is a general purpose perceptual audio CODEC intended to allow maximum encoder +flexibility, thus allowing it to scale competitively over an exceptionally wide range of bitrates. At +the high quality/bitrate end of the scale (CD or DAT rate stereo, 16/24 bits) it is in the same +league as MPEG-2 and MPC. Similarly, the 1.0 encoder can encode high-quality CD and DAT +rate stereo at below 48kbps without resampling to a lower rate. Vorbis is also intended for lower +and higher sample rates (from 8kHz telephony to 192kHz digital masters) and a range of channel +representations (monaural, polyphonic, stereo, quadraphonic, 5.1, ambisonic, or up to 255 +discrete channels). +

    +

    1.1.2. Classification
    +

    Vorbis I is a forward-adaptive monolithic transform CODEC based on the Modified Discrete +Cosine Transform. The codec is structured to allow addition of a hybrid wavelet filterbank in +Vorbis II to offer better transient response and reproduction using a transform better suited to +localized time events. + + + +

    +

    1.1.3. Assumptions
    +

    The Vorbis CODEC design assumes a complex, psychoacoustically-aware encoder and simple, +low-complexity decoder. Vorbis decode is computationally simpler than mp3, although it does +require more working memory as Vorbis has no static probability model; the vector codebooks +used in the first stage of decoding from the bitstream are packed in their entirety into the Vorbis +bitstream headers. In packed form, these codebooks occupy only a few kilobytes; the extent to +which they are pre-decoded into a cache is the dominant factor in decoder memory +usage. +

    Vorbis provides none of its own framing, synchronization or protection against errors; it +is solely a method of accepting input audio, dividing it into individual frames and +compressing these frames into raw, unformatted ’packets’. The decoder then accepts +these raw packets in sequence, decodes them, synthesizes audio frames from them, and +reassembles the frames into a facsimile of the original audio stream. Vorbis is a free-form +variable bit rate (VBR) codec and packets have no minimum size, maximum size, or +fixed/expected size. Packets are designed that they may be truncated (or padded) +and remain decodable; this is not to be considered an error condition and is used +extensively in bitrate management in peeling. Both the transport mechanism and +decoder must allow that a packet may be any size, or end before or after packet decode +expects. +

    Vorbis packets are thus intended to be used with a transport mechanism that provides free-form +framing, sync, positioning and error correction in accordance with these design assumptions, such +as Ogg (for file transport) or RTP (for network multicast). For purposes of a few examples in this +document, we will assume that Vorbis is to be embedded in an Ogg stream specifically, +although this is by no means a requirement or fundamental assumption in the Vorbis +design. +

    The specification for embedding Vorbis into an Ogg transport stream is in section A, +“Embedding Vorbis into an Ogg stream”. +

    +

    1.1.4. Codec Setup and Probability Model
    +

    Vorbis’ heritage is as a research CODEC and its current design reflects a desire to allow multiple +decades of continuous encoder improvement before running out of room within the codec +specification. For these reasons, configurable aspects of codec setup intentionally lean toward the +extreme of forward adaptive. + + + +

    The single most controversial design decision in Vorbis (and the most unusual for a Vorbis +developer to keep in mind) is that the entire probability model of the codec, the Huffman and +VQ codebooks, is packed into the bitstream header along with extensive CODEC setup +parameters (often several hundred fields). This makes it impossible, as it would be with +MPEG audio layers, to embed a simple frame type flag in each audio packet, or begin +decode at any frame in the stream without having previously fetched the codec setup +header. +

    Note: Vorbis can initiate decode at any arbitrary packet within a bitstream so long as the codec +has been initialized/setup with the setup headers. +

    Thus, Vorbis headers are both required for decode to begin and relatively large as bitstream +headers go. The header size is unbounded, although for streaming a rule-of-thumb of 4kB or less +is recommended (and Xiph.Org’s Vorbis encoder follows this suggestion). +

    Our own design work indicates the primary liability of the required header is in mindshare; it is +an unusual design and thus causes some amount of complaint among engineers as this runs +against current design trends (and also points out limitations in some existing software/interface +designs, such as Windows’ ACM codec framework). However, we find that it does not +fundamentally limit Vorbis’ suitable application space. +

    +

    1.1.5. Format Specification
    +

    The Vorbis format is well-defined by its decode specification; any encoder that produces packets +that are correctly decoded by the reference Vorbis decoder described below may be considered +a proper Vorbis encoder. A decoder must faithfully and completely implement the +specification defined below (except where noted) to be considered a proper Vorbis +decoder. +

    +

    1.1.6. Hardware Profile
    + + + +

    Although Vorbis decode is computationally simple, it may still run into specific limitations of an +embedded design. For this reason, embedded designs are allowed to deviate in limited ways from +the ‘full’ decode specification yet still be certified compliant. These optional omissions are +labelled in the spec where relevant. +

    +

    1.2. Decoder Configuration

    +

    Decoder setup consists of configuration of multiple, self-contained component abstractions that +perform specific functions in the decode pipeline. Each different component instance of a specific +type is semantically interchangeable; decoder configuration consists both of internal component +configuration, as well as arrangement of specific instances into a decode pipeline. Componentry +arrangement is roughly as follows: +

    +

    + +

    PIC +

    Figure 1: decoder pipeline configuration
    +
    +

    +

    1.2.1. Global Config
    +

    Global codec configuration consists of a few audio related fields (sample rate, channels), Vorbis +version (always ’0’ in Vorbis I), bitrate hints, and the lists of component instances. All other +configuration is in the context of specific components. +

    +

    1.2.2. Mode
    + + + +

    Each Vorbis frame is coded according to a master ’mode’. A bitstream may use one or many +modes. +

    The mode mechanism is used to encode a frame according to one of multiple possible +methods with the intention of choosing a method best suited to that frame. Different +modes are, e.g. how frame size is changed from frame to frame. The mode number of a +frame serves as a top level configuration switch for all other specific aspects of frame +decode. +

    A ’mode’ configuration consists of a frame size setting, window type (always 0, the Vorbis +window, in Vorbis I), transform type (always type 0, the MDCT, in Vorbis I) and a mapping +number. The mapping number specifies which mapping configuration instance to use for low-level +packet decode and synthesis. +

    +

    1.2.3. Mapping
    +

    A mapping contains a channel coupling description and a list of ’submaps’ that bundle sets +of channel vectors together for grouped encoding and decoding. These submaps are +not references to external components; the submap list is internal and specific to a +mapping. +

    A ’submap’ is a configuration/grouping that applies to a subset of floor and residue vectors +within a mapping. The submap functions as a last layer of indirection such that specific special +floor or residue settings can be applied not only to all the vectors in a given mode, but also +specific vectors in a specific mode. Each submap specifies the proper floor and residue +instance number to use for decoding that submap’s spectral floor and spectral residue +vectors. +

    As an example: +

    Assume a Vorbis stream that contains six channels in the standard 5.1 format. The sixth +channel, as is normal in 5.1, is bass only. Therefore it would be wasteful to encode a +full-spectrum version of it as with the other channels. The submapping mechanism can be used +to apply a full range floor and residue encoding to channels 0 through 4, and a bass-only +representation to the bass channel, thus saving space. In this example, channels 0-4 belong to +submap 0 (which indicates use of a full-range floor) and channel 5 belongs to submap 1, which +uses a bass-only representation. + + + +

    +

    1.2.4. Floor
    +

    Vorbis encodes a spectral ’floor’ vector for each PCM channel. This vector is a low-resolution +representation of the audio spectrum for the given channel in the current frame, generally used +akin to a whitening filter. It is named a ’floor’ because the Xiph.Org reference encoder has +historically used it as a unit-baseline for spectral resolution. +

    A floor encoding may be of two types. Floor 0 uses a packed LSP representation on a dB +amplitude scale and Bark frequency scale. Floor 1 represents the curve as a piecewise linear +interpolated representation on a dB amplitude scale and linear frequency scale. The two floors +are semantically interchangeable in encoding/decoding. However, floor type 1 provides more +stable inter-frame behavior, and so is the preferred choice in all coupled-stereo and +high bitrate modes. Floor 1 is also considerably less expensive to decode than floor +0. +

    Floor 0 is not to be considered deprecated, but it is of limited modern use. No known Vorbis +encoder past Xiph.Org’s own beta 4 makes use of floor 0. +

    The values coded/decoded by a floor are both compactly formatted and make use of entropy +coding to save space. For this reason, a floor configuration generally refers to multiple +codebooks in the codebook component list. Entropy coding is thus provided as an +abstraction, and each floor instance may choose from any and all available codebooks when +coding/decoding. +

    +

    1.2.5. Residue
    +

    The spectral residue is the fine structure of the audio spectrum once the floor curve has been +subtracted out. In simplest terms, it is coded in the bitstream using cascaded (multi-pass) vector +quantization according to one of three specific packing/coding algorithms numbered +0 through 2. The packing algorithm details are configured by residue instance. As +with the floor components, the final VQ/entropy encoding is provided by external +codebook instances and each residue instance may choose from any and all available +codebooks. +

    + + + +

    1.2.6. Codebooks
    +

    Codebooks are a self-contained abstraction that perform entropy decoding and, optionally, use +the entropy-decoded integer value as an offset into an index of output value vectors, returning +the indicated vector of values. +

    The entropy coding in a Vorbis I codebook is provided by a standard Huffman binary tree +representation. This tree is tightly packed using one of several methods, depending on whether +codeword lengths are ordered or unordered, or the tree is sparse. +

    The codebook vector index is similarly packed according to index characteristic. Most commonly, +the vector index is encoded as a single list of values of possible values that are then permuted +into a list of n-dimensional rows (lattice VQ). +

    +

    1.3. High-level Decode Process

    +

    +

    1.3.1. Decode Setup
    +

    Before decoding can begin, a decoder must initialize using the bitstream headers matching the +stream to be decoded. Vorbis uses three header packets; all are required, in-order, by +this specification. Once set up, decode may begin at any audio packet belonging to +the Vorbis stream. In Vorbis I, all packets after the three initial headers are audio +packets. +

    The header packets are, in order, the identification header, the comments header, and the setup +header. +

    Identification Header +The identification header identifies the bitstream as Vorbis, Vorbis version, and the simple audio +characteristics of the stream such as sample rate and number of channels. + + + +

    Comment Header +The comment header includes user text comments (“tags”) and a vendor string for the +application/library that produced the bitstream. The encoding and proper use of the comment +header is described in section 5, “comment field and header specification”. +

    Setup Header +The setup header includes extensive CODEC setup information as well as the complete VQ and +Huffman codebooks needed for decode. +

    +

    1.3.2. Decode Procedure
    +

    The decoding and synthesis procedure for all audio packets is fundamentally the same. +

    + 1.
    decode packet type flag +
    + 2.
    decode mode number +
    + 3.
    decode window shape (long windows only) +
    + 4.
    decode floor +
    + 5.
    decode residue into residue vectors +
    + 6.
    inverse channel coupling of residue vectors +
    + 7.
    generate floor curve from decoded floor data +
    + 8.
    compute dot product of floor and residue, producing audio spectrum vector +
    + 9.
    inverse monolithic transform of audio spectrum vector, always an MDCT in Vorbis + I + + + +
    + 10.
    overlap/add left-hand output of transform with right-hand output of previous frame +
    + 11.
    store right hand-data from transform of current frame for future lapping +
    + 12.
    if not first frame, return results of overlap/add as audio result of current frame
    +

    Note that clever rearrangement of the synthesis arithmetic is possible; as an example, one can +take advantage of symmetries in the MDCT to store the right-hand transform data of a partial +MDCT for a 50% inter-frame buffer space savings, and then complete the transform later before +overlap/add with the next frame. This optimization produces entirely equivalent output and is +naturally perfectly legal. The decoder must be entirely mathematically equivalent to the +specification, it need not be a literal semantic implementation. +

    Packet type decode +Vorbis I uses four packet types. The first three packet types mark each of the three Vorbis +headers described above. The fourth packet type marks an audio packet. All other packet types +are reserved; packets marked with a reserved type should be ignored. +

    Following the three header packets, all packets in a Vorbis I stream are audio. The first step of +audio packet decode is to read and verify the packet type; a non-audio packet when audio is +expected indicates stream corruption or a non-compliant stream. The decoder must ignore the +packet and not attempt decoding it to audio. +

    Mode decode +Vorbis allows an encoder to set up multiple, numbered packet ’modes’, as described earlier, all of +which may be used in a given Vorbis stream. The mode is encoded as an integer used as a direct +offset into the mode instance index. +

    Window shape decode (long windows only) +Vorbis frames may be one of two PCM sample sizes specified during codec setup. In Vorbis I, +legal frame sizes are powers of two from 64 to 8192 samples. Aside from coupling, Vorbis +handles channels as independent vectors and these frame sizes are in samples per +channel. + + + +

    Vorbis uses an overlapping transform, namely the MDCT, to blend one frame into the next, +avoiding most inter-frame block boundary artifacts. The MDCT output of one frame is windowed +according to MDCT requirements, overlapped 50% with the output of the previous frame and +added. The window shape assures seamless reconstruction. +

    This is easy to visualize in the case of equal sized-windows: +

    +

    + +

    PIC +

    Figure 2: overlap of two equal-sized windows
    +
    +

    And slightly more complex in the case of overlapping unequal sized windows: +

    +

    + +

    PIC +

    Figure 3: overlap of a long and a short window
    +
    +

    In the unequal-sized window case, the window shape of the long window must be modified for +seamless lapping as above. It is possible to correctly infer window shape to be applied to the +current window from knowing the sizes of the current, previous and next window. It is legal for a +decoder to use this method. However, in the case of a long window (short windows require no +modification), Vorbis also codes two flag bits to specify pre- and post- window shape. Although +not strictly necessary for function, this minor redundancy allows a packet to be fully decoded to +the point of lapping entirely independently of any other packet, allowing easier abstraction of +decode layers as well as allowing a greater level of easy parallelism in encode and +decode. +

    A description of valid window functions for use with an inverse MDCT can be found in [1]. +Vorbis windows all use the slope function +

    +y = sin (.5 * π sin2((x + .5)∕n * π)).
+                                                                                        
+
+                                                                                        
+
    +

    +

    floor decode +Each floor is encoded/decoded in channel order, however each floor belongs to a ’submap’ that +specifies which floor configuration to use. All floors are decoded before residue decode +begins. +

    residue decode +Although the number of residue vectors equals the number of channels, channel coupling may +mean that the raw residue vectors extracted during decode do not map directly to specific +channels. When channel coupling is in use, some vectors will correspond to coupled magnitude or +angle. The coupling relationships are described in the codec setup and may differ from frame to +frame, due to different mode numbers. +

    Vorbis codes residue vectors in groups by submap; the coding is done in submap order from +submap 0 through n-1. This differs from floors which are coded using a configuration provided by +submap number, but are coded individually in channel order. +

    inverse channel coupling +A detailed discussion of stereo in the Vorbis codec can be found in the document +Stereo Channel Coupling in the Vorbis CODEC. Vorbis is not limited to only stereo +coupling, but the stereo document also gives a good overview of the generic coupling +mechanism. +

    Vorbis coupling applies to pairs of residue vectors at a time; decoupling is done in-place a +pair at a time in the order and using the vectors specified in the current mapping +configuration. The decoupling operation is the same for all pairs, converting square polar +representation (where one vector is magnitude and the second angle) back to Cartesian +representation. +

    After decoupling, in order, each pair of vectors on the coupling list, the resulting residue vectors +represent the fine spectral detail of each output channel. + + + +

    generate floor curve +The decoder may choose to generate the floor curve at any appropriate time. It is reasonable to +generate the output curve when the floor data is decoded from the raw packet, or it +can be generated after inverse coupling and applied to the spectral residue directly, +combining generation and the dot product into one step and eliminating some working +space. +

    Both floor 0 and floor 1 generate a linear-range, linear-domain output vector to be multiplied +(dot product) by the linear-range, linear-domain spectral residue. +

    compute floor/residue dot product +This step is straightforward; for each output channel, the decoder multiplies the floor curve and +residue vectors element by element, producing the finished audio spectrum of each +channel. +

    One point is worth mentioning about this dot product; a common mistake in a fixed point +implementation might be to assume that a 32 bit fixed-point representation for floor and +residue and direct multiplication of the vectors is sufficient for acceptable spectral depth +in all cases because it happens to mostly work with the current Xiph.Org reference +encoder. +

    However, floor vector values can span ~140dB (~24 bits unsigned), and the audio spectrum +vector should represent a minimum of 120dB (~21 bits with sign), even when output is to a 16 +bit PCM device. For the residue vector to represent full scale if the floor is nailed +to -140dB, it must be able to span 0 to +140dB. For the residue vector to reach +full scale if the floor is nailed at 0dB, it must be able to represent -140dB to +0dB. +Thus, in order to handle full range dynamics, a residue vector may span -140dB to ++140dB entirely within spec. A 280dB range is approximately 48 bits with sign; thus the +residue vector must be able to represent a 48 bit range and the dot product must +be able to handle an effective 48 bit times 24 bit multiplication. This range may be +achieved using large (64 bit or larger) integers, or implementing a movable binary point +representation. +

    inverse monolithic transform (MDCT) +The audio spectrum is converted back into time domain PCM audio via an inverse Modified +Discrete Cosine Transform (MDCT). A detailed description of the MDCT is available in +[1]. +

    Note that the PCM produced directly from the MDCT is not yet finished audio; it must be + + + +lapped with surrounding frames using an appropriate window (such as the Vorbis window) before +the MDCT can be considered orthogonal. +

    overlap/add data +Windowed MDCT output is overlapped and added with the right hand data of the previous +window such that the 3/4 point of the previous window is aligned with the 1/4 point of the +current window (as illustrated in the window overlap diagram). At this point, the audio data +between the center of the previous frame and the center of the current frame is now finished and +ready to be returned. +

    cache right hand data +The decoder must cache the right hand portion of the current frame to be lapped with the left +hand portion of the next frame. +

    return finished audio data +The overlapped portion produced from overlapping the previous and current frame data +is finished data to be returned by the decoder. This data spans from the center of +the previous window to the center of the current window. In the case of same-sized +windows, the amount of data to return is one-half block consisting of and only of the +overlapped portions. When overlapping a short and long window, much of the returned +range is not actually overlap. This does not damage transform orthogonality. Pay +attention however to returning the correct data range; the amount of data to be returned +is: +

    +

    1  window_blocksize(previous_window)/4+window_blocksize(current_window)/4
    +

    from the center of the previous window to the center of the current window. +

    Data is not returned from the first frame; it must be used to ’prime’ the decode engine. The +encoder accounts for this priming when calculating PCM offsets; after the first frame, the proper +PCM output offset is ’0’ (as no data has been returned yet). + + + + + + +

    2. Bitpacking Convention

    +

    +

    2.1. Overview

    +

    The Vorbis codec uses relatively unstructured raw packets containing arbitrary-width binary +integer fields. Logically, these packets are a bitstream in which bits are coded one-by-one by the +encoder and then read one-by-one in the same monotonically increasing order by the decoder. +Most current binary storage arrangements group bits into a native word size of eight bits +(octets), sixteen bits, thirty-two bits or, less commonly other fixed word sizes. The Vorbis +bitpacking convention specifies the correct mapping of the logical packet bitstream into an actual +representation in fixed-width words. +

    +

    2.1.1. octets, bytes and words
    +

    In most contemporary architectures, a ’byte’ is synonymous with an ’octet’, that is, eight bits. +This has not always been the case; seven, ten, eleven and sixteen bit ’bytes’ have been used. +For purposes of the bitpacking convention, a byte implies the native, smallest integer +storage representation offered by a platform. On modern platforms, this is generally +assumed to be eight bits (not necessarily because of the processor but because of the +filesystem/memory architecture. Modern filesystems invariably offer bytes as the fundamental +atom of storage). A ’word’ is an integer size that is a grouped multiple of this smallest +size. +

    The most ubiquitous architectures today consider a ’byte’ to be an octet (eight bits) and a word +to be a group of two, four or eight bytes (16, 32 or 64 bits). Note however that the Vorbis +bitpacking convention is still well defined for any native byte size; Vorbis uses the native +bit-width of a given storage system. This document assumes that a byte is one octet for purposes +of example. +

    + + + +

    2.1.2. bit order
    +

    A byte has a well-defined ’least significant’ bit (LSb), which is the only bit set when the byte is +storing the two’s complement integer value +1. A byte’s ’most significant’ bit (MSb) is at the +opposite end of the byte. Bits in a byte are numbered from zero at the LSb to n (n = 7 in an +octet) for the MSb. +

    +

    2.1.3. byte order
    +

    Words are native groupings of multiple bytes. Several byte orderings are possible in a word; the +common ones are 3-2-1-0 (’big endian’ or ’most significant byte first’ in which the +highest-valued byte comes first), 0-1-2-3 (’little endian’ or ’least significant byte first’ in +which the lowest value byte comes first) and less commonly 3-1-2-0 and 0-2-1-3 (’mixed +endian’). +

    The Vorbis bitpacking convention specifies storage and bitstream manipulation at the byte, not +word, level, thus host word ordering is of a concern only during optimization when writing high +performance code that operates on a word of storage at a time rather than by byte. +Logically, bytes are always coded and decoded in order from byte zero through byte +n. +

    +

    2.1.4. coding bits into byte sequences
    +

    The Vorbis codec has need to code arbitrary bit-width integers, from zero to 32 bits +wide, into packets. These integer fields are not aligned to the boundaries of the byte +representation; the next field is written at the bit position at which the previous field +ends. +

    The encoder logically packs integers by writing the LSb of a binary integer to the logical +bitstream first, followed by next least significant bit, etc, until the requested number of bits +have been coded. When packing the bits into bytes, the encoder begins by placing +the LSb of the integer to be written into the least significant unused bit position of +the destination byte, followed by the next-least significant bit of the source integer +and so on up to the requested number of bits. When all bits of the destination byte +have been filled, encoding continues by zeroing all bits of the next byte and writing +the next bit into the bit position 0 of that byte. Decoding follows the same process + + + +as encoding, but by reading bits from the byte stream and reassembling them into +integers. +

    +

    2.1.5. signedness
    +

    The signedness of a specific number resulting from decode is to be interpreted by the decoder +given decode context. That is, the three bit binary pattern ’b111’ can be taken to represent +either ’seven’ as an unsigned integer, or ’-1’ as a signed, two’s complement integer. The +encoder and decoder are responsible for knowing if fields are to be treated as signed or +unsigned. +

    +

    2.1.6. coding example
    +

    Code the 4 bit integer value ’12’ [b1100] into an empty bytestream. Bytestream result: +

    +

    1                |
    2                V
    3  
    4          7 6 5 4 3 2 1 0
    5  byte 0 [0 0 0 0 1 1 0 0]  <-
    6  byte 1 [               ] +
    7  byte 2 [               ]
    8  byte 3 [               ]
    9               ...
    10  byte n [               ]  bytestream length == 1 byte
    11  
    +

    Continue by coding the 3 bit integer value ’-1’ [b111]: +

    +

    1          |
    2          V
    3  
    4          7 6 5 4 3 2 1 0
    5  byte 0 [0 1 1 1 1 1 0 0]  <-
    6  byte 1 [               ] +
    7  byte 2 [               ]
    8  byte 3 [               ]
    9               ...
    10  byte n [               ]  bytestream length == 1 byte
    +

    Continue by coding the 7 bit integer value ’17’ [b0010001]: +

    +

    1            |
    2            V
    3  
    4          7 6 5 4 3 2 1 0
    5  byte 0 [1 1 1 1 1 1 0 0]
    6  byte 1 [0 0 0 0 1 0 0 0]  <-
    7  byte 2 [               ] +
    8  byte 3 [               ]
    9               ...
    10  byte n [               ]  bytestream length == 2 bytes
    11                            bit cursor == 6
    +

    Continue by coding the 13 bit integer value ’6969’ [b110 11001110 01]: +

    +

    1                  |
    2                  V
    3  
    4          7 6 5 4 3 2 1 0
    5  byte 0 [1 1 1 1 1 1 0 0]
    6  byte 1 [0 1 0 0 1 0 0 0] +
    7  byte 2 [1 1 0 0 1 1 1 0]
    8  byte 3 [0 0 0 0 0 1 1 0]  <-
    9               ...
    10  byte n [               ]  bytestream length == 4 bytes
    11  
    + + + +

    +

    2.1.7. decoding example
    +

    Reading from the beginning of the bytestream encoded in the above example: +

    +

    1                        |
    2                        V
    3  
    4          7 6 5 4 3 2 1 0
    5  byte 0 [1 1 1 1 1 1 0 0]  <- +
    6  byte 1 [0 1 0 0 1 0 0 0]
    7  byte 2 [1 1 0 0 1 1 1 0]
    8  byte 3 [0 0 0 0 0 1 1 0]  bytestream length == 4 bytes
    9  
    +

    We read two, two-bit integer fields, resulting in the returned numbers ’b00’ and ’b11’. Two things +are worth noting here: +

      +
    • Although these four bits were originally written as a single four-bit integer, reading + some other combination of bit-widths from the bitstream is well defined. There are + no artificial alignment boundaries maintained in the bitstream. +
    • +
    • The second value is the two-bit-wide integer ’b11’. This value may be interpreted + either as the unsigned value ’3’, or the signed value ’-1’. Signedness is dependent on + decode context.
    +

    +

    2.1.8. end-of-packet alignment
    +

    The typical use of bitpacking is to produce many independent byte-aligned packets which are +embedded into a larger byte-aligned container structure, such as an Ogg transport bitstream. +Externally, each bytestream (encoded bitstream) must begin and end on a byte boundary. Often, +the encoded bitstream is not an integer number of bytes, and so there is unused (uncoded) space +in the last byte of a packet. +

    Unused space in the last byte of a bytestream is always zeroed during the coding process. Thus, +should this unused space be read, it will return binary zeroes. +

    Attempting to read past the end of an encoded packet results in an ’end-of-packet’ condition. +End-of-packet is not to be considered an error; it is merely a state indicating that there is +insufficient remaining data to fulfill the desired read size. Vorbis uses truncated packets as a + + + +normal mode of operation, and as such, decoders must handle reading past the end of a packet as +a typical mode of operation. Any further read operations after an ’end-of-packet’ condition shall +also return ’end-of-packet’. +

    +

    2.1.9. reading zero bits
    +

    Reading a zero-bit-wide integer returns the value ’0’ and does not increment the stream cursor. +Reading to the end of the packet (but not past, such that an ’end-of-packet’ condition has not +triggered) and then reading a zero bit integer shall succeed, returning 0, and not trigger an +end-of-packet condition. Reading a zero-bit-wide integer after a previous read sets ’end-of-packet’ +shall also fail with ’end-of-packet’. + + + + + + +

    3. Probability Model and Codebooks

    +

    +

    3.1. Overview

    +

    Unlike practically every other mainstream audio codec, Vorbis has no statically configured +probability model, instead packing all entropy decoding configuration, VQ and Huffman, into the +bitstream itself in the third header, the codec setup header. This packed configuration consists of +multiple ’codebooks’, each containing a specific Huffman-equivalent representation for decoding +compressed codewords as well as an optional lookup table of output vector values to which a +decoded Huffman value is applied as an offset, generating the final decoded output corresponding +to a given compressed codeword. +

    +

    3.1.1. Bitwise operation
    +

    The codebook mechanism is built on top of the vorbis bitpacker. Both the codebooks themselves +and the codewords they decode are unrolled from a packet as a series of arbitrary-width values +read from the stream according to section 2, “Bitpacking Convention”. +

    +

    3.2. Packed codebook format

    +

    For purposes of the examples below, we assume that the storage system’s native byte width is +eight bits. This is not universally true; see section 2, “Bitpacking Convention” for discussion +relating to non-eight-bit bytes. + + + +

    +

    3.2.1. codebook decode
    +

    A codebook begins with a 24 bit sync pattern, 0x564342: +

    +

    1  byte 0: [ 0 1 0 0 0 0 1 0 ] (0x42)
    2  byte 1: [ 0 1 0 0 0 0 1 1 ] (0x43)
    3  byte 2: [ 0 1 0 1 0 1 1 0 ] (0x56)
    +

    16 bit [codebook_dimensions] and 24 bit [codebook_entries] fields: +

    +

    1  
    2  byte 3: [ X X X X X X X X ]
    3  byte 4: [ X X X X X X X X ] [codebook_dimensions] (16 bit unsigned)
    4   +
    5  byte 5: [ X X X X X X X X ]
    6  byte 6: [ X X X X X X X X ]
    7  byte 7: [ X X X X X X X X ] [codebook_entries] (24 bit unsigned)
    8  
    +

    Next is the [ordered] bit flag: +

    +

    1  
    2  byte 8: [               X ] [ordered] (1 bit)
    3  
    +

    Each entry, numbering a total of [codebook_entries], is assigned a codeword length. +We now read the list of codeword lengths and store these lengths in the array +[codebook_codeword_lengths]. Decode of lengths is according to whether the [ordered] flag +is set or unset. +

      +
    • If the [ordered] flag is unset, the codeword list is not length ordered and the decoder + needs to read each codeword length one-by-one. +

      The decoder first reads one additional bit flag, the [sparse] flag. This flag determines + whether or not the codebook contains unused entries that are not to be included in + the codeword decode tree: +

      +

      1  byte 8: [             X 1 ] [sparse] flag (1 bit)
      +

      The decoder now performs for each of the [codebook_entries] codebook entries: +

      +

      1  
      2    1) if([sparse] is set) {
      3  
      4           2) [flag] = read one bit;
      5           3) if([flag] is set) {
      6   +
      7                4) [length] = read a five bit unsigned integer;
      8                5) codeword length for this entry is [length]+1;
      9   +
      10              } else {
      11  
      12                6) this entry is unused.  mark it as such.
      13  
      14              }
      15  
      16       } else the sparse flag is not set { +
      17  
      18          7) [length] = read a five bit unsigned integer;
      19          8) the codeword length for this entry is [length]+1;
      20  
      21       }
      22  
      + + + +
    • +
    • If the [ordered] flag is set, the codeword list for this codebook is encoded in + ascending length order. Rather than reading a length for every codeword, the + encoder reads the number of codewords per length. That is, beginning at entry + zero: +

      +

      1    1) [current_entry] = 0;
      2    2) [current_length] = read a five bit unsigned integer and add 1; +
      3    3) [number] = read ilog([codebook_entries] - [current_entry]) bits as an unsigned integer +
      4    4) set the entries [current_entry] through [current_entry]+[number]-1, inclusive, +
      5      of the [codebook_codeword_lengths] array to [current_length] +
      6    5) set [current_entry] to [number] + [current_entry]
      7    6) increment [current_length] by 1 +
      8    7) if [current_entry] is greater than [codebook_entries] ERROR CONDITION;
      9      the decoder will not be able to read this stream. +
      10    8) if [current_entry] is less than [codebook_entries], repeat process starting at 3)
      11    9) done.
      +
    +

    After all codeword lengths have been decoded, the decoder reads the vector lookup table. Vorbis +I supports three lookup types: +

    + 1.
    No lookup +
    + 2.
    Implicitly populated value mapping (lattice VQ) +
    + 3.
    Explicitly populated value mapping (tessellated or ’foam’ VQ)
    +

    The lookup table type is read as a four bit unsigned integer: +

    1    1) [codebook_lookup_type] = read four bits as an unsigned integer
    +

    Codebook decode precedes according to [codebook_lookup_type]: +

      +
    • Lookup type zero indicates no lookup to be read. Proceed past lookup decode. +
    • +
    • Lookup types one and two are similar, differing only in the number of lookup values to + be read. Lookup type one reads a list of values that are permuted in a set pattern to + build a list of vectors, each vector of order [codebook_dimensions] scalars. Lookup + type two builds the same vector list, but reads each scalar for each vector explicitly, + rather than building vectors from a smaller list of possible scalar values. Lookup + decode proceeds as follows: +

      +

      1    1) [codebook_minimum_value] = float32_unpack( read 32 bits as an unsigned integer) +
      2    2) [codebook_delta_value] = float32_unpack( read 32 bits as an unsigned integer) +
      3    3) [codebook_value_bits] = read 4 bits as an unsigned integer and add 1
      4    4) [codebook_sequence_p] = read 1 bit as a boolean flag
      5   + + + +
      6    if ( [codebook_lookup_type] is 1 ) {
      7  
      8       5) [codebook_lookup_values] = lookup1_values([codebook_entries], [codebook_dimensions] ) +
      9  
      10    } else {
      11  
      12       6) [codebook_lookup_values] = [codebook_entries] * [codebook_dimensions]
      13  
      14    }
      15   +
      16    7) read a total of [codebook_lookup_values] unsigned integers of [codebook_value_bits] each; +
      17       store these in order in the array [codebook_multiplicands]
      +
    • +
    • A [codebook_lookup_type] of greater than two is reserved and indicates a stream that is + not decodable by the specification in this document. +
    +

    An ’end of packet’ during any read operation in the above steps is considered an error condition +rendering the stream undecodable. +

    Huffman decision tree representation +The [codebook_codeword_lengths] array and [codebook_entries] value uniquely define the +Huffman decision tree used for entropy decoding. +

    Briefly, each used codebook entry (recall that length-unordered codebooks support unused +codeword entries) is assigned, in order, the lowest valued unused binary Huffman codeword +possible. Assume the following codeword length list: +

    +

    1  entry 0: length 2
    2  entry 1: length 4
    3  entry 2: length 4
    4  entry 3: length 4
    5  entry 4: length 4
    6  entry 5: length 2 +
    7  entry 6: length 3
    8  entry 7: length 3
    +

    Assigning codewords in order (lowest possible value of the appropriate length to highest) results +in the following codeword list: +

    +

    1  entry 0: length 2 codeword 00
    2  entry 1: length 4 codeword 0100
    3  entry 2: length 4 codeword 0101
    4  entry 3: length 4 codeword 0110 +
    5  entry 4: length 4 codeword 0111
    6  entry 5: length 2 codeword 10
    7  entry 6: length 3 codeword 110
    8  entry 7: length 3 codeword 111
    +

    Note: Unlike most binary numerical values in this document, we intend the above codewords to +be read and used bit by bit from left to right, thus the codeword ’001’ is the bit string ’zero, zero, +one’. When determining ’lowest possible value’ in the assignment definition above, the leftmost +bit is the MSb. +

    It is clear that the codeword length list represents a Huffman decision tree with the entry +numbers equivalent to the leaves numbered left-to-right: + + + +

    +

    + +

    PIC +

    Figure 4: huffman tree illustration
    +
    +

    As we assign codewords in order, we see that each choice constructs a new leaf in the leftmost +possible position. +

    Note that it’s possible to underspecify or overspecify a Huffman tree via the length list. +In the above example, if codeword seven were eliminated, it’s clear that the tree is +unfinished: +

    +

    + +

    PIC +

    Figure 5: underspecified huffman tree illustration
    +
    +

    Similarly, in the original codebook, it’s clear that the tree is fully populated and a ninth +codeword is impossible. Both underspecified and overspecified trees are an error condition +rendering the stream undecodable. +

    Codebook entries marked ’unused’ are simply skipped in the assigning process. They have no +codeword and do not appear in the decision tree, thus it’s impossible for any bit pattern read +from the stream to decode to that entry number. +

    Errata 20150226: Single entry codebooks +A ’single-entry codebook’ is a codebook with one active codeword entry. A single-entry codebook +may be either a fully populated codebook with only one declared entry, or a sparse codebook +with only one entry marked used. The Vorbis I spec provides no means to specify a codeword +length of zero, and as a result, a single-entry codebook is inherently malformed because it is +underpopulated. The original specification did not address directly the matter of single-entry +codebooks; they were implicitly illegal as it was not possible to write such a codebook with a +valid tree structure. + + + +

    In r14811 of the libvorbis reference implementation, Xiph added an additional check to the +codebook implementation to reject underpopulated Huffman trees. This change led to the +discovery of single-entry books used ’in the wild’ when the new, stricter checks rejected a number +of apparently working streams. +

    In order to minimize breakage of deployed (if technically erroneous) streams, r16073 of the +reference implementation explicitly special-cased single-entry codebooks to tolerate the +single-entry case. Commit r16073 also added the following to the specification: +

    Take special care that a codebook with a single used entry is handled properly; it consists of a +single codework of zero bits and reading a value out of such a codebook always returns the single +used value and sinks zero bits. ” +

    The intent was to clarify the spec and codify current practice. However, this addition is +erroneously at odds with the intent of preserving usability of existing streams using single-entry +codebooks, disagrees with the code changes that reinstated decoding, and does not address how +single-entry codebooks should be encoded. +

    As such, the above addition made in r16037 is struck from the specification and replaced by the +following: +

    +

    +

    It is possible to declare a Vorbis codebook containing a single codework + entry. A single-entry codebook may be either a fully populated codebook with + [codebook_entries] set to 1, or a sparse codebook marking only one entry + used. Note that it is not possible to also encode a [codeword_length] of zero + for the single used codeword, as the unsigned value written to the stream + is [codeword_length]-1. Instead, encoder implementations should indicate a + [codeword_length] of 1 and ’write’ the codeword to a stream during audio + encoding by writing a single zero bit. +

    Decoder implementations shall reject a codebook if it contains only one used + entry and the encoded [codeword_length] of that entry is not 1. ’Reading’ a + value from single-entry codebook always returns the single used codeword value + and sinks one bit. Decoders should tolerate that the bit read from the stream + be ’1’ instead of ’0’; both values shall return the single used codeword.

    +

    VQ lookup table vector representation +Unpacking the VQ lookup table vectors relies on the following values: + + + +

    1  the [codebook\_multiplicands] array
    2  [codebook\_minimum\_value]
    3  [codebook\_delta\_value]
    4  [codebook\_sequence\_p] +
    5  [codebook\_lookup\_type]
    6  [codebook\_entries]
    7  [codebook\_dimensions]
    8  [codebook\_lookup\_values]
    +

    Decoding (unpacking) a specific vector in the vector lookup table proceeds according to +[codebook_lookup_type]. The unpacked vector values are what a codebook would return +during audio packet decode in a VQ context. +

    Vector value decode: Lookup type 1 +Lookup type one specifies a lattice VQ lookup table built algorithmically from a list of +scalar values. Calculate (unpack) the final values of a codebook entry vector from +the entries in [codebook_multiplicands] as follows ([value_vector] is the output +vector representing the vector of values for entry number [lookup_offset] in this +codebook): +

    +

    1    1) [last] = 0;
    2    2) [index_divisor] = 1;
    3    3) iterate [i] over the range 0 ... [codebook_dimensions]-1 (once for each scalar value in the value vector) { +
    4  
    5         4) [multiplicand_offset] = ( [lookup_offset] divided by [index_divisor] using integer +
    6            division ) integer modulo [codebook_lookup_values]
    7  
    8         5) vector [value_vector] element [i] = +
    9              ( [codebook_multiplicands] array element number [multiplicand_offset] ) * +
    10              [codebook_delta_value] + [codebook_minimum_value] + [last];
    11   +
    12         6) if ( [codebook_sequence_p] is set ) then set [last] = vector [value_vector] element [i]
    13   +
    14         7) [index_divisor] = [index_divisor] * [codebook_lookup_values]
    15  
    16       }
    17  
    18    8) vector calculation completed.
    +

    Vector value decode: Lookup type 2 +Lookup type two specifies a VQ lookup table in which each scalar in each vector is explicitly set +by the [codebook_multiplicands] array in a one-to-one mapping. Calculate [unpack] the final +values of a codebook entry vector from the entries in [codebook_multiplicands] as follows +([value_vector] is the output vector representing the vector of values for entry number +[lookup_offset] in this codebook): +

    +

    1    1) [last] = 0;
    2    2) [multiplicand_offset] = [lookup_offset] * [codebook_dimensions] +
    3    3) iterate [i] over the range 0 ... [codebook_dimensions]-1 (once for each scalar value in the value vector) {
    4   +
    5         4) vector [value_vector] element [i] =
    6              ( [codebook_multiplicands] array element number [multiplicand_offset] ) * +
    7              [codebook_delta_value] + [codebook_minimum_value] + [last];
    8   +
    9         5) if ( [codebook_sequence_p] is set ) then set [last] = vector [value_vector] element [i]
    10   +
    11         6) increment [multiplicand_offset]
    12  
    13       }
    14  
    15    7) vector calculation completed.
    + + + +

    +

    3.3. Use of the codebook abstraction

    +

    The decoder uses the codebook abstraction much as it does the bit-unpacking convention; a +specific codebook reads a codeword from the bitstream, decoding it into an entry number, and +then returns that entry number to the decoder (when used in a scalar entropy coding context), or +uses that entry number as an offset into the VQ lookup table, returning a vector of values (when +used in a context desiring a VQ value). Scalar or VQ context is always explicit; any +call to the codebook mechanism requests either a scalar entry number or a lookup +vector. +

    Note that VQ lookup type zero indicates that there is no lookup table; requesting +decode using a codebook of lookup type 0 in any context expecting a vector return +value (even in a case where a vector of dimension one) is forbidden. If decoder setup +or decode requests such an action, that is an error condition rendering the packet +undecodable. +

    Using a codebook to read from the packet bitstream consists first of reading and decoding the +next codeword in the bitstream. The decoder reads bits until the accumulated bits match a +codeword in the codebook. This process can be though of as logically walking the +Huffman decode tree by reading one bit at a time from the bitstream, and using the +bit as a decision boolean to take the 0 branch (left in the above examples) or the 1 +branch (right in the above examples). Walking the tree finishes when the decode process +hits a leaf in the decision tree; the result is the entry number corresponding to that +leaf. Reading past the end of a packet propagates the ’end-of-stream’ condition to the +decoder. +

    When used in a scalar context, the resulting codeword entry is the desired return +value. +

    When used in a VQ context, the codeword entry number is used as an offset into the VQ lookup +table. The value returned to the decoder is the vector of scalars corresponding to this +offset. + + + + + + +

    4. Codec Setup and Packet Decode

    +

    +

    4.1. Overview

    +

    This document serves as the top-level reference document for the bit-by-bit decode specification +of Vorbis I. This document assumes a high-level understanding of the Vorbis decode +process, which is provided in section 1, “Introduction and Description”. section 2, +“Bitpacking Convention” covers reading and writing bit fields from and to bitstream +packets. +

    +

    4.2. Header decode and decode setup

    +

    A Vorbis bitstream begins with three header packets. The header packets are, in order, the +identification header, the comments header, and the setup header. All are required for decode +compliance. An end-of-packet condition during decoding the first or third header packet renders +the stream undecodable. End-of-packet decoding the comment header is a non-fatal error +condition. +

    +

    4.2.1. Common header decode
    +

    Each header packet begins with the same header fields. +

    +

    1    1) [packet_type] : 8 bit value
    2    2) 0x76, 0x6f, 0x72, 0x62, 0x69, 0x73: the characters ’v’,’o’,’r’,’b’,’i’,’s’ as six octets
    +

    Decode continues according to packet type; the identification header is type 1, the comment +header type 3 and the setup header type 5 (these types are all odd as a packet with a leading +single bit of ’0’ is an audio packet). The packets must occur in the order of identification, + + + +comment, setup. +

    +

    4.2.2. Identification header
    +

    The identification header is a short header of only a few fields used to declare the stream +definitively as Vorbis, and provide a few externally relevant pieces of information about the audio +stream. The identification header is coded as follows: +

    +

    1   1) [vorbis_version] = read 32 bits as unsigned integer
    2   2) [audio_channels] = read 8 bit integer as unsigned +
    3   3) [audio_sample_rate] = read 32 bits as unsigned integer
    4   4) [bitrate_maximum] = read 32 bits as signed integer +
    5   5) [bitrate_nominal] = read 32 bits as signed integer
    6   6) [bitrate_minimum] = read 32 bits as signed integer +
    7   7) [blocksize_0] = 2 exponent (read 4 bits as unsigned integer)
    8   8) [blocksize_1] = 2 exponent (read 4 bits as unsigned integer) +
    9   9) [framing_flag] = read one bit
    +

    [vorbis_version] is to read ’0’ in order to be compatible with this document. Both +[audio_channels] and [audio_sample_rate] must read greater than zero. Allowed final +blocksize values are 64, 128, 256, 512, 1024, 2048, 4096 and 8192 in Vorbis I. [blocksize_0] +must be less than or equal to [blocksize_1]. The framing bit must be nonzero. Failure to meet +any of these conditions renders a stream undecodable. +

    The bitrate fields above are used only as hints. The nominal bitrate field especially may be +considerably off in purely VBR streams. The fields are meaningful only when greater than +zero. +

      +
    • All three fields set to the same value implies a fixed rate, or tightly bounded, nearly + fixed-rate bitstream +
    • +
    • Only nominal set implies a VBR or ABR stream that averages the nominal bitrate +
    • +
    • Maximum and or minimum set implies a VBR bitstream that obeys the bitrate limits +
    • +
    • None set indicates the encoder does not care to speculate.
    + + + +

    +

    4.2.3. Comment header
    +

    Comment header decode and data specification is covered in section 5, “comment field and +header specification”. +

    +

    4.2.4. Setup header
    +

    Vorbis codec setup is configurable to an extreme degree: +

    +

    + +

    PIC +

    Figure 6: decoder pipeline configuration
    +
    +

    The setup header contains the bulk of the codec setup information needed for decode. The setup +header contains, in order, the lists of codebook configurations, time-domain transform +configurations (placeholders in Vorbis I), floor configurations, residue configurations, channel +mapping configurations and mode configurations. It finishes with a framing bit of ’1’. Header +decode proceeds in the following order: +

    Codebooks +

    + 1.
    [vorbis_codebook_count] = read eight bits as unsigned integer and add one +
    + 2.
    Decode [vorbis_codebook_count] codebooks in order as defined in section 3, + “Probability Model and Codebooks”. Save each configuration, in order, in an array + of codebook configurations [vorbis_codebook_configurations].
    + + + +

    Time domain transforms +These hooks are placeholders in Vorbis I. Nevertheless, the configuration placeholder values must +be read to maintain bitstream sync. +

    +

    + 1.
    [vorbis_time_count] = read 6 bits as unsigned integer and add one +
    + 2.
    read [vorbis_time_count] 16 bit values; each value should be zero. If any value is + nonzero, this is an error condition and the stream is undecodable.
    +

    Floors +Vorbis uses two floor types; header decode is handed to the decode abstraction of the appropriate +type. +

    +

    + 1.
    [vorbis_floor_count] = read 6 bits as unsigned integer and add one +
    + 2.
    For each [i] of [vorbis_floor_count] floor numbers: +
    + a)
    read the floor type: vector [vorbis_floor_types] element [i] = read 16 bits + as unsigned integer +
    + b)
    If the floor type is zero, decode the floor configuration as defined in section 6, + “Floor type 0 setup and decode”; save this configuration in slot [i] of the floor + configuration array [vorbis_floor_configurations]. +
    + c)
    If the floor type is one, decode the floor configuration as defined in section 7, + “Floor type 1 setup and decode”; save this configuration in slot [i] of the floor + configuration array [vorbis_floor_configurations]. +
    + d)
    If the the floor type is greater than one, this stream is undecodable; ERROR + CONDITION
    + + + +
    +

    Residues +Vorbis uses three residue types; header decode of each type is identical. +

    +

    + 1.
    [vorbis_residue_count] = read 6 bits as unsigned integer and add one +
    + 2.
    For each of [vorbis_residue_count] residue numbers: +
    + a)
    read the residue type; vector [vorbis_residue_types] element [i] = read 16 + bits as unsigned integer +
    + b)
    If the residue type is zero, one or two, decode the residue configuration as defined + in section 8, “Residue setup and decode”; save this configuration in slot [i] of + the residue configuration array [vorbis_residue_configurations]. +
    + c)
    If the the residue type is greater than two, this stream is undecodable; ERROR + CONDITION
    +
    +

    Mappings +Mappings are used to set up specific pipelines for encoding multichannel audio with varying +channel mapping applications. Vorbis I uses a single mapping type (0), with implicit PCM +channel mappings. +

    +

    + 1.
    [vorbis_mapping_count] = read 6 bits as unsigned integer and add one +
    + 2.
    For each [i] of [vorbis_mapping_count] mapping numbers: + + + +
    + a)
    read the mapping type: 16 bits as unsigned integer. There’s no reason to save + the mapping type in Vorbis I. +
    + b)
    If the mapping type is nonzero, the stream is undecodable +
    + c)
    If the mapping type is zero: +
    + i.
    read 1 bit as a boolean flag +
    + A.
    if set, [vorbis_mapping_submaps] = read 4 bits as unsigned integer + and add one +
    + B.
    if unset, [vorbis_mapping_submaps] = 1
    +
    + ii.
    read 1 bit as a boolean flag +
    + A.
    if set, square polar channel mapping is in use: +
      +
    • [vorbis_mapping_coupling_steps] = read 8 bits as unsigned + integer and add one +
    • +
    • for [j] each of [vorbis_mapping_coupling_steps] steps: +
        +
      • vector [vorbis_mapping_magnitude] element [j]= read + ilog([audio_channels] - 1) bits as unsigned integer +
      • +
      • vector [vorbis_mapping_angle] element [j]= read + ilog([audio_channels] - 1) bits as unsigned integer +
      • +
      • the numbers read in the above two steps are channel numbers + representing the channel to treat as magnitude and the channel + to treat as angle, respectively. If for any coupling step the + angle channel number equals the magnitude channel number, the + magnitude channel number is greater than [audio_channels]-1, or + the angle channel is greater than [audio_channels]-1, the stream + is undecodable.
      + + + +
    +
    + B.
    if unset, [vorbis_mapping_coupling_steps] = 0
    +
    + iii.
    read 2 bits (reserved field); if the value is nonzero, the stream is undecodable +
    + iv.
    if [vorbis_mapping_submaps] is greater than one, we read channel multiplex + settings. For each [j] of [audio_channels] channels: +
    + A.
    vector [vorbis_mapping_mux] element [j] = read 4 bits as unsigned + integer +
    + B.
    if the value is greater than the highest numbered submap + ([vorbis_mapping_submaps] - 1), this in an error condition rendering + the stream undecodable
    +
    + v.
    for each submap [j] of [vorbis_mapping_submaps] submaps, read the floor and + residue numbers for use in decoding that submap: +
    + A.
    read and discard 8 bits (the unused time configuration placeholder) +
    + B.
    read 8 bits as unsigned integer for the floor number; save in vector + [vorbis_mapping_submap_floor] element [j] +
    + C.
    verify the floor number is not greater than the highest number floor + configured for the bitstream. If it is, the bitstream is undecodable +
    + D.
    read 8 bits as unsigned integer for the residue number; save in vector + [vorbis_mapping_submap_residue] element [j] +
    + E.
    verify the residue number is not greater than the highest number residue + configured for the bitstream. If it is, the bitstream is undecodable
    +
    + vi.
    save this mapping configuration in slot [i] of the mapping configuration array + [vorbis_mapping_configurations].
    +
    + + + +
    +

    Modes +

    + 1.
    [vorbis_mode_count] = read 6 bits as unsigned integer and add one +
    + 2.
    For each of [vorbis_mode_count] mode numbers: +
    + a)
    [vorbis_mode_blockflag] = read 1 bit +
    + b)
    [vorbis_mode_windowtype] = read 16 bits as unsigned integer +
    + c)
    [vorbis_mode_transformtype] = read 16 bits as unsigned integer +
    + d)
    [vorbis_mode_mapping] = read 8 bits as unsigned integer +
    + e)
    verify ranges; zero is the only legal value in + Vorbis I for [vorbis_mode_windowtype] and [vorbis_mode_transformtype]. + [vorbis_mode_mapping] must not be greater than the highest number mapping + in use. Any illegal values render the stream undecodable. +
    + f)
    save this mode configuration in slot [i] of the mode configuration array + [vorbis_mode_configurations].
    +
    + 3.
    read 1 bit as a framing flag. If unset, a framing error occurred and the stream is not + decodable.
    +

    After reading mode descriptions, setup header decode is complete. +

    +

    4.3. Audio packet decode and synthesis

    + + + +

    Following the three header packets, all packets in a Vorbis I stream are audio. The first step of +audio packet decode is to read and verify the packet type. A non-audio packet when audio is +expected indicates stream corruption or a non-compliant stream. The decoder must ignore the +packet and not attempt decoding it to audio. +

    +

    4.3.1. packet type, mode and window decode
    +

    +

    + 1.
    read 1 bit [packet_type]; check that packet type is 0 (audio) +
    + 2.
    read ilog([vorbis_mode_count]-1) bits [mode_number] +
    + 3.
    decode blocksize [n] is equal to [blocksize_0] if [vorbis_mode_blockflag] is 0, + else [n] is equal to [blocksize_1]. +
    + 4.
    perform window selection and setup; this window is used later by the inverse + MDCT: +
    + a)
    if this is a long window (the [vorbis_mode_blockflag] flag of this mode is + set): +
    + i.
    read 1 bit for [previous_window_flag] +
    + ii.
    read 1 bit for [next_window_flag] +
    + iii.
    if [previous_window_flag] is not set, the left half of the window will + be a hybrid window for lapping with a short block. See paragraph 1.3.2, + “Window shape decode (long windows only)” for an illustration of + overlapping dissimilar windows. Else, the left half window will have normal + long shape. +
    + iv.
    if [next_window_flag] is not set, the right half of the window will be + a hybrid window for lapping with a short block. See paragraph 1.3.2, + + + + “Window shape decode (long windows only)” for an illustration of + overlapping dissimilar windows. Else, the left right window will have normal + long shape.
    +
    + b)
    if this is a short window, the window is always the same short-window + shape.
    +
    +

    Vorbis windows all use the slope function y = sin(π
+2 * sin 2((x + 0.5)∕n * π)), where n is window +size and x ranges 0n- 1, but dissimilar lapping requirements can affect overall shape. Window +generation proceeds as follows: +

    +

    + 1.
    [window_center] = [n] / 2 +
    + 2.
    if ([vorbis_mode_blockflag] is set and [previous_window_flag] is not set) + then +
    + a)
    [left_window_start] = [n]/4 - [blocksize_0]/4 +
    + b)
    [left_window_end] = [n]/4 + [blocksize_0]/4 +
    + c)
    [left_n] = [blocksize_0]/2
    +

    else +

    + a)
    [left_window_start] = 0 +
    + b)
    [left_window_end] = [window_center] +
    + c)
    [left_n] = [n]/2
    +
    + 3.
    if ([vorbis_mode_blockflag] is set and [next_window_flag] is not set) then +
    + a)
    [right_window_start] = [n]*3/4 - [blocksize_0]/4 +
    + b)
    [right_window_end] = [n]*3/4 + [blocksize_0]/4 + + + +
    + c)
    [right_n] = [blocksize_0]/2
    +

    else +

    + a)
    [right_window_start] = [window_center] +
    + b)
    [right_window_end] = [n] +
    + c)
    [right_n] = [n]/2
    +
    + 4.
    window from range 0 ... [left_window_start]-1 inclusive is zero +
    + 5.
    for [i] in range [left_window_start] ... [left_window_end]-1, window([i]) = + sin(π
+2 * sin 2( ([i]-[left_window_start]+0.5) / [left_n] *π
+2) ) +
    + 6.
    window from range [left_window_end] ... [right_window_start]-1 inclusive is + one +
    + 7.
    for [i] in range [right_window_start] ... [right_window_end]-1, window([i]) = + sin(π2 * sin 2( ([i]-[right_window_start]+0.5) / [right_n] *π2 + π2) ) +
    + 8.
    window from range [right_window_start] ... [n]-1 is zero
    +

    An end-of-packet condition up to this point should be considered an error that discards this +packet from the stream. An end of packet condition past this point is to be considered a possible +nominal occurrence. +

    +

    4.3.2. floor curve decode
    +

    From this point on, we assume out decode context is using mode number [mode_number] +from configuration array [vorbis_mode_configurations] and the map number +[vorbis_mode_mapping] (specified by the current mode) taken from the mapping configuration +array [vorbis_mapping_configurations]. +

    Floor curves are decoded one-by-one in channel order. + + + +

    For each floor [i] of [audio_channels] +

    + 1.
    [submap_number] = element [i] of vector [vorbis_mapping_mux] +
    + 2.
    [floor_number] = element [submap_number] of vector [vorbis_submap_floor] +
    + 3.
    if the floor type of this floor (vector + [vorbis_floor_types] element [floor_number]) is zero then decode the floor for + channel [i] according to the subsubsection 6.2.2, “packet decode” +
    + 4.
    if the type of this floor is one then decode the floor for channel [i] according to the + subsubsection 7.2.3, “packet decode” +
    + 5.
    save the needed decoded floor information for channel for later synthesis +
    + 6.
    if the decoded floor returned ’unused’, set vector [no_residue] element [i] to true, + else set vector [no_residue] element [i] to false
    +

    An end-of-packet condition during floor decode shall result in packet decode zeroing all channel +output vectors and skipping to the add/overlap output stage. +

    +

    4.3.3. nonzero vector propagate
    +

    A possible result of floor decode is that a specific vector is marked ’unused’ which indicates that +that final output vector is all-zero values (and the floor is zero). The residue for that vector is not +coded in the stream, save for one complication. If some vectors are used and some are not, +channel coupling could result in mixing a zeroed and nonzeroed vector to produce two nonzeroed +vectors. +

    for each [i] from 0 ... [vorbis_mapping_coupling_steps]-1 +

    +

    + 1.
    if either [no_residue] entry for channel ([vorbis_mapping_magnitude] element + [i]) or channel ([vorbis_mapping_angle] element [i]) are set to false, then both + must be set to false. Note that an ’unused’ floor has no decoded floor information; it + + + + is important that this is remembered at floor curve synthesis time.
    +

    +

    4.3.4. residue decode
    +

    Unlike floors, which are decoded in channel order, the residue vectors are decoded in submap +order. +

    for each submap [i] in order from 0 ... [vorbis_mapping_submaps]-1 +

    +

    + 1.
    [ch] = 0 +
    + 2.
    for each channel [j] in order from 0 ... [audio_channels] - 1 +
    + a)
    if channel [j] in submap [i] (vector [vorbis_mapping_mux] element [j] is equal to + [i]) +
    + i.
    if vector [no_residue] element [j] is true +
    + A.
    vector [do_not_decode_flag] element [ch] is set
    +

    else +

    + A.
    vector [do_not_decode_flag] element [ch] is unset
    +
    + ii.
    increment [ch]
    +
    +
    + 3.
    [residue_number] = vector [vorbis_mapping_submap_residue] element [i] +
    + 4.
    [residue_type] = vector [vorbis_residue_types] element [residue_number] +
    + 5.
    decode [ch] vectors using residue [residue_number], according to type [residue_type], + + + + also passing vector [do_not_decode_flag] to indicate which vectors in the bundle should + not be decoded. Correct per-vector decode length is [n]/2. +
    + 6.
    [ch] = 0 +
    + 7.
    for each channel [j] in order from 0 ... [audio_channels] +
    + a)
    if channel [j] is in submap [i] (vector [vorbis_mapping_mux] element [j] is equal + to [i]) +
    + i.
    residue vector for channel [j] is set to decoded residue vector [ch] +
    + ii.
    increment [ch]
    +
    +
    +

    +

    4.3.5. inverse coupling
    +

    for each [i] from [vorbis_mapping_coupling_steps]-1 descending to 0 +

    +

    + 1.
    [magnitude_vector] = the residue vector for channel (vector + [vorbis_mapping_magnitude] element [i]) +
    + 2.
    [angle_vector] = the residue vector for channel (vector [vorbis_mapping_angle] + element [i]) +
    + 3.
    for each scalar value [M] in vector [magnitude_vector] and the corresponding scalar value + [A] in vector [angle_vector]: +
    + a)
    if ([M] is greater than zero) + + + +
    + i.
    if ([A] is greater than zero) +
    + A.
    [new_M] = [M] +
    + B.
    [new_A] = [M]-[A]
    +

    else +

    + A.
    [new_A] = [M] +
    + B.
    [new_M] = [M]+[A]
    +
    +

    else +

    + i.
    if ([A] is greater than zero) +
    + A.
    [new_M] = [M] +
    + B.
    [new_A] = [M]+[A]
    +

    else +

    + A.
    [new_A] = [M] +
    + B.
    [new_M] = [M]-[A]
    +
    +
    + b)
    set scalar value [M] in vector [magnitude_vector] to [new_M] +
    + c)
    set scalar value [A] in vector [angle_vector] to [new_A]
    +
    + + + +

    +

    4.3.6. dot product
    +

    For each channel, synthesize the floor curve from the decoded floor information, according to +packet type. Note that the vector synthesis length for floor computation is [n]/2. +

    For each channel, multiply each element of the floor curve by each element of that +channel’s residue vector. The result is the dot product of the floor and residue vectors for +each channel; the produced vectors are the length [n]/2 audio spectrum for each +channel. +

    One point is worth mentioning about this dot product; a common mistake in a fixed point +implementation might be to assume that a 32 bit fixed-point representation for floor and +residue and direct multiplication of the vectors is sufficient for acceptable spectral depth +in all cases because it happens to mostly work with the current Xiph.Org reference +encoder. +

    However, floor vector values can span ~140dB (~24 bits unsigned), and the audio spectrum +vector should represent a minimum of 120dB (~21 bits with sign), even when output is to a 16 +bit PCM device. For the residue vector to represent full scale if the floor is nailed +to -140dB, it must be able to span 0 to +140dB. For the residue vector to reach +full scale if the floor is nailed at 0dB, it must be able to represent -140dB to +0dB. +Thus, in order to handle full range dynamics, a residue vector may span -140dB to ++140dB entirely within spec. A 280dB range is approximately 48 bits with sign; thus the +residue vector must be able to represent a 48 bit range and the dot product must +be able to handle an effective 48 bit times 24 bit multiplication. This range may be +achieved using large (64 bit or larger) integers, or implementing a movable binary point +representation. +

    +

    4.3.7. inverse MDCT
    +

    Convert the audio spectrum vector of each channel back into time domain PCM audio via an +inverse Modified Discrete Cosine Transform (MDCT). A detailed description of the MDCT is +available in [1]. The window function used for the MDCT is the function described +earlier. + + + +

    +

    4.3.8. overlap_add
    +

    Windowed MDCT output is overlapped and added with the right hand data of the previous +window such that the 3/4 point of the previous window is aligned with the 1/4 point of the +current window (as illustrated in paragraph 1.3.2, “Window shape decode (long windows +only)”). The overlapped portion produced from overlapping the previous and current frame data +is finished data to be returned by the decoder. This data spans from the center of +the previous window to the center of the current window. In the case of same-sized +windows, the amount of data to return is one-half block consisting of and only of the +overlapped portions. When overlapping a short and long window, much of the returned +range does not actually overlap. This does not damage transform orthogonality. Pay +attention however to returning the correct data range; the amount of data to be returned +is: +

    +

    1  window_blocksize(previous_window)/4+window_blocksize(current_window)/4
    +

    from the center (element windowsize/2) of the previous window to the center (element +windowsize/2-1, inclusive) of the current window. +

    Data is not returned from the first frame; it must be used to ’prime’ the decode engine. The +encoder accounts for this priming when calculating PCM offsets; after the first frame, the proper +PCM output offset is ’0’ (as no data has been returned yet). +

    +

    4.3.9. output channel order
    +

    Vorbis I specifies only a channel mapping type 0. In mapping type 0, channel mapping is +implicitly defined as follows for standard audio applications. As of revision 16781 (20100113), the +specification adds defined channel locations for 6.1 and 7.1 surround. Ordering/location for +greater-than-eight channels remains ’left to the implementation’. +

    These channel orderings refer to order within the encoded stream. It is naturally possible for a +decoder to produce output with channels in any order. Any such decoder should explicitly +document channel reordering behavior. +

    +

    +one channel
    the stream is monophonic + + + +
    +two channels
    the stream is stereo. channel order: left, right +
    +three channels
    the stream is a 1d-surround encoding. channel order: left, center, right +
    +four channels
    the stream is quadraphonic surround. channel order: front left, front right, + rear left, rear right +
    +five channels
    the stream is five-channel surround. channel order: front left, center, front + right, rear left, rear right +
    +six channels
    the stream is 5.1 surround. channel order: front left, center, front right, rear + left, rear right, LFE +
    +seven channels
    the stream is 6.1 surround. channel order: front left, center, front right, + side left, side right, rear center, LFE +
    +eight channels
    the stream is 7.1 surround. channel order: front left, center, front right, + side left, side right, rear left, rear right, LFE +
    +greater than eight channels
    channel use and order is defined by the application +
    +

    Applications using Vorbis for dedicated purposes may define channel mapping as seen fit. Future +channel mappings (such as three and four channel Ambisonics) will make use of channel +mappings other than mapping 0. + + + + + + +

    5. comment field and header specification

    +

    +

    5.1. Overview

    +

    The Vorbis text comment header is the second (of three) header packets that begin a Vorbis +bitstream. It is meant for short text comments, not arbitrary metadata; arbitrary metadata +belongs in a separate logical bitstream (usually an XML stream type) that provides greater +structure and machine parseability. +

    The comment field is meant to be used much like someone jotting a quick note on the bottom of +a CDR. It should be a little information to remember the disc by and explain it to others; a +short, to-the-point text note that need not only be a couple words, but isn’t going to be more +than a short paragraph. The essentials, in other words, whatever they turn out to be, +eg: +

    +

    +

    Honest Bob and the Factory-to-Dealer-Incentives, “I’m Still Around”, opening + for Moxy Früvous, 1997.

    +

    +

    5.2. Comment encoding

    +

    +

    5.2.1. Structure
    +

    The comment header is logically a list of eight-bit-clean vectors; the number of vectors is +bounded to 232 - 1 and the length of each vector is limited to 232 - 1 bytes. The vector length is + + + +encoded; the vector contents themselves are not null terminated. In addition to the vector list, +there is a single vector for vendor name (also 8 bit clean, length encoded in 32 bits). For +example, the 1.0 release of libvorbis set the vendor string to “Xiph.Org libVorbis I +20020717”. +

    The vector lengths and number of vectors are stored lsb first, according to the bit +packing conventions of the vorbis codec. However, since data in the comment header +is octet-aligned, they can simply be read as unaligned 32 bit little endian unsigned +integers. +

    The comment header is decoded as follows: +

    +

    1    1) [vendor\_length] = read an unsigned integer of 32 bits
    2    2) [vendor\_string] = read a UTF-8 vector as [vendor\_length] octets +
    3    3) [user\_comment\_list\_length] = read an unsigned integer of 32 bits
    4    4) iterate [user\_comment\_list\_length] times { +
    5         5) [length] = read an unsigned integer of 32 bits
    6         6) this iteration’s user comment = read a UTF-8 vector as [length] octets +
    7       }
    8    7) [framing\_bit] = read a single bit as boolean
    9    8) if ( [framing\_bit] unset or end-of-packet ) then ERROR
    10    9) done.
    +

    +

    5.2.2. Content vector format
    +

    The comment vectors are structured similarly to a UNIX environment variable. That is, +comment fields consist of a field name and a corresponding value and look like: +

    +

    +

    +

    1  comment[0]="ARTIST=me";
    2  comment[1]="TITLE=the sound of Vorbis";
    +
    +

    The field name is case-insensitive and may consist of ASCII 0x20 through 0x7D, 0x3D (’=’) +excluded. ASCII 0x41 through 0x5A inclusive (characters A-Z) is to be considered equivalent to +ASCII 0x61 through 0x7A inclusive (characters a-z). +

    The field name is immediately followed by ASCII 0x3D (’=’); this equals sign is used to +terminate the field name. +

    0x3D is followed by 8 bit clean UTF-8 encoded value of the field contents to the end of the +field. + + + +

    Field names +Below is a proposed, minimal list of standard field names with a description of intended use. No +single or group of field names is mandatory; a comment header may contain one, all or none of +the names in this list. +

    +

    +TITLE
    Track/Work name +
    +VERSION
    The version field may be used to differentiate multiple versions of the same + track title in a single collection. (e.g. remix info) +
    +ALBUM
    The collection name to which this track belongs +
    +TRACKNUMBER
    The track number of this piece if part of a specific larger collection or + album +
    +ARTIST
    The artist generally considered responsible for the work. In popular music this is + usually the performing band or singer. For classical music it would be the composer. + For an audio book it would be the author of the original text. +
    +PERFORMER
    The artist(s) who performed the work. In classical music this would be the + conductor, orchestra, soloists. In an audio book it would be the actor who did the + reading. In popular music this is typically the same as the ARTIST and is omitted. +
    +COPYRIGHT
    Copyright attribution, e.g., ’2001 Nobody’s Band’ or ’1999 Jack Moffitt’ +
    +LICENSE
    License information, eg, ’All Rights Reserved’, ’Any Use Permitted’, a URL to + a license such as a Creative + Commons license (”www.creativecommons.org/blahblah/license.html”) or the EFF + Open Audio License (’distributed under the terms of the Open Audio License. see + http://www.eff.org/IP/Open_licenses/eff_oal.html for details’), etc. +
    +ORGANIZATION
    Name of the organization producing the track (i.e. the ’record label’) +
    +DESCRIPTION
    A short text description of the contents +
    + + + +GENRE
    A short text indication of music genre +
    +DATE
    Date the track was recorded +
    +LOCATION
    Location where track was recorded +
    +CONTACT
    Contact information for the creators or distributors of the track. This could + be a URL, an email address, the physical address of the producing label. +
    +ISRC
    International Standard Recording Code for the track; see the ISRC intro page for + more information on ISRC numbers. +
    +

    Implications +Field names should not be ’internationalized’; this is a concession to simplicity not +an attempt to exclude the majority of the world that doesn’t speak English. Field +contents, however, use the UTF-8 character encoding to allow easy representation of any +language. +

    We have the length of the entirety of the field and restrictions on the field name so that +the field name is bounded in a known way. Thus we also have the length of the field +contents. +

    Individual ’vendors’ may use non-standard field names within reason. The proper +use of comment fields should be clear through context at this point. Abuse will be +discouraged. +

    There is no vendor-specific prefix to ’nonstandard’ field names. Vendors should make some effort +to avoid arbitrarily polluting the common namespace. We will generally collect the more useful +tags here to help with standardization. +

    Field names are not required to be unique (occur once) within a comment header. As an +example, assume a track was recorded by three well know artists; the following is permissible, +and encouraged: +

    +

    +

    + + + +

    1  ARTIST=Dizzy Gillespie
    2  ARTIST=Sonny Rollins
    3  ARTIST=Sonny Stitt
    +
    +

    +

    5.2.3. Encoding
    +

    The comment header comprises the entirety of the second bitstream header packet. Unlike the +first bitstream header packet, it is not generally the only packet on the second page and may not +be restricted to within the second bitstream page. The length of the comment header packet is +(practically) unbounded. The comment header packet is not optional; it must be present in the +bitstream even if it is effectively empty. +

    The comment header is encoded as follows (as per Ogg’s standard bitstream mapping which +renders least-significant-bit of the word to be coded into the least significant available bit of the +current bitstream octet first): +

    +

    + 1.
    Vendor string length (32 bit unsigned quantity specifying number of octets) +
    + 2.
    Vendor string ([vendor string length] octets coded from beginning of string to end of + string, not null terminated) +
    + 3.
    Number of comment fields (32 bit unsigned quantity specifying number of fields) +
    + 4.
    Comment field 0 length (if [Number of comment fields] > 0; 32 bit unsigned quantity + specifying number of octets) +
    + 5.
    Comment field 0 ([Comment field 0 length] octets coded from beginning of string to + end of string, not null terminated) +
    + 6.
    Comment field 1 length (if [Number of comment fields] > 1...)... +
    +

    This is actually somewhat easier to describe in code; implementation of the above can be found +in vorbis/lib/info.c, _vorbis_pack_comment() and _vorbis_unpack_comment(). + + + + + + + + + +

    6. Floor type 0 setup and decode

    +

    +

    6.1. Overview

    +

    Vorbis floor type zero uses Line Spectral Pair (LSP, also alternately known as Line Spectral +Frequency or LSF) representation to encode a smooth spectral envelope curve as the frequency +response of the LSP filter. This representation is equivalent to a traditional all-pole infinite +impulse response filter as would be used in linear predictive coding; LSP representation may be +converted to LPC representation and vice-versa. +

    +

    6.2. Floor 0 format

    +

    Floor zero configuration consists of six integer fields and a list of VQ codebooks for use in +coding/decoding the LSP filter coefficient values used by each frame. +

    +

    6.2.1. header decode
    +

    Configuration information for instances of floor zero decodes from the codec setup header (third +packet). configuration decode proceeds as follows: +

    +

    1    1) [floor0_order] = read an unsigned integer of 8 bits
    2    2) [floor0_rate] = read an unsigned integer of 16 bits +
    3    3) [floor0_bark_map_size] = read an unsigned integer of 16 bits
    4    4) [floor0_amplitude_bits] = read an unsigned integer of six bits +
    5    5) [floor0_amplitude_offset] = read an unsigned integer of eight bits +
    6    6) [floor0_number_of_books] = read an unsigned integer of four bits and add 1 +
    7    7) array [floor0_book_list] = read a list of [floor0_number_of_books] unsigned integers of eight bits each;
    + + + +

    An end-of-packet condition during any of these bitstream reads renders this stream undecodable. +In addition, any element of the array [floor0_book_list] that is greater than the maximum +codebook number for this bitstream is an error condition that also renders the stream +undecodable. +

    +

    6.2.2. packet decode
    +

    Extracting a floor0 curve from an audio packet consists of first decoding the curve +amplitude and [floor0_order] LSP coefficient values from the bitstream, and then +computing the floor curve, which is defined as the frequency response of the decoded LSP +filter. +

    Packet decode proceeds as follows: +

    1    1) [amplitude] = read an unsigned integer of [floor0_amplitude_bits] bits
    2    2) if ( [amplitude] is greater than zero ) { +
    3         3) [coefficients] is an empty, zero length vector
    4         4) [booknumber] = read an unsigned integer of ilog( [floor0_number_of_books] ) bits +
    5         5) if ( [booknumber] is greater than the highest number decode codebook ) then packet is undecodable
    6         6) [last] = zero; +
    7         7) vector [temp_vector] = read vector from bitstream using codebook number [floor0_book_list] element [booknumber] in VQ context. +
    8         8) add the scalar value [last] to each scalar in vector [temp_vector]
    9         9) [last] = the value of the last scalar in vector [temp_vector] +
    10        10) concatenate [temp_vector] onto the end of the [coefficients] vector +
    11        11) if (length of vector [coefficients] is less than [floor0_order], continue at step 6
    12  
    13       }
    14  
    15   12) done.
    16  
    +

    Take note of the following properties of decode: +

      +
    • An [amplitude] value of zero must result in a return code that indicates this channel + is unused in this frame (the output of the channel will be all-zeroes in synthesis). + Several later stages of decode don’t occur for an unused channel. +
    • +
    • An end-of-packet condition during decode should be considered a nominal occruence; + if end-of-packet is reached during any read operation above, floor decode is to return + ’unused’ status as if the [amplitude] value had read zero at the beginning of decode. +
    • +
    • The book number used for decode can, in fact, be stored in the bitstream in ilog( + [floor0_number_of_books] - 1 ) bits. Nevertheless, the above specification is correct + and values greater than the maximum possible book value are reserved. +
    • +
    • The number of scalars read into the vector [coefficients] may be greater + than [floor0_order], the number actually required for curve computation. For + example, if the VQ codebook used for the floor currently being decoded has a + [codebook_dimensions] value of three and [floor0_order] is ten, the only way to + + + + fill all the needed scalars in [coefficients] is to to read a total of twelve scalars + as four vectors of three scalars each. This is not an error condition, and care must + be taken not to allow a buffer overflow in decode. The extra values are not used and + may be ignored or discarded.
    +

    +

    6.2.3. curve computation
    +

    Given an [amplitude] integer and [coefficients] vector from packet decode as well as +the [floor0_order], [floor0_rate], [floor0_bark_map_size], [floor0_amplitude_bits] and +[floor0_amplitude_offset] values from floor setup, and an output vector size [n] specified by the +decode process, we compute a floor output vector. +

    If the value [amplitude] is zero, the return value is a length [n] vector with all-zero +scalars. Otherwise, begin by assuming the following definitions for the given vector to be +synthesized: +

    +        {
+map  =    min (floor0_bark_map_size    - 1,f oobar)  for i ∈ [0, n - 1]
+    i     - 1                                        for i = n
+
    +

    +

    where +

    +          ⌊                                                 ⌋
+                ( floor0_rate--⋅ i) floor0_bark_map_size----
+f oobar =  bark         2n         ⋅ bark(.5 ⋅ floor0_rate )
+
    +

    +

    and +

    +                                                         2
+bark(x) = 13.1arctan (.00074x ) + 2.24 arctan(.0000000185x  ) + .0001x
+
    +

    +

    The above is used to synthesize the LSP curve on a Bark-scale frequency axis, then map the +result to a linear-scale frequency axis. Similarly, the below calculation synthesizes the output +LSP curve [output] on a log (dB) amplitude scale, mapping it to linear amplitude in the last +step: +

    +

    + 1.
    [i] = 0 +
    + 2.
    [ω] = π * map element [i] / [floor0_bark_map_size] +
    + 3.
    if ( [floor0_order] is odd ) +
    + a)
    calculate [p] and [q] according to:
    +
    +                    floor0∏_2order-3
+p  =   (1 - cos2ω)           4(cos([coefficients  ]2j+1) - cosω )2
+                      j=0
+         floor0_order-1
+       1     ∏2                                     2
+q  =   4-          4(cos([coefficients  ]2j) - cosω )
+            j=0
+
    +
    +
    +

    else [floor0_order] is even + + + +

    + a)
    calculate [p] and [q] according to:
    +
    +                    floor0_order-2
+       (1 - cosω ) ---∏2-----
+p  =   -----------           4(cos([coefficients   ]2j+1) - cosω)2
+            2         j=0
+                   floor0_order--2
+       (1-+-cosω-)    ∏2                                     2
+q  =        2                4(cos([coefficients  ]2j) - cos ω)
+                      j=0
+
    +
    +
    +
    + 4.
    calculate [linear_floor_value] according to: +
    +     (           (                                                                      ))
+                 amplitude---⋅ floor0_amplitute_offset---
+exp   .11512925       (2floor0_amplitude_bits - 1)√p--+-q    -  floor0_amplitude_offset
+
    +

    +

    + 5.
    [iteration_condition] = map element [i] +
    + 6.
    [output] element [i] = [linear_floor_value] +
    + 7.
    increment [i] +
    + 8.
    if ( map element [i] is equal to [iteration_condition] ) continue at step + + + + 5 +
    + 9.
    if ( [i] is less than [n] ) continue at step 2 +
    + 10.
    done
    +

    Errata 20150227: Bark scale computation +Due to a typo when typesetting this version of the specification from the original HTML +document, the Bark scale computation previously erroneously read: +

    +                                                         2
+bark(x) = 13.1arctan (.00074x ) + 2.24 arctan(.0000000185x  +  .0001x )
+
    +

    +

    Note that the last parenthesis is misplaced. This document now uses the correct equation as it +appeared in the original HTML spec document: +

    +bark(x) = 13.1arctan (.00074x ) + 2.24 arctan(.0000000185x2 ) + .0001x
+
    +

    + + + + + + +

    7. Floor type 1 setup and decode

    +

    +

    7.1. Overview

    +

    Vorbis floor type one uses a piecewise straight-line representation to encode a spectral envelope +curve. The representation plots this curve mechanically on a linear frequency axis and a +logarithmic (dB) amplitude axis. The integer plotting algorithm used is similar to Bresenham’s +algorithm. +

    +

    7.2. Floor 1 format

    +

    +

    7.2.1. model
    +

    Floor type one represents a spectral curve as a series of line segments. Synthesis constructs a +floor curve using iterative prediction in a process roughly equivalent to the following simplified +description: +

      +
    • the first line segment (base case) is a logical line spanning from x˙0,y˙0 to x˙1,y˙1 + where in the base case x˙0=0 and x˙1=[n], the full range of the spectral floor to be + computed. +
    • +
    • the induction step chooses a point x˙new within an existing logical line segment and + produces a y˙new value at that point computed from the existing line’s y value at + x˙new (as plotted by the line) and a difference value decoded from the bitstream + packet. + + + +
    • +
    • floor computation produces two new line segments, one running from x˙0,y˙0 to + x˙new,y˙new and from x˙new,y˙new to x˙1,y˙1. This step is performed logically even if + y˙new represents no change to the amplitude value at x˙new so that later refinement + is additionally bounded at x˙new. +
    • +
    • the induction step repeats, using a list of x values specified in the codec setup header + at floor 1 initialization time. Computation is completed at the end of the x value list. +
    +

    Consider the following example, with values chosen for ease of understanding rather than +representing typical configuration: +

    For the below example, we assume a floor setup with an [n] of 128. The list of selected X values +in increasing order is 0,16,32,48,64,80,96,112 and 128. In list order, the values interleave as 0, +128, 64, 32, 96, 16, 48, 80 and 112. The corresponding list-order Y values as decoded from an +example packet are 110, 20, -5, -45, 0, -25, -10, 30 and -10. We compute the floor in the following +way, beginning with the first line: +

    +

    + +

    PIC +

    Figure 7: graph of example floor
    +
    +

    We now draw new logical lines to reflect the correction to new˙Y, and iterate for X positions 32 +and 96: +

    +

    + +

    PIC +

    Figure 8: graph of example floor
    +
    +

    Although the new Y value at X position 96 is unchanged, it is still used later as an endpoint for +further refinement. From here on, the pattern should be clear; we complete the floor computation +as follows: + + + +

    +

    + +

    PIC +

    Figure 9: graph of example floor
    +
    +
    +

    + +

    PIC +

    Figure 10: graph of example floor
    +
    +

    A more efficient algorithm with carefully defined integer rounding behavior is used for actual +decode, as described later. The actual algorithm splits Y value computation and line plotting +into two steps with modifications to the above algorithm to eliminate noise accumulation +through integer roundoff/truncation. +

    +

    7.2.2. header decode
    +

    A list of floor X values is stored in the packet header in interleaved format (used in list order +during packet decode and synthesis). This list is split into partitions, and each partition is +assigned to a partition class. X positions 0 and [n] are implicit and do not belong to an explicit +partition or partition class. +

    A partition class consists of a representation vector width (the number of Y values which +the partition class encodes at once), a ’subclass’ value representing the number of +alternate entropy books the partition class may use in representing Y values, the list of +[subclass] books and a master book used to encode which alternate books were chosen +for representation in a given packet. The master/subclass mechanism is meant to be +used as a flexible representation cascade while still using codebooks only in a scalar +context. + + + +

    +

    1  
    2    1) [floor1_partitions] = read 5 bits as unsigned integer
    3    2) [maximum_class] = -1
    4    3) iterate [i] over the range 0 ... [floor1_partitions]-1 { +
    5  
    6          4) vector [floor1_partition_class_list] element [i] = read 4 bits as unsigned integer
    7  
    8       }
    9   +
    10    5) [maximum_class] = largest integer scalar value in vector [floor1_partition_class_list]
    11    6) iterate [i] over the range 0 ... [maximum_class] { +
    12  
    13          7) vector [floor1_class_dimensions] element [i] = read 3 bits as unsigned integer and add 1 +
    14   8) vector [floor1_class_subclasses] element [i] = read 2 bits as unsigned integer +
    15          9) if ( vector [floor1_class_subclasses] element [i] is nonzero ) {
    16   +
    17               10) vector [floor1_class_masterbooks] element [i] = read 8 bits as unsigned integer
    18  
    19             }
    20   +
    21         11) iterate [j] over the range 0 ... (2 exponent [floor1_class_subclasses] element [i]) - 1 {
    22   +
    23               12) array [floor1_subclass_books] element [i],[j] =
    24                   read 8 bits as unsigned integer and subtract one
    25             } +
    26        }
    27  
    28   13) [floor1_multiplier] = read 2 bits as unsigned integer and add one
    29   14) [rangebits] = read 4 bits as unsigned integer +
    30   15) vector [floor1_X_list] element [0] = 0
    31   16) vector [floor1_X_list] element [1] = 2 exponent [rangebits]; +
    32   17) [floor1_values] = 2
    33   18) iterate [i] over the range 0 ... [floor1_partitions]-1 { +
    34  
    35         19) [current_class_number] = vector [floor1_partition_class_list] element [i] +
    36         20) iterate [j] over the range 0 ... ([floor1_class_dimensions] element [current_class_number])-1 { +
    37               21) vector [floor1_X_list] element ([floor1_values]) =
    38                   read [rangebits] bits as unsigned integer +
    39               22) increment [floor1_values] by one
    40             }
    41       }
    42  
    43   23) done
    +

    An end-of-packet condition while reading any aspect of a floor 1 configuration during +setup renders a stream undecodable. In addition, a [floor1_class_masterbooks] or +[floor1_subclass_books] scalar element greater than the highest numbered codebook +configured in this stream is an error condition that renders the stream undecodable. Vector +[floor1_x_list] is limited to a maximum length of 65 elements; a setup indicating more than 65 +total elements (including elements 0 and 1 set prior to the read loop) renders the stream +undecodable. All vector [floor1_x_list] element values must be unique within the vector; a +non-unique value renders the stream undecodable. +

    +

    7.2.3. packet decode
    +

    Packet decode begins by checking the [nonzero] flag: +

    +

    1    1) [nonzero] = read 1 bit as boolean
    +

    If [nonzero] is unset, that indicates this channel contained no audio energy in this frame. +Decode immediately returns a status indicating this floor curve (and thus this channel) is unused +this frame. (A return status of ’unused’ is different from decoding a floor that has all +points set to minimum representation amplitude, which happens to be approximately +-140dB). +

    Assuming [nonzero] is set, decode proceeds as follows: +

    +

    1    1) [range] = vector { 256, 128, 86, 64 } element ([floor1_multiplier]-1) + + + +
    2    2) vector [floor1_Y] element [0] = read ilog([range]-1) bits as unsigned integer +
    3    3) vector [floor1_Y] element [1] = read ilog([range]-1) bits as unsigned integer +
    4    4) [offset] = 2;
    5    5) iterate [i] over the range 0 ... [floor1_partitions]-1 {
    6   +
    7         6) [class] = vector [floor1_partition_class]  element [i]
    8         7) [cdim]  = vector [floor1_class_dimensions] element [class] +
    9         8) [cbits] = vector [floor1_class_subclasses] element [class]
    10         9) [csub]  = (2 exponent [cbits])-1
    11        10) [cval]  = 0 +
    12        11) if ( [cbits] is greater than zero ) {
    13  
    14               12) [cval] = read from packet using codebook number +
    15                   (vector [floor1_class_masterbooks] element [class]) in scalar context +
    16            }
    17  
    18        13) iterate [j] over the range 0 ... [cdim]-1 {
    19   +
    20               14) [book] = array [floor1_subclass_books] element [class],([cval] bitwise AND [csub]) +
    21               15) [cval] = [cval] right shifted [cbits] bits
    22        16) if ( [book] is not less than zero ) {
    23   +
    24              17) vector [floor1_Y] element ([j]+[offset]) = read from packet using codebook
    25                         [book] in scalar context +
    26  
    27                   } else [book] is less than zero {
    28  
    29              18) vector [floor1_Y] element ([j]+[offset]) = 0 +
    30  
    31                   }
    32            }
    33  
    34        19) [offset] = [offset] + [cdim]
    35  
    36       }
    37  
    38   20) done
    +

    An end-of-packet condition during curve decode should be considered a nominal occurrence; if +end-of-packet is reached during any read operation above, floor decode is to return ’unused’ +status as if the [nonzero] flag had been unset at the beginning of decode. +

    Vector [floor1_Y] contains the values from packet decode needed for floor 1 synthesis. +

    +

    7.2.4. curve computation
    +

    Curve computation is split into two logical steps; the first step derives final Y amplitude values +from the encoded, wrapped difference values taken from the bitstream. The second step +plots the curve lines. Also, although zero-difference values are used in the iterative +prediction to find final Y values, these points are conditionally skipped during final +line computation in step two. Skipping zero-difference values allows a smoother line +fit. +

    Although some aspects of the below algorithm look like inconsequential optimizations, +implementors are warned to follow the details closely. Deviation from implementing a strictly +equivalent algorithm can result in serious decoding errors. +

    Additional note: Although [floor1_final_Y] values in the prediction loop and at the end of +step 1 are inherently limited by the prediction algorithm to [0, [range]), it is possible to abuse +the setup and codebook machinery to produce negative or over-range results. We suggest that +decoder implementations guard the values in vector [floor1_final_Y] by clamping each +element to [0, [range]) after step 1. Variants of this suggestion are acceptable as valid floor1 +setups cannot produce out of range values. +

    +

    +step 1: amplitude value synthesis
    +

    Unwrap the always-positive-or-zero values read from the packet into +/- difference + + + + values, then apply to line prediction. +

    +

    1    1) [range] = vector { 256, 128, 86, 64 } element ([floor1_multiplier]-1)
    2    2) vector [floor1_step2_flag] element [0] = set +
    3    3) vector [floor1_step2_flag] element [1] = set
    4    4) vector [floor1_final_Y] element [0] = vector [floor1_Y] element [0] +
    5    5) vector [floor1_final_Y] element [1] = vector [floor1_Y] element [1]
    6    6) iterate [i] over the range 2 ... [floor1_values]-1 {
    7   +
    8         7) [low_neighbor_offset] = low_neighbor([floor1_X_list],[i])
    9         8) [high_neighbor_offset] = high_neighbor([floor1_X_list],[i]) +
    10  
    11         9) [predicted] = render_point( vector [floor1_X_list] element [low_neighbor_offset], +
    12         vector [floor1_final_Y] element [low_neighbor_offset], +
    13                                        vector [floor1_X_list] element [high_neighbor_offset], +
    14         vector [floor1_final_Y] element [high_neighbor_offset], +
    15                                        vector [floor1_X_list] element [i] )
    16  
    17        10) [val] = vector [floor1_Y] element [i] +
    18        11) [highroom] = [range] - [predicted]
    19        12) [lowroom]  = [predicted] +
    20        13) if ( [highroom] is less than [lowroom] ) {
    21  
    22              14) [room] = [highroom] * 2
    23   +
    24            } else [highroom] is not less than [lowroom] {
    25  
    26              15) [room] = [lowroom] * 2
    27  
    28            }
    29   +
    30        16) if ( [val] is nonzero ) {
    31  
    32              17) vector [floor1_step2_flag] element [low_neighbor_offset] = set +
    33              18) vector [floor1_step2_flag] element [high_neighbor_offset] = set +
    34              19) vector [floor1_step2_flag] element [i] = set
    35              20) if ( [val] is greater than or equal to [room] ) { +
    36  
    37                    21) if ( [highroom] is greater than [lowroom] ) {
    38   +
    39                          22) vector [floor1_final_Y] element [i] = [val] - [lowroom] + [predicted] +
    40  
    41         } else [highroom] is not greater than [lowroom] {
    42   +
    43                          23) vector [floor1_final_Y] element [i] = [predicted] - [val] + [highroom] - 1 +
    44  
    45                        }
    46  
    47                  } else [val] is less than [room] {
    48   +
    49                      24) if ([val] is odd) {
    50  
    51                          25) vector [floor1_final_Y] element [i] = +
    52                              [predicted] - (([val] + 1) divided by  2 using integer division)
    53   +
    54                        } else [val] is even {
    55  
    56                          26) vector [floor1_final_Y] element [i] = +
    57                              [predicted] + ([val] / 2 using integer division)
    58  
    59                        }
    60   +
    61                  }
    62  
    63            } else [val] is zero {
    64  
    65              27) vector [floor1_step2_flag] element [i] = unset +
    66              28) vector [floor1_final_Y] element [i] = [predicted]
    67  
    68            }
    69  
    70       }
    71  
    72   29) done
    73  
    +
    +step 2: curve synthesis
    +

    Curve synthesis generates a return vector [floor] of length [n] (where [n] is provided by + the decode process calling to floor decode). Floor 1 curve synthesis makes use of the + [floor1_X_list], [floor1_final_Y] and [floor1_step2_flag] vectors, as well as + [floor1_multiplier] and [floor1_values] values. +

    Decode begins by sorting the scalars from vectors [floor1_X_list], [floor1_final_Y] and + [floor1_step2_flag] together into new vectors [floor1_X_list]’, [floor1_final_Y]’ + and [floor1_step2_flag]’ according to ascending sort order of the values in + [floor1_X_list]. That is, sort the values of [floor1_X_list] and then apply the same + permutation to elements of the other two vectors so that the X, Y and step2_flag values + still match. +

    Then compute the final curve in one pass: +

    +

    1    1) [hx] = 0
    2    2) [lx] = 0
    3    3) [ly] = vector [floor1_final_Y]’ element [0] * [floor1_multiplier] +
    4    4) iterate [i] over the range 1 ... [floor1_values]-1 {
    5  
    6         5) if ( [floor1_step2_flag]’ element [i] is set ) {
    7   +
    8               6) [hy] = [floor1_final_Y]’ element [i] * [floor1_multiplier]
    9         7) [hx] = [floor1_X_list]’ element [i] +
    10               8) render_line( [lx], [ly], [hx], [hy], [floor] )
    11               9) [lx] = [hx]
    12       10) [ly] = [hy] +
    13            }
    14       }
    15  
    16   11) if ( [hx] is less than [n] ) {
    17  
    18          12) render_line( [hx], [hy], [n], [hy], [floor] ) +
    19  
    20       }
    21  
    22   13) if ( [hx] is greater than [n] ) {
    23  
    24              14) truncate vector [floor] to [n] elements +
    25  
    26       }
    27  
    28   15) for each scalar in vector [floor], perform a lookup substitution using + + + +
    29       the scalar value from [floor] as an offset into the vector [floor1_inverse_dB_static_table]
    30  
    31   16) done
    32  
    +
    + + + +

    8. Residue setup and decode

    +

    +

    8.1. Overview

    +

    A residue vector represents the fine detail of the audio spectrum of one channel in an audio frame +after the encoder subtracts the floor curve and performs any channel coupling. A residue vector +may represent spectral lines, spectral magnitude, spectral phase or hybrids as mixed by channel +coupling. The exact semantic content of the vector does not matter to the residue +abstraction. +

    Whatever the exact qualities, the Vorbis residue abstraction codes the residue vectors into the +bitstream packet, and then reconstructs the vectors during decode. Vorbis makes use of three +different encoding variants (numbered 0, 1 and 2) of the same basic vector encoding +abstraction. +

    +

    8.2. Residue format

    +

    Residue format partitions each vector in the vector bundle into chunks, classifies each +chunk, encodes the chunk classifications and finally encodes the chunks themselves +using the the specific VQ arrangement defined for each selected classification. The +exact interleaving and partitioning vary by residue encoding number, however the +high-level process used to classify and encode the residue vector is the same in all three +variants. +

    A set of coded residue vectors are all of the same length. High level coding structure, ignoring for +the moment exactly how a partition is encoded and simply trusting that it is, is as +follows: +

      +
    • Each vector is partitioned into multiple equal sized chunks according to configuration + specified. If we have a vector size of n, a partition size residue_partition_size, + and a total of ch residue vectors, the total number of partitioned chunks coded + + + + is n/residue_partition_size*ch. It is important to note that the integer division + truncates. In the below example, we assume an example residue_partition_size of 8. +
    • +
    • Each partition in each vector has a classification number that specifies which of + multiple configured VQ codebook setups are used to decode that partition. The + classification numbers of each partition can be thought of as forming a vector in + their own right, as in the illustration below. Just as the residue vectors are coded + in grouped partitions to increase encoding efficiency, the classification vector is also + partitioned into chunks. The integer elements of each scalar in a classification chunk + are built into a single scalar that represents the classification numbers in that chunk. + In the below example, the classification codeword encodes two classification numbers. +
    • +
    • The values in a residue vector may be encoded monolithically in a single pass through + the residue vector, but more often efficient codebook design dictates that each vector + is encoded as the additive sum of several passes through the residue vector using + more than one VQ codebook. Thus, each residue value potentially accumulates values + from multiple decode passes. The classification value associated with a partition is + the same in each pass, thus the classification codeword is coded only in the first pass. +
    +
    +

    + +

    PIC +

    Figure 11: illustration of residue vector format
    +
    +

    +

    8.3. residue 0

    +

    Residue 0 and 1 differ only in the way the values within a residue partition are interleaved during +partition encoding (visually treated as a black box–or cyan box or brown box–in the above +figure). +

    Residue encoding 0 interleaves VQ encoding according to the dimension of the codebook used to + + + +encode a partition in a specific pass. The dimension of the codebook need not be the same in +multiple passes, however the partition size must be an even multiple of the codebook +dimension. +

    As an example, assume a partition vector of size eight, to be encoded by residue 0 using +codebook sizes of 8, 4, 2 and 1: +

    +

    1  
    2              original residue vector: [ 0 1 2 3 4 5 6 7 ]
    3  
    4  codebook dimensions = 8  encoded as: [ 0 1 2 3 4 5 6 7 ]
    5   +
    6  codebook dimensions = 4  encoded as: [ 0 2 4 6 ], [ 1 3 5 7 ]
    7  
    8  codebook dimensions = 2  encoded as: [ 0 4 ], [ 1 5 ], [ 2 6 ], [ 3 7 ] +
    9  
    10  codebook dimensions = 1  encoded as: [ 0 ], [ 1 ], [ 2 ], [ 3 ], [ 4 ], [ 5 ], [ 6 ], [ 7 ]
    11  
    +

    It is worth mentioning at this point that no configurable value in the residue coding setup is +restricted to a power of two. +

    +

    8.4. residue 1

    +

    Residue 1 does not interleave VQ encoding. It represents partition vector scalars in order. As +with residue 0, however, partition length must be an integer multiple of the codebook dimension, +although dimension may vary from pass to pass. +

    As an example, assume a partition vector of size eight, to be encoded by residue 0 using +codebook sizes of 8, 4, 2 and 1: +

    +

    1  
    2              original residue vector: [ 0 1 2 3 4 5 6 7 ]
    3  
    4  codebook dimensions = 8  encoded as: [ 0 1 2 3 4 5 6 7 ]
    5   +
    6  codebook dimensions = 4  encoded as: [ 0 1 2 3 ], [ 4 5 6 7 ]
    7  
    8  codebook dimensions = 2  encoded as: [ 0 1 ], [ 2 3 ], [ 4 5 ], [ 6 7 ] +
    9  
    10  codebook dimensions = 1  encoded as: [ 0 ], [ 1 ], [ 2 ], [ 3 ], [ 4 ], [ 5 ], [ 6 ], [ 7 ]
    11  
    +

    +

    8.5. residue 2

    +

    Residue type two can be thought of as a variant of residue type 1. Rather than encoding multiple +passed-in vectors as in residue type 1, the ch passed in vectors of length n are first interleaved +and flattened into a single vector of length ch*n. Encoding then proceeds as in type 1. Decoding +is as in type 1 with decode interleave reversed. If operating on a single vector to begin with, +residue type 1 and type 2 are equivalent. + + + +

    +

    + +

    PIC +

    Figure 12: illustration of residue type 2
    +
    +

    +

    8.6. Residue decode

    +

    +

    8.6.1. header decode
    +

    Header decode for all three residue types is identical. +

    1    1) [residue\_begin] = read 24 bits as unsigned integer
    2    2) [residue\_end] = read 24 bits as unsigned integer +
    3    3) [residue\_partition\_size] = read 24 bits as unsigned integer and add one +
    4    4) [residue\_classifications] = read 6 bits as unsigned integer and add one
    5    5) [residue\_classbook] = read 8 bits as unsigned integer
    +

    [residue_begin] and [residue_end] select the specific sub-portion of each vector that is +actually coded; it implements akin to a bandpass where, for coding purposes, the vector +effectively begins at element [residue_begin] and ends at [residue_end]. Preceding and +following values in the unpacked vectors are zeroed. Note that for residue type 2, these +values as well as [residue_partition_size]apply to the interleaved vector, not the +individual vectors before interleave. [residue_partition_size] is as explained above, +[residue_classifications] is the number of possible classification to which a partition can +belong and [residue_classbook] is the codebook number used to code classification +codewords. The number of dimensions in book [residue_classbook] determines how +many classification values are grouped into a single classification codeword. Note that +the number of entries and dimensions in book [residue_classbook], along with +[residue_classifications], overdetermines to possible number of classification +codewords. If [residue_classifications]ˆ[residue_classbook].dimensions exceeds +[residue_classbook].entries, the bitstream should be regarded to be undecodable. + + + +

    Next we read a bitmap pattern that specifies which partition classes code values in which +passes. +

    +

    1    1) iterate [i] over the range 0 ... [residue\_classifications]-1 {
    2  
    3         2) [high\_bits] = 0 +
    4         3) [low\_bits] = read 3 bits as unsigned integer
    5         4) [bitflag] = read one bit as boolean +
    6         5) if ( [bitflag] is set ) then [high\_bits] = read five bits as unsigned integer +
    7         6) vector [residue\_cascade] element [i] = [high\_bits] * 8 + [low\_bits]
    8       }
    9    7) done
    +

    Finally, we read in a list of book numbers, each corresponding to specific bit set in the cascade +bitmap. We loop over the possible codebook classifications and the maximum possible number of +encoding stages (8 in Vorbis I, as constrained by the elements of the cascade bitmap being eight +bits): +

    +

    1    1) iterate [i] over the range 0 ... [residue\_classifications]-1 {
    2  
    3         2) iterate [j] over the range 0 ... 7 { +
    4  
    5              3) if ( vector [residue\_cascade] element [i] bit [j] is set ) {
    6   +
    7                   4) array [residue\_books] element [i][j] = read 8 bits as unsigned integer
    8  
    9                 } else {
    10   +
    11                   5) array [residue\_books] element [i][j] = unused
    12  
    13                 }
    14            }
    15        }
    16  
    17    6) done
    +

    An end-of-packet condition at any point in header decode renders the stream undecodable. +In addition, any codebook number greater than the maximum numbered codebook +set up in this stream also renders the stream undecodable. All codebooks in array +[residue_books] are required to have a value mapping. The presence of codebook in array +[residue_books] without a value mapping (maptype equals zero) renders the stream +undecodable. +

    +

    8.6.2. packet decode
    +

    Format 0 and 1 packet decode is identical except for specific partition interleave. Format 2 packet +decode can be built out of the format 1 decode process. Thus we describe first the decode +infrastructure identical to all three formats. +

    In addition to configuration information, the residue decode process is passed the number of +vectors in the submap bundle and a vector of flags indicating if any of the vectors are not to be +decoded. If the passed in number of vectors is 3 and vector number 1 is marked ’do not decode’, +decode skips vector 1 during the decode loop. However, even ’do not decode’ vectors are +allocated and zeroed. +

    Depending on the values of [residue_begin] and [residue_end], it is obvious that the +encoded portion of a residue vector may be the entire possible residue vector or some other strict +subset of the actual residue vector size with zero padding at either uncoded end. However, it is + + + +also possible to set [residue_begin] and [residue_end] to specify a range partially or wholly +beyond the maximum vector size. Before beginning residue decode, limit [residue_begin] +and [residue_end] to the maximum possible vector size as follows. We assume that +the number of vectors being encoded, [ch] is provided by the higher level decoding +process. +

    +

    1    1) [actual\_size] = current blocksize/2;
    2    2) if residue encoding is format 2 +
    3         3) [actual\_size] = [actual\_size] * [ch];
    4    4) [limit\_residue\_begin] = maximum of ([residue\_begin],[actual\_size]); +
    5    5) [limit\_residue\_end] = maximum of ([residue\_end],[actual\_size]);
    +

    The following convenience values are conceptually useful to clarifying the decode process: +

    +

    1    1) [classwords\_per\_codeword] = [codebook\_dimensions] value of codebook [residue\_classbook] +
    2    2) [n\_to\_read] = [limit\_residue\_end] - [limit\_residue\_begin]
    3    3) [partitions\_to\_read] = [n\_to\_read] / [residue\_partition\_size]
    +

    Packet decode proceeds as follows, matching the description offered earlier in the document. +

    1    1) allocate and zero all vectors that will be returned.
    2    2) if ([n\_to\_read] is zero), stop; there is no residue to decode. +
    3    3) iterate [pass] over the range 0 ... 7 {
    4  
    5         4) [partition\_count] = 0
    6   +
    7         5) while [partition\_count] is less than [partitions\_to\_read]
    8  
    9              6) if ([pass] is zero) {
    10   +
    11                   7) iterate [j] over the range 0 .. [ch]-1 {
    12  
    13                        8) if vector [j] is not marked ’do not decode’ { +
    14  
    15                             9) [temp] = read from packet using codebook [residue\_classbook] in scalar context +
    16                            10) iterate [i] descending over the range [classwords\_per\_codeword]-1 ... 0 { +
    17  
    18                                 11) array [classifications] element [j],([i]+[partition\_count]) = +
    19                                     [temp] integer modulo [residue\_classifications] +
    20                                 12) [temp] = [temp] / [residue\_classifications] using integer division
    21   +
    22                                }
    23  
    24                           }
    25  
    26                      }
    27  
    28                 }
    29   +
    30             13) iterate [i] over the range 0 .. ([classwords\_per\_codeword] - 1) while [partition\_count] +
    31                 is also less than [partitions\_to\_read] {
    32  
    33                   14) iterate [j] over the range 0 .. [ch]-1 { +
    34  
    35                        15) if vector [j] is not marked ’do not decode’ {
    36   +
    37                             16) [vqclass] = array [classifications] element [j],[partition\_count] +
    38                             17) [vqbook] = array [residue\_books] element [vqclass],[pass]
    39                             18) if ([vqbook] is not ’unused’) { +
    40  
    41                                  19) decode partition into output vector number [j], starting at scalar +
    42                                      offset [limit\_residue\_begin]+[partition\_count]*[residue\_partition\_size] using +
    43                                      codebook number [vqbook] in VQ context
    44                            }
    45                       } +
    46  
    47                   20) increment [partition\_count] by one
    48  
    49                 }
    50            }
    51       }
    52  
    53   21) done
    54  
    +

    An end-of-packet condition during packet decode is to be considered a nominal occurrence. +Decode returns the result of vector decode up to that point. +

    +

    8.6.3. format 0 specifics
    +

    Format zero decodes partitions exactly as described earlier in the ’Residue Format: residue 0’ +section. The following pseudocode presents the same algorithm. Assume: + + + +

      +
    • [n] is the value in [residue_partition_size] +
    • +
    • [v] is the residue vector +
    • +
    • [offset] is the beginning read offset in [v]
    +

    +

    1   1) [step] = [n] / [codebook\_dimensions]
    2   2) iterate [i] over the range 0 ... [step]-1 {
    3   +
    4        3) vector [entry\_temp] = read vector from packet using current codebook in VQ context +
    5        4) iterate [j] over the range 0 ... [codebook\_dimensions]-1 {
    6  
    7             5) vector [v] element ([offset]+[i]+[j]*[step]) = +
    8           vector [v] element ([offset]+[i]+[j]*[step]) +
    9                  vector [entry\_temp] element [j]
    10  
    11           }
    12  
    13      }
    14  
    15    6) done
    16  
    +

    +

    8.6.4. format 1 specifics
    +

    Format 1 decodes partitions exactly as described earlier in the ’Residue Format: residue 1’ +section. The following pseudocode presents the same algorithm. Assume: +

      +
    • [n] is the value in [residue_partition_size] +
    • +
    • [v] is the residue vector +
    • +
    • [offset] is the beginning read offset in [v]
    +

    +

    1   1) [i] = 0
    2   2) vector [entry\_temp] = read vector from packet using current codebook in VQ context +
    3   3) iterate [j] over the range 0 ... [codebook\_dimensions]-1 {
    4  
    5        4) vector [v] element ([offset]+[i]) = +
    6     vector [v] element ([offset]+[i]) +
    7            vector [entry\_temp] element [j]
    8        5) increment [i]
    9   +
    10      }
    11  
    12    6) if ( [i] is less than [n] ) continue at step 2
    13    7) done
    +

    +

    8.6.5. format 2 specifics
    + + + +

    Format 2 is reducible to format 1. It may be implemented as an additional step prior to and an +additional post-decode step after a normal format 1 decode. +

    Format 2 handles ’do not decode’ vectors differently than residue 0 or 1; if all vectors are marked +’do not decode’, no decode occurrs. However, if at least one vector is to be decoded, all +the vectors are decoded. We then request normal format 1 to decode a single vector +representing all output channels, rather than a vector for each channel. After decode, +deinterleave the vector into independent vectors, one for each output channel. That +is: +

    +

    + 1.
    If all vectors 0 through ch-1 are marked ’do not decode’, allocate and clear a single + vector [v]of length ch*n and skip step 2 below; proceed directly to the post-decode + step. +
    + 2.
    Rather than performing format 1 decode to produce ch vectors of length n each, call + format 1 decode to produce a single vector [v] of length ch*n. +
    + 3.
    Post decode: Deinterleave the single vector [v] returned by format 1 decode as + described above into ch independent vectors, one for each outputchannel, according + to: +
    1    1) iterate [i] over the range 0 ... [n]-1 {
    2  
    3         2) iterate [j] over the range 0 ... [ch]-1 {
    4   +
    5              3) output vector number [j] element [i] = vector [v] element ([i] * [ch] + [j])
    6  
    7            }
    8       }
    9  
    10    4) done
    +
    + + + + + + +

    9. Helper equations

    +

    +

    9.1. Overview

    +

    The equations below are used in multiple places by the Vorbis codec specification. Rather than +cluttering up the main specification documents, they are defined here and referenced where +appropriate. +

    +

    9.2. Functions

    +

    +

    9.2.1. ilog
    +

    The ”ilog(x)” function returns the position number (1 through n) of the highest set bit in the +two’s complement integer value [x]. Values of [x] less than zero are defined to return +zero. +

    +

    1    1) [return\_value] = 0;
    2    2) if ( [x] is greater than zero ) {
    3  
    4         3) increment [return\_value]; +
    5         4) logical shift [x] one bit to the right, padding the MSb with zero
    6         5) repeat at step 2)
    7  
    8       }
    9  
    10     6) done
    +

    Examples: +

      +
    • ilog(0) = 0; +
    • +
    • ilog(1) = 1; + + + +
    • +
    • ilog(2) = 2; +
    • +
    • ilog(3) = 2; +
    • +
    • ilog(4) = 3; +
    • +
    • ilog(7) = 3; +
    • +
    • ilog(negative number) = 0;
    +

    +

    9.2.2. float32_unpack
    +

    ”float32_unpack(x)” is intended to translate the packed binary representation of a Vorbis +codebook float value into the representation used by the decoder for floating point numbers. For +purposes of this example, we will unpack a Vorbis float32 into a host-native floating point +number. +

    +

    1    1) [mantissa] = [x] bitwise AND 0x1fffff (unsigned result)
    2    2) [sign] = [x] bitwise AND 0x80000000 (unsigned result) +
    3    3) [exponent] = ( [x] bitwise AND 0x7fe00000) shifted right 21 bits (unsigned result) +
    4    4) if ( [sign] is nonzero ) then negate [mantissa]
    5    5) return [mantissa] * ( 2 ^ ( [exponent] - 788 ) )
    +

    +

    9.2.3. lookup1_values
    +

    ”lookup1_values(codebook_entries,codebook_dimensions)” is used to compute the +correct length of the value index for a codebook VQ lookup table of lookup type 1. +The values on this list are permuted to construct the VQ vector lookup table of size +[codebook_entries]. +

    The return value for this function is defined to be ’the greatest integer value for which +[return_value] to the power of [codebook_dimensions] is less than or equal to +[codebook_entries]’. + + + +

    +

    9.2.4. low_neighbor
    +

    ”low_neighbor(v,x)” finds the position n in vector [v] of the greatest value scalar element for +which n is less than [x] and vector [v] element n is less than vector [v] element +[x]. +

    +

    9.2.5. high_neighbor
    +

    ”high_neighbor(v,x)” finds the position n in vector [v] of the lowest value scalar element for +which n is less than [x] and vector [v] element n is greater than vector [v] element +[x]. +

    +

    9.2.6. render_point
    +

    ”render_point(x0,y0,x1,y1,X)” is used to find the Y value at point X along the line specified by +x0, x1, y0 and y1. This function uses an integer algorithm to solve for the point directly without +calculating intervening values along the line. +

    +

    1    1)  [dy] = [y1] - [y0]
    2    2) [adx] = [x1] - [x0]
    3    3) [ady] = absolute value of [dy]
    4    4) [err] = [ady] * ([X] - [x0]) +
    5    5) [off] = [err] / [adx] using integer division
    6    6) if ( [dy] is less than zero ) {
    7  
    8         7) [Y] = [y0] - [off] +
    9  
    10       } else {
    11  
    12         8) [Y] = [y0] + [off]
    13  
    14       }
    15  
    16    9) done
    +

    +

    9.2.7. render_line
    + + + +

    Floor decode type one uses the integer line drawing algorithm of ”render_line(x0, y0, x1, y1, v)” +to construct an integer floor curve for contiguous piecewise line segments. Note that it has not +been relevant elsewhere, but here we must define integer division as rounding division of both +positive and negative numbers toward zero. +

    +

    1    1)   [dy] = [y1] - [y0]
    2    2)  [adx] = [x1] - [x0]
    3    3)  [ady] = absolute value of [dy]
    4    4) [base] = [dy] / [adx] using integer division +
    5    5)    [x] = [x0]
    6    6)    [y] = [y0]
    7    7)  [err] = 0
    8  
    9    8) if ( [dy] is less than 0 ) {
    10  
    11          9) [sy] = [base] - 1 +
    12  
    13       } else {
    14  
    15         10) [sy] = [base] + 1
    16  
    17       }
    18  
    19   11) [ady] = [ady] - (absolute value of [base]) * [adx] +
    20   12) vector [v] element [x] = [y]
    21  
    22   13) iterate [x] over the range [x0]+1 ... [x1]-1 {
    23  
    24         14) [err] = [err] + [ady]; +
    25         15) if ( [err] >= [adx] ) {
    26  
    27               16) [err] = [err] - [adx]
    28               17)   [y] = [y] + [sy]
    29   +
    30             } else {
    31  
    32               18) [y] = [y] + [base]
    33  
    34             }
    35  
    36         19) vector [v] element [x] = [y]
    37  
    38       }
    + + + + + + +

    10. Tables

    +

    +

    10.1. floor1_inverse_dB_table

    +

    The vector [floor1_inverse_dB_table] is a 256 element static lookup table consisting of the +following values (read left to right then top to bottom): +

    +

    1    1.0649863e-07, 1.1341951e-07, 1.2079015e-07, 1.2863978e-07,
    2    1.3699951e-07, 1.4590251e-07, 1.5538408e-07, 1.6548181e-07, +
    3    1.7623575e-07, 1.8768855e-07, 1.9988561e-07, 2.1287530e-07,
    4    2.2670913e-07, 2.4144197e-07, 2.5713223e-07, 2.7384213e-07, +
    5    2.9163793e-07, 3.1059021e-07, 3.3077411e-07, 3.5226968e-07,
    6    3.7516214e-07, 3.9954229e-07, 4.2550680e-07, 4.5315863e-07, +
    7    4.8260743e-07, 5.1396998e-07, 5.4737065e-07, 5.8294187e-07,
    8    6.2082472e-07, 6.6116941e-07, 7.0413592e-07, 7.4989464e-07, +
    9    7.9862701e-07, 8.5052630e-07, 9.0579828e-07, 9.6466216e-07,
    10    1.0273513e-06, 1.0941144e-06, 1.1652161e-06, 1.2409384e-06, +
    11    1.3215816e-06, 1.4074654e-06, 1.4989305e-06, 1.5963394e-06,
    12    1.7000785e-06, 1.8105592e-06, 1.9282195e-06, 2.0535261e-06, +
    13    2.1869758e-06, 2.3290978e-06, 2.4804557e-06, 2.6416497e-06,
    14    2.8133190e-06, 2.9961443e-06, 3.1908506e-06, 3.3982101e-06, +
    15    3.6190449e-06, 3.8542308e-06, 4.1047004e-06, 4.3714470e-06,
    16    4.6555282e-06, 4.9580707e-06, 5.2802740e-06, 5.6234160e-06, +
    17    5.9888572e-06, 6.3780469e-06, 6.7925283e-06, 7.2339451e-06,
    18    7.7040476e-06, 8.2047000e-06, 8.7378876e-06, 9.3057248e-06, +
    19    9.9104632e-06, 1.0554501e-05, 1.1240392e-05, 1.1970856e-05,
    20    1.2748789e-05, 1.3577278e-05, 1.4459606e-05, 1.5399272e-05, +
    21    1.6400004e-05, 1.7465768e-05, 1.8600792e-05, 1.9809576e-05,
    22    2.1096914e-05, 2.2467911e-05, 2.3928002e-05, 2.5482978e-05, +
    23    2.7139006e-05, 2.8902651e-05, 3.0780908e-05, 3.2781225e-05,
    24    3.4911534e-05, 3.7180282e-05, 3.9596466e-05, 4.2169667e-05, +
    25    4.4910090e-05, 4.7828601e-05, 5.0936773e-05, 5.4246931e-05,
    26    5.7772202e-05, 6.1526565e-05, 6.5524908e-05, 6.9783085e-05, +
    27    7.4317983e-05, 7.9147585e-05, 8.4291040e-05, 8.9768747e-05,
    28    9.5602426e-05, 0.00010181521, 0.00010843174, 0.00011547824, +
    29    0.00012298267, 0.00013097477, 0.00013948625, 0.00014855085,
    30    0.00015820453, 0.00016848555, 0.00017943469, 0.00019109536, +
    31    0.00020351382, 0.00021673929, 0.00023082423, 0.00024582449,
    32    0.00026179955, 0.00027881276, 0.00029693158, 0.00031622787, +
    33    0.00033677814, 0.00035866388, 0.00038197188, 0.00040679456,
    34    0.00043323036, 0.00046138411, 0.00049136745, 0.00052329927, +
    35    0.00055730621, 0.00059352311, 0.00063209358, 0.00067317058,
    36    0.00071691700, 0.00076350630, 0.00081312324, 0.00086596457, +
    37    0.00092223983, 0.00098217216, 0.0010459992,  0.0011139742,
    38    0.0011863665,  0.0012634633,  0.0013455702,  0.0014330129, +
    39    0.0015261382,  0.0016253153,  0.0017309374,  0.0018434235,
    40    0.0019632195,  0.0020908006,  0.0022266726,  0.0023713743, +
    41    0.0025254795,  0.0026895994,  0.0028643847,  0.0030505286,
    42    0.0032487691,  0.0034598925,  0.0036847358,  0.0039241906, +
    43    0.0041792066,  0.0044507950,  0.0047400328,  0.0050480668,
    44    0.0053761186,  0.0057254891,  0.0060975636,  0.0064938176, +
    45    0.0069158225,  0.0073652516,  0.0078438871,  0.0083536271,
    46    0.0088964928,  0.009474637,   0.010090352,   0.010746080, +
    47    0.011444421,   0.012188144,   0.012980198,   0.013823725,
    48    0.014722068,   0.015678791,   0.016697687,   0.017782797, +
    49    0.018938423,   0.020169149,   0.021479854,   0.022875735,
    50    0.024362330,   0.025945531,   0.027631618,   0.029427276, +
    51    0.031339626,   0.033376252,   0.035545228,   0.037855157,
    52    0.040315199,   0.042935108,   0.045725273,   0.048696758, +
    53    0.051861348,   0.055231591,   0.058820850,   0.062643361,
    54    0.066714279,   0.071049749,   0.075666962,   0.080584227, +
    55    0.085821044,   0.091398179,   0.097337747,   0.10366330,
    56    0.11039993,    0.11757434,    0.12521498,    0.13335215, +
    57    0.14201813,    0.15124727,    0.16107617,    0.17154380,
    58    0.18269168,    0.19456402,    0.20720788,    0.22067342, +
    59    0.23501402,    0.25028656,    0.26655159,    0.28387361,
    60    0.30232132,    0.32196786,    0.34289114,    0.36517414, +
    61    0.38890521,    0.41417847,    0.44109412,    0.46975890,
    62    0.50028648,    0.53279791,    0.56742212,    0.60429640, +
    63    0.64356699,    0.68538959,    0.72993007,    0.77736504,
    64    0.82788260,    0.88168307,    0.9389798,     1.
    + + + + + + +

    A. Embedding Vorbis into an Ogg stream

    +

    +

    A.1. Overview

    +

    This document describes using Ogg logical and physical transport streams to encapsulate Vorbis +compressed audio packet data into file form. +

    The section 1, “Introduction and Description” provides an overview of the construction of Vorbis +audio packets. +

    The Ogg bitstream overview and Ogg logical bitstream and framing spec provide detailed +descriptions of Ogg transport streams. This specification document assumes a working +knowledge of the concepts covered in these named backround documents. Please read them +first. +

    +

    A.1.1. Restrictions
    +

    The Ogg/Vorbis I specification currently dictates that Ogg/Vorbis streams use Ogg transport +streams in degenerate, unmultiplexed form only. That is: +

      +
    • A meta-headerless Ogg file encapsulates the Vorbis I packets +
    • +
    • The Ogg stream may be chained, i.e., contain multiple, contigous logical streams + (links). +
    • +
    • The Ogg stream must be unmultiplexed (only one stream, a Vorbis audio stream, + per link) +
    + + + +

    This is not to say that it is not currently possible to multiplex Vorbis with other media +types into a multi-stream Ogg file. At the time this document was written, Ogg was +becoming a popular container for low-bitrate movies consisting of DivX video and Vorbis +audio. However, a ’Vorbis I audio file’ is taken to imply Vorbis audio existing alone +within a degenerate Ogg stream. A compliant ’Vorbis audio player’ is not required to +implement Ogg support beyond the specific support of Vorbis within a degenrate Ogg +stream (naturally, application authors are encouraged to support full multiplexed Ogg +handling). +

    +

    A.1.2. MIME type
    +

    The MIME type of Ogg files depend on the context. Specifically, complex multimedia and +applications should use application/ogg, while visual media should use video/ogg, and audio +audio/ogg. Vorbis data encapsulated in Ogg may appear in any of those types. RTP +encapsulated Vorbis should use audio/vorbis + audio/vorbis-config. +

    +

    A.2. Encapsulation

    +

    Ogg encapsulation of a Vorbis packet stream is straightforward. +

      +
    • The first Vorbis packet (the identification header), which uniquely identifies a stream + as Vorbis audio, is placed alone in the first page of the logical Ogg stream. This + results in a first Ogg page of exactly 58 bytes at the very beginning of the logical + stream. +
    • +
    • This first page is marked ’beginning of stream’ in the page flags. +
    • +
    • The second and third vorbis packets (comment and setup headers) may span one or + more pages beginning on the second page of the logical stream. However many pages + they span, the third header packet finishes the page on which it ends. The next (first + audio) packet must begin on a fresh page. + + + +
    • +
    • The granule position of these first pages containing only headers is zero. +
    • +
    • The first audio packet of the logical stream begins a fresh Ogg page. +
    • +
    • Packets are placed into ogg pages in order until the end of stream. +
    • +
    • The last page is marked ’end of stream’ in the page flags. +
    • +
    • Vorbis packets may span page boundaries. +
    • +
    • The granule position of pages containing Vorbis audio is in units of PCM audio + samples (per channel; a stereo stream’s granule position does not increment at twice + the speed of a mono stream). +
    • +
    • The granule position of a page represents the end PCM sample position of the last + packet completed on that page. The ’last PCM sample’ is the last complete sample + returned by decode, not an internal sample awaiting lapping with a subsequent block. + A page that is entirely spanned by a single packet (that completes on a subsequent + page) has no granule position, and the granule position is set to ’-1’. +

      Note that the last decoded (fully lapped) PCM sample from a packet is not + necessarily the middle sample from that block. If, eg, the current Vorbis packet + encodes a ”long block” and the next Vorbis packet encodes a ”short block”, the last + decodable sample from the current packet be at position (3*long_block_length/4) - + (short_block_length/4). +

    • +
    • The granule (PCM) position of the first page need not indicate that the stream + started at position zero. Although the granule position belongs to the last completed + packet on the page and a valid granule position must be positive, by inference it may + indicate that the PCM position of the beginning of audio is positive or negative. +
        +
      • A positive starting value simply indicates that this stream begins at some + positive time offset, potentially within a larger program. This is a common case + when connecting to the middle of broadcast stream. +
      • +
      • A negative value indicates that output samples preceeding time zero should be + + + + discarded during decoding; this technique is used to allow sample-granularity + editing of the stream start time of already-encoded Vorbis streams. The number + of samples to be discarded must not exceed the overlap-add span of the first two + audio packets. +
      +

      In both of these cases in which the initial audio PCM starting offset is nonzero, the + second finished audio packet must flush the page on which it appears and the + third packet begin a fresh page. This allows the decoder to always be able to + perform PCM position adjustments before needing to return any PCM data from + synthesis, resulting in correct positioning information without any aditional seeking + logic. +

      Note: Failure to do so should, at worst, cause a decoder implementation to return + incorrect positioning information for seeking operations at the very beginning of the + stream. +

    • +
    • A granule position on the final page in a stream that indicates less audio data than the + final packet would normally return is used to end the stream on other than even frame + boundaries. The difference between the actual available data returned and the + declared amount indicates how many trailing samples to discard from the decoding + process. +
    + + + +

    B. Vorbis encapsulation in RTP

    +

    Please consult RFC 5215 “RTP Payload Format for Vorbis Encoded Audio” for description of +how to embed Vorbis audio in an RTP stream. + + + + + + +

    Colophon

    +

    PIC +

    Ogg is a Xiph.Org Foundation effort to protect essential tenets of Internet multimedia from +corporate hostage-taking; Open Source is the net’s greatest tool to keep everyone honest. See +About the Xiph.Org Foundation for details. +

    Ogg Vorbis is the first Ogg audio CODEC. Anyone may freely use and distribute the Ogg and +Vorbis specification, whether in a private, public or corporate capacity. However, the Xiph.Org +Foundation and the Ogg project (xiph.org) reserve the right to set the Ogg Vorbis specification +and certify specification compliance. +

    Xiph.Org’s Vorbis software CODEC implementation is distributed under a BSD-like license. This +does not restrict third parties from distributing independent implementations of Vorbis software +under other licenses. +

    Ogg, Vorbis, Xiph.Org Foundation and their logos are trademarks (tm) of the Xiph.Org +Foundation. These pages are copyright (C) 1994-2015 Xiph.Org Foundation. All rights +reserved. +

    This document is set using LATEX. + + + +

    References

    +

    +

    +

    + [1]   T. Sporer, K. Brandenburg and + B. Edler, The use of multirate filter banks for coding of high quality digital audio, + http://www.iocon.com/resource/docs/ps/eusipco_corrected.ps. +

    +
    + + + + + + diff --git a/cs/3rd party/libvorbis/doc/Vorbis_I_spec.pdf b/cs/3rd party/libvorbis/doc/Vorbis_I_spec.pdf new file mode 100644 index 0000000000000000000000000000000000000000..04c068278886c8353186bde70633ce35be86e025 GIT binary patch literal 418532 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 W(Jo9^hxyzJG7wM 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 z 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 F{|8rJ@+1HN literal 0 HcmV?d00001 diff --git a/cs/3rd party/libvorbis/doc/Vorbis_I_spec.tex b/cs/3rd party/libvorbis/doc/Vorbis_I_spec.tex new file mode 100644 index 000000000..fb7a5596c --- /dev/null +++ b/cs/3rd party/libvorbis/doc/Vorbis_I_spec.tex @@ -0,0 +1,142 @@ +% $Id$ +\documentclass[12pt,paper=a4]{scrartcl} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Packages +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% ... +%\usepackage[margin=3cm]{geometry} +\usepackage{a4wide} + +% ... +\usepackage[english]{babel} + +%\usepackage[latin1]{inputenc} +%\usepackage[T1]{fontenc} + +% Do not indent paragraphs, instead separate them via vertical spacing +\usepackage{parskip} + +% Support for graphics, provides \includegraphics +\usepackage{graphicx} +%\graphicspath{{images/}} % Specify subdir containing the images + +% Hyperref enriches the generated PDF with clickable links, +% and provides many other useful features. +\usepackage{nameref} +\usepackage[colorlinks]{hyperref} +\def\sectionautorefname{Section} % Write section with capital 'S' +\def\subsectionautorefname{Subsection} % Write subsection with capital 'S' + + +% The fancyvrb package provides the "Verbatim" environment, which, +% unlike the built-in "verbatim", allows embedding TeX commands, as +% well as tons of other neat stuff (line numbers, formatting adjustments, ...) +\usepackage{fancyvrb} +\fvset{tabsize=4,fontsize=\scriptsize,numbers=left} + +% Normally, one can not use the underscore character in LaTeX without +% escaping it (\_ instead of _). Since the Vorbis specs use it a lot, +% we use the underscore package to change this default behavior. +\usepackage[nohyphen]{underscore} + +\usepackage{enumitem} + +% In LaTeX, pictures are normally put into floating environments, and it is +% left to the typesetting engine to place them in the "optimal" spot. These +% docs however expect pictures to be placed in a *specific* position. So we +% don't use \begin{figure}...\end{figure}, but rather a center environment. +% To still be able to use captions, we use the capt-of package. +\usepackage{capt-of} + +% strikeout support +\usepackage[normalem]{ulem} + +% blockquote support +\usepackage{csquotes} + +% allow 'special' characters in filenames, like undescore :-P +\usepackage{grffile} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Custom commands +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% Custom ref command, using hyperrefs autoref & nameref, to simulate the +% behavior of DocBook's ''. +\newcommand{\xref}[1]{\autoref{#1}, ``\nameref{#1}''} + +% Emulat DocBook's ''. +\newcommand{\link}[2]{\hyperref[#1]{#2}} + +% Simple 'Note' environment. Can be customized later on. +\newenvironment{note}{\subparagraph*{Note:}}{} + +% Map DocBook's to fancyvrb's Verbatim environment +\let\programlisting\Verbatim +\let\endprogramlisting\endVerbatim + +% Fake some more DocBook elements +\newcommand{\function}[1]{\texttt{#1}} +\newcommand{\filename}[1]{\texttt{#1}} +\newcommand{\varname}[1]{\texttt{#1}} +\newcommand{\literal}[1]{\texttt{#1}} + +% Redefine \~ to generate something that looks more appropriate when used in text. +\renewcommand{\~}{$\sim$} + +% Useful helper macro that inserts TODO comments very visibly into the generated +% file. Helps you to not forget to resolve those TODOs... :) +\newcommand{\TODO}[1]{\textcolor{red}{*** #1 ***}} + +% Configure graphics formats: Prefer PDF, fall back to PNG or JPG, as available. +\DeclareGraphicsExtensions{.pdf,.png,.jpg,.jpeg} + + +% NOTE: Things to watch out for: Some chars are reserved in LaTeX. You need to translate them... +% ~ -> $\sim$ (or \~ which we defined above) +% % -> \% +% & -> \& +% < -> $<$ +% > -> $>$ +% and others. Refer to any of the many LaTeX refs out there if in doubt! + +\begin{document} + + +\title{Vorbis I specification} +\author{Xiph.Org Foundation} +\maketitle + +\tableofcontents + +\include{01-introduction} +\include{02-bitpacking} +\include{03-codebook} +\include{04-codec} +\include{05-comment} +\include{06-floor0} +\include{07-floor1} +\include{08-residue} +\include{09-helper} +\include{10-tables} + +\appendix +\include{a1-encapsulation-ogg} +\include{a2-encapsulation-rtp} + +\include{footer} + + +% TODO: Use a bibliography, as in the example below? +\begin{thebibliography}{99} + +\bibitem{Sporer/Brandenburg/Edler} T.~Sporer, K.~Brandenburg and B.~Edler, +The use of multirate filter banks for coding of high quality digital audio, +\url{http://www.iocon.com/resource/docs/ps/eusipco_corrected.ps}. + + +\end{thebibliography} + +\end{document} diff --git a/cs/3rd party/libvorbis/doc/Vorbis_I_spec0x.png b/cs/3rd party/libvorbis/doc/Vorbis_I_spec0x.png new file mode 100644 index 0000000000000000000000000000000000000000..f6d296779d46b1ffe56b2e21fe0ac203f98c9dfe GIT binary patch literal 1341 zcmeAS@N?(olHy`uVBq!ia0y~yU=#qdMLC#(~bp9zYIffk$L9 zkj?|+kVkxm3=GVXo-U3d5r@x4bWd8Mz{AqQAk_Z<|Lw=BEF$4|SKjiz%JX@HwXcWL zp&S1bVm`S3+uHH}gopv#ul1od2hU8exN>O52HTg(d4_+Bm`i{E@@D?Jw87=_g^700 z!}iop+kScN0*xQrK3*-o@2h&ym$~MS{*D!AOd1y7hy9APmD)IW6lyzv?hfuKWoZx5 z>%(>jPj6ypnI*bXGt98gZq>(ycQxfX%#^&mm)UK~io4WnGSiGhV$p+jJ7!(#-c?m{(o%ev z-3_O7mExv@{4u#@)A*F`IalebPxY(Gx72$e6yc(?-95B^H z@_Q^=si|qR*8ZJ`!?~SmjEQ&ug&vo=Z};(Uz`di}&+ZJlkeMEAyg%I4_3esT9kVkV zc@`eb`pTtRa>v|E8i$;GMmb)IaYfV@h;Ua6kWab)52wM-^^JZb>I2X{B`$_$TK_DrfbcO zZtnifmD;Sn$|}&A|K#S~8H$Q7uAcUtJ}VyCD*U{8D{0bhpD4%obq}N_W*W?&@XRnZ zol&xOx5%{G+j@_-Z@6Gk(7(t?i@(!QN8;6LF{Y@58=8tgSU=C^%lA>wRlCP5vf$DZ zr_NVbHb$>ei@9o)Dc57l*7CAz8TW}7*7>qW=H2)hy+XJ&=sZ)x{`{l5Eu zPRTEwVnN@TVPF3>>$$#l{-iszu2iNWUv6gpq6pzyTfPQ!<9G0pX#ZBi6! z&-GS@%0J6>d|2++v9C0#%G+2mq?`USZ)=lNPm31;WpLFJ*NBpo#FA92J4ygQ10Cg`ugok)ffsnW_I0`7c1lYEZ>Ksb#4-42~)JNvUr6 zc_q4rdInYs&b~p0MhXT7#(D+@MqF<<-}6S&5nPa8;+&t8U!-fm5SCw*lvy0_8DCtG fnyiHz(B`75zB1n-U zy+{?6CV~P2B1MoZ2ru{k@64MwZ{Ez?+1+!_p7ZV5*_}DxY?7IY0V^{tHsj@0D!g`>S|jNr@uSDzg+=i&z02s zdUCQaf7VD^+e2C9=G!;2+FHEn@JVdJ30ItQ>P~%I=64^WenZ4JAAYhNurzdHEfp;z z;HlzS&Z@bN_0n)YtIJA!-=Xr|?;SsKNo0H?-E0bUarxkA*eSZ@chT@J2WM(vEbSPx#GN^R}SfX{Vj9j(~>--|) zKLG;Ax%`B5=5$9kT_p3vFU8w#LY`GU9A!Dsj37~`%`PVtv^XNeH=`wmkm49BlZU`o z3hZGnW&ak+h8?mU36}(NTT0@axl3eEFDhn&80i=Jq}@4vBYr@aPbIyfD8w8{phzbHi;lE2 zNF`zwH=VA3*OVVVqLoT*6x~}0ys<2JDb1!RnD}h+({A#!l|sJiK5Ju73isPD4Uyt6 zop@f#R2wPzw&ypjWmhIrKZjtzYM?r3!U@pV3}RrU2m z1}S%~L196G*0opZFCXY6$6IAWqMx2&6dku}ED)@ZuylAL;vxy)6F?htpQznuF4&O`gCi@q+MoFv7Ef(i!6DLV0H zd7nQC0Q0q*_F^@*Eb;JHQdMrG%~nX;UV!-r$#)2?)jlAooZ&HLgb)7ApW*im_XqvA zMi!D><8_KX4lt*ePDR4J>GT?2z!Pb~Em&N<#y#eq=3Au7JAISId95wUpuERTYizrD z#R)ui-=5IZ;c^9ZOdOZOupP*~SPPFpl2nFBU`xJjGAfrNcK7t=spsFYjC1i}GVbkJ znfqT`BascQ}52n4R&m3d}kbLC?B$>0@D!NNqgKfag{PmRRqW#tK= zN;H&g|7p-s)=srJyY37GZT3Vzq21l=)fmfpo)RvxTWK78x~CI)dtBPvioYTUZMZRx-=uOzRVVVzsM%ltBw*I@9f zk$X{`GJ^Y7324_mWQSiY;g>Am18XYAO5C$S@PePEpO>d|J)!cU^kan`jkAQ+l;75J zqt7`6-dRjSz6g#X459$h!;i|*L_Zejm$5qhj4cDW^IVR$`F=a8wLxRFx!G#IIUvw2_o?YVL=_n}Y4wBOEaNjSgn>0te-9yxk^c@2-5?rluwtrdA;XEmi;xjS5pJxPIMd$BIYqxs}W*{ zx@^2lXcy0}Bv2Jqj?T$^w2QpOT6XZ71FKi?$_cTcg*x2P;8awK>)%aLM_fWbu{>pY zHi{rhzppyE7BK^%ZT7B{oe#m0H#k6Gm2Iwk@zuu%kiP?Kw zFFd28m0Rz-lJk7AAD?H)@{DU#qr@JBWsJJ?BqKv)+4Nhht)FzOM_!}a-M+%4k=`8a zyL&CoS<=Mz%i2taJw}bR&x+=;eQ>=HCpQM6@4f$`xdvM{p1zw$yvs;OE0yfOI(C*B zP3VQi+7#Tfz|{0so}V5+Pf3YX;?W%2XBgMZ)P6XR)A(d%;Iq5p2S;Svkg~=d!{-Zxd3EJ95u;$@;99k;CcUqd6Gq|H<~R zAfJHaly9t8Gu4Jp<@yJFU*z=ttL;oGa=2>5@%qP&;U%2N+oN`@Oc%p~bE7i4qu=X4 zBz3_2b>dQMzpK&2VTnagiRHCElANCU;u@cpE^=mz5@SU9yjJ!Uckk%Qe#}+Ph*CDq zTOT$-SQz;ASr$mm)`j_=t`*9=3(?rZ)4Z^sNE``zU_xW3_uv1Uou(CcE5;;Frbdeo zORn|0@l`!*9RapAV@JOUYjnxc4R?PM>I3K(qg4If`#2@W;IktSIy>1**;Zb2xTYsN zw(w3TABz|HlDfASOg}4v9d`C?Kb~7w9R#jkjBjn1d$^`-+QkOq!-vAao9P~q7eY=a zg+m?;Dkjien4{1k?&c%b(KkmL2h4-?i+?SRwXBHTu9kW0l9hC?r}SOz33NmndiBAS zsMfU9R#&AC@kqNF9`u68ZXS~pKZ6P0P%-n9QD?RjG_tRFm~_5EhGin^a-8BM zS9MbLTl*5?GR#<5bLf#b^=yWu7-U7r<>UY8R#ked zh|u5<=jFY=%`N*$I7u4HkQkFCOlUDqA16L+EZQu{2=TBM;P;!$N$Ai%3;*@(3V7z@ z6+X0zj{#nvX$6yGn@&kuzXy@G*LPA35R1gjb<_F38;t_}8h{(2$}eD@GTf$Sop4w2 zG0YHB|8D*(B8yLM{d2W^>z6GP9XF zh>5i7uXFuB^cINCQ-L``a_wpg(d{IBmmA5DA`V`?c$F$S=)!}5ZO~`}s4s-p6pWqQ zFC=(w282q@2Jm^bp7KszUs9|#=;N}d&P2PgVYvTh3vv@$ru?*T%6a=$kb2{*v^3SA z{;@4jNa~mb6)_J6FE|%Vs?(${5=2^I+!_=?XzKXY{oWv+Uv+iX+a!v-di)m z$JijZ+t#q0i&tf&m+t;p+E$grI@xv#Gr1a35ng%fKij3!XhCbS|IveZj!2mCwSflF zjvc+s)nhxi256f5vBJg+^!p2|Z7&LRk`^w!Bkh)Z0Hu*^u7=skB8E($Sla;%hIpAJ zNBi4NepWRVEuQa*_?tRoY%CqU2^xMF2?Mx23rp@U?ZuNQto*PZDG9-@kgiFkn{DY&2b{ z{<|n-0H_C;ypsmnEa}0h`#({a&0XubqlTN>9Rbn4pwR6r&v`cDTSU_=%L^rj*Om2f z#3WGaS@mOH@XoBW8dO{EAcBfoq9;6QGBsgeQGzHwjy!HWBr&XoL)AV)3ib7(}V(GD#ozbzyH?+q?o86^OF0+V6YTJMxUnRi(> zmV9NgsMh$P*nsKH*KfJFe2A!?fo&#X=O8ytjn|dQ0^k`^bLlbIsY$_&QWZKi|Zhhx-ZcHeh<8-nXv^kR z_(Pn}KefL?n^yY+IPMq=IPo@et-gVKcI@W<$bQ|DO2Z@tk>PpAE9 z#0h$K1TS}jx0+|5H%$QYaDv+xEc(Jwm`_k;BW<5I9#6jd)>Sd4RQ8gge4wFK;mxT0%hO; z5{))g4dD~ZqxmoVFFyjX!3BC?gIo<=gYe#-vRJPWm<%2dLnu?P`RCFgfT5m=Znciv G?f(KMRh!2E literal 0 HcmV?d00001 diff --git a/cs/3rd party/libvorbis/doc/Vorbis_I_spec11x.png b/cs/3rd party/libvorbis/doc/Vorbis_I_spec11x.png new file mode 100644 index 0000000000000000000000000000000000000000..610e28cd4a4ed7c95377e5f2825e68dad9bf57f0 GIT binary patch literal 3825 zcma)<2T)VbzQ+$B5DZ8Wk=_OA2}MIM0RibC5NQd$7a=G`0t$kNRHZ0jP(Y+t6{L3% z1e9XvRf_Z$kU+TcKX=~DdvET{-8s9z-Lv1%Y&)~xIkCou+H@D$F9HBSr>moB3IJqh zqaK&PCApq1y^+gbpWVL1fSYdlG?nEI;I8y5F!Ks5m5keLV6Xk3IKr+0Qijp z0EG+yxaybn#YBnJA!Dq6N9+9joK*eq6G^|T;=xS<=+UNzX264|nl9$AWEkuDi>CXx zT!@Ubq%JZCJ#9_kDJ7QnfOc6|Q~gfR#HMX*S}`weYM9ya zc{3Mz?P$Kn8hY`~{s}Adoif2B(At*=7uvX5(V2s_IA!cyqfIQRz_vZ+k?}(Ks1S00 zpl6!N<1_nIFL8A6M-q(!?NGXM?hjVZ@T5+Pw!B;~CC`DeDa5((%I=`Ec}K&EJ-fep z&N>C*X&@pBYxqZLQ00~8pR8{mRev_KXGN(hJ|jy?L8Q&V+lwn4uu)jvNfFAn%gbJp z^<+5LlUo#^kz`9%J-85PrC)55+tVGQgE@zXuJ%*yua(GKvw9Vto2>i^%1owib5RvF{r} z<+n2I-1}`P@%djBo5y$UXcgFhdRAbk|73D)e}v?YmA9!ZzM_21wVhw#xbQOUxo*Wb z0Zj%FxF5vTmV7U-8_tskpBW{I^D{=b*a)bs;l?e9as0jRIl8CQ5ASe_7o9e=23IdO zvN*99WLHRKThd$UZmQ`MkP54k_pQj7_^u}&OCJ~{g)`uBt{xi9>w<@FOI)XnY^JH^gzU0mc8164^F(Myw&UaWD-?copUoLcR-Kqtw*YSbW&Z69?su7 ze&05)J(16PG-<}%u-+ZG)5qmQFPEv~qCW#3*WR@s4+eL&U*$GPn(VNMUlthyJ1tGN zC$8rtf-tlAD>EHyY0}G~&KsT_)<>5re}C0Qy{;K6ValFz<9k(*E?I$Hr&TP35A~<- zvwWCf&R%k>k;a>h6dyFiujN|`W)wu$c^Dpxd0AcN`YctMSt9nh)@mgt6Qi?ddHP9s z{nay^t3s9Uz$^}ZEJ+w<*la_1pT~ZFfXRRF<%(11nmAcA%|ZvLkHcRypKH+&n6AAs zO;_|+$#0)0Paz0B9%K1>s2&Yo6i+AmI)~=tvLXVyg4+;Y18jZv&WP=YZSi5 znHAv&@gomN7hz0EZmPs($)pYU&}p{E3DWorGA|Lml%v*dQ~0~-ZI+B3Q(6QT8+J8+ zC2m)#w2GmyPdhL*Mm!4GTl;|sMd_35wtmpDtWp-8Ot*3`mWl=Zz+3^ADqwtrwLz%Y zcTVb=WOeu|tytg(%FM*x{d5cqfhkZ7PoHh1hc8&GxV9$PtFwJ0`?ty0u@d$%4tb=E;jo+o5i=cEHy8tbuj8e4e104>{$hnNBv^y^;!J>+C{>A z<~wqHSe-IHU#OOTX`z%XEpL8j!&DI+ovJXR#>rTpd>xs8RG&JdidK<0RH1Vh&7BjH zyvDm?vu7k+DyZr-T_Lp*bi0;Ei34@ma}s^lPA!T4&>9d}G_kb#Cn)Mn_QPMY`!w=9 z*S;+rwnXg$OPFbJQvOLWtCV*Y{ft5eRV9U+Fzc|eoY)ohg6UgRwEWwNu`(t7Z=>n> zPa}Jz9I+_Rw>R@xV1Lipy=%pWo^G+g{k!pM0VYYH{d)fP@`Vr95w^^k0bTyYh}=bh znjp>^$DUc1f}^GofApySK=h~4%)*qz!v&d@+sW{6#b?48o;CBWog9NTmVCQ6qq#gV zEKbXMR)zst;TCa7QEiJi%KrOd9Q7Y2K{Qi7NuJSHB6|nUY1PEysc?CZe6EEj$ZUX$ z6*45sR>-M>27{){KXE&rC-^?IIoutkenVHWcssSDiKkwhB0N6zMV~^$vlgR`)7G@- z>zI#+tc0V7X7f90#IQ%T2p^>zR(8Es!mje|myB~0ib3&i(v}`mt#h~TE>K%g!qdRB z_&N5b8l@q3yHaZT5Zk2?Zo9?zL_%v`F)VkeHpc!&k5~~(-@D0Imp&J}=wA;u3m6i9 z@yEoltLIZ}w<3l4>4gvT?P{}q`cpetlp1FJteNJKx}2r?sn{Z!R!Qk%xHS&7QMLn} zP-(Hh7sjR2UH~r_3YzQW4J@Uh+m4$fj4VE&W`B4$uk`%%O48vpku3RhZBq&!#KlH|1bN-Z<(gUF`yA z^?*;yT_>vYiQ$qS9wZ4vF=&JT6wR>5h@XDtM6xx$y)WT%Fq-fmb0;yPR=6^wj%Q&^ zm<2-xbmeK#z;YEwMA-YE>^V<1Pc#_@Uj3X<9{YhxIwi*7hcdr8s22Z^qgiN><`l0M zG;y!U4On#HRwqH9hUw+5pe`GD-H*bhvKhB+-u0OPl3 z1plbsk6jxsD}pA{+Zi%PbvOxJ#26PVNI zBTU%Q)S~6Y6FE!d);lb~y-J-m*Mx@&_xy?rnXDc>5HtNQkvT6e>BN(diY?%Zu%qkk zG>}E~$6oTD4MF1=dkkgsvK5PQf6OY%L)1p!ugbSNeEr8H47cUE8V8AXvRx(AGj;pf zuZuQrT@_`E4D;rNYP?&O9&Os}4epG?rMq2;+wVE6pzRc?izn!Tf1Svp{nOya4EbK= z%$b*y*jH#A>$EIHpQhS3?$i7hE?#qkg@Q_(;RA(70^LufsR$DeyobXq+vjxRf)WQ8NOj&<^$;vbSZo^J8=3;9F8 z=y#uuhk&k539KxUt=AfBpndn{u@hD@(h=Z)a7^G?6>2rb#(#4U8|bQCxytKWObv%xC&;>@3m-5MdizC4Z{;2$*S021p@Fxinsn#0 zjA9aw78%S%MKmiU7K^~{)Hj>-F*fE46!quc^koayeH7UtbIg(Nz8W<6kHc5t@9i2i z<3m}U+gGziSxqygY({p?q1W?@m%#_^lOXwV{z-1`ZMtFdUqs0v>TyO6(a5IM7di9D z)`-*Bjp2=+6j~(`zcAJyT7l{U5sV+o21zrtGg#3&YO-s+5V&Em5eyL50h zB$)j^^p6S$h7tLT@KBiu@N=gH8hQ=SkbZrxp|ucbCwsKBf}_7PDFD(CsGI~uT0;89 z9jL6r-v=rIfhj;Bk{2D3{|oT;b#iwJ{?7o?a&nOb@c$jbFF--Z-PAci!#B{!$=%0Q z!#4U<#Gy zg+OE^ArR?{o7FRVB!cbVgqfc&8t&`m>n{NT;06Y|u)lKH&=fzBBoh9AA}C+j$m lfYe0>_&GaDx;x$HmGJZ9g~D|9)KW+YpsQu5S*C${{4Z@$9r*wN literal 0 HcmV?d00001 diff --git a/cs/3rd party/libvorbis/doc/Vorbis_I_spec12x.png b/cs/3rd party/libvorbis/doc/Vorbis_I_spec12x.png new file mode 100644 index 0000000000000000000000000000000000000000..f4f477abda2472ca34dfe09732a80f721d549cf8 GIT binary patch literal 3371 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 Za8Qs0Or5eanoUOlV}!YWm7eSU{{ixMD|r9_ literal 0 HcmV?d00001 diff --git a/cs/3rd party/libvorbis/doc/Vorbis_I_spec13x.png b/cs/3rd party/libvorbis/doc/Vorbis_I_spec13x.png new file mode 100644 index 0000000000000000000000000000000000000000..803dd55ccf265210beb5d2b15adbad8d0da92bce GIT binary patch literal 1768 zcmVP)4M`&+z zbaP{JX>fEPIW93abG9uJR<$mxM(-9M9Z$7ZblWx#= zkL5$~7`|G8<9&!rHroL3M#ONk5#oC2OthoEHvp`NxVGx(0ZHw#HgG|aw6~`BuF!BI zO{)UqD+`$|h6@02amdBJi`yf3op3dBPZ9@JIg5V(EAYr?k1~l|^H>@}K-l-wrT3l} z>m9{cZ*frAeH_CO@q2v!L^%79)?;N4d?rArw=1c00f2a;Le7SGJ#BNzUWwiTZN1C} z1$UOzuGHU#GVj8%^T=BEUSZjkSU8~T0J19Aki}!MZ3~Vv^9`LcV^dx5z zzeZj!Ez1N0-wFfq<+Y7=evwR`%Qs2*`=0RA0&0rL)8xq`=F~hNc>l7 z16K)mLpgNFnq#RhMhA67jyO3-EU7M1PuGMbab)$-kftQxqEn*RB3?{+ZmlsFD^1;1 zost*|Y(i@phM(DvTJl8;w>3Vg#i2n@w!dl1NqEx8D>F_%h0oq(YQ9b4SezgT;@)(B z(H@q4&{G_G$FRea4f1KHHvq6ZkrDB=?Of)rtx<-%-ns@C^^&w%tfyEDRB#xXZNPwjKu2VKUY%YWM07B|DoTxWIBnNs|znVIEm5Xe^boppdBrKfFEi(YBG zfTW*$eA`&J=$yu;$T@2niH&KTYH^nGK;U~+9OfLAl+*gAlULoGzB`}2$)tYBaR~V3 zGf4(HSC?fb(XCscyhB&~TiRO4ASxQorrRPn!(uz!s z*c)Q6OzAu(uLR>hJ)C=u&Xn60NK>%exoSTsm233PC{90y&)#H8sQ7;O5j3gJDDSNg za_|xd25SEuG9=9FONaH{!hob+3&w37R`S|ZAYXY+8)re5lV+BiaI?gf1nHfIkP2T8dWjNxk$2qe18}%eugUdYmV=f{GYQPKg&3M<9o9@EcBxaUBX`p#c3ujm{qLkr zD?OL-H}@o0(@W7DFKP?JiIuAZ_I}pZy>RCeeUi+~;YpZq<`rmw+gZBL}Q{0o+cf#cJ#1p}dVXpU(OiWBnOiWBX1OEfrr+@oSi+W)I0000< KMNUMnLSTX&XlPLY literal 0 HcmV?d00001 diff --git a/cs/3rd party/libvorbis/doc/Vorbis_I_spec14x.png b/cs/3rd party/libvorbis/doc/Vorbis_I_spec14x.png new file mode 100644 index 0000000000000000000000000000000000000000..211774f0fc21cdec98b3dbf4f2c8315a910aba4f GIT binary patch literal 1792 zcmV+b2mknqP)4M`&+z zbaP{JX>fEPIW93abG)25_*G z;kJ4X`*?F~-`w}7!ejb(5Emzi_=yXX5WcPQW=z}KN6gf(^Y73gVa)TXQZ25iwlaprD;}r8>~w3IH1-ZoN82kfZ`h z8z>@k`rFd`R7g0Hr(uEcm4?h7!vz4SIF#Z(#O)cp&bS)6$BBcep2oQUE3n9Ci!zy9 z_gor6Ksb)mW%QXB+fCb={oG0HFcl*)5b>vcKO$URxb0}!1K$PF<^9UqTmT?GxRA0T z-p~77vzMcHLSJvQLBO3Qw=4IzqRd(;OQ|2De(SAYvPs$&rw={#Eb#iS_Kot{q)f+L zx)yY!7RM<2M>*6pKCN)37NeeG_6*9t5>s1!-kmZ=#0|fDl&wC9Qh@@!kAsjCrFbtF z$iN_!? zb?5k`^f0d98Y3wzzr~}uK#3EgsfllNfLH*L`nwXM2_5Ow?Q($(WfM7ZB@ZPHpWVsp zXs@&_c0Fa^bmK-&TjjGg85TkaD;~F5E{kE*jlYLv7vkYO`?+H-Mq*@X8-(9fO)*8C z-7lqjF#kJkCzHpTOr!m!)K1rFWk1NxQ@h-l8s!` zmZALJx>t&|l-oVLmhwznPp$7Z~I4n3w~#PRJ(o={9ZU`_+H<;+wUp(E{liAbf+FS)LyouLIv=DcQ+5Tz#Hqm!do zBVI&(YCp0RD@of;osz*`8$8-F1V5X5(v&ZHxGnKXD-IocisMaMkHeErUa4{VEqt~n z)ADT=$JT^i!^SHI+ra_X2z(;x2G*0r1y|k03c5~BjRU28BN{Wq6~Gv_q2Z0 zo21!dJ42_jrFLimlQiMgr@uSmwE%#MUutc`&F77@WC*mjcB;6F+uG>mDOGRuyxA;H zKatPYWQ2%uT>!r4IP$TWen!MC&bj&Z)IO_Yum-C!68l!V;-Xf0h5N;oBmAbyR5BhT ztI0bGFftvzed^K6jTa>8>Ji^|w#~XGu_^YfKTyfeJROy9p=ztvyMHew zJuGJMw^}%U?UpH>ypPwZ`!{6FPGgJu-3BgVwnJ)fsa}t7W^wv$d^Rp~LK>6(?=8)6 zS@~^}6x!pHfvGW)qWPLJk>V)^S&|OI?`uhsMC8QIz#*MJnvROUa?33vZS9B?-j(Q% z7baUzg1YH-6|VH65F_#dIVw}Tj@c{7cuXgkUd>bGwg&RF?0&5|4r=u}eKU*Gui>*b znHn0tKl~^gS7(&BHU_1z5+edE-<~ok#OqS0{o%?4CEiQMeIK{*n%2oS_@;$I-XRV0 zT(n}Xq4bNIsu_sEc%5FAlP*LD+Ge5PCys6{nPFVb?NOw!-j?j4;=rlbgISz@37@UW zRIz8bIA0h`^JuzgH9H1tFu<8AdVQN`P~xPr#=}DZrw8|z-9KbO(t3HOfw;FM#^qUw ztzh^e)tc%kJ;W0`Zw1l+HS5!sUMu*U`li>?o1!~jsVxL2HmVIc`dQlcLS4)BaWXfj zZ^{WrKH4%R8z?0G`-yqdClR-A=5_j7U|Moe8COodmTywb;`A%{Y)vNdU2V?$WOFHX zNVYWJ=5ZH2UrLzp+?hHDGM{%c-?k2^%qmcMU9&^i;Q*Dj68mb|Mhm5f6CB?v%iI>j zUe18hYm8oo@-qeJ^8?}IQwOFOD0n<*Cq~>q_JBVJ zqnvmGoY&8R^Z9x3@u>&X3lxCyH*1_E&x5DLo!3u-^Z9x3@u>sTXHXmthr{7;yc6a# iC=Q3i;cz(KhyMYZ>;zN`EjC6&7I;J!1L-_4 z4td092xJ6#x;Tb#Tu)9A2nrHPNGS6yG)+iIUnP(L1gWe-JV|R<9g5h}8JM|taI=Un zP~m#;#)oCnQXWNzO+5>_b)Io4S;#n~uqsbTxX)m8>)E?dHU^!gLX&ftd6~RsBeM`g6DuGxu+%lMure^X=&!pBMMG|WN@iLmZVd~B zrb+=dD1dAzD7Ny*3`#9_$}i1J$;?Z4%CBIss4z6uHZ-)Lp`L-2g0pXsg@S>Bv7Ui}5!a@j8>Ry_s6h=6F32x&&dNn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4NyWiz$e7@|Ns9$CNTi0 z@<7YfO+cl*B|(0{41z97GdorprH^So)e_f; zl9a@fRIB8oR3OD*WMF8jYha{nWENs*Vg*D7mbwNORt5$a{dJe2Xvob^$xN%ntzm)C zR4Jea1&|E|#a14fL8-+~`K5U&nR)3>`4tQn6^16-hK6R^CdNiz6&5+b3Y#qpl;#RaL!dYLI@3c3Xa3T7pr*N6ahFnGH9xvXNn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4NyWiz$e7@|Ns9$CNTi0 z@<7YfO+cl*B|(0{41z97GdorprH^So)e_f; zl9a@fRIB8oR3OD*WMF8jYha{nWENs*Vg*D7mbwNORt5$a{dJe2Xvob^$xN%ntzm)C zR4Jea1&|E|#a14fL8-+~`K5U&nR)3>`4tQn6^16-hGwSPCdNkVTVH6v3Y#qpl;#RaL!dYLI@3c3Xa3g*mT<}?9yFnGH9xvX>;zN`EjC6&7I;J!1L-_4 z4td092xJ6#x;Tb#Tu)9A2nrHPNGS6yG)+iIUnP(L1gWe-JV|R<9g5h}8JM|taI=Un zP~m#;#)oCnQXWNzO+5>_b)Io4S;#n~uqsbTxX)m8>)E?dHU^!gLX&ftd6~RsBeM`g6DuGxu+%lMure^X=&!pBMMG|WN@iLmZVd~B zrb+=dD1dAzD7Ny*3`#9_$}i1J$;?Z4%CBIss4z6qHZ(NTHa0fQOnX`nGaRVaC$%g! zhrux=KPlBMKd(gBP|v_h!Pz&+LczemSkJ(~h-=f%4by=d)S!k37vz^X=jY@X=^8ME qt&{tDd-jyC|FGPZWIRUVDNPHb6Mw<&;$VH!;**q literal 0 HcmV?d00001 diff --git a/cs/3rd party/libvorbis/doc/Vorbis_I_spec5x.png b/cs/3rd party/libvorbis/doc/Vorbis_I_spec5x.png new file mode 100644 index 0000000000000000000000000000000000000000..a723708f7f0e3077d03cc431da3eaa7b2e9d1657 GIT binary patch literal 556 zcmeAS@N?(olHy`uVBq!ia0vp^oIotX!VDzWe&>;zN`EjC6&7I;J!1L-_4 z4td092xJ6#x;Tb#Tu)9A2nrHPNGS6yG)+iIUnP(L1gWe-JV|R<9g5h}8JM|taI=Un zP~m#;#)oCnQXWNzO+5>_b)Io4S;#n~uqsbTxX)m8>)E?dHU^!gLX&ftd6~RsBeM`g6Dtrh&^55IGBD_<&3KKXAvZrIGp!Q0hMx)- z!hsqTKsFQ_5Fls*6e literal 0 HcmV?d00001 diff --git a/cs/3rd party/libvorbis/doc/Vorbis_I_spec6x.png b/cs/3rd party/libvorbis/doc/Vorbis_I_spec6x.png new file mode 100644 index 0000000000000000000000000000000000000000..9c7e2f72d36cea81d2598c791eede6d890a4495c GIT binary patch literal 557 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 O2w;t}vuH5$q5KDT7nUdh literal 0 HcmV?d00001 diff --git a/cs/3rd party/libvorbis/doc/Vorbis_I_spec9x.png b/cs/3rd party/libvorbis/doc/Vorbis_I_spec9x.png new file mode 100644 index 0000000000000000000000000000000000000000..145100b342240f39c743b7e68392f5d8eae737c5 GIT binary patch literal 1819 zcma)+c{J2(AHaXg8cK{ULt|XtK{L%_T)WGRjIrDdMG-U1&{$^17~4>otfROhx5!db zm$$OieG$21f2*;iY=zQ7t{Pb)%i;dIZ~wf1yyv{nd7kIHe!kyxzUMhl_E8UK6+J)#Z1Cx0^8L2T(|dI=DLkKz*L#7EK1UVZkJdI{@&F03am|05(8Z z$_D_5K?A^_Q~#(s}DSFzyR*3o43=>&JL*l{|n4tv&zK5iXvTjHxTW2SZXpuFgatOGcLj8VVfJiD*!={yyGs_F@1)2Jb?2@IF2D>158u z8!#nET2{r|)?{P(E4-eWtJV zvEmjRSoCk(wdo}OnV8$(yM94ew!=*1lK6C2gQ(-|z=9iDB@&}qb+FUizO`0u*_t63 z-6W|hc&&aE+;%$lPS7@=wCW>I4U?vvF`SKN$_j9{i#K;YIji3qk3UBt^87Gk4fVCq|LM7RF&9b_z72Ae)jydIHjR2n)9!8M$DH>SMBFA-P4H` z_TJi3j8*ZKJHkjAznLvT&OOqP?+l0fS}<#fZ0p=V#EUhHF27y$T7sW4)ZXSFI@)1H zNmI*ZW#&^O{U-*nqr*Pj4J|rM@I2Nl)#ZR%{+% zkd&0ssP}SF^%H3ubv;GL@fg{PX09Sv@oemil2FsjN0d7E%jr%uC>x>;1nK%+tB~0C zih~8c>4lUZ4|YyeLMNClq`6V}NhZof&Q;%dh>@xqg0UUcr$!CX53Q{)ND9sMJ0>IW^8?TzC2TM8c) z;(F$}AM?(f&neA5tUj3}ADzeLWbR7|Sj(mT6FN~f_j(YVMG+;fH=)N8`JbW}`S{9( zNL=S{8TZ@DUdr`exUw?kc&_fXWJYX~e8+~;rR_lMEflsNCp<8HZ4sFBp$VhH_4?KfdR7}A|eU25znOZi;G#UyxBsSRg2v2Hq|FO5sCEf0$iEbEZo zm**(#RE5-4judPvz#N^=nPyam)Ig1|(_V`FMJTNRjroE|a?{}D&zaaSZKWm}h-Q^wYavw-WZYr8#;OjgSx$`} zYjp1VBcs{*T47jZn4BxqGM+u{9CdTybWi5HHbOvh->LSZ@|~@j(%PBwCr|d;W!<~` zYGr%LRAQ7hyR=ys*t>Ns!BNZf?(nPin^_OFrrDyi>dQXwwQ1c&f6hU-Q3;ERcWXu4 z-L?HwsIoeH%XZHXJtmDmfj_As&&iiZr|}q8!CVF?04y4VN20MvthqPF%<9|5Akh|9 zXf$e1aNvIdk!(6MB;kJpfj%$af&lzm2TrsViAiBZJF;U~bS5j*ksS}<@RsoyyeS5Y zH8sbh^+qmy0ke(1XS*?C84-X3ogKtD!e;T17!=wHMsTNKurM?lheD&Vdp_Npas`Qh zd?&m(Y#xCf!R8{-z;QM=h#4K|5*W>41f!VrSQwJSfno4Z1B#nK1aNWkAl`MP3jPA{ CeiF(6 literal 0 HcmV?d00001 diff --git a/cs/3rd party/libvorbis/doc/a1-encapsulation-ogg.tex b/cs/3rd party/libvorbis/doc/a1-encapsulation-ogg.tex new file mode 100644 index 000000000..47355f67c --- /dev/null +++ b/cs/3rd party/libvorbis/doc/a1-encapsulation-ogg.tex @@ -0,0 +1,185 @@ +% -*- mode: latex; TeX-master: "Vorbis_I_spec"; -*- +%!TEX root = Vorbis_I_spec.tex +% $Id$ +\section{Embedding Vorbis into an Ogg stream} \label{vorbis:over:ogg} + +\subsection{Overview} + +This document describes using Ogg logical and physical transport +streams to encapsulate Vorbis compressed audio packet data into file +form. + +The \xref{vorbis:spec:intro} provides an overview of the construction +of Vorbis audio packets. + +The \href{oggstream.html}{Ogg +bitstream overview} and \href{framing.html}{Ogg logical +bitstream and framing spec} provide detailed descriptions of Ogg +transport streams. This specification document assumes a working +knowledge of the concepts covered in these named backround +documents. Please read them first. + +\subsubsection{Restrictions} + +The Ogg/Vorbis I specification currently dictates that Ogg/Vorbis +streams use Ogg transport streams in degenerate, unmultiplexed +form only. That is: + +\begin{itemize} + \item + A meta-headerless Ogg file encapsulates the Vorbis I packets + + \item + The Ogg stream may be chained, i.e., contain multiple, contigous logical streams (links). + + \item + The Ogg stream must be unmultiplexed (only one stream, a Vorbis audio stream, per link) + +\end{itemize} + + +This is not to say that it is not currently possible to multiplex +Vorbis with other media types into a multi-stream Ogg file. At the +time this document was written, Ogg was becoming a popular container +for low-bitrate movies consisting of DivX video and Vorbis audio. +However, a 'Vorbis I audio file' is taken to imply Vorbis audio +existing alone within a degenerate Ogg stream. A compliant 'Vorbis +audio player' is not required to implement Ogg support beyond the +specific support of Vorbis within a degenrate Ogg stream (naturally, +application authors are encouraged to support full multiplexed Ogg +handling). + + + + +\subsubsection{MIME type} + +The MIME type of Ogg files depend on the context. Specifically, complex +multimedia and applications should use \literal{application/ogg}, +while visual media should use \literal{video/ogg}, and audio +\literal{audio/ogg}. Vorbis data encapsulated in Ogg may appear +in any of those types. RTP encapsulated Vorbis should use +\literal{audio/vorbis} + \literal{audio/vorbis-config}. + + +\subsection{Encapsulation} + +Ogg encapsulation of a Vorbis packet stream is straightforward. + +\begin{itemize} + +\item + The first Vorbis packet (the identification header), which + uniquely identifies a stream as Vorbis audio, is placed alone in the + first page of the logical Ogg stream. This results in a first Ogg + page of exactly 58 bytes at the very beginning of the logical stream. + + +\item + This first page is marked 'beginning of stream' in the page flags. + + +\item + The second and third vorbis packets (comment and setup + headers) may span one or more pages beginning on the second page of + the logical stream. However many pages they span, the third header + packet finishes the page on which it ends. The next (first audio) packet + must begin on a fresh page. + + +\item + The granule position of these first pages containing only headers is zero. + + +\item + The first audio packet of the logical stream begins a fresh Ogg page. + + +\item + Packets are placed into ogg pages in order until the end of stream. + + +\item + The last page is marked 'end of stream' in the page flags. + + +\item + Vorbis packets may span page boundaries. + + +\item + The granule position of pages containing Vorbis audio is in units + of PCM audio samples (per channel; a stereo stream's granule position + does not increment at twice the speed of a mono stream). + + +\item + The granule position of a page represents the end PCM sample + position of the last packet \emph{completed} on that + page. The 'last PCM sample' is the last complete sample returned by + decode, not an internal sample awaiting lapping with a + subsequent block. A page that is entirely spanned by a single + packet (that completes on a subsequent page) has no granule + position, and the granule position is set to '-1'. + + + Note that the last decoded (fully lapped) PCM sample from a packet + is not necessarily the middle sample from that block. If, eg, the + current Vorbis packet encodes a "long block" and the next Vorbis + packet encodes a "short block", the last decodable sample from the + current packet be at position (3*long\_block\_length/4) - + (short\_block\_length/4). + + +\item + The granule (PCM) position of the first page need not indicate + that the stream started at position zero. Although the granule + position belongs to the last completed packet on the page and a + valid granule position must be positive, by + inference it may indicate that the PCM position of the beginning + of audio is positive or negative. + + + \begin{itemize} + \item + A positive starting value simply indicates that this stream begins at + some positive time offset, potentially within a larger + program. This is a common case when connecting to the middle + of broadcast stream. + + \item + A negative value indicates that + output samples preceeding time zero should be discarded during + decoding; this technique is used to allow sample-granularity + editing of the stream start time of already-encoded Vorbis + streams. The number of samples to be discarded must not exceed + the overlap-add span of the first two audio packets. + + \end{itemize} + + + In both of these cases in which the initial audio PCM starting + offset is nonzero, the second finished audio packet must flush the + page on which it appears and the third packet begin a fresh page. + This allows the decoder to always be able to perform PCM position + adjustments before needing to return any PCM data from synthesis, + resulting in correct positioning information without any aditional + seeking logic. + + + \begin{note} + Failure to do so should, at worst, cause a + decoder implementation to return incorrect positioning information + for seeking operations at the very beginning of the stream. + \end{note} + + +\item + A granule position on the final page in a stream that indicates + less audio data than the final packet would normally return is used to + end the stream on other than even frame boundaries. The difference + between the actual available data returned and the declared amount + indicates how many trailing samples to discard from the decoding + process. + +\end{itemize} diff --git a/cs/3rd party/libvorbis/doc/a2-encapsulation-rtp.tex b/cs/3rd party/libvorbis/doc/a2-encapsulation-rtp.tex new file mode 100644 index 000000000..067803717 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/a2-encapsulation-rtp.tex @@ -0,0 +1,9 @@ +% -*- mode: latex; TeX-master: "Vorbis_I_spec"; -*- +%!TEX root = Vorbis_I_spec.tex +% $Id$ +\section{Vorbis encapsulation in RTP} \label{vorbis:over:rtp} + +% TODO: Include draft-rtp.xml somehow? + +Please consult RFC 5215 \textit{``RTP Payload Format for Vorbis Encoded + Audio''} for description of how to embed Vorbis audio in an RTP stream. diff --git a/cs/3rd party/libvorbis/doc/components.png b/cs/3rd party/libvorbis/doc/components.png new file mode 100644 index 0000000000000000000000000000000000000000..0c4e75c6e6117ba49e23f3b47abb6618bea4a0ab GIT binary patch literal 9741 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 T`q6ju%?qHb3DIa&dlvIQ(wI9) literal 0 HcmV?d00001 diff --git a/cs/3rd party/libvorbis/doc/eightphase.png b/cs/3rd party/libvorbis/doc/eightphase.png new file mode 100644 index 0000000000000000000000000000000000000000..8272e44824c17c2c9b0e663e309042f7a714baa3 GIT binary patch literal 11130 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 R#~uIx002ovPDHLkV1gu$DbfG{ literal 0 HcmV?d00001 diff --git a/cs/3rd party/libvorbis/doc/floor1-1.png b/cs/3rd party/libvorbis/doc/floor1-1.png new file mode 100644 index 0000000000000000000000000000000000000000..bd7faba6680caabc6cf15ffb723e1048adc6610b GIT binary patch literal 3420 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 literal 0 HcmV?d00001 diff --git a/cs/3rd party/libvorbis/doc/floor1-3.png b/cs/3rd party/libvorbis/doc/floor1-3.png new file mode 100644 index 0000000000000000000000000000000000000000..4d03c6a1b722d66faaa58c8c8cfe2929c37de67e GIT binary patch literal 4627 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 N002ovPDHLkV1nnGL0SL+ literal 0 HcmV?d00001 diff --git a/cs/3rd party/libvorbis/doc/floor1_inverse_dB_table.html b/cs/3rd party/libvorbis/doc/floor1_inverse_dB_table.html new file mode 100644 index 000000000..99ad4b805 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/floor1_inverse_dB_table.html @@ -0,0 +1,154 @@ + + + + + +Ogg Vorbis Documentation + + + + + + + + + +

    Ogg Vorbis I format specification: floor1_inverse_dB_table

    + +

    The vector [floor1_inverse_dB_table] is a 256 element static +lookup table consiting of the following values (read left to right +then top to bottom):

    + +
    +  1.0649863e-07, 1.1341951e-07, 1.2079015e-07, 1.2863978e-07, 
    +  1.3699951e-07, 1.4590251e-07, 1.5538408e-07, 1.6548181e-07, 
    +  1.7623575e-07, 1.8768855e-07, 1.9988561e-07, 2.1287530e-07, 
    +  2.2670913e-07, 2.4144197e-07, 2.5713223e-07, 2.7384213e-07, 
    +  2.9163793e-07, 3.1059021e-07, 3.3077411e-07, 3.5226968e-07, 
    +  3.7516214e-07, 3.9954229e-07, 4.2550680e-07, 4.5315863e-07, 
    +  4.8260743e-07, 5.1396998e-07, 5.4737065e-07, 5.8294187e-07, 
    +  6.2082472e-07, 6.6116941e-07, 7.0413592e-07, 7.4989464e-07, 
    +  7.9862701e-07, 8.5052630e-07, 9.0579828e-07, 9.6466216e-07, 
    +  1.0273513e-06, 1.0941144e-06, 1.1652161e-06, 1.2409384e-06, 
    +  1.3215816e-06, 1.4074654e-06, 1.4989305e-06, 1.5963394e-06, 
    +  1.7000785e-06, 1.8105592e-06, 1.9282195e-06, 2.0535261e-06, 
    +  2.1869758e-06, 2.3290978e-06, 2.4804557e-06, 2.6416497e-06, 
    +  2.8133190e-06, 2.9961443e-06, 3.1908506e-06, 3.3982101e-06, 
    +  3.6190449e-06, 3.8542308e-06, 4.1047004e-06, 4.3714470e-06, 
    +  4.6555282e-06, 4.9580707e-06, 5.2802740e-06, 5.6234160e-06, 
    +  5.9888572e-06, 6.3780469e-06, 6.7925283e-06, 7.2339451e-06, 
    +  7.7040476e-06, 8.2047000e-06, 8.7378876e-06, 9.3057248e-06, 
    +  9.9104632e-06, 1.0554501e-05, 1.1240392e-05, 1.1970856e-05, 
    +  1.2748789e-05, 1.3577278e-05, 1.4459606e-05, 1.5399272e-05, 
    +  1.6400004e-05, 1.7465768e-05, 1.8600792e-05, 1.9809576e-05, 
    +  2.1096914e-05, 2.2467911e-05, 2.3928002e-05, 2.5482978e-05, 
    +  2.7139006e-05, 2.8902651e-05, 3.0780908e-05, 3.2781225e-05, 
    +  3.4911534e-05, 3.7180282e-05, 3.9596466e-05, 4.2169667e-05, 
    +  4.4910090e-05, 4.7828601e-05, 5.0936773e-05, 5.4246931e-05, 
    +  5.7772202e-05, 6.1526565e-05, 6.5524908e-05, 6.9783085e-05, 
    +  7.4317983e-05, 7.9147585e-05, 8.4291040e-05, 8.9768747e-05, 
    +  9.5602426e-05, 0.00010181521, 0.00010843174, 0.00011547824, 
    +  0.00012298267, 0.00013097477, 0.00013948625, 0.00014855085, 
    +  0.00015820453, 0.00016848555, 0.00017943469, 0.00019109536, 
    +  0.00020351382, 0.00021673929, 0.00023082423, 0.00024582449, 
    +  0.00026179955, 0.00027881276, 0.00029693158, 0.00031622787, 
    +  0.00033677814, 0.00035866388, 0.00038197188, 0.00040679456, 
    +  0.00043323036, 0.00046138411, 0.00049136745, 0.00052329927, 
    +  0.00055730621, 0.00059352311, 0.00063209358, 0.00067317058, 
    +  0.00071691700, 0.00076350630, 0.00081312324, 0.00086596457, 
    +  0.00092223983, 0.00098217216, 0.0010459992,  0.0011139742, 
    +  0.0011863665,  0.0012634633,  0.0013455702,  0.0014330129, 
    +  0.0015261382,  0.0016253153,  0.0017309374,  0.0018434235, 
    +  0.0019632195,  0.0020908006,  0.0022266726,  0.0023713743, 
    +  0.0025254795,  0.0026895994,  0.0028643847,  0.0030505286, 
    +  0.0032487691,  0.0034598925,  0.0036847358,  0.0039241906, 
    +  0.0041792066,  0.0044507950,  0.0047400328,  0.0050480668, 
    +  0.0053761186,  0.0057254891,  0.0060975636,  0.0064938176, 
    +  0.0069158225,  0.0073652516,  0.0078438871,  0.0083536271, 
    +  0.0088964928,  0.009474637,   0.010090352,   0.010746080, 
    +  0.011444421,   0.012188144,   0.012980198,   0.013823725, 
    +  0.014722068,   0.015678791,   0.016697687,   0.017782797, 
    +  0.018938423,   0.020169149,   0.021479854,   0.022875735, 
    +  0.024362330,   0.025945531,   0.027631618,   0.029427276, 
    +  0.031339626,   0.033376252,   0.035545228,   0.037855157, 
    +  0.040315199,   0.042935108,   0.045725273,   0.048696758, 
    +  0.051861348,   0.055231591,   0.058820850,   0.062643361, 
    +  0.066714279,   0.071049749,   0.075666962,   0.080584227, 
    +  0.085821044,   0.091398179,   0.097337747,   0.10366330, 
    +  0.11039993,    0.11757434,    0.12521498,    0.13335215, 
    +  0.14201813,    0.15124727,    0.16107617,    0.17154380, 
    +  0.18269168,    0.19456402,    0.20720788,    0.22067342, 
    +  0.23501402,    0.25028656,    0.26655159,    0.28387361, 
    +  0.30232132,    0.32196786,    0.34289114,    0.36517414, 
    +  0.38890521,    0.41417847,    0.44109412,    0.46975890, 
    +  0.50028648,    0.53279791,    0.56742212,    0.60429640, 
    +  0.64356699,    0.68538959,    0.72993007,    0.77736504, 
    +  0.82788260,    0.88168307,    0.9389798,     1.
    +
    + + + + + diff --git a/cs/3rd party/libvorbis/doc/floorval.png b/cs/3rd party/libvorbis/doc/floorval.png new file mode 100644 index 0000000000000000000000000000000000000000..49d6ec190f851627ae91539fb961f4803233b5e2 GIT binary patch literal 2545 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 TXw~DXZ3NHM^`6wI+C}{rdnX(T literal 0 HcmV?d00001 diff --git a/cs/3rd party/libvorbis/doc/framing.html b/cs/3rd party/libvorbis/doc/framing.html new file mode 100644 index 000000000..857b292b8 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/framing.html @@ -0,0 +1,431 @@ + + + + + +Ogg Vorbis Documentation + + + + + + + + + +

    Ogg logical bitstream framing

    + +

    Ogg bitstreams

    + +

    The Ogg transport bitstream is designed to provide framing, error +protection and seeking structure for higher-level codec streams that +consist of raw, unencapsulated data packets, such as the Vorbis audio +codec or Theora video codec.

    + +

    Application example: Vorbis

    + +

    Vorbis encodes short-time blocks of PCM data into raw packets of +bit-packed data. These raw packets may be used directly by transport +mechanisms that provide their own framing and packet-separation +mechanisms (such as UDP datagrams). For stream based storage (such as +files) and transport (such as TCP streams or pipes), Vorbis uses the +Ogg bitstream format to provide framing/sync, sync recapture +after error, landmarks during seeking, and enough information to +properly separate data back into packets at the original packet +boundaries without relying on decoding to find packet boundaries.

    + +

    Design constraints for Ogg bitstreams

    + +
      +
    1. True streaming; we must not need to seek to build a 100% + complete bitstream.
    2. +
    3. Use no more than approximately 1-2% of bitstream bandwidth for + packet boundary marking, high-level framing, sync and seeking.
    4. +
    5. Specification of absolute position within the original sample + stream.
    6. +
    7. Simple mechanism to ease limited editing, such as a simplified + concatenation mechanism.
    8. +
    9. Detection of corruption, recapture after error and direct, random + access to data at arbitrary positions in the bitstream.
    10. +
    + +

    Logical and Physical Bitstreams

    + +

    A logical Ogg bitstream is a contiguous stream of +sequential pages belonging only to the logical bitstream. A +physical Ogg bitstream is constructed from one or more +than one logical Ogg bitstream (the simplest physical bitstream +is simply a single logical bitstream). We describe below the exact +formatting of an Ogg logical bitstream. Combining logical +bitstreams into more complex physical bitstreams is described in the +Ogg bitstream overview. The exact +mapping of raw Vorbis packets into a valid Ogg Vorbis physical +bitstream is described in the Vorbis I Specification.

    + +

    Bitstream structure

    + +

    An Ogg stream is structured by dividing incoming packets into +segments of up to 255 bytes and then wrapping a group of contiguous +packet segments into a variable length page preceded by a page +header. Both the header size and page size are variable; the page +header contains sizing information and checksum data to determine +header/page size and data integrity.

    + +

    The bitstream is captured (or recaptured) by looking for the beginning +of a page, specifically the capture pattern. Once the capture pattern +is found, the decoder verifies page sync and integrity by computing +and comparing the checksum. At that point, the decoder can extract the +packets themselves.

    + +

    Packet segmentation

    + +

    Packets are logically divided into multiple segments before encoding +into a page. Note that the segmentation and fragmentation process is a +logical one; it's used to compute page header values and the original +page data need not be disturbed, even when a packet spans page +boundaries.

    + +

    The raw packet is logically divided into [n] 255 byte segments and a +last fractional segment of < 255 bytes. A packet size may well +consist only of the trailing fractional segment, and a fractional +segment may be zero length. These values, called "lacing values" are +then saved and placed into the header segment table.

    + +

    An example should make the basic concept clear:

    + +
    +
    +raw packet:
    +  ___________________________________________
    + |______________packet data__________________| 753 bytes
    +
    +lacing values for page header segment table: 255,255,243
    +
    +
    + +

    We simply add the lacing values for the total size; the last lacing +value for a packet is always the value that is less than 255. Note +that this encoding both avoids imposing a maximum packet size as well +as imposing minimum overhead on small packets (as opposed to, eg, +simply using two bytes at the head of every packet and having a max +packet size of 32k. Small packets (<255, the typical case) are +penalized with twice the segmentation overhead). Using the lacing +values as suggested, small packets see the minimum possible +byte-aligned overheade (1 byte) and large packets, over 512 bytes or +so, see a fairly constant ~.5% overhead on encoding space.

    + +

    Note that a lacing value of 255 implies that a second lacing value +follows in the packet, and a value of < 255 marks the end of the +packet after that many additional bytes. A packet of 255 bytes (or a +multiple of 255 bytes) is terminated by a lacing value of 0:

    + +
    
    +raw packet:
    +  _______________________________
    + |________packet data____________|          255 bytes
    +
    +lacing values: 255, 0
    +
    + +

    Note also that a 'nil' (zero length) packet is not an error; it +consists of nothing more than a lacing value of zero in the header.

    + +

    Packets spanning pages

    + +

    Packets are not restricted to beginning and ending within a page, +although individual segments are, by definition, required to do so. +Packets are not restricted to a maximum size, although excessively +large packets in the data stream are discouraged; the Ogg +bitstream specification strongly recommends nominal page size of +approximately 4-8kB (large packets are foreseen as being useful for +initialization data at the beginning of a logical bitstream).

    + +

    After segmenting a packet, the encoder may decide not to place all the +resulting segments into the current page; to do so, the encoder places +the lacing values of the segments it wishes to belong to the current +page into the current segment table, then finishes the page. The next +page is begun with the first value in the segment table belonging to +the next packet segment, thus continuing the packet (data in the +packet body must also correspond properly to the lacing values in the +spanned pages. The segment data in the first packet corresponding to +the lacing values of the first page belong in that page; packet +segments listed in the segment table of the following page must begin +the page body of the subsequent page).

    + +

    The last mechanic to spanning a page boundary is to set the header +flag in the new page to indicate that the first lacing value in the +segment table continues rather than begins a packet; a header flag of +0x01 is set to indicate a continued packet. Although mandatory, it +is not actually algorithmically necessary; one could inspect the +preceding segment table to determine if the packet is new or +continued. Adding the information to the packet_header flag allows a +simpler design (with no overhead) that needs only inspect the current +page header after frame capture. This also allows faster error +recovery in the event that the packet originates in a corrupt +preceding page, implying that the previous page's segment table +cannot be trusted.

    + +

    Note that a packet can span an arbitrary number of pages; the above +spanning process is repeated for each spanned page boundary. Also a +'zero termination' on a packet size that is an even multiple of 255 +must appear even if the lacing value appears in the next page as a +zero-length continuation of the current packet. The header flag +should be set to 0x01 to indicate that the packet spanned, even though +the span is a nil case as far as data is concerned.

    + +

    The encoding looks odd, but is properly optimized for speed and the +expected case of the majority of packets being between 50 and 200 +bytes (note that it is designed such that packets of wildly different +sizes can be handled within the model; placing packet size +restrictions on the encoder would have only slightly simplified design +in page generation and increased overall encoder complexity).

    + +

    The main point behind tracking individual packets (and packet +segments) is to allow more flexible encoding tricks that requiring +explicit knowledge of packet size. An example is simple bandwidth +limiting, implemented by simply truncating packets in the nominal case +if the packet is arranged so that the least sensitive portion of the +data comes last.

    + +

    Page header

    + +

    The headering mechanism is designed to avoid copying and re-assembly +of the packet data (ie, making the packet segmentation process a +logical one); the header can be generated directly from incoming +packet data. The encoder buffers packet data until it finishes a +complete page at which point it writes the header followed by the +buffered packet segments.

    + +

    capture_pattern

    + +

    A header begins with a capture pattern that simplifies identifying +pages; once the decoder has found the capture pattern it can do a more +intensive job of verifying that it has in fact found a page boundary +(as opposed to an inadvertent coincidence in the byte stream).

    + +
    
    + byte value
    +
    +  0  0x4f 'O'
    +  1  0x67 'g'
    +  2  0x67 'g'
    +  3  0x53 'S'  
    +
    + +

    stream_structure_version

    + +

    The capture pattern is followed by the stream structure revision:

    + +
    
    + byte value
    +
    +  4  0x00
    +
    + +

    header_type_flag

    + +

    The header type flag identifies this page's context in the bitstream:

    + +
    
    + byte value
    +
    +  5  bitflags: 0x01: unset = fresh packet
    +	               set = continued packet
    +	       0x02: unset = not first page of logical bitstream
    +                       set = first page of logical bitstream (bos)
    +	       0x04: unset = not last page of logical bitstream
    +                       set = last page of logical bitstream (eos)
    +
    + +

    absolute granule position

    + +

    (This is packed in the same way the rest of Ogg data is packed; LSb +of LSB first. Note that the 'position' data specifies a 'sample' +number (eg, in a CD quality sample is four octets, 16 bits for left +and 16 bits for right; in video it would likely be the frame number. +It is up to the specific codec in use to define the semantic meaning +of the granule position value). The position specified is the total +samples encoded after including all packets finished on this page +(packets begun on this page but continuing on to the next page do not +count). The rationale here is that the position specified in the +frame header of the last page tells how long the data coded by the +bitstream is. A truncated stream will still return the proper number +of samples that can be decoded fully.

    + +

    A special value of '-1' (in two's complement) indicates that no packets +finish on this page.

    + +
    
    + byte value
    +
    +  6  0xXX LSB
    +  7  0xXX
    +  8  0xXX
    +  9  0xXX
    + 10  0xXX
    + 11  0xXX
    + 12  0xXX
    + 13  0xXX MSB
    +
    + +

    stream serial number

    + +

    Ogg allows for separate logical bitstreams to be mixed at page +granularity in a physical bitstream. The most common case would be +sequential arrangement, but it is possible to interleave pages for +two separate bitstreams to be decoded concurrently. The serial +number is the means by which pages physical pages are associated with +a particular logical stream. Each logical stream must have a unique +serial number within a physical stream:

    + +
    
    + byte value
    +
    + 14  0xXX LSB
    + 15  0xXX
    + 16  0xXX
    + 17  0xXX MSB
    +
    + +

    page sequence no

    + +

    Page counter; lets us know if a page is lost (useful where packets +span page boundaries).

    + +
    
    + byte value
    +
    + 18  0xXX LSB
    + 19  0xXX
    + 20  0xXX
    + 21  0xXX MSB
    +
    + +

    page checksum

    + +

    32 bit CRC value (direct algorithm, initial val and final XOR = 0, +generator polynomial=0x04c11db7). The value is computed over the +entire header (with the CRC field in the header set to zero) and then +continued over the page. The CRC field is then filled with the +computed value.

    + +

    (A thorough discussion of CRC algorithms can be found in "A +Painless Guide to CRC Error Detection Algorithms" by Ross +Williams ross@ross.net.)

    + +
    
    + byte value
    +
    + 22  0xXX LSB
    + 23  0xXX
    + 24  0xXX
    + 25  0xXX MSB
    +
    + +

    page_segments

    + +

    The number of segment entries to appear in the segment table. The +maximum number of 255 segments (255 bytes each) sets the maximum +possible physical page size at 65307 bytes or just under 64kB (thus +we know that a header corrupted so as destroy sizing/alignment +information will not cause a runaway bitstream. We'll read in the +page according to the corrupted size information that's guaranteed to +be a reasonable size regardless, notice the checksum mismatch, drop +sync and then look for recapture).

    + +
    
    + byte value
    +
    + 26 0x00-0xff (0-255)
    +
    + +

    segment_table (containing packet lacing values)

    + +

    The lacing values for each packet segment physically appearing in +this page are listed in contiguous order.

    + +
    
    + byte value
    +
    + 27 0x00-0xff (0-255)
    + [...]
    + n  0x00-0xff (0-255, n=page_segments+26)
    +
    + +

    Total page size is calculated directly from the known header size and +lacing values in the segment table. Packet data segments follow +immediately after the header.

    + +

    Page headers typically impose a flat .25-.5% space overhead assuming +nominal ~8k page sizes. The segmentation table needed for exact +packet recovery in the streaming layer adds approximately .5-1% +nominal assuming expected encoder behavior in the 44.1kHz, 128kbps +stereo encodings.

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/helper.html b/cs/3rd party/libvorbis/doc/helper.html new file mode 100644 index 000000000..a16df2800 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/helper.html @@ -0,0 +1,239 @@ + + + + + +Ogg Vorbis Documentation + + + + + + + + + +

    Ogg Vorbis I format specification: helper equations

    + +

    Overview

    + +

    The equations below are used in multiple places by the Vorbis codec +specification. Rather than cluttering up the main specification +documents, they are defined here and linked in the main documents +where appropriate.

    + +

    ilog

    + +

    The "ilog(x)" function returns the position number (1 through n) of the +highest set bit in the two's complement integer value +[x]. Values of [x] less than zero are defined to return zero.

    + +
    +  1) [return_value] = 0;
    +  2) if ( [x] is greater than zero ){
    +      
    +       3) increment [return_value];
    +       4) logical shift [x] one bit to the right, padding the MSb with zero
    +       5) repeat at step 2)
    +
    +     }
    +
    +   6) done
    +
    + +

    Examples:

    + +
      +
    • ilog(0) = 0;
    • +
    • ilog(1) = 1;
    • +
    • ilog(2) = 2;
    • +
    • ilog(3) = 2;
    • +
    • ilog(4) = 3;
    • +
    • ilog(7) = 3;
    • +
    • ilog(negative number) = 0;
    • +
    + +

    float32_unpack

    + +

    "float32_unpack(x)" is intended to translate the packed binary +representation of a Vorbis codebook float value into the +representation used by the decoder for floating point numbers. For +purposes of this example, we will unpack a Vorbis float32 into a +host-native floating point number.

    + +
    +  1) [mantissa] = [x] bitwise AND 0x1fffff (unsigned result)
    +  2) [sign] = [x] bitwise AND 0x80000000 (unsigned result)
    +  3) [exponent] = ( [x] bitwise AND 0x7fe00000) shifted right 21 bits (unsigned result)
    +  4) if ( [sign] is nonzero ) then negate [mantissa]
    +  5) return [mantissa] * ( 2 ^ ( [exponent] - 788 ) )
    +
    + +

    lookup1_values

    + +

    "lookup1_values(codebook_entries,codebook_dimensions)" is used to +compute the correct length of the value index for a codebook VQ lookup +table of lookup type 1. The values on this list are permuted to +construct the VQ vector lookup table of size +[codebook_entries].

    + +

    The return value for this function is defined to be 'the greatest +integer value for which [return_value] to the power of +[codebook_dimensions] is less than or equal to +[codebook_entries]'.

    + +

    low_neighbor

    + +

    "low_neighbor(v,x)" finds the position n in vector [v] of +the greatest value scalar element for which n is less than +[x] and vector [v] element n is less +than vector [v] element [x].

    + +

    high_neighbor

    + +

    "high_neighbor(v,x)" finds the position n in vector [v] of +the lowest value scalar element for which n is less than +[x] and vector [v] element n is greater +than vector [v] element [x].

    + +

    render_point

    + +

    "render_point(x0,y0,x1,y1,X)" is used to find the Y value at point X +along the line specified by x0, x1, y0 and y1. This function uses an +integer algorithm to solve for the point directly without calculating +intervening values along the line.

    + +
    +  1)  [dy] = [y1] - [y0]
    +  2) [adx] = [x1] - [x0]
    +  3) [ady] = absolute value of [dy]
    +  4) [err] = [ady] * ([X] - [x0])
    +  5) [off] = [err] / [adx] using integer division
    +  6) if ( [dy] is less than zero ) {
    +
    +       7) [Y] = [y0] - [off]
    +
    +     } else {
    +
    +       8) [Y] = [y0] + [off]
    +  
    +     }
    +
    +  9) done
    +
    + +

    render_line

    + +

    Floor decode type one uses the integer line drawing algorithm of +"render_line(x0, y0, x1, y1, v)" to construct an integer floor +curve for contiguous piecewise line segments. Note that it has not +been relevant elsewhere, but here we must define integer division as +rounding division of both positive and negative numbers toward zero.

    + +
    +  1)   [dy] = [y1] - [y0]
    +  2)  [adx] = [x1] - [x0]
    +  3)  [ady] = absolute value of [dy]
    +  4) [base] = [dy] / [adx] using integer division
    +  5)    [x] = [x0]
    +  6)    [y] = [y0]
    +  7)  [err] = 0
    +
    +  8) if ( [dy] is less than 0 ) {
    +
    +        9) [sy] = [base] - 1
    +
    +     } else {
    +
    +       10) [sy] = [base] + 1
    +
    +     }
    +
    + 11) [ady] = [ady] - (absolute value of [base]) * [adx]
    + 12) vector [v] element [x] = [y]
    +
    + 13) iterate [x] over the range [x0]+1 ... [x1]-1 {
    +
    +       14) [err] = [err] + [ady];
    +       15) if ( [err] >= [adx] ) {
    +
    +             15) [err] = [err] - [adx]
    +             16)   [y] = [y] + [sy]
    +
    +           } else {
    +
    +             17) [y] = [y] + [base]
    +   
    +           }
    +
    +       18) vector [v] element [x] = [y]
    +
    +     }
    +
    + + + + + diff --git a/cs/3rd party/libvorbis/doc/hufftree-under.png b/cs/3rd party/libvorbis/doc/hufftree-under.png new file mode 100644 index 0000000000000000000000000000000000000000..be6e8d6bb8e5cb37a812be7120619331ee72aa0c GIT binary patch literal 1206 zcmZWpTToL65WPVJC%mOZMU{ z5#g4XI)=$mFqlgt4e}_7DWsstV`7{b5o`(wF|?vkAi!;C|LA_4b7ntwcXrP1wV30P z4p``FnD`=)9Lia#zwVTjVhHS z5~;MbG&3_3Ehs>>S~M*Ul}Jzu1!XeP>1njGk}w_S1pw9|QIx|cc?qTweVPZ=IfC6t z%Njd7xw1WnQ`2-NFr!hmqb&uZUe9z(oqaQ9fAZctt(S|7%gw4oH~_S=0}+J<{>NNi z==M=%c8zrI+4xI^~ECaVAhdBB}{o?ix;wk&G-WX9 z5u_Fr(%o&TH#YU}r9%A)pEo^Tkl#b%PQgfAXWq-1w^-^A<0Ib-IQiMru13ukn89v) zJe-tWWGS(o8*-pkatC>cHE>!wK{kPp*$ORW6KUxgzAPpmM7F(s-8-HqUSe`_%`7yhuu^~GsRLB2=@_jjwJUd_T^-Z{aFsxO z_%f~g;L3jZn4aA*$x5~72Ww|YQ2hktp_;!Tej)RRdk{Mtgr*oa>Tujgi>|8#jZtUy z1owyYfvuMPJZttDbfnIe`sS%QI?)n|toSBoKiJ|e*}Xgj%RjYjtD?)VmN_@@S?UVJ zDyq#2hIEMoLPs6BZ-gZ-ZNAPtHYE9&UjY`?epwIIF&CUY`AQGd@T=W0b7`k>1HQT> zDo((5lT9TC)Ku(6PP7FSozw1O5T7hH`NP#ugCGJu!4dKm&(7VVYm3DuVZ6k!`X17O zf;-HNBHNCi!>`i2)H_nyBu$;JQp8L!)D^DfI{(YDA5sIQWA`*?&IL3qL1j3YdOGu& zk>4)!q7FZvZD_x;%UdR2!N6qEdwKYb`rrlY`?+S7a#k!C{@d$KjK7H!7+n4kp>*y6 z@255IhfEVotP8*ME<58OPgHt)&7&q^NWPmWXQv{wDbb@p8Cg!2#gM#g@Ql%X)<)T- zSovWq2C*h_4&wxOe}Z@7A&G-F*Ic1n#G{J1jvN5KTL02vGty(MawEy6cTc%OZsR{j zpGIB<(f)E+^S{QJXt|588gfH}e(C!;JvpBh7pyH8Ekerk9l7Y_z}=g%_VWeZNHU22>eA~|l^)4#eO7Wi zq9zBg_9G3D8BqjK3v@O~P5=RUIK`v6f#j#D0d!7BI%36(ms literal 0 HcmV?d00001 diff --git a/cs/3rd party/libvorbis/doc/hufftree.png b/cs/3rd party/libvorbis/doc/hufftree.png new file mode 100644 index 0000000000000000000000000000000000000000..f4dc537425bfc1fd8a06bc32b795dcbbd98ae493 GIT binary patch literal 1228 zcmY*ZX;71A5dLDgBpf4<*aDFj<^BNifI*M|Lb)-Zq;FcaNsxkoV4)O5nH-P~lol09 z5DQ^ip%wg;L>#cfa0ElF0jXE8lR_W}7y<>+a0v1>vHocP>^{%VJMTWbv%6*F_y}`T zTT=*v%%dX15+Mi!>+n4jtj?xj;8dOSC&wNRM^RJ(!|7sR4VoN_eXns zD=I2-a&pkHFqFeV5d_W3LgjLlN=0X8&`Xz`XLy$($RIu{EaY&(vAGd-mSU$(Ny6ad zFOrx?%gkr}rR)%m?Qzi8aCepE$mDIWK3~*w;lz+zV^v}_rofXWtP++u!Su~BAR36R z_1C89nq+h1H9yFT*m0sr}Ux+xr7)n zI|fqeyuI1e>YH(5_rP0iCkYh#@M>;)Nh4cwcE109*lihIzPFJs;ce3cNQK|m(4G#qEqJcU6pX5(OSnrwT=>%& zm+I|E{jD?as{gMJ)d#)-EIdIftifakz@tM`z`pNGBcZ2g@$rUCO$4=YkY6^JSHJX1 z;*IR#bWKIs=TwK+)pNFx2|@V0WI@iqBrmv>E=?QlgFQ?0w1Fx_ys#z;0+7}RRkj@ZFU zABsV3e()?-)@R)MhZ|*+I1biwco1#Q8n>W4UPSZ%=ybZ4i)T;DXoiffV3g@&X#Bb~ zh4nJxbGQw1Mk-CcBf!J8mACi5TkBITNw>=VZvAY8|PH@41K7d>W3n_J|=4W_D-i&xl;(kifji$+67)&01gigiUis=y(ZDPNVhL; z_;O`MLxNzJc(>IT>mwO`7@>TiCAv~uPib1{7`Dh-2Dn9_se7J)i+pUOUg^YNQ~JqO z#6^IKT%JeQ*LE**dXKSiXZlrThkTPo5po*g{*>!x*{xh8t!+y5^YR72+&b9HMe;8% zRfKaMwT$ndx-c!U7n8xp?>=1x$Bj)rDr=m2#3rDZM3NL^LoMD2%vpG%P+si4!N;Br z4B}%R2s}KU#-yayG`wIx`|YZd3@jGD(Xj8L+Dvcc-h}_F8$ODcqVK`#xwQL-qTgMD c|Cu-DAzp5gpAG(YQ+Jb~sPOo(8=*ALKY8y}F8}}l literal 0 HcmV?d00001 diff --git a/cs/3rd party/libvorbis/doc/index.html b/cs/3rd party/libvorbis/doc/index.html new file mode 100644 index 000000000..6d95e4573 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/index.html @@ -0,0 +1,114 @@ + + + + + +Ogg Vorbis Documentation + + + + + + + + + +

    Ogg Vorbis Documentation

    + +

    Vorbis technical discussion documents

    + + +

    Ogg Vorbis I specification

    + + + +

    Ogg Vorbis programming documents

    + + + +

    Ogg bitstream documentation

    + + + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/Makefile.am b/cs/3rd party/libvorbis/doc/libvorbis/Makefile.am new file mode 100644 index 000000000..0bcc135b7 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/Makefile.am @@ -0,0 +1,24 @@ +## Process this file with automake to produce Makefile.in + +docdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/libvorbis + +doc_DATA = index.html reference.html style.css vorbis_comment.html\ + vorbis_info.html vorbis_analysis_blockout.html vorbis_analysis_buffer.html\ + vorbis_analysis_headerout.html vorbis_analysis_init.html \ + vorbis_analysis_wrote.html vorbis_analysis.html vorbis_bitrate_addblock.html\ + vorbis_bitrate_flushpacket.html vorbis_block_init.html \ + vorbis_block_clear.html vorbis_dsp_clear.html vorbis_granule_time.html \ + vorbis_version_string.html vorbis_info_blocksize.html vorbis_info_clear.html\ + vorbis_info_init.html vorbis_comment_add.html vorbis_comment_add_tag.html\ + vorbis_comment_clear.html vorbis_comment_init.html vorbis_comment_query.html\ + vorbis_comment_query_count.html vorbis_commentheader_out.html\ + vorbis_packet_blocksize.html vorbis_synthesis.html \ + vorbis_synthesis_blockin.html vorbis_synthesis_halfrate.html \ + vorbis_synthesis_halfrate_p.html vorbis_synthesis_headerin.html \ + vorbis_synthesis_idheader.html vorbis_synthesis_init.html \ + vorbis_synthesis_lapout.html vorbis_synthesis_pcmout.html \ + vorbis_synthesis_read.html vorbis_synthesis_restart.html \ + vorbis_synthesis_trackonly.html vorbis_block.html vorbis_dsp_state.html \ + return.html overview.html + +EXTRA_DIST = $(doc_DATA) diff --git a/cs/3rd party/libvorbis/doc/libvorbis/index.html b/cs/3rd party/libvorbis/doc/libvorbis/index.html new file mode 100644 index 000000000..e2199a2e1 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/index.html @@ -0,0 +1,44 @@ + + + +libvorbis - Documentation + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    Libvorbis Documentation

    + +

    +Libvorbis contains the Vorbis reference encoder and decoder. +

    +This is the lowest-level interface to the Vorbis encoder and decoder. If +you're just looking for a simple way to extract the +audio from an Ogg Vorbis file, you probably want to use vorbisfile rather than using libogg +and libvorbis directly. +

    +Libvorbis API overview
    +Libvorbis API reference
    + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/overview.html b/cs/3rd party/libvorbis/doc/libvorbis/overview.html new file mode 100644 index 000000000..22cd18645 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/overview.html @@ -0,0 +1,136 @@ + + + +libvorbis - API Overview + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    Libvorbis API Overview

    + +

    Libvorbis is the reference implementation of the Vorbis codec. It is +the lowest-level interface to the Vorbis encoder and decoder, working +with packets directly.

    + +

    All libvorbis routines and structures are declared in "vorbis/codec.h".

    + +

    Encoding workflow

    + +
      +
    1. Initialize a vorbis_info structure +by calling vorbis_info_init and +then functions from libvorbisenc +on it.
    2. +
    3. Initialize a vorbis_dsp_state +for encoding based on the parameters in the vorbis_info by using vorbis_analysis_init.
    4. +
    5. Initialize a vorbis_comment +structure using vorbis_comment_init, +populate it with any comments you wish to store in the stream, and call +vorbis_analysis_headerout to +get the three Vorbis stream header packets. Output the packets.
    6. +
    7. Initialize a vorbis_block structure +using vorbis_block_init.
    8. +
    9. While there is more audio to encode:
        +
      1. Submit a chunk of audio data using vorbis_analysis_buffer and vorbis_analysis_wrote.
      2. +
      3. Obtain all available blocks using vorbis_analysis_blockout +in a loop. For each block obtained:
          +
        1. Encode the block into a packet (or prepare it for bitrate management) +using vorbis_analysis. (It's a good +idea to always pass the blocks through the bitrate +management mechanism; more information is on the vorbis_analysis page. It does not affect +the resulting packets unless you are actually using a bitrate-managed +mode.)
        2. +
        3. If you are using bitrate management, submit the block using vorbis_bitrate_addblock and obtain +packets using vorbis_bitrate_flushpacket.
        4. +
        5. Output any obtained packets.
        6. +
      4. +
    10. +
    11. Submit an empty buffer to indicate the end of input; this will result +in an end-of-stream packet after all encoding steps are done to it.
    12. +
    13. Destroy the structures using the appropriate vorbis_*_clear routines.
    14. +
    + +

    Decoding workflow

    + +Note: if you do not need to do anything more involved than just +decoding the audio from an Ogg Vorbis file, you can use the far simpler +libvorbisfile interface, which +will take care of all of the demuxing and low-level decoding operations +(and even the I/O, if you want) for you. + +
      +
    1. When reading the header packets of an Ogg stream, you can use vorbis_synthesis_idheader to +check whether a stream might be Vorbis.
    2. +
    3. Initialize a vorbis_info and a vorbis_comment structure using the +appropriate vorbis_*_init routines, then pass the first three packets +from the stream (the Vorbis stream header packets) to vorbis_synthesis_headerin in +order. At this point, you can see the comments and basic parameters of +the Vorbis stream.
    4. +
    5. Initialize a vorbis_dsp_state +for decoding based on the parameters in the vorbis_info by using vorbis_synthesis_init.
    6. +
    7. Initialize a vorbis_block structure +using vorbis_block_init.
    8. +
    9. While there are more packets to decode:
        +
      1. Decode the next packet into a block using vorbis_synthesis.
      2. +
      3. Submit the block to the reassembly layer using vorbis_synthesis_blockin.
      4. +
      5. Obtain some decoded audio using vorbis_synthesis_pcmout and vorbis_synthesis_read. Any audio data +returned but not marked as consumed using vorbis_synthesis_read carries +over to the next call to vorbis_synthesis_pcmout.
      6. +
    10. +
    11. Destroy the structures using the appropriate vorbis_*_clear routines.
    12. +
    + +

    Metadata workflow

    + +Note: if you do not need to do anything more involved than just +reading the metadata from an Ogg Vorbis file, libvorbisfile can do this for you. + +
      +
    1. Follow the decoding workflow above until you have access to the comments +and basic parameters of the Vorbis stream.
    2. +
    3. If you want to alter the comments, copy the first packet to the output +file, then create a packet for the modified comments using vorbis_commentheader_out and output +it, then copy the third packet and all subsequent packets into the output +file.
    4. +
    + +

    +
    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/reference.html b/cs/3rd party/libvorbis/doc/libvorbis/reference.html new file mode 100644 index 000000000..642b1f9c0 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/reference.html @@ -0,0 +1,86 @@ + + + +Libvorbis API Reference + + + + + + + + + +

    Libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    Libvorbis API Reference

    + +

    +Data Structures
    +vorbis_block
    +vorbis_comment
    +vorbis_dsp_state
    +vorbis_info
    +
    +Functions used by both decode and encode
    +vorbis_block_clear()
    +vorbis_block_init()
    +vorbis_dsp_clear()
    +vorbis_granule_time()
    +vorbis_info_blocksize()
    +vorbis_info_clear()
    +vorbis_info_init()
    +vorbis_version_string()
    +
    +Decoding
    +vorbis_packet_blocksize()
    +vorbis_synthesis()
    +vorbis_synthesis_blockin()
    +vorbis_synthesis_halfrate()
    +vorbis_synthesis_halfrate_p()
    +vorbis_synthesis_headerin()
    +vorbis_synthesis_idheader()
    +vorbis_synthesis_init()
    +vorbis_synthesis_lapout()
    +vorbis_synthesis_pcmout()
    +vorbis_synthesis_read()
    +vorbis_synthesis_restart()
    +vorbis_synthesis_trackonly()
    +
    +Encoding
    +vorbis_analysis()
    +vorbis_analysis_blockout()
    +vorbis_analysis_buffer()
    +vorbis_analysis_headerout()
    +vorbis_analysis_init()
    +vorbis_analysis_wrote()
    +vorbis_bitrate_addblock()
    +vorbis_bitrate_flushpacket()
    +
    +Metadata
    +vorbis_comment_add()
    +vorbis_comment_add_tag()
    +vorbis_comment_clear()
    +vorbis_comment_init()
    +vorbis_comment_query()
    +vorbis_comment_query_count()
    +vorbis_commentheader_out()
    +
    +Return Codes
    + + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/return.html b/cs/3rd party/libvorbis/doc/libvorbis/return.html new file mode 100644 index 000000000..7a008d5c3 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/return.html @@ -0,0 +1,79 @@ + + + +libvorbis - Return Codes + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    Return Codes

    + +

    + +The following return codes are #defined in "vorbis/codec.h" and +may be returned by functions from libvorbis, libvorbisfile, and libvorbisenc. Descriptions of a code +relevant to a specific function are found in the reference description +of that function. + +

    + +
    OV_FALSE
    +
    Not true, or no data available
    + +
    OV_HOLE
    +
    Vorbisfile encoutered missing or corrupt data in the bitstream. Recovery +is normally automatic and this return code is for informational purposes only.
    + +
    OV_EREAD
    +
    Read error while fetching compressed data for decode
    + +
    OV_EFAULT
    +
    Internal inconsistency in encode or decode state. Continuing is likely not possible.
    + +
    OV_EIMPL
    +
    Feature not implemented
    + +
    OV_EINVAL
    +
    Either an invalid argument, or incompletely initialized argument passed to a call
    + +
    OV_ENOTVORBIS
    +
    The given file/data was not recognized as Ogg Vorbis data.
    + +
    OV_EBADHEADER
    +
    The file/data is apparently an Ogg Vorbis stream, but contains a corrupted or undecipherable header.
    + +
    OV_EVERSION
    +
    The bitstream format revision of the given stream is not supported.
    + +
    OV_EBADLINK
    +
    The given link exists in the Vorbis data stream, but is not decipherable due to garbacge or corruption.
    + +
    OV_ENOSEEK
    +
    The given stream is not seekable
    + +
    + +

    +
    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/style.css b/cs/3rd party/libvorbis/doc/libvorbis/style.css new file mode 100644 index 000000000..81cf41795 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/style.css @@ -0,0 +1,7 @@ +BODY { font-family: Helvetica, sans-serif } +TD { font-family: Helvetica, sans-serif } +P { font-family: Helvetica, sans-serif } +H1 { font-family: Helvetica, sans-serif } +H2 { font-family: Helvetica, sans-serif } +H4 { font-family: Helvetica, sans-serif } +P.tiny { font-size: 8pt } diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_analysis.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_analysis.html new file mode 100644 index 000000000..b126f2094 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_analysis.html @@ -0,0 +1,86 @@ + + + +libvorbis - function - vorbis_analysis + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_analysis

    + +

    declared in "vorbis/codec.h";

    + +

    Once the uncompressed audio data has been divided into blocks, this +function is called on each block. It looks up the encoding mode and +dispatches the block to the forward transform provided by that mode. +

    +

    When using a basic encoding mode, with no bitrate management, +an ogg_packet pointer can be given, and the coded block is returned +directly through that structure and can be placed in the output stream. +

    +

    Otherwise, NULL should be passed for the ogg_packet pointer. In +that case, after the transform has been applied, the block must passed +to vorbis_bitrate_addblock() for further coding. This method works with +both basic and managed encoding modes, so it's recommended for new code. +

    + + + + + +
    +
    
    +extern int      vorbis_analysis(vorbis_block *vb,ogg_packet *op);
    +
    +
    + +

    Parameters

    +
    +
    vb
    +
    Pointer to the vorbis_block to be encoded.
    +
    op
    +
    Optional pointer to an ogg_packet. This is normally NULL, +and the final output is obtained by passing vb though the +vorbis_bitrate_*() interface to perform further refinement. +However, when not using a bitrate managed encoding mode, it +is possible to skip that step by providing an ogg_packet pointer +here, obtaining the compressed data directly.
    +
    + + +

    Return Values

    +
      +
    • 0 for success
    • +
    • negative values for failure: +
        +
      • OV_EINVAL - Invalid request; a non-NULL value was passed for op when the encoder is using a bitrate managed mode.
      • +
      • OV_EFAULT - Internal fault; indicates a bug or memory corruption.
      • +
      • OV_EIMPL - Unimplemented; not supported by this version of the library.
      • +
      +
    • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_analysis_blockout.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_analysis_blockout.html new file mode 100644 index 000000000..94948b62e --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_analysis_blockout.html @@ -0,0 +1,79 @@ + + + +libvorbis - function - vorbis_analysis_blockout + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_analysis_blockout

    + +

    declared in "vorbis/codec.h";

    + +

    This fuction examines the available uncompressed data and tries to +break it into appropriate sized blocks. It should be called in a loop +after adding new data with vorbis_analysis_buffer()/vorbis_analysis_wrote() +until it returns zero (need more data) or an negative value (error). +

    +

    +Each block returned should be passed to vorbis_analysis() for transform +and coding. +

    + + + + + +
    +
    
    +extern int      vorbis_analysis_blockout(vorbis_dsp_state *v,vorbis_block *vb);
    +
    +
    + +

    Parameters

    +
    +
    v
    +
    Pointer to the vorbis_dsp_state representing the encoder.
    +
    vb
    +
    Pointer to a previously initialized vorbis_block object to hold the +returned data. +
    + + +

    Return Values

    +
      +
    • 1 for success when more blocks are available.
    • +
    • 0 for success when this is the last block available from the current input.
    • +
    • negative values for failure: +
        +
      • OV_EINVAL - Invalid parameters.
      • +
      • OV_EFAULT - Internal fault; indicates a bug or memory corruption.
      • +
      • OV_EIMPL - Unimplemented; not supported by this version of the library.
      • +
      +
    • + +
    + +

    +
    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_analysis_buffer.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_analysis_buffer.html new file mode 100644 index 000000000..cf6ae8086 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_analysis_buffer.html @@ -0,0 +1,74 @@ + + + +libvorbis - function - vorbis_analysis_buffer + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_analysis_buffer

    + +

    declared in "vorbis/codec.h";

    + +

    This fuction requests a buffer array for delivering audio to the +encoder for compression.

    + +

    The Vorbis encoder expects the caller to write audio data as +non-interleaved floating point samples into its internal buffers. +

    +

    +The general procedure is to call this function with the number of samples +you have available. The encoder will arrange for that much internal storage +and return an array of buffer pointers, one for each channel of audio. +The caller must then write the audio samples into those buffers, as +float values, and finally call vorbis_analysis_wrote() to tell the +encoder the data is available for analysis. +

    + + + + + +
    +
    
    +extern float  **vorbis_analysis_buffer(vorbis_dsp_state *v,int vals);
    +
    +
    + +

    Parameters

    +
    +
    v
    +
    Pointer to the vorbis_dsp_state representing the encoder.
    +
    vals
    +
    Number of samples to provide space for in the returned buffer. 1024 is a reasonable choice.
    +
    + + +

    Return Values

    +

    Returns an array of floating point buffers which can accept data. +A (**float) where the first index is the channel, and the second is +the sample index.

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_analysis_headerout.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_analysis_headerout.html new file mode 100644 index 000000000..58c37c317 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_analysis_headerout.html @@ -0,0 +1,83 @@ + + + +libvorbis - function - vorbis_analysis_headerout + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_analysis_headerout

    + +

    declared in "vorbis/codec.h";

    + +

    This function creates and returns the three header packets needed +to configure a decoder to accept compressed data. I should be called +after all encoder initialization and configuration is complete. The +output packets should be placed in order at the start of the compressed +vorbis stream, prior to the first data packet. +

    + + + + + +
    +
    
    +extern int      vorbis_analysis_headerout(vorbis_dsp_state *v,
    +                                          vorbis_comment *vc,
    +                                          ogg_packet *op,
    +                                          ogg_packet *op_comm,
    +                                          ogg_packet *op_code);
    +
    +
    + +

    Parameters

    +
    +
    v
    +
    Pointer to an initialized vorbis_dsp_state which holds the encoder configuration.
    +
    vc
    +
    Pointer to an initialized vorbis_comment structure which holds the metadata associated with the stream being encoded.
    +
    op
    +
    Pointer to an ogg_packet structure to be filled out with the stream identification header.
    +
    op_comm
    +
    Pointer to an ogg_packet structure to be filled out with the serialied vorbis_comment data.
    +
    op_code
    +
    Pointer to an ogg_packet structure to be filled out with the codebooks, mode descriptions, etc. which will be used encoding the stream.
    +
    + + +

    Return Values

    +
      +
    • 0 for success
    • +
    • negative values for failure: +
        +
      • OV_EFAULT - Internal fault; indicates a bug or memory corruption.
      • +
      • OV_EIMPL - Unimplemented; not supported by this version of the library.
      • +
      +
    • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_analysis_init.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_analysis_init.html new file mode 100644 index 000000000..8799338b0 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_analysis_init.html @@ -0,0 +1,66 @@ + + + +libvorbis - function - vorbis_analysis_init + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_analysis_init

    + +

    declared in "vorbis/codec.h";

    + +

    This function allocates and initializes the encoder's analysis state +inside a is vorbis_dsp_state, based on the configuration in a vorbis_info +struct. +

    + + + + + +
    +
    
    +extern int      vorbis_analysis_init(vorbis_dsp_state *v,vorbis_info *vi);
    +
    +
    + +

    Parameters

    +
    +
    v +
    Pointer to the vorbis_dsp_state structure to be initialized for encoding.
    +
    vi
    +
    Pointer to an initialized vorbis_info struct describing the encoder configuration.
    +
    + + +

    Return Values

    +
    +
  • +0 for success
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_analysis_wrote.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_analysis_wrote.html new file mode 100644 index 000000000..2326f60f7 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_analysis_wrote.html @@ -0,0 +1,80 @@ + + + +libvorbis - function - vorbis_analysis_wrote + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_analysis_wrote

    + +

    declared in "vorbis/codec.h";

    + +

    This function tells the encoder new data is available for compression. +Call this after writing new audio into the buffer array returned by +vorbis_analysis_buffer(). +

    + +

    +Call with the vals parameter set to zero to signal the end +of the input data. +

    + + + + + +
    +
    
    +extern int      vorbis_analysis_wrote(vorbis_dsp_state *v,int vals);
    +
    +
    + +

    Parameters

    +
    +
    v
    +
    Pointer to the vorbis_dsp_state representing the encoder.
    +
    vals
    +
    Number of samples successfully written. This must be less than +or equal to the value passed to vorbis_analysis_buffer(). A value +of zero means all input data has been provided and the compressed +stream should be finalized.
    +
    + + +

    Return Values

    +
      +
    • 0 for success
    • +
    • negative values for failure: +
        +
      • OV_EINVAL - Invalid request; e.g. vals overflows the allocated space.
      • +
      • OV_EFAULT - Internal fault; indicates a bug or memory corruption.
      • +
      • OV_EIMPL - Unimplemented; not supported by this version of the library.
      • +
      +
    • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_bitrate_addblock.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_bitrate_addblock.html new file mode 100644 index 000000000..9de5de43e --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_bitrate_addblock.html @@ -0,0 +1,74 @@ + + + +libvorbis - function - vorbis_bitrate_addblock + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_bitrate_addblock

    + +

    declared in "vorbis/codec.h";

    + +

    This fuction submits a transformed block to the bitrate management +engine for final encoding. Packets are buffered and the packet boundaries +adjusted and padded to meet the target bitrate, if any.

    + +

    After calling vorbis_bitrate_addblock(), the passed vorbis_block +structure can be reused in another call to vorbis_analysis_blockout(). +Call vorbis_bitrate_flushpacket() to obtain the final compressed data. +

    + + + + + +
    +
    
    +extern int      vorbis_bitrate_addblock(vorbis_block *vb);
    +
    +
    + +

    Parameters

    +
    +
    vb
    +
    Pointer to the vorbis_block to be submitted.
    +
    + + +

    Return Values

    +
      +
    • 0 for success.
    • +
    • negative values for failure: +
        +
      • OV_EINVAL - Invalid parameters.
      • +
      • OV_EFAULT - Internal fault; indicates a bug or memory corruption.
      • +
      • OV_EIMPL - Unimplemented; not supported by this version of the library.
      • +
      +
    • + +
    + +

    +
    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_bitrate_flushpacket.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_bitrate_flushpacket.html new file mode 100644 index 000000000..297abb0bc --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_bitrate_flushpacket.html @@ -0,0 +1,80 @@ + + + +libvorbis - function - vorbis_bitrate_flushpacket + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_bitrate_flushpacket

    + +

    declared in "vorbis/codec.h";

    + +

    This function returns the next available completed packet from the +bitrate management engine. It should be called in a loop after any call +to vorbis_bitrate_addblock() until it returns either 0 (more data needed) +or a negative value (error). +

    + +

    +The data returned in the ogg_packet structure can be copied to the +final compressed output stream. +

    + + + + + +
    +
    
    +extern int      vorbis_bitrate_flushpacket(vorbis_dsp_state *vd,
    +                                           ogg_packet *op);
    +
    +
    + +

    Parameters

    +
    +
    vd
    +
    Pointer to the vorbis_dsp_state represending the encoder.
    +
    op
    +
    Pointer to an ogg_packet to be filled out with the compressed data.
    +
    + + +

    Return Values

    +
      +
    • 1 for success when more packets are available. +
    • 0 for success when this is the last packet available from the current input.
    • +
    • negative values for failure: +
        +
      • OV_EINVAL - Invalid parameters.
      • +
      • OV_EFAULT - Internal fault; indicates a bug or memory corruption.
      • +
      • OV_EIMPL - Unimplemented; not supported by this version of the library.
      • +
      +
    • + +
    + +

    +
    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_block.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_block.html new file mode 100644 index 000000000..9cd24c21e --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_block.html @@ -0,0 +1,60 @@ + + + +libvorbis - datatype - vorbis_block + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_block

    + +

    declared in "vorbis/codec.h"

    + +

    +The vorbis_block structure holds the data for a single block of audio. One +vorbis_block translates to one codec packet. The encoding process consists +of splitting the audio into blocks and encoding the blocks into packets; +decoding consists of decoding the packets into blocks and reassembling +the audio from the blocks. +

    +This structure is intended to be private. Although the fields are given +in the header file, they should not be directly modified or relied upon +in any way. +

    + + + + + +
    +
    typedef struct vorbis_block{
    +  /* private */
    +} vorbis_block;
    +
    + +

    Parameters

    +
    • None public.
    + + +

    +
    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_block_clear.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_block_clear.html new file mode 100644 index 000000000..13be5b626 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_block_clear.html @@ -0,0 +1,61 @@ + + + +libvorbis - function - vorbis_block_clear + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_block_clear

    + +

    declared in "vorbis/codec.h";

    + +

    This function frees the internal storage for a vorbis_block structure.

    + + + + + +
    +
    
    +extern int      vorbis_block_clear(vorbis_block *vb);
    +
    +
    + +

    Parameters

    +
    +
    vb
    +
    Pointer to a vorbis_block struct to be cleared.
    +
    + + +

    Return Values

    +
    +
  • +0 for success
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_block_init.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_block_init.html new file mode 100644 index 000000000..82f6ae8f5 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_block_init.html @@ -0,0 +1,66 @@ + + + +libvorbis - function - vorbis_block_init + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_block_init

    + +

    declared in "vorbis/codec.h";

    + +

    This function initializes a vorbis_block structure and allocates its +internal storage. A vorbis_block is used to represent a particular block +of input audio which can be analyzed and coded as a unit. +

    + + + + + +
    +
    
    +extern int      vorbis_block_init(vorbis_dsp_state *v, vorbis_block *vb);
    +
    +
    + +

    Parameters

    +
    +
    v +
    Pointer to an initialized vorbis_dsp_state with which to associate the new block.
    +
    vb
    +
    Pointer to a vorbis_block struct to be initialized.
    +
    + + +

    Return Values

    +
    +
  • +0 for success
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_comment.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_comment.html new file mode 100644 index 000000000..7afb7f327 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_comment.html @@ -0,0 +1,80 @@ + + + +libvorbis - datatype - vorbis_comment + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_comment

    + +

    declared in "vorbis/codec.h"

    + +

    +The vorbis_comment structure defines an Ogg Vorbis comment. +

    +Only the fields the program needs must be defined. If a field isn't +defined by the application, it will either be blank (if it's a string value) +or set to some reasonable default (usually 0). +

    +Note: When encoding, while it is supported to modify a +vorbis_comment structure directly, be sure to read the notes on the +vorbis_comment_init and +vorbis_comment_clear pages for +considerations on memory allocation and freeing before you do so. Rule of +thumb: call vorbis_comment_init, then either do all allocation, +freeing, and modification yourself and do not call +vorbis_comment_clear, or do all modification using libvorbis +functions and do call vorbis_comment_clear. +

    + + + + + +
    +
    typedef struct vorbis_comment{
    +  /* unlimited user comment fields. */
    +  char **user_comments;
    +  int  *comment_lengths;
    +  int  comments;
    +  char *vendor;
    +
    +} vorbis_comment;
    +
    + +

    Parameters

    +
    +
    user_comments
    +
    Unlimited user comment array. The individual strings in the array are 8 bit clean, by the Vorbis specification, and as such the comment_lengths array should be consulted to determine string length. For convenience, each string is also NULL-terminated by the decode library (although Vorbis comments are not NULL terminated within the bitstream itself).
    +
    comment_lengths
    +
    An int array that stores the length of each comment string
    +
    comments
    +
    Int signifying number of user comments in user_comments field.
    +
    vendor
    +
    Information about the Vorbis implementation that encoded the file. Stored in a standard C 0-terminated string. Libvorbis will fill this in itself when encoding a comment packet from this structure; when decoding, this contains the vendor string that was in the comment packet.
    +
    + + +

    +
    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_comment_add.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_comment_add.html new file mode 100644 index 000000000..b7125b04e --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_comment_add.html @@ -0,0 +1,70 @@ + + + +libvorbis - function - vorbis_comment_add + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_comment_add

    + +

    declared in "vorbis/codec.h";

    + +

    This function adds a raw comment string to a +vorbis_comment structure.

    + +

    This function should be used if the string is already in the +form "KEY=value". If you have a separate key and value, use +vorbis_comment_add_tag +instead.

    + + + + + +
    +
    
    +extern void     vorbis_comment_add(vorbis_comment *vc, const char *comment);
    +
    +
    + +

    Parameters

    +
    +
    vc
    +
    Pointer to a vorbis_comment structure to add the comment to.
    +
    comment
    +
    Pointer to the null-terminated raw comment string. The string will +be copied, so it can be freed or modified after this function returns +without affecting the vorbis_comment structure's contents.
    +
    + + +

    Return Values

    +
    +
  • None.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_comment_add_tag.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_comment_add_tag.html new file mode 100644 index 000000000..97565d35a --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_comment_add_tag.html @@ -0,0 +1,74 @@ + + + +libvorbis - function - vorbis_comment_add_tag + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_comment_add_tag

    + +

    declared in "vorbis/codec.h";

    + +

    This function adds a tag-comment pair to a +vorbis_comment structure. There can +be more than one comment value for the same tag; if a comment with the +same tag already exists, another comment with the same tag is added.

    + +

    If you already have a string in the form "KEY=value", see +vorbis_comment_add instead.

    + + + + + +
    +
    
    +extern void     vorbis_comment_add_tag(vorbis_comment *vc,
    +                                       const char *tag, const char *contents);
    +
    +
    + +

    Parameters

    +
    +
    vc
    +
    Pointer to a vorbis_comment structure to add the comment to.
    +
    tag
    +
    Pointer to the null-terminated tag string. The string will +be copied, so it can be freed or modified after this function returns +without affecting the vorbis_comment structure's contents.
    +
    contents
    +
    Pointer to the null-terminated comment contents string. This will +also be copied.
    +
    + + +

    Return Values

    +
    +
  • None.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_comment_clear.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_comment_clear.html new file mode 100644 index 000000000..0771d6ee0 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_comment_clear.html @@ -0,0 +1,69 @@ + + + +libvorbis - function - vorbis_comment_clear + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_comment_clear

    + +

    declared in "vorbis/codec.h";

    + +

    This function frees the internal storage associated with a vorbis_comment structure.

    + +

    Note: Be careful if you have modified the vorbis_comment +structure yourself, as libvorbis will try to use its own wrappers of +memory allocation functions to free the contents of the vorbis_comment +structure. This will not work correctly unless all arrays and comment +strings contained in the vorbis_comment structure were allocated by +libvorbis itself. This function is only guaranteed to be safe if all +modification to the vorbis_comment structure was done using libvorbis +functions.

    + + + + + +
    +
    
    +extern void     vorbis_comment_clear(vorbis_comment *vc);
    +
    +
    + +

    Parameters

    +
    +
    vc
    +
    The vorbis_comment structure to clear.
    +
    + + +

    Return Values

    +
    +
  • None.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_comment_init.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_comment_init.html new file mode 100644 index 000000000..abce0a6ac --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_comment_init.html @@ -0,0 +1,72 @@ + + + +libvorbis - function - vorbis_comment_init + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_comment_init

    + +

    declared in "vorbis/codec.h";

    + +

    This function initializes a vorbis_comment +structure for use. After calling this function, the vorbis_comment +structure contains no comments.

    + +

    Note: No internal storage is allocated by this function; +internal storage is allocated as needed by other libvorbis functions that +modify the vorbis_comment structure. If you modify the vorbis_comment +structure directly, without using libvorbis, you should not +call vorbis_comment_clear when +you are finished but instead clean up after it yourself. See the note +on the vorbis_comment_clear +page for more information.

    + + + + + +
    +
    
    +extern void     vorbis_comment_init(vorbis_comment *vc);
    +
    +
    + +

    Parameters

    +
    +
    vc
    +
    Pointer to the vorbis_comment +structure to initialize.
    +
    + + +

    Return Values

    +
    +
  • None.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_comment_query.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_comment_query.html new file mode 100644 index 000000000..f958ebb60 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_comment_query.html @@ -0,0 +1,72 @@ + + + +libvorbis - function - vorbis_comment_query + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_comment_query

    + +

    declared in "vorbis/codec.h";

    + +

    This function retrieves a comment string for a given tag in a +vorbis_comment structure.

    + + + + + +
    +
    
    +extern char    *vorbis_comment_query(vorbis_comment *vc, const char *tag, int count);
    +
    +
    + +

    Parameters

    +
    +
    vc
    +
    Pointer to the vorbis_comment structure.
    +
    tag
    +
    Pointer to a null-terminated string of the comment tag to look +for. Tags are compared case-insensitively.
    +
    count
    +
    The index of the comment string to retrieve. A value of 0 indicates +the first comment whose tag matches tag. Use +vorbis_comment_query_count +to determine the number of matching comments.
    +
    + + +

    Return Values

    +
    +
  • A pointer to the comment string. The underlying buffer is owned by +the vorbis_comment structure.
  • +
  • NULL on a nonexistent tag or if count is greater than or +equal to the number of matching comments.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_comment_query_count.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_comment_query_count.html new file mode 100644 index 000000000..e8a04f462 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_comment_query_count.html @@ -0,0 +1,66 @@ + + + +libvorbis - function - vorbis_comment_query_count + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_comment_query_count

    + +

    declared in "vorbis/codec.h";

    + +

    This function determines the number of comments with a given tag +that are present in a vorbis_comment +structure.

    + + + + + +
    +
    
    +extern int      vorbis_comment_query_count(vorbis_comment *vc, const char *tag);
    +
    +
    + +

    Parameters

    +
    +
    vc
    +
    Pointer to the vorbis_comment structure.
    +
    tag
    +
    Pointer to a null-terminated string of the comment tag to look +for. Tags are compared case-insensitively.
    +
    + + +

    Return Values

    +
    +
  • The number of comments present with the given tag.
  • +
  • 0 if no such comments are present.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_commentheader_out.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_commentheader_out.html new file mode 100644 index 000000000..0dd63d632 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_commentheader_out.html @@ -0,0 +1,65 @@ + + + +libvorbis - function - vorbis_commentheader_out + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_commentheader_out

    + +

    declared in "vorbis/codec.h";

    + +

    This function encodes the contents of a +vorbis_comment structure into an +ogg_packet.

    + + + + + +
    +
    
    +extern int      vorbis_commentheader_out(vorbis_comment *vc, ogg_packet *op);
    +
    +
    + +

    Parameters

    +
    +
    vc
    +
    The vorbis_comment structure to encode.
    +
    op
    +
    The ogg_packet to place the encoded comment packet into.
    +
    + + +

    Return Values

    +
    +
  • 0 on success.
  • +
  • OV_EIMPL on error.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_dsp_clear.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_dsp_clear.html new file mode 100644 index 000000000..0a9b959ce --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_dsp_clear.html @@ -0,0 +1,63 @@ + + + +libvorbis - function - vorbis_dsp_clear + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_dsp_clear

    + +

    declared in "vorbis/codec.h";

    + +

    This function frees the internal storage for a vorbis_dsp_state +structure. This can be used independent of whether the vorbis_dsp_state +is set up for analysis (encoding) or synthesis (decoding).

    + + + + + +
    +
    
    +extern void     vorbis_dsp_clear(vorbis_dsp_state *v);
    +
    +
    + +

    Parameters

    +
    +
    v
    +
    Pointer to the vorbis_dsp_state to be cleared.
    +
    + + +

    Return Values

    +
    +
  • +None
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_dsp_state.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_dsp_state.html new file mode 100644 index 000000000..b8baf9cdc --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_dsp_state.html @@ -0,0 +1,57 @@ + + + +libvorbis - datatype - vorbis_dsp_state + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_dsp_state

    + +

    declared in "vorbis/codec.h"

    + +

    +The vorbis_dsp_state structure is the state for one instance of the +Vorbis encoder or decoder. +

    +This structure is intended to be private. Although the fields are given +in the header file, they should not be directly modified or relied upon +in any way. +

    + + + + + +
    +
    typedef struct vorbis_dsp_state{
    +  /* private */
    +} vorbis_dsp_state;
    +
    + +

    Parameters

    +
    • None public.
    + + +

    +
    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_granule_time.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_granule_time.html new file mode 100644 index 000000000..f5c8b7f48 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_granule_time.html @@ -0,0 +1,65 @@ + + + +libvorbis - function - vorbis_granule_time + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_granule_time

    + +

    declared in "vorbis/codec.h";

    + +

    This function converts a granule position to a time for a given Vorbis stream.

    + + + + + +
    +
    
    +extern double   vorbis_granule_time(vorbis_dsp_state *v,
    +                                    ogg_int64_t granulepos);
    +
    +
    + +

    Parameters

    +
    +
    v
    +
    Pointer to the vorbis_dsp_state for the stream.
    +
    granulepos
    +
    The granule position.
    +
    + + +

    Return Values

    +
    +
  • +The time (in seconds) corresponding to the granulepos.
  • +
  • -1 if the given granulepos is negative
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_info.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_info.html new file mode 100644 index 000000000..2a06c0648 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_info.html @@ -0,0 +1,80 @@ + + + +libvorbis - datatype - vorbis_info + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_info

    + +

    declared in "vorbis/codec.h"

    + +

    +The vorbis_info structure contains basic information about the audio in a vorbis bitstream. +

    + + + + + +
    +
    typedef struct vorbis_info{
    +  int version;
    +  int channels;
    +  long rate;
    +  
    +  long bitrate_upper;
    +  long bitrate_nominal;
    +  long bitrate_lower;
    +  long bitrate_window;
    +
    +  void *codec_setup;
    +
    +} vorbis_info;
    +
    + +

    Relevant Struct Members

    +
    +
    version
    +
    Vorbis encoder version used to create this bitstream.
    +
    channels
    +
    Int signifying number of channels in bitstream.
    +
    rate
    +
    Sampling rate of the bitstream.
    +
    bitrate_upper
    +
    Specifies the upper limit in a VBR bitstream. If the value matches the bitrate_nominal and bitrate_lower parameters, the stream is fixed bitrate. May be unset if no limit exists.
    +
    bitrate_nominal
    +
    Specifies the average bitrate for a VBR bitstream. May be unset. If the bitrate_upper and bitrate_lower parameters match, the stream is fixed bitrate.
    +
    bitrate_lower
    +
    Specifies the lower limit in a VBR bitstream. If the value matches the bitrate_nominal and bitrate_upper parameters, the stream is fixed bitrate. May be unset if no limit exists.
    +
    bitrate_window
    +
    Currently unset.
    + +
    codec_setup
    +
    Internal structure that contains the detailed/unpacked configuration for decoding the current Vorbis bitstream.
    +
    + + +

    +
    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_info_blocksize.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_info_blocksize.html new file mode 100644 index 000000000..f256d2485 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_info_blocksize.html @@ -0,0 +1,66 @@ + + + +libvorbis - function - vorbis_info_blocksize + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_info_blocksize

    + +

    declared in "vorbis/codec.h";

    + +

    This function gets the possible sizes for encoded blocks. There +are short blocks (zo = 0) and long blocks (zo = 1). The size of a long +block is guaranteed to be greater than or equal to the size of a short +block.

    + + + + + +
    +
    
    +extern int      vorbis_info_blocksize(vorbis_info *vi,int zo);
    +
    +
    + +

    Parameters

    +
    +
    vi
    +
    Pointer to the vorbis_info struct.
    +
    zo
    +
    Integer for which block size to get: 0 for short and 1 for long
    +
    + + +

    Return Values

    +
    +
  • A positive integer for the block size.
  • +
  • -1 on error.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_info_clear.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_info_clear.html new file mode 100644 index 000000000..907be6f23 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_info_clear.html @@ -0,0 +1,61 @@ + + + +libvorbis - function - vorbis_info_clear + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_info_clear

    + +

    declared in "vorbis/codec.h";

    + +

    This function frees the internal storage for a vorbis_info structure.

    + + + + + +
    +
    
    +extern void     vorbis_info_clear(vorbis_info *vi);
    +
    +
    + +

    Parameters

    +
    +
    vi
    +
    Pointer to a vorbis_info struct to be cleared.
    +
    + + +

    Return Values

    +
    +
  • +None.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_info_init.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_info_init.html new file mode 100644 index 000000000..a0e58fb22 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_info_init.html @@ -0,0 +1,62 @@ + + + +libvorbis - function - vorbis_info_init + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_info_init

    + +

    declared in "vorbis/codec.h";

    + +

    This function initializes a vorbis_info +structure and allocates its internal storage.

    + + + + + +
    +
    
    +extern void     vorbis_info_init(vorbis_info *vi);
    +
    +
    + +

    Parameters

    +
    +
    vi
    +
    Pointer to a vorbis_info struct to be initialized.
    +
    + + +

    Return Values

    +
    +
  • +None.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_packet_blocksize.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_packet_blocksize.html new file mode 100644 index 000000000..827e03f87 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_packet_blocksize.html @@ -0,0 +1,66 @@ + + + +libvorbis - function - vorbis_packet_blocksize + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_packet_blocksize

    + +

    declared in "vorbis/codec.h";

    + +

    This function gets the size of the block that would result from +decoding a Vorbis packet but does not actually decode the packet.

    + + + + + +
    +
    
    +extern long     vorbis_packet_blocksize(vorbis_info *vi,ogg_packet *op);
    +
    +
    + +

    Parameters

    +
    +
    vi
    +
    The vorbis_info structure for the +stream the packet is from.
    +
    op
    +
    The packet to get the block size of.
    +
    + + +

    Return Values

    +
    +
  • The block size on success.
  • +
  • OV_ENOTAUDIO if the packet is not an audio packet.
  • +
  • OV_EBADPACKET if there was an error in the packet.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis.html new file mode 100644 index 000000000..38ac4ede6 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis.html @@ -0,0 +1,70 @@ + + + +libvorbis - function - vorbis_synthesis + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_synthesis

    + +

    declared in "vorbis/codec.h";

    + +

    This function decodes a Vorbis packet into a block of data. The +vorbis_block should then be submitted +to the vorbis_dsp_state +for the decoder instance using +vorbis_synthesis_blockin +to be assembled into the final decoded audio.

    + + + + + +
    +
    
    +extern int      vorbis_synthesis(vorbis_block *vb,ogg_packet *op);
    +
    +
    + +

    Parameters

    +
    +
    vb
    +
    The vorbis_block to decode the +packet into.
    +
    op
    +
    The ogg_packet to decode.
    +
    + + +

    Return Values

    +
    +
  • 0 on success.
  • +
  • OV_ENOTAUDIO if the packet is not an audio packet.
  • +
  • OV_EBADPACKET if there was an error in the packet.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_blockin.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_blockin.html new file mode 100644 index 000000000..d12fd2a6f --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_blockin.html @@ -0,0 +1,69 @@ + + + +libvorbis - function - vorbis_synthesis_blockin + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_synthesis_blockin

    + +

    declared in "vorbis/codec.h";

    + +

    This function submits a vorbis_block +for assembly into the final decoded audio. After calling +this function, decoded audio can be obtained with +vorbis_synthesis_pcmout.

    + + + + + +
    +
    
    +extern int      vorbis_synthesis_blockin(vorbis_dsp_state *v,vorbis_block *vb);
    +
    +
    + +

    Parameters

    +
    +
    v
    +
    The vorbis_dsp_state for the +decoder instance.
    +
    vb
    +
    The vorbis_block to submit. After +this function returns, it can be reused in another call to +vorbis_synthesis.
    +
    + + +

    Return Values

    +
    +
  • 0 on success.
  • +
  • OV_EINVAL if the decoder is in an invalid state to accept blocks.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_halfrate.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_halfrate.html new file mode 100644 index 000000000..fefe8d354 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_halfrate.html @@ -0,0 +1,68 @@ + + + +libvorbis - function - vorbis_synthesis_halfrate + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_synthesis_halfrate

    + +

    declared in "vorbis/codec.h";

    + +

    This function puts the Vorbis decoder into or out of half-rate +mode. In half-rate mode, the audio is decoded to only half its original +sampling rate. Half-rate mode speeds up decoding at the expense of +decoded audio quality.

    + + + + + +
    +
    
    +extern int      vorbis_synthesis_halfrate(vorbis_info *v,int flag);
    +
    +
    + +

    Parameters

    +
    +
    v
    +
    The vorbis_info structure for the +decoder instance.
    +
    flag
    +
    Whether half-rate mode is to be turned on or off. Zero turns it off; +nonzero turns it on.
    +
    + + +

    Return Values

    +
    +
  • 0 on success.
  • +
  • -1 if half-rate mode could not be set.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_halfrate_p.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_halfrate_p.html new file mode 100644 index 000000000..d82880e54 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_halfrate_p.html @@ -0,0 +1,64 @@ + + + +libvorbis - function - vorbis_synthesis_halfrate_p + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_synthesis_halfrate_p

    + +

    declared in "vorbis/codec.h";

    + +

    This function gets whether a decoder is in half-rate mode. See +vorbis_synthesis_halfrate +for more information on half-rate mode.

    + + + + + +
    +
    
    +extern int      vorbis_synthesis_halfrate_p(vorbis_info *v);
    +
    +
    + +

    Parameters

    +
    +
    v
    +
    The vorbis_info structure for the +decoder instance.
    +
    + + +

    Return Values

    +
    +
  • 1 if half-rate mode is on.
  • +
  • 0 if half-rate mode is off.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_headerin.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_headerin.html new file mode 100644 index 000000000..835d8ce17 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_headerin.html @@ -0,0 +1,80 @@ + + + +libvorbis - function - vorbis_synthesis_headerin + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_synthesis_headerin

    + +

    declared in "vorbis/codec.h";

    + +

    This function decodes a header packet from a Vorbis stream and applies +the contents to the given vorbis_info +structure (to provide codec parameters to the decoder) and +vorbis_comment structure (to provide +access to the embedded Vorbis comments).

    + +

    Once the three Vorbis header packets (info, comments, +and codebooks, in that order) have been passed to this +function, the vorbis_info +structure is ready to be used in a call to +vorbis_synthesis_init.

    + + + + + +
    +
    
    +extern int      vorbis_synthesis_headerin(vorbis_info *vi,vorbis_comment *vc,
    +                                          ogg_packet *op);
    +
    +
    + +

    Parameters

    +
    +
    vi
    +
    The vorbis_info structure to apply +the decoded information to.
    +
    vc
    +
    The vorbis_comment structure to +apply the decoded comments to.
    +
    op
    +
    The ogg_packet to decode.
    +
    + + +

    Return Values

    +
    +
  • 0 on success.
  • +
  • OV_ENOTVORBIS if the packet is not a Vorbis header packet.
  • +
  • OV_EBADHEADER if there was an error interpreting the packet.
  • +
  • OV_EFAULT on internal error.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_idheader.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_idheader.html new file mode 100644 index 000000000..7fe99e945 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_idheader.html @@ -0,0 +1,63 @@ + + + +libvorbis - function - vorbis_synthesis_idheader + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_synthesis_idheader

    + +

    declared in "vorbis/codec.h";

    + +

    This function checks whether a packet is a valid Vorbis identification +header packet. This function can be used to detect whether a logical +Ogg stream could be a Vorbis stream, given its very first packet.

    + + + + + +
    +
    
    +extern int      vorbis_synthesis_idheader(ogg_packet *op);
    +
    +
    + +

    Parameters

    +
    +
    op
    +
    Pointer to the ogg_packet to check.
    +
    + + +

    Return Values

    +
    +
  • 1 if the packet is a valid first packet for a Vorbis bitstream.
  • +
  • 0 if not.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_init.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_init.html new file mode 100644 index 000000000..64f06b918 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_init.html @@ -0,0 +1,69 @@ + + + +libvorbis - function - vorbis_synthesis_init + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_synthesis_init

    + +

    declared in "vorbis/codec.h";

    + +

    This function initializes a +vorbis_dsp_state structure for +decoding and allocates internal storage for it.

    + + + + + +
    +
    
    +extern int      vorbis_synthesis_init(vorbis_dsp_state *v,vorbis_info *vi);
    +
    +
    + +

    Parameters

    +
    +
    v
    +
    The vorbis_dsp_state to initialize +for decoding.
    +
    vi
    +
    The vorbis_info structure +for the stream. The vorbis_info structure must have had vorbis_synthesis_headerin +called on it for each header packet in the stream.
    +
    + + +

    Return Values

    +
    +
  • 0 on success.
  • +
  • 1 on error.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_lapout.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_lapout.html new file mode 100644 index 000000000..7fcdf0639 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_lapout.html @@ -0,0 +1,74 @@ + + + +libvorbis - function - vorbis_synthesis_lapout + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_synthesis_lapout

    + +

    declared in "vorbis/codec.h";

    + +

    This function retrieves buffers containing decoded audio samples, similarly +to vorbis_synthesis_pcmout. +However, it includes some extra samples extrapolated from the end of +the audio, suitable for crosslapping with other blocks. This exists mainly +for libvorbisfile to use for +handling chained bitstreams and bitstreams with holes.

    + + + + + +
    +
    
    +extern int      vorbis_synthesis_lapout(vorbis_dsp_state *v,float ***pcm);
    +
    +
    + +

    Parameters

    +
    +
    v
    +
    The vorbis_dsp_state for the +decoder instance.
    +
    pcm
    +
    A pointer to a float** which will be made to point to an array of +pointers to the decoded samples for each channel. The memory is owned +by the decoder instance and will be freed when the application continues +decoding or destroys the decoder instance. This can be NULL, in which +case the return value gives the number of samples that would be returned +if this function were called with a non-NULL pointer here.
    +
    + + +

    Return Values

    +
    +
  • The number of samples available in the output buffer.
  • +
  • 0 if no more samples are currently available.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_pcmout.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_pcmout.html new file mode 100644 index 000000000..0283d88c6 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_pcmout.html @@ -0,0 +1,75 @@ + + + +libvorbis - function - vorbis_synthesis_pcmout + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_synthesis_pcmout

    + +

    declared in "vorbis/codec.h";

    + +

    This function retrieves buffers containing decoded audio samples.

    +

    The application is not required to make use of all of the samples +made available to it by one call to this function before it continues to +decode. Use vorbis_synthesis_read +to inform the decoder of how many samples were actually used. Any +unused samples will be included in the buffers output by the next call +to this function.

    + + + + + +
    +
    
    +extern int      vorbis_synthesis_pcmout(vorbis_dsp_state *v,float ***pcm);
    +
    +
    + +

    Parameters

    +
    +
    v
    +
    The vorbis_dsp_state for the +decoder instance.
    +
    pcm
    +
    A pointer to a float** which will be made to point to an array of +pointers to the decoded samples for each channel. The memory is owned +by the decoder instance and will be freed when the application continues +decoding or destroys the decoder instance. This can be NULL, in which +case the return value gives the number of samples that would be returned +if this function were called with a non-NULL pointer here.
    +
    + + +

    Return Values

    +
    +
  • The number of samples available in the output buffer.
  • +
  • 0 if no more samples are currently available.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_read.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_read.html new file mode 100644 index 000000000..4972a85d1 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_read.html @@ -0,0 +1,67 @@ + + + +libvorbis - function - vorbis_synthesis_read + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_synthesis_read

    + +

    declared in "vorbis/codec.h";

    + +

    This function informs the Vorbis decoder of how many +samples the application used from the last buffer output by +vorbis_synthesis_pcmout.

    + + + + + +
    +
    
    +extern int      vorbis_synthesis_read(vorbis_dsp_state *v,int samples);
    +
    +
    + +

    Parameters

    +
    +
    v
    +
    The vorbis_dsp_state for the +decoder instance.
    +
    samples
    +
    The number of samples the application has used.
    +
    + + +

    Return Values

    +
    +
  • 0 on success.
  • +
  • OV_EINVAL if samples is greater than the number of remaining +samples in the buffer.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_restart.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_restart.html new file mode 100644 index 000000000..c02385e5a --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_restart.html @@ -0,0 +1,64 @@ + + + +libvorbis - function - vorbis_synthesis_restart + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_synthesis_restart

    + +

    declared in "vorbis/codec.h";

    + +

    This function restores a +vorbis_dsp_state structure +representing a decoder to its freshly-initialized state. This should be +called if the application seeks within a Vorbis bitstream.

    + + + + + +
    +
    
    +extern int      vorbis_synthesis_restart(vorbis_dsp_state *v);
    +
    +
    + +

    Parameters

    +
    +
    v
    +
    The vorbis_dsp_state to reset.
    +
    + + +

    Return Values

    +
    +
  • 0 on success.
  • +
  • -1 on error.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_trackonly.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_trackonly.html new file mode 100644 index 000000000..dd3e685a5 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_synthesis_trackonly.html @@ -0,0 +1,71 @@ + + + +libvorbis - function - vorbis_synthesis_trackonly + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_synthesis_trackonly

    + +

    declared in "vorbis/codec.h";

    + +

    This function decodes a Vorbis packet similarly to +vorbis_synthesis, except that the +vorbis_block produced does not contain +any audio data but merely updates the decoder's state as though the +block had been actually decoded when +vorbis_synthesis_blockin +is called on it.

    + + + + + +
    +
    
    +extern int      vorbis_synthesis_trackonly(vorbis_block *vb,ogg_packet *op);
    +
    +
    + +

    Parameters

    +
    +
    vb
    +
    The vorbis_block to decode the +packet into.
    +
    op
    +
    The ogg_packet to decode.
    +
    + + +

    Return Values

    +
    +
  • 0 on success.
  • +
  • OV_ENOTAUDIO if the packet is not an audio packet.
  • +
  • OV_EBADPACKET if there was an error in the packet.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/libvorbis/vorbis_version_string.html b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_version_string.html new file mode 100644 index 000000000..e85f23e44 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/libvorbis/vorbis_version_string.html @@ -0,0 +1,56 @@ + + + +libvorbis - function - vorbis_version_string + + + + + + + + + +

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + +

    vorbis_version_string

    + +

    declared in "vorbis/codec.h";

    + +

    This function returns a string giving version information for libvorbis. (This is not the same string that libvorbis encodes into the vendor field of comment headers.)

    + + + + + +
    +
    
    +extern const char *vorbis_version_string(void);
    +
    +
    + +

    Parameters

    +

    None.

    + +

    Return Values

    +
    +
  • The libvorbis version string. The string is in static storage.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2010 Xiph.Org

    Ogg Vorbis

    libvorbis documentation

    libvorbis version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/oggstream.html b/cs/3rd party/libvorbis/doc/oggstream.html new file mode 100644 index 000000000..6952ed9f3 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/oggstream.html @@ -0,0 +1,234 @@ + + + + + +Ogg Vorbis Documentation + + + + + + + + + +

    Ogg logical and physical bitstream overview

    + +

    Ogg bitstreams

    + +

    Ogg codecs use octet vectors of raw, compressed data +(packets). These compressed packets do not have any +high-level structure or boundary information; strung together, they +appear to be streams of random bytes with no landmarks.

    + +

    Raw packets may be used directly by transport mechanisms that provide +their own framing and packet-separation mechanisms (such as UDP +datagrams). For stream based storage (such as files) and transport +(such as TCP streams or pipes), Vorbis and other future Ogg codecs use +the Ogg bitstream format to provide framing/sync, sync recapture +after error, landmarks during seeking, and enough information to +properly separate data back into packets at the original packet +boundaries without relying on decoding to find packet boundaries.

    + +

    Logical and physical bitstreams

    + +

    Raw packets are grouped and encoded into contiguous pages of +structured bitstream data called logical bitstreams. A +logical bitstream consists of pages, in order, belonging to a single +codec instance. Each page is a self contained entity (although it is +possible that a packet may be split and encoded across one or more +pages); that is, the page decode mechanism is designed to recognize, +verify and handle single pages at a time from the overall bitstream.

    + +

    Multiple logical bitstreams can be combined (with restrictions) into a +single physical bitstream. A physical bitstream consists of +multiple logical bitstreams multiplexed at the page level and may +include a 'meta-header' at the beginning of the multiplexed logical +stream that serves as identification magic. Whole pages are taken in +order from multiple logical bitstreams and combined into a single +physical stream of pages. The decoder reconstructs the original +logical bitstreams from the physical bitstream by taking the pages in +order from the physical bitstream and redirecting them into the +appropriate logical decoding entity. The simplest physical bitstream +is a single, unmultiplexed logical bitstream with no meta-header; this +is referred to as a 'degenerate stream'.

    + +

    Ogg Logical Bitstream Framing discusses +the page format of an Ogg bitstream, the packet coding process +and logical bitstreams in detail. The remainder of this document +specifies requirements for constructing finished, physical Ogg +bitstreams.

    + +

    Mapping Restrictions

    + +

    Logical bitstreams may not be mapped/multiplexed into physical +bitstreams without restriction. Here we discuss design restrictions +on Ogg physical bitstreams in general, mostly to introduce +design rationale. Each 'media' format defines its own (generally more +restrictive) mapping. An 'Ogg Vorbis Audio Bitstream', for example, has a +specific physical bitstream structure. +An 'Ogg A/V' bitstream (not currently specified) will also mandate a +specific, restricted physical bitstream format.

    + +

    additional end-to-end structure

    + +

    The framing specification defines +'beginning of stream' and 'end of stream' page markers via a header +flag (it is possible for a stream to consist of a single page). A +stream always consists of an integer number of pages, an easy +requirement given the variable size nature of pages.

    + +

    In addition to the header flag marking the first and last pages of a +logical bitstream, the first page of an Ogg bitstream obeys +additional restrictions. Each individual media mapping specifies its +own implementation details regarding these restrictions.

    + +

    The first page of a logical Ogg bitstream consists of a single, +small 'initial header' packet that includes sufficient information to +identify the exact CODEC type and media requirements of the logical +bitstream. The intent of this restriction is to simplify identifying +the bitstream type and content; for a given media type (or across all +Ogg media types) we can know that we only need a small, fixed +amount of data to uniquely identify the bitstream type.

    + +

    As an example, Ogg Vorbis places the name and revision of the Vorbis +CODEC, the audio rate and the audio quality into this initial header, +thus simplifying vastly the certain identification of an Ogg Vorbis +audio bitstream.

    + +

    sequential multiplexing (chaining)

    + +

    The simplest form of logical bitstream multiplexing is concatenation +(chaining). Complete logical bitstreams are strung +one-after-another in order. The bitstreams do not overlap; the final +page of a given logical bitstream is immediately followed by the +initial page of the next. Chaining is the only logical->physical +mapping allowed by Ogg Vorbis.

    + +

    Each chained logical bitstream must have a unique serial number within +the scope of the physical bitstream.

    + +

    concurrent multiplexing (grouping)

    + +

    Logical bitstreams may also be multiplexed 'in parallel' +(grouped). An example of grouping would be to allow +streaming of separate audio and video streams, using different codecs +and different logical bitstreams, in the same physical bitstream. +Whole pages from multiple logical bitstreams are mixed together.

    + +

    The initial pages of each logical bitstream must appear first; the +media mapping specifies the order of the initial pages. For example, +Ogg A/V will eventually specify an Ogg video bitstream with +audio. The mapping may specify that the physical bitstream must begin +with the initial page of a logical video bitstream, followed by the +initial page of an audio stream. Unlike initial pages, terminal pages +for the logical bitstreams need not all occur contiguously (although a +specific media mapping may require this; it is not mandated by the +generic Ogg stream spec). Terminal pages may be 'nil' pages, +that is, pages containing no content but simply a page header with +position information and the 'last page of bitstream' flag set in the +page header.

    + +

    Each grouped bitstream must have a unique serial number within the +scope of the physical bitstream.

    + +

    sequential and concurrent multiplexing

    + +

    Groups of concurrently multiplexed bitstreams may be chained +consecutively. Such a physical bitstream obeys all the rules of both +grouped and chained multiplexed streams; the groups, when unchained , +must stand on their own as a valid concurrently multiplexed +bitstream.

    + +

    multiplexing example

    + +

    Below, we present an example of a grouped and chained bitstream:

    + +

    stream

    + +

    In this example, we see pages from five total logical bitstreams +multiplexed into a physical bitstream. Note the following +characteristics:

    + +
      +
    1. Grouped bitstreams begin together; all of the initial pages +must appear before any data pages. When concurrently multiplexed +groups are chained, the new group does not begin until all the +bitstreams in the previous group have terminated.
    2. + +
    3. The pages of concurrently multiplexed bitstreams need not conform +to a regular order; the only requirement is that page n of a +logical bitstream follow page n-1 in the physical bitstream. +There are no restrictions on intervening pages belonging to other +logical bitstreams. (Tying page appearance to bitrate demands is one +logical strategy, ie, the page appears at the chronological point +where decode requires more information).
    4. +
    + + + + + diff --git a/cs/3rd party/libvorbis/doc/programming.html b/cs/3rd party/libvorbis/doc/programming.html new file mode 100644 index 000000000..4b54347b1 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/programming.html @@ -0,0 +1,554 @@ + + + + + +Ogg Vorbis Documentation + + + + + + + + + +

    Programming with Xiph.Org libvorbis

    + +

    Description

    + +

    Libvorbis is the Xiph.Org Foundation's portable Ogg Vorbis CODEC +implemented as a programmatic library. Libvorbis provides primitives +to handle framing and manipulation of Ogg bitstreams (used by the +Vorbis for streaming), a full analysis (encoding) interface as well as +packet decoding and synthesis for playback.

    + +

    The libvorbis library does not provide any system interface; a +full-featured demonstration player included with the library +distribtion provides example code for a variety of system interfaces +as well as a working example of using libvorbis in production code.

    + +

    Encoding Overview

    + +

    Decoding Overview

    + +

    Decoding a bitstream with libvorbis follows roughly the following +steps:

    + +
      +
    1. Frame the incoming bitstream into pages
    2. +
    3. Sort the pages by logical bitstream and buffer then into logical streams
    4. +
    5. Decompose the logical streams into raw packets
    6. +
    7. Reconstruct segments of the original data from each packet
    8. +
    9. Glue the reconstructed segments back into a decoded stream
    10. +
    + +

    Framing

    + +

    An Ogg bitstream is logically arranged into pages, but to decode +the pages, we have to find them first. The raw bitstream is first fed +into an ogg_sync_state buffer using ogg_sync_buffer() +and ogg_sync_wrote(). After each block we submit to the sync +buffer, we should check to see if we can frame and extract a complete +page or pages using ogg_sync_pageout(). Extra pages are +buffered; allowing them to build up in the ogg_sync_state +buffer will eventually exhaust memory.

    + +

    The Ogg pages returned from ogg_sync_pageout need not be +decoded further to be used as landmarks in seeking; seeking can be +either a rough process of simply jumping to approximately intuited +portions of the bitstream, or it can be a precise bisection process +that captures pages and inspects data position. When seeking, +however, sequential multiplexing (chaining) must be accounted for; +beginning play in a new logical bitstream requires initializing a +synthesis engine with the headers from that bitstream. Vorbis +bitstreams do not make use of concurent multiplexing (grouping).

    + +

    Sorting

    + +

    The pages produced by ogg_sync_pageout are then sorted by +serial number to seperate logical bitstreams. Initialize logical +bitstream buffers (og_stream_state) using +ogg_stream_init(). Pages are submitted to the matching +logical bitstream buffer using ogg_stream_pagein; the serial +number of the page and the stream buffer must match, or the page will +be rejected. A page submitted out of sequence will simply be noted, +and in the course of outputting packets, the hole will be flagged +(ogg_sync_pageout and ogg_stream_packetout will +return a negative value at positions where they had to recapture the +stream).

    + +

    Extracting packets

    + +

    After submitting page[s] to a logical stream, read available packets +using ogg_stream_packetout.

    + +

    Decoding packets

    + +

    Reassembling data segments

    + +

    Ogg Bitstream Manipulation Structures

    + +

    Two of the Ogg bitstream data structures are intended to be +transparent to the developer; the fields should be used directly.

    + +

    ogg_packet

    + +
    +typedef struct {
    +  unsigned char *packet;
    +  long  bytes;
    +  long  b_o_s;
    +  long  e_o_s;
    +
    +  size64 granulepos;
    +
    +} ogg_packet;
    +
    + +
    +
    packet:
    +
    a pointer to the byte data of the raw packet
    +
    bytes:
    +
    the size of the packet' raw data
    +
    b_o_s:
    +
    beginning of stream; nonzero if this is the first packet of + the logical bitstream
    +
    e_o_s:
    +
    end of stream; nonzero if this is the last packet of the + logical bitstream
    +
    granulepos:
    +
    the absolute position of this packet in the original + uncompressed data stream.
    +
    + +

    encoding notes

    + +

    The encoder is responsible for setting all of +the fields of the packet to appropriate values before submission to +ogg_stream_packetin(); however, it is noted that the value in +b_o_s is ignored; the first page produced from a given +ogg_stream_state structure will be stamped as the initial +page. e_o_s, however, must be set; this is the means by +which the stream encoding primitives handle end of stream and cleanup.

    + +

    decoding notes

    + +

    ogg_stream_packetout() sets the fields +to appropriate values. Note that granulepos will be >= 0 only in the +case that the given packet actually represents that position (ie, only +the last packet completed on any page will have a meaningful +granulepos). Intervening frames will see granulepos set +to -1.

    + +

    ogg_page

    + +
    +typedef struct {
    +  unsigned char *header;
    +  long header_len;
    +  unsigned char *body;
    +  long body_len;
    +} ogg_page;
    +
    + +
    +
    header:
    +
    pointer to the page header data
    +
    header_len:
    +
    length of the page header in bytes
    +
    body:
    +
    pointer to the page body
    +
    body_len:
    +
    length of the page body
    +
    + +

    Note that although the header and body pointers do +not necessarily point into a single contiguous page vector, the page +body must immediately follow the header in the bitstream.

    + +

    Ogg Bitstream Manipulation Functions

    + +

    +int ogg_page_bos(ogg_page *og); +

    + +

    Returns the 'beginning of stream' flag for the given Ogg page. The +beginning of stream flag is set on the initial page of a logical +bitstream.

    + +

    Zero indicates the flag is cleared (this is not the initial page of a +logical bitstream). Nonzero indicates the flag is set (this is the +initial page of a logical bitstream).

    + +

    +int ogg_page_continued(ogg_page *og); +

    + +

    Returns the 'packet continued' flag for the given Ogg page. The packet +continued flag indicates whether or not the body data of this page +begins with packet continued from a preceeding page.

    + +

    Zero (unset) indicates that the body data begins with a new packet. +Nonzero (set) indicates that the first packet data on the page is a +continuation from the preceeding page.

    + +

    +int ogg_page_eos(ogg_page *og); +

    + +

    Returns the 'end of stream' flag for a give Ogg page. The end of page +flag is set on the last (terminal) page of a logical bitstream.

    + +

    Zero (unset) indicates that this is not the last page of a logical +bitstream. Nonzero (set) indicates that this is the last page of a +logical bitstream and that no addiitonal pages belonging to this +bitstream may follow.

    + +

    +size64 ogg_page_granulepos(ogg_page *og); +

    + +

    Returns the position of this page as an absolute position within the +original uncompressed data. The position, as returned, is 'frames +encoded to date up to and including the last whole packet on this +page'. Partial packets begun on this page but continued to the +following page are not included. If no packet ends on this page, the +frame position value will be equal to the frame position value of the +preceeding page. If none of the original uncompressed data is yet +represented in the logical bitstream (for example, the first page of a +bitstream consists only of a header packet; this packet encodes only +metadata), the value shall be zero.

    + +

    The units of the framenumber are determined by media mapping. A +vorbis audio bitstream, for example, defines one frame to be the +channel values from a single sampling period (eg, a 16 bit stereo +bitstream consists of two samples of two bytes for a total of four +bytes, thus a frame would be four bytes). A video stream defines one +frame to be a single frame of video.

    + +

    +int ogg_page_pageno(ogg_page *og); +

    + +

    Returns the sequential page number of the given Ogg page. The first +page in a logical bitstream is numbered zero; following pages are +numbered in increasing monotonic order.

    + +

    +int ogg_page_serialno(ogg_page *og); +

    + +

    Returns the serial number of the given Ogg page. The serial number is +used as a handle to distinguish various logical bitstreams in a +physical Ogg bitstresm. Every logical bitstream within a +physical bitstream must use a unique (within the scope of the physical +bitstream) serial number, which is stamped on all bitstream pages.

    + +

    +int ogg_page_version(ogg_page *og); +

    + +

    Returns the revision of the Ogg bitstream structure of the given page. +Currently, the only permitted number is zero. Later revisions of the +bitstream spec will increment this version should any changes be +incompatable.

    + +

    +int ogg_stream_clear(ogg_stream_state *os); +

    + +

    Clears and deallocates the internal storage of the given Ogg stream. +After clearing, the stream structure is not initialized for use; +ogg_stream_init must be called to reinitialize for use. +Use ogg_stream_reset to reset the stream state +to a fresh, intiialized state.

    + +

    ogg_stream_clear does not call free() on the pointer +os, allowing use of this call on stream structures in static +or automatic storage. ogg_stream_destroyis a complimentary +function that frees the pointer as well.

    + +

    Returns zero on success and non-zero on failure. This function always +succeeds.

    + +

    +int ogg_stream_destroy(ogg_stream_state *os); +

    + +

    Clears and deallocates the internal storage of the given Ogg stream, +then frees the storage associated with the pointer os.

    + +

    ogg_stream_clear does not call free() on the pointer +os, allowing use of that call on stream structures in static +or automatic storage.

    + +

    Returns zero on success and non-zero on failure. This function always +succeeds.

    + +

    +int ogg_stream_init(ogg_stream_state *os,int serialno); +

    + +

    Initialize the storage associated with os for use as an Ogg +stream. This call is used to initialize a stream for both encode and +decode. The given serial number is the serial number that will be +stamped on pages of the produced bitstream (during encode), or used as +a check that pages match (during decode).

    + +

    Returns zero on success, nonzero on failure.

    + +

    +int ogg_stream_packetin(ogg_stream_state *os, ogg_packet *op); +

    + +

    Used during encoding to add the given raw packet to the given Ogg +bitstream. The contents of op are copied; +ogg_stream_packetin does not retain any pointers into +op's storage. The encoding proccess buffers incoming packets +until enough packets have been assembled to form an entire page; +ogg_stream_pageout is used to read complete pages.

    + +

    Returns zero on success, nonzero on failure.

    + +

    +int ogg_stream_packetout(ogg_stream_state *os,ogg_packet *op); +

    + +

    Used during decoding to read raw packets from the given logical +bitstream. ogg_stream_packetout will only return complete +packets for which checksumming indicates no corruption. The size and +contents of the packet exactly match those given in the encoding +process.

    + +

    Returns zero if the next packet is not ready to be read (not buffered +or incomplete), positive if it returned a complete packet in +op and negative if there is a gap, extra bytes or corruption +at this position in the bitstream (essentially that the bitstream had +to be recaptured). A negative value is not necessarily an error. It +would be a common occurence when seeking, for example, which requires +recapture of the bitstream at the position decoding continued.

    + +

    If the return value is positive, ogg_stream_packetout placed +a packet in op. The data in op points to static +storage that is valid until the next call to +ogg_stream_pagein, ogg_stream_clear, +ogg_stream_reset, or ogg_stream_destroy. The +pointers are not invalidated by more calls to +ogg_stream_packetout.

    + +

    +int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og); +

    + +

    Used during decoding to buffer the given complete, pre-verified page +for decoding into raw Ogg packets. The given page must be framed, +normally produced by ogg_sync_pageout, and from the logical +bitstream associated with os (the serial numbers must match). +The contents of the given page are copied; ogg_stream_pagein +retains no pointers into og storage.

    + +

    Returns zero on success and non-zero on failure.

    + +

    +int ogg_stream_pageout(ogg_stream_state *os, ogg_page *og); +

    + +

    Used during encode to read complete pages from the stream buffer. The +returned page is ready for sending out to the real world.

    + +

    Returns zero if there is no complete page ready for reading. Returns +nonzero when it has placed data for a complete page into +og. Note that the storage returned in og points into internal +storage; the pointers in og are valid until the next call to +ogg_stream_pageout, ogg_stream_packetin, +ogg_stream_reset, ogg_stream_clear or +ogg_stream_destroy.

    + +

    +int ogg_stream_reset(ogg_stream_state *os); +

    + +

    Resets the given stream's state to that of a blank, unused stream; +this may be used during encode or decode.

    + +

    Note that if used during encode, it does not alter the stream's serial +number. In addition, the next page produced during encoding will be +marked as the 'initial' page of the logical bitstream.

    + +

    When used during decode, this simply clears the data buffer of any +pending pages. Beginning and end of stream cues are read from the +bitstream and are unaffected by reset.

    + +

    Returns zero on success and non-zero on failure. This function always +succeeds.

    + +

    +char *ogg_sync_buffer(ogg_sync_state *oy, long size); +

    + +

    This call is used to buffer a raw bitstream for framing and +verification. ogg_sync_buffer handles stream capture and +recapture, checksumming, and division into Ogg pages (as required by +ogg_stream_pagein).

    + +

    ogg_sync_buffer exposes a buffer area into which the decoder +copies the next (up to) size bytes. We expose the buffer +(rather than taking a buffer) in order to avoid an extra copy many +uses; this way, for example, read() can transfer data +directly into the stream buffer without first needing to place it in +temporary storage.

    + +

    Returns a pointer into oy's internal bitstream sync buffer; +the remaining space in the sync buffer is at least size +bytes. The decoder need not write all of size bytes; +ogg_sync_wrote is used to inform the engine how many bytes +were actually written. Use of ogg_sync_wrote after writing +into the exposed buffer is mandantory.

    + +

    +int ogg_sync_clear(ogg_sync_state *oy); +

    + +

    ogg_sync_clear +clears and deallocates the internal storage of the given Ogg sync +buffer. After clearing, the sync structure is not initialized for +use; ogg_sync_init must be called to reinitialize for use. +Use ogg_sync_reset to reset the sync state and buffer to a +fresh, intiialized state.

    + +

    ogg_sync_clear does not call free() on the pointer +oy, allowing use of this call on sync structures in static +or automatic storage. ogg_sync_destroyis a complimentary +function that frees the pointer as well.

    + +

    Returns zero on success and non-zero on failure. This function always +succeeds.

    + +

    +int ogg_sync_destroy(ogg_sync_state *oy); +

    + +

    Clears and deallocates the internal storage of the given Ogg sync +buffer, then frees the storage associated with the pointer +oy.

    + +

    An alternative function,ogg_sync_clear, does not call +free() on the pointer oy, allowing use of that call on +stream structures in static or automatic storage.

    + +

    Returns zero on success and non-zero on failure. This function always +succeeds.

    + +

    +int ogg_sync_init(ogg_sync_state *oy); +

    + +

    Initializes the sync buffer oy for use.

    + +

    Returns zero on success and non-zero on failure. This function always +succeeds.

    + +

    +int ogg_sync_pageout(ogg_sync_state *oy, ogg_page *og); +

    + +

    Reads complete, framed, verified Ogg pages from the sync buffer, +placing the page data in og.

    + +

    Returns zero when there's no complete pages buffered for +retrieval. Returns negative when a loss of sync or recapture occurred +(this is not necessarily an error; recapture would be required after +seeking, for example). Returns positive when a page is returned in +og. Note that the data in og points into the sync +buffer storage; the pointers are valid until the next call to +ogg_sync_buffer, ogg_sync_clear, +ogg_sync_destroy or ogg_sync_reset.

    + +

    +int ogg_sync_reset(ogg_sync_state *oy); +

    + +

    ogg_sync_reset resets the sync state in oy to a +clean, empty state. This is useful, for example, when seeking to a +new location in a bitstream.

    + +

    Returns zero on success, nonzero on failure.

    + +

    +int ogg_sync_wrote(ogg_sync_state *oy, long bytes); +

    + +

    Used to inform the sync state as to how many bytes were actually +written into the exposed sync buffer. It must be equal to or less +than the size of the buffer requested.

    + +

    Returns zero on success and non-zero on failure; failure occurs only +when the number of bytes written were larger than the buffer.

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/release.txt b/cs/3rd party/libvorbis/doc/release.txt new file mode 100644 index 000000000..a9038681d --- /dev/null +++ b/cs/3rd party/libvorbis/doc/release.txt @@ -0,0 +1,16 @@ +libvorbis release checklist. + +- Bump vendor string for encoder changes in lib/info.c +- Bump release version and sonames in configure.ac +- Update CHANGES. +- Update overall copyright dates on COPYING and README. +- Verify 'make distcheck' works. +- Verify everything is committed. +- Tag release: + svn cp https://svn.xiph.org/trunk/vorbis https://svn.xiph.org/tags/vorbis/libvorbis-x.y.z +- Copy source packages to a checkout of https://svn.xiph.org/releases/vorbis/ +- Add them to the repo and update checksum files there. +- Update https://xiph.org/downloads/ +- Update topic in the #vorbis irc channel on freenode.net. +- Post announcement to https://xiph.org/press/ and link from front page. +- Announce new release to mailing list. diff --git a/cs/3rd party/libvorbis/doc/residue-pack.png b/cs/3rd party/libvorbis/doc/residue-pack.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed071b857362cf5760aa4a77d9d0bb472ec49fb GIT binary patch literal 32318 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°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 Q$tXd3T85f+5ZkE#1AlvNwg3PC literal 0 HcmV?d00001 diff --git a/cs/3rd party/libvorbis/doc/residue2.png b/cs/3rd party/libvorbis/doc/residue2.png new file mode 100644 index 0000000000000000000000000000000000000000..e8bde3262cb60c7405cd536061413087bb701906 GIT binary patch literal 20427 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 aN4Fo(9F=)IMSBnc0000 + IETF Audio/Video Transport Working Group + + Intended usage: + + COMMON + + Restriction on usage: + + This media type depends on RTP framing, hence is only defined for + transfer via RTP [RFC3550]. + + Author: + + Luca Barbato + + Change controller: + + IETF AVT Working Group delegated from the IESG + +6.1. Packed Headers IANA Considerations + + The following IANA considerations refers to the split configuration + Packed Headers (Section 3.2.1) used within RFC 5215. + + Type name: audio + + Subtype name: vorbis-config + + Required parameters: + + None + + Optional parameters: + + None + + Encoding considerations: + + This media type contains binary data. + + Security considerations: + + See Section 10 of RFC 5215. + + + + + +Barbato Standards Track [Page 19] + +RFC 5215 Vorbis RTP Payload Format August 2008 + + + Interoperability considerations: + + None + + Published specification: + + RFC 5215 + + Applications which use this media type: + + Vorbis encoded audio, configuration data + + Additional information: + + None + + Person & email address to contact for further information: + + Luca Barbato: + IETF Audio/Video Transport Working Group + + Intended usage: COMMON + + Restriction on usage: + + This media type doesn't depend on the transport. + + Author: + + Luca Barbato + + Change controller: + + IETF AVT Working Group delegated from the IESG + +7. SDP Related Considerations + + The following paragraphs define the mapping of the parameters + described in the IANA considerations section and their usage in the + Offer/Answer Model [RFC3264]. In order to be forward compatible, the + implementation MUST ignore unknown parameters. + +7.1. Mapping Media Type Parameters into SDP + + The information carried in the Media Type specification has a + specific mapping to fields in the Session Description Protocol (SDP) + [RFC4566], which is commonly used to describe RTP sessions. When SDP + is used to specify sessions, the mapping are as follows: + + + +Barbato Standards Track [Page 20] + +RFC 5215 Vorbis RTP Payload Format August 2008 + + + o The type name ("audio") goes in SDP "m=" as the media name. + + o The subtype name ("vorbis") goes in SDP "a=rtpmap" as the encoding + name. + + o The parameter "rate" also goes in "a=rtpmap" as the clock rate. + + o The parameter "channels" also goes in "a=rtpmap" as the channel + count. + + o The mandated parameters "configuration" MUST be included in the + SDP "a=fmtp" attribute. + + If the stream comprises chained Vorbis files and all of them are + known in advance, the Configuration Packet for each file SHOULD be + passed to the client using the configuration attribute. + + The port value is specified by the server application bound to the + address specified in the c= line. The channel count value specified + in the rtpmap attribute SHOULD match the current Vorbis stream or + should be considered the maximum number of channels to be expected. + The timestamp clock rate MUST be a multiple of the sample rate; a + different payload number MUST be used if the clock rate changes. The + Configuration payload delivers the exact information, thus the SDP + information SHOULD be considered a hint. An example is found below. + +7.1.1. SDP Example + + The following example shows a basic SDP single stream. The first + configuration packet is inside the SDP; other configurations could be + fetched at any time from the URIs provided. The following base64 + [RFC4648] configuration string is folded in this example due to RFC + line length limitations. + + c=IN IP4 192.0.2.1 + + m=audio RTP/AVP 98 + + a=rtpmap:98 vorbis/44100/2 + + a=fmtp:98 configuration=AAAAAZ2f4g9NAh4aAXZvcmJpcwA...; + + Note that the payload format (encoding) names are commonly shown in + uppercase. Media Type subtypes are commonly shown in lowercase. + These names are case-insensitive in both places. Similarly, + parameter names are case-insensitive both in Media Type types and in + the default mapping to the SDP a=fmtp attribute. The a=fmtp line is + + + + +Barbato Standards Track [Page 21] + +RFC 5215 Vorbis RTP Payload Format August 2008 + + + a single line, even if it is shown as multiple lines in this document + for clarity. + +7.2. Usage with the SDP Offer/Answer Model + + There are no negotiable parameters. All of them are declarative. + +8. Congestion Control + + The general congestion control considerations for transporting RTP + data apply to Vorbis audio over RTP as well. See the RTP + specification [RFC3550] and any applicable RTP profile (e.g., + [RFC3551]). Audio data can be encoded using a range of different bit + rates, so it is possible to adapt network bandwidth by adjusting the + encoder bit rate in real time or by having multiple copies of content + encoded at different bit rates. + +9. Example + + The following example shows a common usage pattern that MAY be + applied in such a situation. The main scope of this section is to + explain better usage of the transmission vectors. + +9.1. Stream Radio + + This is one of the most common situations: there is one single server + streaming content in multicast, and the clients may start a session + at a random time. The content itself could be a mix of a live stream + (as the webjockey's voice) and stored streams (as the music she + plays). + + In this situation, we don't know in advance how many codebooks we + will use. The clients can join anytime and users expect to start + listening to the content in a short time. + + Upon joining, the client will receive the current Configuration + necessary to decode the current stream inside the SDP so that the + decoding will start immediately after. + + When the streamed content changes, the new Configuration is sent in- + band before the actual stream, and the Configuration that has to be + sent inside the SDP is updated. Since the in-band method is + unreliable, an out-of-band fallback is provided. + + The client may choose to fetch the Configuration from the alternate + source as soon as it discovers a Configuration packet got lost in- + band, or use selective retransmission [RFC3611] if the server + supports this feature. + + + +Barbato Standards Track [Page 22] + +RFC 5215 Vorbis RTP Payload Format August 2008 + + + A server-side optimization would be to keep a hash list of the + Configurations per session, which avoids packing all of them and + sending the same Configuration with different Ident tags. + + A client-side optimization would be to keep a tag list of the + Configurations per session and not process configuration packets that + are already known. + +10. Security Considerations + + RTP packets using this payload format are subject to the security + considerations discussed in the RTP specification [RFC3550], the + base64 specification [RFC4648], and the URI Generic syntax + specification [RFC3986]. Among other considerations, this implies + that the confidentiality of the media stream is achieved by using + encryption. Because the data compression used with this payload + format is applied end-to-end, encryption may be performed on the + compressed data. + +11. Copying Conditions + + The authors agree to grant third parties the irrevocable right to + copy, use, and distribute the work, with or without modification, in + any medium, without royalty, provided that, unless separate + permission is granted, redistributed modified works do not contain + misleading author, version, name of work, or endorsement information. + +12. Acknowledgments + + This document is a continuation of the following documents: + + Moffitt, J., "RTP Payload Format for Vorbis Encoded Audio", February + 2001. + + Kerr, R., "RTP Payload Format for Vorbis Encoded Audio", December + 2004. + + The Media Type declaration is a continuation of the following + document: + + Short, B., "The audio/rtp-vorbis MIME Type", January 2008. + + Thanks to the AVT, Vorbis Communities / Xiph.Org Foundation including + Steve Casner, Aaron Colwell, Ross Finlayson, Fluendo, Ramon Garcia, + Pascal Hennequin, Ralph Giles, Tor-Einar Jarnbjo, Colin Law, John + Lazzaro, Jack Moffitt, Christopher Montgomery, Colin Perkins, Barry + Short, Mike Smith, Phil Kerr, Michael Sparks, Magnus Westerlund, + David Barrett, Silvia Pfeiffer, Stefan Ehmann, Gianni Ceccarelli, and + + + +Barbato Standards Track [Page 23] + +RFC 5215 Vorbis RTP Payload Format August 2008 + + + Alessandro Salvatori. Thanks to the LScube Group, in particular + Federico Ridolfo, Francesco Varano, Giampaolo Mancini, Dario + Gallucci, and Juan Carlos De Martin. + +13. References + +13.1. Normative References + + [RFC1191] Mogul, J. and S. Deering, "Path MTU discovery", + RFC 1191, November 1990. + + [RFC1981] McCann, J., Deering, S., and J. Mogul, "Path MTU + Discovery for IP version 6", RFC 1981, + August 1996. + + [RFC2119] Bradner, S., "Key words for use in RFCs to + Indicate Requirement Levels", BCP 14, RFC 2119, + March 1997. + + [RFC3264] Rosenberg, J. and H. Schulzrinne, "An Offer/Answer + Model with Session Description Protocol (SDP)", + RFC 3264, June 2002. + + [RFC3550] Schulzrinne, H., Casner, S., Frederick, R., and V. + Jacobson, "RTP: A Transport Protocol for Real-Time + Applications", STD 64, RFC 3550, July 2003. + + [RFC3551] Schulzrinne, H. and S. Casner, "RTP Profile for + Audio and Video Conferences with Minimal Control", + STD 65, RFC 3551, July 2003. + + [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, + "Uniform Resource Identifier (URI): Generic + Syntax", STD 66, RFC 3986, January 2005. + + [RFC4566] Handley, M., Jacobson, V., and C. Perkins, "SDP: + Session Description Protocol", RFC 4566, + July 2006. + + [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 + Data Encodings", RFC 4648, October 2006. + + [VORBIS-SPEC-REF] "Ogg Vorbis I specification: Codec setup and + packet decode. Available from the Xiph website, + http://xiph.org/vorbis/doc/Vorbis_I_spec.html". + + + + + + +Barbato Standards Track [Page 24] + +RFC 5215 Vorbis RTP Payload Format August 2008 + + +13.2. Informative References + + [LIBVORBIS] "libvorbis: Available from the dedicated website, + http://vorbis.com/". + + [RFC3533] Pfeiffer, S., "The Ogg Encapsulation Format + Version 0", RFC 3533, May 2003. + + [RFC3611] Friedman, T., Caceres, R., and A. Clark, "RTP + Control Protocol Extended Reports (RTCP XR)", + RFC 3611, November 2003. + + [RFC4588] Rey, J., Leon, D., Miyazaki, A., Varsa, V., and R. + Hakenberg, "RTP Retransmission Payload Format", + RFC 4588, July 2006. + +Author's Address + + Luca Barbato + Xiph.Org Foundation + + EMail: lu_zero@gentoo.org + URI: http://xiph.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Barbato Standards Track [Page 25] + +RFC 5215 Vorbis RTP Payload Format August 2008 + + +Full Copyright Statement + + Copyright (C) The IETF Trust (2008). + + This document is subject to the rights, licenses and restrictions + contained in BCP 78, and except as set forth therein, the authors + retain all their rights. + + This document and the information contained herein are provided on an + "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS + OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY, THE IETF TRUST AND + THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF + THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED + WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +Intellectual Property + + The IETF takes no position regarding the validity or scope of any + Intellectual Property Rights or other rights that might be claimed to + pertain to the implementation or use of the technology described in + this document or the extent to which any license under such rights + might or might not be available; nor does it represent that it has + made any independent effort to identify any such rights. Information + on the procedures with respect to rights in RFC documents can be + found in BCP 78 and BCP 79. + + Copies of IPR disclosures made to the IETF Secretariat and any + assurances of licenses to be made available, or the result of an + attempt made to obtain a general license or permission for the use of + such proprietary rights by implementers or users of this + specification can be obtained from the IETF on-line IPR repository at + http://www.ietf.org/ipr. + + The IETF invites any interested party to bring to its attention any + copyrights, patents or patent applications, or other proprietary + rights that may cover technology that may be required to implement + this standard. Please address the information to the IETF at + ietf-ipr@ietf.org. + + + + + + + + + + + + +Barbato Standards Track [Page 26] + diff --git a/cs/3rd party/libvorbis/doc/rfc5215.xml b/cs/3rd party/libvorbis/doc/rfc5215.xml new file mode 100644 index 000000000..719c10043 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/rfc5215.xml @@ -0,0 +1,1176 @@ + + + + + + + + + + + + +RTP Payload Format for Vorbis Encoded Audio + + +Xiph.Org Foundation +
    +lu_zero@gentoo.org +http://xiph.org/ +
    +
    + + + +General +AVT Working Group +I-D + +Internet-Draft +Vorbis +RTP + +example + + + + +This document describes an RTP payload format for transporting Vorbis encoded +audio. It details the RTP encapsulation mechanism for raw Vorbis data and +the delivery mechanisms for the decoder probability model (referred to +as a codebook), as well as other setup information. + + + +Also included within this memo are media type registrations and the details +necessary for the use of Vorbis with the Session Description Protocol (SDP). + + + + +
    + + + +
    + + +Vorbis is a general purpose perceptual audio codec intended to allow +maximum encoder flexibility, thus allowing it to scale competitively +over an exceptionally wide range of bit rates. At the high +quality/bitrate end of the scale (CD or DAT rate stereo, 16/24 bits), it +is in the same league as MPEG-4 AAC. +Vorbis is also intended for lower and higher sample rates (from +8kHz telephony to 192kHz digital masters) and a range of channel +representations (monaural, polyphonic, stereo, quadraphonic, 5.1, +ambisonic, or up to 255 discrete channels). + + + +Vorbis encoded audio is generally encapsulated within an Ogg format bitstream +, which provides framing and synchronization. +For the purposes of RTP transport, this layer is unnecessary, and so raw Vorbis +packets are used in the payload. + + +
    + +The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14, and indicate requirement levels for compliant implementations. Requirements apply to all implementations unless otherwise stated. +An implementation is a software module that supports one of the media types defined in this document. Software modules may support multiple media types, but conformance is considered individually for each type. +Implementations that fail to satisfy one or more "MUST" requirements are considered non-compliant. Implementations that satisfy all "MUST" requirements, but fail to satisfy one or more "SHOULD" requirements, are said to be "conditionally compliant". All other implementations are "unconditionally compliant". + +
    +
    + +
    + + +For RTP-based transport of Vorbis-encoded audio, the standard RTP header is +followed by a 4-octet payload header, and then the payload data. The payload +headers are used to associate the Vorbis data with its associated decoding +codebooks as well as indicate if the following packet contains fragmented +Vorbis data and/or the number of whole Vorbis data frames. The payload data +contains the raw Vorbis bitstream information. There are 3 types of Vorbis +data; an RTP payload MUST contain just one of them at a time. + + +
    + + +The format of the RTP header is specified in +and shown in . This payload format +uses the fields of the header in a manner consistent with that specification. + + + +
    + +
    +
    + + +The RTP header begins with an octet of fields (V, P, X, and CC) to support +specialized RTP uses (see and + for details). For Vorbis RTP, the following +values are used. + + + +Version (V): 2 bits + +This field identifies the version of RTP. The version used by this +specification is two (2). + + + +Padding (P): 1 bit + +Padding MAY be used with this payload format according to Section 5.1 of +. + + + +Extension (X): 1 bit + +The Extension bit is used in accordance with . + + + +CSRC count (CC): 4 bits + +The CSRC count is used in accordance with . + + + +Marker (M): 1 bit + +Set to zero. Audio silence suppression is not used. This conforms to Section 4.1 +of . + + + +Payload Type (PT): 7 bits + +An RTP profile for a class of applications is expected to assign a payload type +for this format, or a dynamically allocated payload type SHOULD be chosen that +designates the payload as Vorbis. + + + +Sequence number: 16 bits + +The sequence number increments by one for each RTP data packet sent, and may be +used by the receiver to detect packet loss and to restore the packet sequence. This +field is detailed further in . + + + +Timestamp: 32 bits + +A timestamp representing the sampling time of the first sample of the first +Vorbis packet in the RTP payload. The clock frequency MUST be set to the sample +rate of the encoded audio data and is conveyed out-of-band (e.g., as an SDP parameter). + + + +SSRC/CSRC identifiers: + +These two fields, 32 bits each with one SSRC field and a maximum of 16 CSRC +fields, are as defined in +. + + +
    + +
    + + +The 4 octets following the RTP Header section are the Payload Header. This +header is split into a number of bit fields detailing the format of the +following payload data packets. + + +
    + +
    + + +Ident: 24 bits + +This 24-bit field is used to associate the Vorbis data to a decoding +Configuration. It is stored as a network byte order integer. + + + +Fragment type (F): 2 bits + +This field is set according to the following list: + + + + 0 = Not Fragmented + 1 = Start Fragment + 2 = Continuation Fragment + 3 = End Fragment + + + +Vorbis Data Type (VDT): 2 bits + +This field specifies the kind of Vorbis data stored in this RTP packet. There +are currently three different types of Vorbis payloads. Each packet MUST contain only a single type of Vorbis packet (e.g., you must not aggregate configuration and comment packets in the same RTP payload). + + + + + 0 = Raw Vorbis payload + 1 = Vorbis Packed Configuration payload + 2 = Legacy Vorbis Comment payload + 3 = Reserved + + + The packets with a VDT of value 3 MUST be ignored. + + +The last 4 bits represent the number of complete packets in this payload. This +provides for a maximum number of 15 Vorbis packets in the payload. If the +payload contains fragmented data, the number of packets MUST be set to 0. + + +
    + +
    + + +Raw Vorbis packets are currently unbounded in length; application profiles will +likely define a practical limit. Typical Vorbis packet sizes range from very +small (2-3 bytes) to quite large (8-12 kilobytes). The reference implementation + typically produces packets less than ~800 +bytes, except for the setup header packets, which are ~4-12 kilobytes. Within an +RTP context, to avoid fragmentation, the Vorbis data packet size SHOULD be kept +sufficiently small so that after adding the RTP and payload headers, the +complete RTP packet is smaller than the path MTU. + + +
    + +
    + + +Each Vorbis payload packet starts with a two octet length header, which is used +to represent the size in bytes of the following data payload, and is followed by the +raw Vorbis data padded to the nearest byte boundary, as explained by the Vorbis I Specification. The length value is stored +as a network byte order integer. + + + +For payloads that consist of multiple Vorbis packets, the payload data consists +of the packet length followed by the packet data for each of the Vorbis packets +in the payload. + + + +The Vorbis packet length header is the length of the Vorbis data block only and +does not include the length field. + + + +The payload packing of the Vorbis data packets MUST follow the guidelines +set out in , where the oldest Vorbis packet occurs +immediately after the RTP packet header. Subsequent Vorbis packets, if any, MUST +follow in temporal order. + + + +Audio channel mapping is in accordance with the +Vorbis I Specification. + + +
    + +
    + + +Here is an example RTP payload containing two Vorbis packets. + + +
    + +
    + + +The payload data section of the RTP packet begins with the 24-bit Ident field +followed by the one octet bit field header, which has the number of Vorbis +frames set to 2. Each of the Vorbis data frames is prefixed by the two octets +length field. The Packet Type and Fragment Type are set to 0. The Configuration +that will be used to decode the packets is the one indexed by the ident value. + + +
    +
    + + + +
    + + +Unlike other mainstream audio codecs, Vorbis has no statically +configured probability model. Instead, it packs all entropy decoding +configuration, Vector Quantization and Huffman models into a data block +that must be transmitted to the decoder with the compressed data. +A decoder also requires information detailing the number of audio +channels, bitrates, and similar information to configure itself for a +particular compressed data stream. These two blocks of information are +often referred to collectively as the "codebooks" for a Vorbis stream, +and are included as special "header" packets at the start +of the compressed data. In addition, +the Vorbis I specification +requires the presence of a comment header packet that gives simple +metadata about the stream, but this information is not required for +decoding the frame sequence. + + + +Thus, these two codebook header packets must be received by the decoder before +any audio data can be interpreted. These requirements pose problems in RTP, +which is often used over unreliable transports. + + + +Since this information must be transmitted reliably and, as the RTP +stream may change certain configuration data mid-session, there are +different methods for delivering this configuration data to a +client, both in-band and out-of-band, which are detailed below. +In order to set up an initial state for the client application, the +configuration MUST be conveyed via the signalling channel used to set up +the session. One example of such signalling is +SDP with the +Offer/Answer Model. +Changes to the configuration MAY be communicated via a re-invite, +conveying a new SDP, or sent in-band in the RTP channel. +Implementations MUST support an in-band delivery of updated codebooks, +and SHOULD support out-of-band codebook update using a new SDP file. +The changes may be due to different codebooks as well as +different bitrates of the RTP stream. + + +For non-chained streams, the recommended Configuration delivery +method is inside the Packed +Configuration in the SDP as explained the Mapping Media Type +Parameters into SDP. + + + +The 24-bit Ident field is used to map which Configuration will be used to +decode a packet. When the Ident field changes, it indicates that a change in +the stream has taken place. The client application MUST have in advance the +correct configuration. If the client detects a change in the Ident value and +does not have this information, it MUST NOT decode the raw associated Vorbis +data until it fetches the correct Configuration. + + +
    + + +The Packed Configuration Payload is +sent in-band with the packet type bits set to match the Vorbis Data Type. +Clients MUST be capable of dealing with fragmentation and periodic +re-transmission of the configuration headers. +The RTP timestamp value MUST reflect the transmission time of the first data packet for which this configuration applies. + + +
    + + +A Vorbis Packed Configuration is indicated with the Vorbis Data Type field set +to 1. Of the three headers defined in the +Vorbis I specification, the +Identification and the Setup MUST be packed as they are, while the Comment +header MAY be replaced with a dummy one. + +The packed configuration stores Xiph codec +configurations in a generic way: the first field stores the number of the following packets +minus one (count field), the next ones represent the size of the headers +(length fields), and the headers immediately follow the list of length fields. +The size of the last header is implicit. + +The count and the length fields are encoded using the following logic: the data +is in network byte order; every byte has the most significant bit used +as a flag, and the following 7 bits are used to store the value. +The first 7 most significant bits are stored in the first byte. +If there are remaining bits, the flag bit is set to 1 and the subsequent +7 bits are stored in the following byte. +If there are remaining bits, set the flag to 1 and the same procedure is +repeated. +The ending byte has the flag bit set to 0. To decode, simply iterate +over the bytes until the flag bit is set to 0. For every byte, the data +is added to the accumulated value multiplied by 128. + +The headers are packed in the same order as they are present in Ogg : +Identification, Comment, Setup. + + +The 2 byte length tag defines the length of the packed headers as the sum of +the Configuration, Comment, and Setup lengths. + +
    + +
    + +The Ident field is set with the value that will be used by the Raw Payload +Packets to address this Configuration. The Fragment type is set to 0 because the +packet bears the full Packed configuration. The number of the packet is set to 1. +
    +
    + +
    + + +The following packet definition MUST be used when Configuration is inside +in the SDP. + + +
    + + +As mentioned above, the RECOMMENDED delivery vector for Vorbis configuration +data is via a retrieval method that can be performed using a reliable transport +protocol. As the RTP headers are not required for this method of delivery, the +structure of the configuration data is slightly different. The packed header +starts with a 32-bit (network-byte ordered) count field, which details +the number of packed headers that are contained in the bundle. The +following shows the Packed header +payload for each chained Vorbis stream. + + +
    + +
    + +
    + +
    + +The key difference between the in-band format and this one is that there is no +need for the payload header octet. In this figure, the comment has a size bigger +than 127 bytes. + +
    + +
    + +
    + + +Unlike the loss of raw Vorbis payload data, loss of a configuration header +leads to a situation where it will not be possible to successfully decode the +stream. Implementations MAY try to recover from an error by requesting again the +missing Configuration or, if the delivery method is in-band, by buffering the +payloads waiting for the Configuration needed to decode them. +The baseline reaction SHOULD either be reset or end the RTP session. + + +
    + +
    + +
    + + +Vorbis Data Type flag set to 2 indicates that the packet contains +the comment metadata, such as artist name, track title, and so on. These +metadata messages are not intended to be fully descriptive but rather to offer basic +track/song information. Clients MAY ignore it completely. The details on the +format of the comments can be found in the Vorbis I Specification. + +
    + +
    + + +The 2-byte length field is necessary since this packet could be fragmented. + + +
    +
    + + +Each RTP payload contains either one Vorbis packet fragment or an integer +number of complete Vorbis packets (up to a maximum of 15 packets, since the +number of packets is defined by a 4-bit value). + + + +Any Vorbis data packet that is less than path MTU SHOULD be bundled in the RTP +payload with as many Vorbis packets as will fit, up to a maximum of 15, except +when such bundling would exceed an application's desired transmission latency. +Path MTU is detailed in and . + + + +A fragmented packet has a zero in the last four bits of the payload header. +The first fragment will set the Fragment type to 1. Each fragment after the +first will set the Fragment type to 2 in the payload header. The consecutive +fragments MUST be sent without any other payload being sent between the first +and the last fragment. The RTP payload containing the last fragment of the +Vorbis packet will have the Fragment type set to 3. To maintain the correct +sequence for fragmented packet reception, the timestamp field of fragmented +packets MUST be the same as the first packet sent, with the sequence number +incremented as normal for the subsequent RTP payloads; this will affect the +RTCP jitter measurement. The length field shows the fragment length. + + +
    + + +Here is an example of a fragmented Vorbis packet split over three RTP payloads. +Each of them contains the standard RTP headers as well as the 4-octet Vorbis +headers. + + +
    + +
    + + +In this payload, the initial sequence number is 1000 and the timestamp is 12345. The Fragment type is set to 1, the number of packets field is set to 0, and as +the payload is raw Vorbis data, the VDT field is set to 0. + + +
    + +
    + + +The Fragment type field is set to 2, and the number of packets field is set to 0. +For large Vorbis fragments, there can be several of these types of payloads. +The maximum packet size SHOULD be no greater than the path MTU, +including all RTP and payload headers. The sequence number has been incremented +by one, but the timestamp field remains the same as the initial payload. + + +
    + +
    + + +This is the last Vorbis fragment payload. The Fragment type is set to 3 and the +packet count remains set to 0. As in the previous payloads, the timestamp remains +set to the first payload timestamp in the sequence and the sequence number has +been incremented. + +
    + +
    + + +As there is no error correction within the Vorbis stream, packet loss will +result in a loss of signal. Packet loss is more of an issue for fragmented +Vorbis packets as the client will have to cope with the handling of the +Fragment Type. In case of loss of fragments, the client MUST discard all the +remaining Vorbis fragments and decode the incomplete packet. If we use the +fragmented Vorbis packet example above and the first RTP payload is lost, the +client MUST detect that the next RTP payload has the packet count field set +to 0 and the Fragment type 2 and MUST drop it. +The next RTP payload, which is the final fragmented packet, MUST be dropped +in the same manner. +If the missing RTP payload is the last, the two fragments received will be +kept and the incomplete Vorbis packet decoded. + + + +Loss of any of the Configuration fragment will result in the loss of the full +Configuration packet with the result detailed in the Loss of Configuration Headers section. + + +
    +
    +
    + + + audio + + vorbis + + + + + indicates the RTP timestamp clock rate as described in RTP Profile for Audio and Video Conferences with Minimal Control. + + + indicates the number of audio channels as described in RTP Profile for Audio and Video Conferences with Minimal Control. + + + + the base64 representation of the Packed Headers. + + + + + + +This media type is framed and contains binary data. + + + + +See Section 10 of RFC 5215. + + + +None + + + +RFC 5215 + +Ogg Vorbis I specification: Codec setup and packet decode. Available from the Xiph website, http://xiph.org/ + + + + + +Audio streaming and conferencing tools + + + +None + + + +Luca Barbato: <lu_zero@gentoo.org>
    + +IETF Audio/Video Transport Working Group + +
    + + + +COMMON + + + +This media type depends on RTP framing, hence is only defined for transfer via RTP. + + +Luca Barbato + + +IETF AVT Working Group delegated from the IESG +
    + +
    + + +The following IANA considerations refers to the split configuration Packed Headers used within RFC 5215. + + + + audio + + vorbis-config + + + +None + + + + +None + + + + +This media type contains binary data. + + + + +See Section 10 of RFC 5215. + + + + +None + + + + +RFC 5215 + + + + +Vorbis encoded audio, configuration data + + + + +None + + + + +Luca Barbato: <lu_zero@gentoo.org> + +IETF Audio/Video Transport Working Group + + + +COMMON + + + + +This media type doesn't depend on the transport. + + + + +Luca Barbato + + + +IETF AVT Working Group delegated from the IESG + + +
    + +
    + +
    + +The following paragraphs define the mapping of the parameters described in the IANA considerations section and their usage in the Offer/Answer Model. In order to be forward compatible, the implementation MUST ignore unknown parameters. + + +
    + + +The information carried in the Media Type specification has a +specific mapping to fields in the Session Description +Protocol (SDP), which is commonly used to describe RTP sessions. +When SDP is used to specify sessions, the mapping are as follows: + + + + +The type name ("audio") goes in SDP "m=" as the media name. + +The subtype name ("vorbis") goes in SDP "a=rtpmap" as the encoding name. + +The parameter "rate" also goes in "a=rtpmap" as the clock rate. + +The parameter "channels" also goes in "a=rtpmap" as the channel count. + +The mandated parameters "configuration" MUST be included in the SDP +"a=fmtp" attribute. + + + + +If the stream comprises chained Vorbis files and all of them are known in +advance, the Configuration Packet for each file SHOULD be passed to the client +using the configuration attribute. + + + +The port value is specified by the server application bound to the address +specified in the c= line. The channel count value specified in the rtpmap +attribute SHOULD match the current Vorbis stream or should be considered the maximum +number of channels to be expected. The timestamp clock rate MUST be a multiple +of the sample rate; a different payload number MUST be used if the clock rate +changes. The Configuration payload delivers the exact information, thus the +SDP information SHOULD be considered a hint. +An example is found below. + + +
    +The following example shows a basic SDP single stream. The first +configuration packet is inside the SDP; other configurations could be +fetched at any time from the URIs provided. The following +base64 configuration string is folded in this +example due to RFC line length limitations. + + + +c=IN IP4 192.0.2.1 +m=audio RTP/AVP 98 +a=rtpmap:98 vorbis/44100/2 +a=fmtp:98 configuration=AAAAAZ2f4g9NAh4aAXZvcmJpcwA...; + +
    + + +Note that the payload format (encoding) names are commonly shown in uppercase. +Media Type subtypes are commonly shown in lowercase. These names are +case-insensitive in both places. Similarly, parameter names are +case-insensitive both in Media Type types and in the default mapping to the SDP +a=fmtp attribute. The a=fmtp line is a single line, even if it is shown as multiple lines in this document for clarity. + + +
    + +
    + + +There are no negotiable parameters. All of them are declarative. + + +
    + +
    +
    + +The general congestion control considerations for transporting RTP +data apply to Vorbis audio over RTP as well. See the RTP specification + and any applicable RTP profile (e.g., ). +Audio data can be encoded using a range of different bit rates, so +it is possible to adapt network bandwidth by adjusting the encoder +bit rate in real time or by having multiple copies of content encoded + at different bit rates. + +
    +
    + + +The following example shows a common usage pattern that MAY be applied in +such a situation. The main scope of this section is to explain better usage +of the transmission vectors. + + +
    + +This is one of the most common situations: there is one single server streaming +content in multicast, and the clients may start a session at a random time. The +content itself could be a mix of a live stream (as the webjockey's voice) +and stored streams (as the music she plays). + +In this situation, we don't know in advance how many codebooks we will use. +The clients can join anytime and users expect to start listening to the content +in a short time. + +Upon joining, the client will receive the current Configuration necessary to +decode the current stream inside the SDP so that the decoding will start +immediately after. + +When the streamed content changes, the new Configuration is sent in-band +before the actual stream, and the Configuration that has to be sent inside +the SDP is updated. Since the in-band method is unreliable, an out-of-band +fallback is provided. + +The client may choose to fetch the Configuration from the alternate source +as soon as it discovers a Configuration packet got lost in-band, or use +selective retransmission if the server supports +this feature. + +A server-side optimization would be to keep a hash list of the +Configurations per session, which avoids packing all of them and sending the same +Configuration with different Ident tags. + +A client-side optimization would be to keep a tag list of the Configurations +per session and not process configuration packets that are already known. + +
    +
    + +
    + +RTP packets using this payload format are subject to the security +considerations discussed in the +RTP specification, the +base64 specification, and the +URI Generic syntax specification. +Among other considerations, this implies that the confidentiality of the +media stream is achieved by using encryption. Because the data compression used +with this payload format is applied end-to-end, encryption may be performed on +the compressed data. + + +
    +
    + The authors agree to grant third parties the irrevocable right to copy, + use, and distribute the work, with or without modification, in any medium, + without royalty, provided that, unless separate permission is granted, + redistributed modified works do not contain misleading author, version, + name of work, or endorsement information. +
    +
    + + +This document is a continuation of the following documents: + +Moffitt, J., "RTP Payload Format for Vorbis Encoded Audio", February 2001. + +Kerr, R., "RTP Payload Format for Vorbis Encoded Audio", December 2004. + +The Media Type declaration is a continuation of the following +document: +Short, B., "The audio/rtp-vorbis MIME Type", January 2008. + + + +Thanks to the AVT, Vorbis Communities / Xiph.Org Foundation including Steve Casner, +Aaron Colwell, Ross Finlayson, Fluendo, Ramon Garcia, Pascal Hennequin, Ralph +Giles, Tor-Einar Jarnbjo, Colin Law, John Lazzaro, Jack Moffitt, Christopher +Montgomery, Colin Perkins, Barry Short, Mike Smith, Phil Kerr, Michael Sparks, +Magnus Westerlund, David Barrett, Silvia Pfeiffer, Stefan Ehmann, Gianni Ceccarelli and Alessandro Salvatori. Thanks to the LScube Group, in particular Federico +Ridolfo, Francesco Varano, Giampaolo Mancini, Dario Gallucci, and Juan Carlos De Martin. + + +
    + +
    + + + + + + + + + + + + + + + + + +Ogg Vorbis I specification: Codec setup and packet decode. Available from the Xiph website, http://xiph.org/vorbis/doc/Vorbis_I_spec.html + + + + + + + + + + + +libvorbis: Available from the dedicated website, http://vorbis.com/ + + + + + + + + +
    diff --git a/cs/3rd party/libvorbis/doc/squarepolar.png b/cs/3rd party/libvorbis/doc/squarepolar.png new file mode 100644 index 0000000000000000000000000000000000000000..4f9b03d33b3945cf2b644a49301ac0232a8cf3d1 GIT binary patch literal 8406 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 A4*&oF literal 0 HcmV?d00001 diff --git a/cs/3rd party/libvorbis/doc/stereo.html b/cs/3rd party/libvorbis/doc/stereo.html new file mode 100644 index 000000000..9cfbbea06 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/stereo.html @@ -0,0 +1,419 @@ + + + + + +Ogg Vorbis Documentation + + + + + + + + + +

    Ogg Vorbis stereo-specific channel coupling discussion

    + +

    Abstract

    + +

    The Vorbis audio CODEC provides a channel coupling +mechanisms designed to reduce effective bitrate by both eliminating +interchannel redundancy and eliminating stereo image information +labeled inaudible or undesirable according to spatial psychoacoustic +models. This document describes both the mechanical coupling +mechanisms available within the Vorbis specification, as well as the +specific stereo coupling models used by the reference +libvorbis codec provided by xiph.org.

    + +

    Mechanisms

    + +

    In encoder release beta 4 and earlier, Vorbis supported multiple +channel encoding, but the channels were encoded entirely separately +with no cross-analysis or redundancy elimination between channels. +This multichannel strategy is very similar to the mp3's dual +stereo mode and Vorbis uses the same name for its analogous +uncoupled multichannel modes.

    + +

    However, the Vorbis spec provides for, and Vorbis release 1.0 rc1 and +later implement a coupled channel strategy. Vorbis has two specific +mechanisms that may be used alone or in conjunction to implement +channel coupling. The first is channel interleaving via +residue backend type 2, and the second is square polar +mapping. These two general mechanisms are particularly well +suited to coupling due to the structure of Vorbis encoding, as we'll +explore below, and using both we can implement both totally +lossless stereo image coupling [bit-for-bit decode-identical +to uncoupled modes], as well as various lossy models that seek to +eliminate inaudible or unimportant aspects of the stereo image in +order to enhance bitrate. The exact coupling implementation is +generalized to allow the encoder a great deal of flexibility in +implementation of a stereo or surround model without requiring any +significant complexity increase over the combinatorially simpler +mid/side joint stereo of mp3 and other current audio codecs.

    + +

    A particular Vorbis bitstream may apply channel coupling directly to +more than a pair of channels; polar mapping is hierarchical such that +polar coupling may be extrapolated to an arbitrary number of channels +and is not restricted to only stereo, quadraphonics, ambisonics or 5.1 +surround. However, the scope of this document restricts itself to the +stereo coupling case.

    + + +

    Square Polar Mapping

    + +

    maximal correlation

    + +

    Recall that the basic structure of a a Vorbis I stream first generates +from input audio a spectral 'floor' function that serves as an +MDCT-domain whitening filter. This floor is meant to represent the +rough envelope of the frequency spectrum, using whatever metric the +encoder cares to define. This floor is subtracted from the log +frequency spectrum, effectively normalizing the spectrum by frequency. +Each input channel is associated with a unique floor function.

    + +

    The basic idea behind any stereo coupling is that the left and right +channels usually correlate. This correlation is even stronger if one +first accounts for energy differences in any given frequency band +across left and right; think for example of individual instruments +mixed into different portions of the stereo image, or a stereo +recording with a dominant feature not perfectly in the center. The +floor functions, each specific to a channel, provide the perfect means +of normalizing left and right energies across the spectrum to maximize +correlation before coupling. This feature of the Vorbis format is not +a convenient accident.

    + +

    Because we strive to maximally correlate the left and right channels +and generally succeed in doing so, left and right residue is typically +nearly identical. We could use channel interleaving (discussed below) +alone to efficiently remove the redundancy between the left and right +channels as a side effect of entropy encoding, but a polar +representation gives benefits when left/right correlation is +strong.

    + +

    point and diffuse imaging

    + +

    The first advantage of a polar representation is that it effectively +separates the spatial audio information into a 'point image' +(magnitude) at a given frequency and located somewhere in the sound +field, and a 'diffuse image' (angle) that fills a large amount of +space simultaneously. Even if we preserve only the magnitude (point) +data, a detailed and carefully chosen floor function in each channel +provides us with a free, fine-grained, frequency relative intensity +stereo*. Angle information represents diffuse sound fields, such as +reverberation that fills the entire space simultaneously.

    + +

    *Because the Vorbis model supports a number of different possible +stereo models and these models may be mixed, we do not use the term +'intensity stereo' talking about Vorbis; instead we use the terms +'point stereo', 'phase stereo' and subcategories of each.

    + +

    The majority of a stereo image is representable by polar magnitude +alone, as strong sounds tend to be produced at near-point sources; +even non-diffuse, fast, sharp echoes track very accurately using +magnitude representation almost alone (for those experimenting with +Vorbis tuning, this strategy works much better with the precise, +piecewise control of floor 1; the continuous approximation of floor 0 +results in unstable imaging). Reverberation and diffuse sounds tend +to contain less energy and be psychoacoustically dominated by the +point sources embedded in them. Thus, we again tend to concentrate +more represented energy into a predictably smaller number of numbers. +Separating representation of point and diffuse imaging also allows us +to model and manipulate point and diffuse qualities separately.

    + +

    controlling bit leakage and symbol crosstalk

    + +

    Because polar +representation concentrates represented energy into fewer large +values, we reduce bit 'leakage' during cascading (multistage VQ +encoding) as a secondary benefit. A single large, monolithic VQ +codebook is more efficient than a cascaded book due to entropy +'crosstalk' among symbols between different stages of a multistage cascade. +Polar representation is a way of further concentrating entropy into +predictable locations so that codebook design can take steps to +improve multistage codebook efficiency. It also allows us to cascade +various elements of the stereo image independently.

    + +

    eliminating trigonometry and rounding

    + +

    Rounding and computational complexity are potential problems with a +polar representation. As our encoding process involves quantization, +mixing a polar representation and quantization makes it potentially +impossible, depending on implementation, to construct a coupled stereo +mechanism that results in bit-identical decompressed output compared +to an uncoupled encoding should the encoder desire it.

    + +

    Vorbis uses a mapping that preserves the most useful qualities of +polar representation, relies only on addition/subtraction (during +decode; high quality encoding still requires some trig), and makes it +trivial before or after quantization to represent an angle/magnitude +through a one-to-one mapping from possible left/right value +permutations. We do this by basing our polar representation on the +unit square rather than the unit-circle.

    + +

    Given a magnitude and angle, we recover left and right using the +following function (note that A/B may be left/right or right/left +depending on the coupling definition used by the encoder):

    + +
    +      if(magnitude>0)
    +        if(angle>0){
    +          A=magnitude;
    +          B=magnitude-angle;
    +        }else{
    +          B=magnitude;
    +          A=magnitude+angle;
    +        }
    +      else
    +        if(angle>0){
    +          A=magnitude;
    +          B=magnitude+angle;
    +        }else{
    +          B=magnitude;
    +          A=magnitude-angle;
    +        }
    +    }
    +
    + +

    The function is antisymmetric for positive and negative magnitudes in +order to eliminate a redundant value when quantizing. For example, if +we're quantizing to integer values, we can visualize a magnitude of 5 +and an angle of -2 as follows:

    + +

    square polar

    + +

    This representation loses or replicates no values; if the range of A +and B are integral -5 through 5, the number of possible Cartesian +permutations is 121. Represented in square polar notation, the +possible values are:

    + +
    + 0, 0
    +
    +-1,-2  -1,-1  -1, 0  -1, 1
    +
    + 1,-2   1,-1   1, 0   1, 1
    +
    +-2,-4  -2,-3  -2,-2  -2,-1  -2, 0  -2, 1  -2, 2  -2, 3  
    +
    + 2,-4   2,-3   ... following the pattern ...
    +
    + ...   5, 1   5, 2   5, 3   5, 4   5, 5   5, 6   5, 7   5, 8   5, 9
    +
    +
    + +

    ...for a grand total of 121 possible values, the same number as in +Cartesian representation (note that, for example, 5,-10 is +the same as -5,10, so there's no reason to represent +both. 2,10 cannot happen, and there's no reason to account for it.) +It's also obvious that this mapping is exactly reversible.

    + +

    Channel interleaving

    + +

    We can remap and A/B vector using polar mapping into a magnitude/angle +vector, and it's clear that, in general, this concentrates energy in +the magnitude vector and reduces the amount of information to encode +in the angle vector. Encoding these vectors independently with +residue backend #0 or residue backend #1 will result in bitrate +savings. However, there are still implicit correlations between the +magnitude and angle vectors. The most obvious is that the amplitude +of the angle is bounded by its corresponding magnitude value.

    + +

    Entropy coding the results, then, further benefits from the entropy +model being able to compress magnitude and angle simultaneously. For +this reason, Vorbis implements residue backend #2 which pre-interleaves +a number of input vectors (in the stereo case, two, A and B) into a +single output vector (with the elements in the order of +A_0, B_0, A_1, B_1, A_2 ... A_n-1, B_n-1) before entropy encoding. Thus +each vector to be coded by the vector quantization backend consists of +matching magnitude and angle values.

    + +

    The astute reader, at this point, will notice that in the theoretical +case in which we can use monolithic codebooks of arbitrarily large +size, we can directly interleave and encode left and right without +polar mapping; in fact, the polar mapping does not appear to lend any +benefit whatsoever to the efficiency of the entropy coding. In fact, +it is perfectly possible and reasonable to build a Vorbis encoder that +dispenses with polar mapping entirely and merely interleaves the +channel. Libvorbis based encoders may configure such an encoding and +it will work as intended.

    + +

    However, when we leave the ideal/theoretical domain, we notice that +polar mapping does give additional practical benefits, as discussed in +the above section on polar mapping and summarized again here:

    + +
      +
    • Polar mapping aids in controlling entropy 'leakage' between stages +of a cascaded codebook.
    • +
    • Polar mapping separates the stereo image +into point and diffuse components which may be analyzed and handled +differently.
    • +
    + +

    Stereo Models

    + +

    Dual Stereo

    + +

    Dual stereo refers to stereo encoding where the channels are entirely +separate; they are analyzed and encoded as entirely distinct entities. +This terminology is familiar from mp3.

    + +

    Lossless Stereo

    + +

    Using polar mapping and/or channel interleaving, it's possible to +couple Vorbis channels losslessly, that is, construct a stereo +coupling encoding that both saves space but also decodes +bit-identically to dual stereo. OggEnc 1.0 and later uses this +mode in all high-bitrate encoding.

    + +

    Overall, this stereo mode is overkill; however, it offers a safe +alternative to users concerned about the slightest possible +degradation to the stereo image or archival quality audio.

    + +

    Phase Stereo

    + +

    Phase stereo is the least aggressive means of gracefully dropping +resolution from the stereo image; it affects only diffuse imaging.

    + +

    It's often quoted that the human ear is deaf to signal phase above +about 4kHz; this is nearly true and a passable rule of thumb, but it +can be demonstrated that even an average user can tell the difference +between high frequency in-phase and out-of-phase noise. Obviously +then, the statement is not entirely true. However, it's also the case +that one must resort to nearly such an extreme demonstration before +finding the counterexample.

    + +

    'Phase stereo' is simply a more aggressive quantization of the polar +angle vector; above 4kHz it's generally quite safe to quantize noise +and noisy elements to only a handful of allowed phases, or to thin the +phase with respect to the magnitude. The phases of high amplitude +pure tones may or may not be preserved more carefully (they are +relatively rare and L/R tend to be in phase, so there is generally +little reason not to spend a few more bits on them)

    + +

    example: eight phase stereo

    + +

    Vorbis may implement phase stereo coupling by preserving the entirety +of the magnitude vector (essential to fine amplitude and energy +resolution overall) and quantizing the angle vector to one of only +four possible values. Given that the magnitude vector may be positive +or negative, this results in left and right phase having eight +possible permutation, thus 'eight phase stereo':

    + +

    eight phase

    + +

    Left and right may be in phase (positive or negative), the most common +case by far, or out of phase by 90 or 180 degrees.

    + +

    example: four phase stereo

    + +

    Similarly, four phase stereo takes the quantization one step further; +it allows only in-phase and 180 degree out-out-phase signals:

    + +

    four phase

    + +

    example: point stereo

    + +

    Point stereo eliminates the possibility of out-of-phase signal +entirely. Any diffuse quality to a sound source tends to collapse +inward to a point somewhere within the stereo image. A practical +example would be balanced reverberations within a large, live space; +normally the sound is diffuse and soft, giving a sonic impression of +volume. In point-stereo, the reverberations would still exist, but +sound fairly firmly centered within the image (assuming the +reverberation was centered overall; if the reverberation is stronger +to the left, then the point of localization in point stereo would be +to the left). This effect is most noticeable at low and mid +frequencies and using headphones (which grant perfect stereo +separation). Point stereo is is a graceful but generally easy to +detect degradation to the sound quality and is thus used in frequency +ranges where it is least noticeable.

    + +

    Mixed Stereo

    + +

    Mixed stereo is the simultaneous use of more than one of the above +stereo encoding models, generally using more aggressive modes in +higher frequencies, lower amplitudes or 'nearly' in-phase sound.

    + +

    It is also the case that near-DC frequencies should be encoded using +lossless coupling to avoid frame blocking artifacts.

    + +

    Vorbis Stereo Modes

    + +

    Vorbis, as of 1.0, uses lossless stereo and a number of mixed modes +constructed out of lossless and point stereo. Phase stereo was used +in the rc2 encoder, but is not currently used for simplicity's sake. It +will likely be re-added to the stereo model in the future.

    + + + + + + + + + + + diff --git a/cs/3rd party/libvorbis/doc/stream.png b/cs/3rd party/libvorbis/doc/stream.png new file mode 100644 index 0000000000000000000000000000000000000000..d1d2f368507dff661c6422193eebd53cf3722544 GIT binary patch literal 2171 zcmV->2!!{EP)C{-b9<5*qCO+t=0HF7K(ITj5a3r$ZSLPQ!lIXR%9pglc3 zot>TF;NWFtWzf*jRaI4ZczD3Tz%el~mzS4=gM&v$M>aM#V`F2Hk&$U>Y4GsyQBhHF zaB!TQoV2vGfPjFis;V_LHEL>VTwGjvd3jJ!P+?(V`Tu36szXy%A>HFy!pBaEjyP{} zEjKw9932Z~b^k+7sv##;S!m-UUBsi~=r zjg9(3+zbE!2KY%tK~#8N?7#sH0002OAp57b#|LWx007|Z&_NLZ00c!rUJ=6m{uvz1 zXyC*~SZBfO+(>Sa4T^ocZBE+=0s!pkf)1S|5E4QHEM`n1p_z#&SWeL1iByC~RBaDu6mFEg94rRAqNGyN{o&04V&h%LTOtRos(Hdf{P)mk0n_$mO^ z9;@keTJ3X;*wO(&1B0B*ie$mSfUu$rKr?2V`P<^BzZ zCUBg%;WQc=9$dj52}%bROR(YZCZ*!R64+-!x!~Y@4`+WfkB5`PJ^|J6t0yO?egoqP zG#e);)w=JWOhI)!t;?%7oi4^Jc-y_aY@K&Hm-B{jTM$3V|ykk9}WLdxh2)R~mW z!L%$SGysK=ER%yaoAMlRi$x?f0ELi>t^@g11XbFeloa25dmEHunIQRoVPr9oMwOHV(kv)*7%XHwNsx#MK*^xQMWAfRWmgkaw*30L{csf(2BpMhWpPjmOc_E@IZO)kfvQ2hdJ9x< z3aSU^AE4KtA5`UNd)pI%($xVdmZ3onYbY7Gbr&c%KLF(vR}>VII)YLlYX4;z6jv|JqlDT zHCg4w@Cf=0sO;usm6ydM=%H0!5Nmz|BQE)Bbv#d3d6%t=e(UP0)$3ni{P~yeuOEN= zeJ)T3hkK=s`FF|_87AB*S1c~vDbE!h3RIGj7Sf!uAcIMPl0c_G$zUlIs5FqE3JwKI zf=q%O8|WLfZi0F_PI?a?+<&J$$(FiPUO)4NJLTu^I~1tP&J(nGL2-r41SpnZ5;X|En*wE$pb9PtDoKxR$RrI*(UdT#%3)BK zS9Zz~pwfmR8zE4Gjiz9hNKn&vi9ii@qr{+2Yt4oT)SLEo7jApHo&oj8pP1_w0>vaI zi9m6g%OX&Y?brlZiGD)KoSu10BU3^~B_DG@sZ7iC6UwGQp(volbIYP=fMtcTdJxQQ zd8ZPO0L2ZHo1s4##!@VpB@)#1T_RA9<7|pS`8B^L0@Z1E+61_E04msl^8SaQOoL1b zdWux3nHm9#bI=w5rRo$`jeh#U@MYq=VGqg^bfOvLVNeoEVvI$Ak|Z%G+jf=>3R`LG z*1nerOnGmv&!a$LJA7SUq$p>SxG3kcxF~mQ@&S+}L1}3+TX9aM zyd+~(%2T*OCm2qqynKNIm0+nDIW~EN3O8oQJ`TPc_8{;iuA#KSPpF1c)nqVBB&g}T z#Gs;TsJdSh7v-HcRg`xx!=S3Kp8o5FL9N?T{-X$1sQt&j9TNZm01yyF|IjuKOk9T_ xzc_kcN?qc1;Ftga003c-{Zm_G2dn`A05~+hz}s%BE#CkD002ovPDHLkV1lo8y*mH^ literal 0 HcmV?d00001 diff --git a/cs/3rd party/libvorbis/doc/v-comment.html b/cs/3rd party/libvorbis/doc/v-comment.html new file mode 100644 index 000000000..aad5e880f --- /dev/null +++ b/cs/3rd party/libvorbis/doc/v-comment.html @@ -0,0 +1,285 @@ + + + + + +Ogg Vorbis Documentation + + + + + + + + + +

    Ogg Vorbis I format specification: comment field and header specification

    + +

    Overview

    + +

    The Vorbis text comment header is the second (of three) header +packets that begin a Vorbis bitstream. It is meant for short, text +comments, not arbitrary metadata; arbitrary metadata belongs in a +separate logical bitstream (usually an XML stream type) that provides +greater structure and machine parseability.

    + +

    The comment field is meant to be used much like someone jotting a +quick note on the bottom of a CDR. It should be a little information to +remember the disc by and explain it to others; a short, to-the-point +text note that need not only be a couple words, but isn't going to be +more than a short paragraph. The essentials, in other words, whatever +they turn out to be, eg:

    + +

    +"Honest Bob and the Factory-to-Dealer-Incentives, _I'm Still Around_, +opening for Moxy Früvous, 1997" +

    + +

    Comment encoding

    + +

    Structure

    + +

    The comment header logically is a list of eight-bit-clean vectors; the +number of vectors is bounded to 2^32-1 and the length of each vector +is limited to 2^32-1 bytes. The vector length is encoded; the vector +contents themselves are not null terminated. In addition to the vector +list, there is a single vector for vendor name (also 8 bit clean, +length encoded in 32 bits). For example, the 1.0 release of libvorbis +set the vendor string to "Xiph.Org libVorbis I 20020717".

    + +

    The comment header is decoded as follows:

    + +
    +  1) [vendor_length] = read an unsigned integer of 32 bits
    +  2) [vendor_string] = read a UTF-8 vector as [vendor_length] octets
    +  3) [user_comment_list_length] = read an unsigned integer of 32 bits
    +  4) iterate [user_comment_list_length] times {
    +
    +       5) [length] = read an unsigned integer of 32 bits
    +       6) this iteration's user comment = read a UTF-8 vector as [length] octets
    +
    +     }
    +
    +  7) [framing_bit] = read a single bit as boolean
    +  8) if ( [framing_bit] unset or end of packet ) then ERROR
    +  9) done.
    +
    + +

    Content vector format

    + +

    The comment vectors are structured similarly to a UNIX environment variable. +That is, comment fields consist of a field name and a corresponding value and +look like:

    + +
    +comment[0]="ARTIST=me"; 
    +comment[1]="TITLE=the sound of Vorbis"; 
    +
    + +
      +
    • A case-insensitive field name that may consist of ASCII 0x20 through +0x7D, 0x3D ('=') excluded. ASCII 0x41 through 0x5A inclusive (A-Z) is +to be considered equivalent to ASCII 0x61 through 0x7A inclusive +(a-z).
    • +
    • The field name is immediately followed by ASCII 0x3D ('='); +this equals sign is used to terminate the field name.
    • +
    • 0x3D is followed by the 8 bit clean UTF-8 encoded value of the +field contents to the end of the field.
    • +
    + +

    Field names

    + +

    Below is a proposed, minimal list of standard field names with a +description of intended use. No single or group of field names is +mandatory; a comment header may contain one, all or none of the names +in this list.

    + +
    + +
    TITLE
    +
    Track/Work name
    + +
    VERSION
    +
    The version field may be used to differentiate multiple +versions of the same track title in a single collection. +(e.g. remix info)
    + +
    ALBUM
    +
    The collection name to which this track belongs
    + +
    TRACKNUMBER
    +
    The track number of this piece if part of a specific larger collection or album
    + +
    ARTIST
    +
    The artist generally considered responsible for the work. In popular music +this is usually the performing band or singer. For classical music it would be +the composer. For an audio book it would be the author of the original text.
    + +
    PERFORMER
    +
    The artist(s) who performed the work. In classical music this would be the +conductor, orchestra, soloists. In an audio book it would be the actor who did +the reading. In popular music this is typically the same as the ARTIST and +is omitted.
    + +
    COPYRIGHT
    +
    Copyright attribution, e.g., '2001 Nobody's Band' or '1999 Jack Moffitt'
    + +
    LICENSE
    +
    License information, eg, 'All Rights Reserved', 'Any +Use Permitted', a URL to a license such as a Creative Commons license +("www.creativecommons.org/blahblah/license.html") or the EFF Open +Audio License ('distributed under the terms of the Open Audio +License. see http://www.eff.org/IP/Open_licenses/eff_oal.html for +details'), etc.
    + +
    ORGANIZATION
    +
    Name of the organization producing the track (i.e. +the 'record label')
    + +
    DESCRIPTION
    +
    A short text description of the contents
    + +
    GENRE
    +
    A short text indication of music genre
    + +
    DATE
    +
    Date the track was recorded
    + +
    LOCATION
    +
    Location where track was recorded
    + +
    CONTACT
    +
    Contact information for the creators or distributors of the track. +This could be a URL, an email address, the physical address of +the producing label.
    + +
    ISRC
    +
    ISRC number for the track; see the +ISRC intro page for more information on ISRC numbers.
    + +
    + +

    Implications

    + +
      +
    • Field names should not be 'internationalized'; this is a +concession to simplicity not an attempt to exclude the majority of +the world that doesn't speak English. Field contents, +however, use the UTF-8 character encoding to allow easy representation +of any language.
    • +
    • We have the length of the entirety of the field and restrictions on +the field name so that the field name is bounded in a known way. Thus +we also have the length of the field contents.
    • +
    • Individual 'vendors' may use non-standard field names within +reason. The proper use of comment fields should be clear through +context at this point. Abuse will be discouraged.
    • +
    • There is no vendor-specific prefix to 'nonstandard' field names. +Vendors should make some effort to avoid arbitrarily polluting the +common namespace. We will generally collect the more useful tags +here to help with standardization.
    • +
    • Field names are not required to be unique (occur once) within a +comment header. As an example, assume a track was recorded by three +well know artists; the following is permissible, and encouraged: +
      +              ARTIST=Dizzy Gillespie 
      +              ARTIST=Sonny Rollins 
      +              ARTIST=Sonny Stitt 
      +
    • +
    + +

    Encoding

    + +

    The comment header comprises the entirety of the second bitstream +header packet. Unlike the first bitstream header packet, it is not +generally the only packet on the second page and may not be restricted +to within the second bitstream page. The length of the comment header +packet is (practically) unbounded. The comment header packet is not +optional; it must be present in the bitstream even if it is +effectively empty.

    + +

    The comment header is encoded as follows (as per Ogg's standard +bitstream mapping which renders least-significant-bit of the word to be +coded into the least significant available bit of the current +bitstream octet first):

    + +
      +
    1. Vendor string length (32 bit unsigned quantity specifying number of octets)
    2. +
    3. Vendor string ([vendor string length] octets coded from beginning of string +to end of string, not null terminated)
    4. +
    5. Number of comment fields (32 bit unsigned quantity specifying number of fields)
    6. +
    7. Comment field 0 length (if [Number of comment fields]>0; 32 bit unsigned +quantity specifying number of octets)
    8. +
    9. Comment field 0 ([Comment field 0 length] octets coded from beginning of +string to end of string, not null terminated)
    10. +
    11. Comment field 1 length (if [Number of comment fields]>1...)...
    12. +
    + +

    This is actually somewhat easier to describe in code; implementation of the above +can be found in vorbis/lib/info.c:_vorbis_pack_comment(),_vorbis_unpack_comment()

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbis-clip.txt b/cs/3rd party/libvorbis/doc/vorbis-clip.txt new file mode 100644 index 000000000..2e6703445 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbis-clip.txt @@ -0,0 +1,139 @@ +Topic: + +Sample granularity editing of a Vorbis file; inferred arbitrary sample +length starting offsets / PCM stream lengths + +Overview: + +Vorbis, like mp3, is a frame-based* audio compression where audio is +broken up into discrete short time segments. These segments are +'atomic' that is, one must recover the entire short time segment from +the frame packet; there's no way to recover only a part of the PCM time +segment from part of the coded packet without expanding the entire +packet and then discarding a portion of the resulting PCM audio. + +* In mp3, the data segment representing a given time period is called + a 'frame'; the roughly equivalent Vorbis construct is a 'packet'. + +Thus, when we edit a Vorbis stream, the finest physical editing +granularity is on these packet boundaries (the mp3 case is +actually somewhat more complex and mp3 editing is more complicated +than just snipping on a frame boundary because time data can be spread +backward or forward over frames. In Vorbis, packets are all +stand-alone). Thus, at the physical packet level, Vorbis is still +limited to streams that contain an integral number of packets. + +However, Vorbis streams may still exactly represent and be edited to a +PCM stream of arbitrary length and starting offset without padding the +beginning or end of the decoded stream or requiring that the desired +edit points be packet aligned. Vorbis makes use of Ogg stream +framing, and this framing provides time-stamping data, called a +'granule position'; our starting offset and finished stream length may +be inferred from correct usage of the granule position data. + +Time stamping mechanism: + +Vorbis packets are bundled into into Ogg pages (note that pages do not +necessarily contain integral numbers of packets, but that isn't +inportant in this discussion. More about Ogg framing can be found in +ogg/doc/framing.html). Each page that contains a packet boundary is +stamped with the absolute sample-granularity offset of the data, that +is, 'complete samples-to-date' up to the last completed packet of that +page. (The same mechanism is used for eg, video, where the number +represents complete 2-D frames, and so on). + +(It's possible but rare for a packet to span more than two pages such +that page[s] in the middle have no packet boundary; these packets have +a granule position of '-1'.) + +This granule position mechaism in Ogg is used by Vorbis to indicate when the +PCM data intended to be represented in a Vorbis segment begins a +number of samples into the data represented by the first packet[s] +and/or ends before the physical PCM data represented in the last +packet[s]. + +File length a non-integral number of frames: + +A file to be encoded in Vorbis will probably not encode into an +integral number of packets; such a file is encoded with the last +packet containing 'extra'* samples. These samples are not padding; they +will be discarded in decode. + +*(For best results, the encoder should use extra samples that preserve +the character of the last frame. Simply setting them to zero will +introduce a 'cliff' that's hard to encode, resulting in spread-frame +noise. Libvorbis extrapolates the last frame past the end of data to +produce the extra samples. Even simply duplicating the last value is +better than clamping the signal to zero). + +The encoder indicates to the decoder that the file is actually shorter +than all of the samples ('original' + 'extra') by setting the granule +position in the last page to a short value, that is, the last +timestamp is the original length of the file discarding extra samples. +The decoder will see that the number of samples it has decoded in the +last page is too many; it is 'original' + 'extra', where the +granulepos says that through the last packet we only have 'original' +number of samples. The decoder then ignores the 'extra' samples. +This behavior is to occur only when the end-of-stream bit is set in +the page (indicating last page of the logical stream). + +Note that it not legal for the granule position of the last page to +indicate that there are more samples in the file than actually exist, +however, implementations should handle such an illegal file gracefully +in the interests of robust programming. + +Beginning point not on integral packet boundary: + +It is possible that we will the PCM data represented by a Vorbis +stream to begin at a position later than where the decoded PCM data +really begins after an integral packet boundary, a situation analagous +to the above description where the PCM data does not end at an +integral packet boundary. The easiest example is taking a clip out of +a larger Vorbis stream, and choosing a beginning point of the clip +that is not on a packet boundary; we need to ignore a few samples to +get the desired beginning point. + +The process of marking the desired beginning point is similar to +marking an arbitrary ending point. If the encoder wishes sample zero +to be some location past the actual beginning of data, it associates a +'short' granule position value with the completion of the second* +audio packet. The granule position is associated with the second +packet simply by making sure the second packet completes its page. + +*(We associate the short value with the second packet for two reasons. + a) The first packet only primes the overlap/add buffer. No data is + returned before decoding the second packet; this places the decision + information at the point of decision. b) Placing the short value on + the first packet would make the value negative (as the first packet + normally represents position zero); a negative value would break the + requirement that granule positions increase; the headers have + position values of zero) + +The decoder sees that on the first page that will return +data from the overlap/add queue, we have more samples than the granule +position accounts for, and discards the 'surplus' from the beginning +of the queue. + +Note that short granule values (indicating less than the actually +returned about of data) are not legal in the Vorbis spec outside of +indicating beginning and ending sample positions. However, decoders +should, at minimum, tolerate inadvertant short values elsewhere in the +stream (just as they should tolerate out-of-order/non-increasing +granulepos values, although this too is illegal). + +Beginning point at arbitrary positive timestamp (no 'zero' sample): + +It's also possible that the granule position of the first page of an +audio stream is a 'long value', that is, a value larger than the +amount of PCM audio decoded. This implies only that we are starting +playback at some point into the logical stream, a potentially common +occurence in streaming applications where the decoder may be +connecting into a live stream. The decoder should not treat the long +value specially. + +A long value elsewhere in the stream would normally occur only when a +page is lost or out of sequence, as indicated by the page's sequence +number. A long value under any other situation is not legal, however +a decoder should tolerate both possibilities. + + diff --git a/cs/3rd party/libvorbis/doc/vorbis-errors.txt b/cs/3rd party/libvorbis/doc/vorbis-errors.txt new file mode 100644 index 000000000..e873d8ab0 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbis-errors.txt @@ -0,0 +1,103 @@ +Error return codes possible from libvorbis and libvorbisfile: + +All 'failure' style returns are <0; this either indicates a generic +'false' value (eg, ready? T or F) or an error condition. Code can +safely just test for < 0, or look at the specific return code for more +detail. + +*** Return codes: + +OV_FALSE The call returned a 'false' status (eg, ov_bitrate_instant + can return OV_FALSE if playback is not in progress, and thus + there is no instantaneous bitrate information to report. + +OV_HOLE libvorbis/libvorbisfile is alerting the application that + there was an interruption in the data (one of: garbage + between pages, loss of sync followed by recapture, or a + corrupt page) + +OV_EREAD A read from media returned an error. + +OV_EFAULT Internal logic fault; indicates a bug or heap/stack + corruption. + +OV_EIMPL The bitstream makes use of a feature not implemented in this + library version. + +OV_EINVAL Invalid argument value. + +OV_ENOTVORBIS Bitstream/page/packet is not Vorbis data. + +OV_EBADHEADER Invalid Vorbis bitstream header. + +OV_EVERSION Vorbis version mismatch. + +OV_ENOTAUDIO Packet data submitted to vorbis_synthesis is not audio data. + +OV_EBADPACKET Invalid packet submitted to vorbis_synthesis. + +OV_EBADLINK Invalid stream section supplied to libvorbis/libvorbisfile, + or the requested link is corrupt. + +OV_ENOSEEK Bitstream is not seekable. + + +**************************************************************** +*** Libvorbis functions that can return failure/error codes: + +int vorbis_analysis_headerout() + OV_EIMPL + +int vorbis_analysis_wrote() + OV_EINVAL + +int vorbis_synthesis_headerin() + OV_ENOTVORBIS, OV_EVERSION, OV_EBADHEADER + +int vorbis_synthesis() + OV_ENOTAUDIO, OV_EBADPACKET + +int vorbis_synthesis_read() + OV_EINVAL + +**************************************************************** +*** Libvorbisfile functions that can return failure/error codes: + +int ov_open_callbacks() + OV_EREAD, OV_ENOTVORBIS, OV_EVERSION, OV_EBADHEADER, OV_FAULT + +int ov_open() + OV_EREAD, OV_ENOTVORBIS, OV_EVERSION, OV_EBADHEADER, OV_FAULT + +long ov_bitrate() + OV_EINVAL, OV_FALSE + +long ov_bitrate_instant() + OV_FALSE + +ogg_int64_t ov_raw_total() + OV_EINVAL + +ogg_int64_t ov_pcm_total() + OV_EINVAL + +double ov_time_total() + OV_EINVAL + +int ov_raw_seek() + OV_ENOSEEK, OV_EINVAL, OV_BADLINK + +int ov_pcm_seek_page() + OV_ENOSEEK, OV_EINVAL, OV_EREAD, OV_BADLINK, OV_FAULT + +int ov_pcm_seek() + OV_ENOSEEK, OV_EINVAL, OV_EREAD, OV_BADLINK, OV_FAULT + +int ov_time_seek() + OV_ENOSEEK, OV_EINVAL, OV_EREAD, OV_BADLINK, OV_FAULT + +int ov_time_seek_page() + OV_ENOSEEK, OV_EINVAL, OV_EREAD, OV_BADLINK, OV_FAULT + +long ov_read() + OV_HOLE, OV_EBADLINK diff --git a/cs/3rd party/libvorbis/doc/vorbis-fidelity.html b/cs/3rd party/libvorbis/doc/vorbis-fidelity.html new file mode 100644 index 000000000..2321d6753 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbis-fidelity.html @@ -0,0 +1,180 @@ + + + + + +Ogg Vorbis Documentation + + + + + + + + + +

    Ogg Vorbis: Fidelity measurement and terminology discussion

    + +

    Terminology discussed in this document is based on common terminology +associated with contemporary codecs such as MPEG I audio layer 3 +(mp3). However, some differences in terminology are useful in the +context of Vorbis as Vorbis functions somewhat differently than most +current formats. For clarity, then, we describe a common terminology +for discussion of Vorbis's and other formats' audio quality.

    + +

    Subjective and Objective

    + +

    Objective fidelity is a measure, based on a computable, +mechanical metric, of how carefully an output matches an input. For +example, a stereo amplifier may claim to introduce less that .01% +total harmonic distortion when amplifying an input signal; this claim +is easy to verify given proper equipment, and any number of testers are +likely to arrive at the same, exact results. One need not listen to +the equipment to make this measurement.

    + +

    However, given two amplifiers with identical, verifiable objective +specifications, listeners may strongly prefer the sound quality of one +over the other. This is actually the case in the decades old debate +[some would say jihad] among audiophiles involving vacuum tube versus +solid state amplifiers. There are people who can tell the difference, +and strongly prefer one over the other despite seemingly identical, +measurable quality. This preference is subjective and +difficult to measure but nonetheless real.

    + +

    Individual elements of subjective differences often can be qualified, +but overall subjective quality generally is not measurable. Different +observers are likely to disagree on the exact results of a subjective +test as each observer's perspective differs. When measuring +subjective qualities, the best one can hope for is average, empirical +results that show statistical significance across a group.

    + +

    Perceptual codecs are most concerned with subjective, not objective, +quality. This is why evaluating a perceptual codec via distortion +measures and sonograms alone is useless; these objective measures may +provide insight into the quality or functioning of a codec, but cannot +answer the much squishier subjective question, "Does it sound +good?". The tube amplifier example is perhaps not the best as very few +people can hear, or care to hear, the minute differences between tubes +and transistors, whereas the subjective differences in perceptual +codecs tend to be quite large even when objective differences are +not.

    + +

    Fidelity, Artifacts and Differences

    + +

    Audio artifacts and loss of fidelity or more simply +put, audio differences are not the same thing.

    + +

    A loss of fidelity implies differences between the perceived input and +output signal; it does not necessarily imply that the differences in +output are displeasing or that the output sounds poor (although this +is often the case). Tube amplifiers are not higher fidelity +than modern solid state and digital systems. They simply produce a +form of distortion and coloring that is either unnoticeable or actually +pleasing to many ears.

    + +

    As compared to an original signal using hard metrics, all perceptual +codecs [ASPEC, ATRAC, MP3, WMA, AAC, TwinVQ, AC3 and Vorbis included] +lose objective fidelity in order to reduce bitrate. This is fact. The +idea is to lose fidelity in ways that cannot be perceived. However, +most current streaming applications demand bitrates lower than what +can be achieved by sacrificing only objective fidelity; this is also +fact, despite whatever various company press releases might claim. +Subjective fidelity eventually must suffer in one way or another.

    + +

    The goal is to choose the best possible tradeoff such that the +fidelity loss is graceful and not obviously noticeable. Most listeners +of FM radio do not realize how much lower fidelity that medium is as +compared to compact discs or DAT. However, when compared directly to +source material, the difference is obvious. A cassette tape is lower +fidelity still, and yet the degradation, relatively speaking, is +graceful and generally easy not to notice. Compare this graceful loss +of quality to an average 44.1kHz stereo mp3 encoded at 80 or 96kbps. +The mp3 might actually be higher objective fidelity but subjectively +sounds much worse.

    + +

    Thus, when a CODEC must sacrifice subjective quality in order +to satisfy a user's requirements, the result should be a +difference that is generally either difficult to notice +without comparison, or easy to ignore. An artifact, on the +other hand, is an element introduced into the output that is +immediately noticeable, obviously foreign, and undesired. The famous +'underwater' or 'twinkling' effect synonymous with low bitrate (or +poorly encoded) mp3 is an example of an artifact. This +working definition differs slightly from common usage, but the coined +distinction between differences and artifacts is useful for our +discussion.

    + +

    The goal, when it is absolutely necessary to sacrifice subjective +fidelity, is obviously to strive for differences and not artifacts. +The vast majority of codecs today fail at this task miserably, +predictably, and regularly in one way or another. Avoiding such +failures when it is necessary to sacrifice subjective quality is a +fundamental design objective of Vorbis and that objective is reflected +in Vorbis's design and tuning.

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisenc/Makefile.am b/cs/3rd party/libvorbis/doc/vorbisenc/Makefile.am new file mode 100644 index 000000000..bbab3c5ba --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisenc/Makefile.am @@ -0,0 +1,11 @@ +## Process this file with automake to produce Makefile.in + +docdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/vorbisenc + +doc_DATA = changes.html examples.html index.html ovectl_ratemanage2_arg.html \ + ovectl_ratemanage_arg.html overview.html reference.html style.css\ + vorbis_encode_ctl.html vorbis_encode_init.html vorbis_encode_setup_init.html \ + vorbis_encode_setup_managed.html vorbis_encode_setup_vbr.html \ + vorbis_encode_init_vbr.html + +EXTRA_DIST = $(doc_DATA) diff --git a/cs/3rd party/libvorbis/doc/vorbisenc/changes.html b/cs/3rd party/libvorbis/doc/vorbisenc/changes.html new file mode 100644 index 000000000..eb8460e55 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisenc/changes.html @@ -0,0 +1,104 @@ + + + +libvorbisenc - Documentation + + + + + + + + + +

    libvorbisenc documentation

    libvorbisenc version 1.3.2 - 20101101

    + +

    Libvorbisenc API changes 1.0 through 1.1

    + +This document describes API additions to libvorbisenc between release +1.0 and 1.1. + +

    1.0.1

    + +The programming API and binary application ABI are unchanged and fully +forward/backward compatible between release 1.0 and 1.0.1. Libvorbis, +libvorbisenc and libvorbisfile must match versions amongst themselves, +however. + +

    1.1

    + +The binary ABI from release 1.0.1 to 1.1 is backward compatible; +applications linked against libvorbis/libvorbisenc 1.0 and 1.0.1 will +continue to function correctly when upgrading the libvorbis and +libvorbisenc dynamic libraries without re-linking.

    + +Release 1.1 adds several possible requests to the libvorbisenc vorbis_encode_ctl() call in order to +reflect the shift to bit-reservoir style +bitrate management. In addition, several vorbis_encode_ctl() requests are +deprecated (but functional) as they are redered semantically obsolete +by the new bitrate management.

    + +

    Deprecated in 1.1

    + +These calls are still available to older codebases to preserve +compatability; the fields of the ovectl_ratemanage_arg argument +are mapped as closely as possible to the fields of the new ovectl_ratemanage2_arg +structure. + +
    +
    OV_ECTL_RATEMANAGE_GET:
    Use OV_ECTL_RATEMANAGE2_GET +instead. + + +
    OV_ECTL_RATEMANAGE_SET:
    Use OV_ECTL_RATEMANAGE2_SET +instead. + +
    OV_ECTL_RATEMANAGE_AVG:
    Use OV_ECTL_RATEMANAGE2_SET +instead. + +
    OV_ECTL_RATEMANAGE_HARD:
    Use OV_ECTL_RATEMANAGE2_SET +instead. +
    + +

    Newly added in 1.1

    + +The following calls are added in 1.1 to semantically reflect movement +to a bit-reservoir-based bitrate +management scheme by introducing the ovectl_ratemanage2_arg +structure in order to better represent the abilities of the bitrate +manager.

    + +

    +
    OV_ECTL_RATEMANAGE2_GET
    + +Used to query the current state of bitrate management setup. + +
    OV_ECTL_RATEMANAGE2_SET
    + +Used to set or alter bitrate management settings. +
    + +

    +
    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    libvorbisenc documentation

    libvorbisenc version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisenc/examples.html b/cs/3rd party/libvorbis/doc/vorbisenc/examples.html new file mode 100644 index 000000000..1fcc7e08d --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisenc/examples.html @@ -0,0 +1,133 @@ + + + +libvorbisenc - Documentation + + + + + + + + + +

    libvorbisenc documentation

    libvorbisenc version 1.3.2 - 20101101

    + +

    Libvorbisenc Setup Examples

    + +VBR is always the recommended mode for Vorbis encoding when +there's no need to impose bitrate constraints. True VBR encoding will +always produce the most consistent quality output as well as the +highest quality for a the bits used. + +

    The following code examples prepare a +vorbis_info structure for encoding +use with libvorbis.

    + +

    Example: encoding using a VBR quality mode

    + + +
     
    +   vorbis_info_init(&vi);
    +
    +  /*********************************************************************
    +   Encoding using a VBR quality mode.  The usable range is -.1
    +   (lowest quality, smallest file) to 1.0 (highest quality, largest file).
    +   Example quality mode .4: 44kHz stereo coupled, roughly 128kbps VBR 
    +   *********************************************************************/
    +  
    +   ret = vorbis_encode_init_vbr(&vi,2,44100,.4);
    +
    +  /*********************************************************************
    +   do not continue if setup failed; this can happen if we ask for a
    +   mode that libVorbis does not support (eg, too low a quality mode, etc,
    +   will return 'OV_EIMPL')
    +   *********************************************************************/
    +
    +   if(ret) exit(1);
    +
    + +

    Example: encoding using average bitrate (ABR)

    + + +
     
    +   vorbis_info_init(&vi);
    +
    +  /*********************************************************************
    +   Encoding using an average bitrate mode (ABR).
    +   example: 44kHz stereo coupled, average 128kbps ABR 
    +   *********************************************************************/
    +  
    +   ret = vorbis_encode_init(&vi,2,44100,-1,128000,-1);
    +
    +  /*********************************************************************
    +   do not continue if setup failed; this can happen if we ask for a
    +   mode that libVorbis does not support (eg, too low a bitrate, etc,
    +   will return 'OV_EIMPL')
    +   *********************************************************************/
    +
    +   if(ret) exit(1);
    +
    + +

    Example: encoding using constant bitrate (CBR)

    + + +
     
    +   vorbis_info_init(&vi);
    +
    +  /*********************************************************************
    +   Encoding using a constant bitrate mode (CBR).
    +   example: 44kHz stereo coupled, average 128kbps CBR 
    +   *********************************************************************/
    +  
    +   ret = vorbis_encode_init(&vi,2,44100,128000,128000,128000);
    +
    +  /*********************************************************************
    +   do not continue if setup failed; this can happen if we ask for a
    +   mode that libVorbis does not support (eg, too low a bitrate, etc,
    +   will return 'OV_EIMPL')
    +   *********************************************************************/
    +
    +   if(ret) exit(1);
    +
    + +

    Example: encoding using VBR selected by approximate bitrate

    + + +
     
    +   vorbis_info_init(&vi);
    +
    +  /*********************************************************************
    +   Encode using a quality mode, but select that quality mode by asking for
    +   an approximate bitrate.  This is not ABR, it is true VBR, but selected
    +   using the bitrate interface, and then turning bitrate management off:
    +   *********************************************************************/
    +
    +   ret = ( vorbis_encode_setup_managed(&vi,2,44100,-1,128000,-1) ||
    +           vorbis_encode_ctl(&vi,OV_ECTL_RATEMANAGE2_SET,NULL) ||
    +           vorbis_encode_setup_init(&vi));
    +
    +  /*********************************************************************
    +   do not continue if setup failed; this can happen if we ask for a
    +   mode that libVorbis does not support (eg, too low a bitrate, etc,
    +   will return 'OV_EIMPL')
    +   *********************************************************************/
    +
    +   if(ret) exit(1);
    +
    + +

    +
    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    libvorbisenc documentation

    libvorbisenc version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisenc/index.html b/cs/3rd party/libvorbis/doc/vorbisenc/index.html new file mode 100644 index 000000000..ec9b98836 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisenc/index.html @@ -0,0 +1,40 @@ + + + +libvorbisenc - Documentation + + + + + + + + + +

    libvorbisenc documentation

    libvorbisenc version 1.3.2 - 20101101

    + +

    Libvorbisenc Documentation

    + +

    +Libvorbisenc is a convenient API for setting up an encoding environment using libvorbis. Libvorbisenc encapsulates the actions needed to set up the encoder properly. +

    +libvorbisenc api overview
    +libvorbisenc api reference
    +libvorbisenc api changes from 1.0 and 1.0.1
    +libvorbisenc encode setup examples
    + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    libvorbisenc documentation

    libvorbisenc version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisenc/ovectl_ratemanage2_arg.html b/cs/3rd party/libvorbis/doc/vorbisenc/ovectl_ratemanage2_arg.html new file mode 100644 index 000000000..3d9d417b5 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisenc/ovectl_ratemanage2_arg.html @@ -0,0 +1,92 @@ + + + +vorbis - datatype - ovectl_ratemanage2_arg + + + + + + + + + +

    libvorbisenc documentation

    libvorbisenc version 1.3.2 - 20101101

    + +

    ovectl_ratemanage2_arg

    + +

    declared in "vorbis/vorbisenc.h"

    + +

    + +The ovectl_ratemanage2_arg structure is used with vorbis_encode_ctl() and the OV_ECTL_RATEMANAGE2_GET and +OV_ECTL_RATEMANAGE2_SET calls in order to query and modify specifics +of the encoder's bitrate management configuration. + +

    + + + + + +
    +
    struct ovectl_ratemanage2_arg {
    +  int    management_active;
    +
    +  long   bitrate_limit_min_kbps;
    +  long   bitrate_limit_max_kbps;
    +  long   bitrate_limit_reservoir_bits;
    +  double bitrate_limit_reservoir_bias;
    +
    +  long   bitrate_average_kbps;
    +  double bitrate_average_damping;
    +};
    +
    + +

    Relevant Struct Members

    +
    +
    management_active
    +
    nonzero if bitrate management is active
    + +
    bitrate_limit_min_kbps
    +
    Lower allowed bitrate limit in kilobits per second
    +
    bitrate_limit_max_kbps
    +
    Upper allowed bitrate limit in kilobits per second
    +
    bitrate_limit_reservoir_bits
    +
    Size of the bitrate reservoir in bits
    +
    bitrate_limit_reservoir_bias
    + +
    Regulates the bitrate reservoir's preferred fill level in a range +from 0.0 to 1.0; 0.0 tries to bank bits to buffer against future +bitrate spikes, 1.0 buffers against future sudden drops in +instantaneous bitrate. Default is 0.1
    + +
    bitrate_average_kbps
    +
    Average bitrate setting in kilobits per second
    + +
    bitrate_average_damping
    Slew rate limit setting +for average bitrate adjustment; sets the minimum time in seconds the +bitrate tracker may swing from one extreme to the other when boosting +or damping average bitrate.
    + + + +
    + + +

    +
    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    libvorbisenc documentation

    libvorbisenc version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisenc/ovectl_ratemanage_arg.html b/cs/3rd party/libvorbis/doc/vorbisenc/ovectl_ratemanage_arg.html new file mode 100644 index 000000000..48f5a6251 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisenc/ovectl_ratemanage_arg.html @@ -0,0 +1,92 @@ + + + +vorbis - datatype - ovectl_ratemanage_arg + + + + + + + + + +

    libvorbisenc documentation

    libvorbisenc version 1.3.2 - 20101101

    + +

    ovectl_ratemanage_arg

    + +

    declared in "vorbis/vorbisenc.h"

    + +

    + +The ovectl_ratemanage_arg structure is used with vorbis_encode_ctl() and the OV_ECTL_RATEMANAGE_GET, +OV_ECTL_RATEMANAGE_SET, OV_ECTL_RATEMANAGE_AVG, +OV_ECTL_RATEMANAGE_HARD calls in order to query and modify specifics +of the encoder's bitrate management configuration. Note that this is +a deprecated interface; please use vorbis_encode_ctl() with the ovectl_ratemanage2_arg struct +and OV_ECTL_RATEMANAGE2_GET and OV_ECTL_RATEMANAGE2_SET calls in new +code. + +

    + + + + + +
    +
    struct ovectl_ratemanage_arg {
    +  int    management_active;
    +
    +  long   bitrate_hard_min;
    +  long   bitrate_hard_max;
    +  double bitrate_hard_window;
    +
    +  long   bitrate_av_lo;
    +  long   bitrate_av_hi;
    +  double bitrate_av_window;
    +  double bitrate_av_window_center;
    +};
    +
    + +

    Relevant Struct Members

    +
    + +
    management_active
    +
    nonzero if bitrate management is active
    + +
    bitrate_hard_min
    +
    hard lower limit (in kilobits per second) below which the stream bitrate will never be allowed for any given bitrate_hard_window seconds of time.
    +
    bitrate_hard_max
    +
    hard upper limit (in kilobits per second) above which the stream bitrate will never be allowed for any given bitrate_hard_window seconds of time.
    +
    bitrate_hard_window
    +
    the window period (in seconds) used to regulate the hard bitrate minimum and maximum
    + +
    bitrate_av_lo
    +
    soft lower limit (in kilobits per second) below which the average bitrate tracker will start nudging the bitrate higher.
    +
    bitrate_av_hi
    +
    soft upper limit (in kilobits per second) above which the average bitrate tracker will start nudging the bitrate lower.
    +
    bitrate_av_window
    +
    the window period (in seconds) used to regulate the average bitrate minimum and maximum.
    +
    bitrate_av_window_center
    +
    Regulates the relative centering of the average and hard windows; in libvorbis 1.0 and 1.0.1, the hard window regulation overlapped but followed the average window regulation. In libvorbis 1.1 a bit-reservoir interface replaces the old windowing interface; the older windowing interface is simulated and this field has no effect.
    + +
    + + +

    +
    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    libvorbisenc documentation

    libvorbisenc version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisenc/overview.html b/cs/3rd party/libvorbis/doc/vorbisenc/overview.html new file mode 100644 index 000000000..51af7b507 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisenc/overview.html @@ -0,0 +1,382 @@ + + + +libvorbisenc - API Overview + + + + + + + + + +

    libvorbisenc documentation

    libvorbisenc version 1.3.2 - 20101101

    + +

    Libvorbisenc API Overview

    + +

    Libvorbisenc is an encoding convenience library intended to +encapsulate the elaborate setup that libvorbis requires for encoding. +Libvorbisenc gives easy access to all high-level adjustments an +application may require when encoding and also exposes some low-level +tuning parameters to allow applications to make detailed adjustments +to the encoding process.

    + +All the libvorbisenc routines are declared in "vorbis/vorbisenc.h". + +Note: libvorbis and libvorbisenc always +encode in a single pass. Thus, all possible encoding setups will work +properly with live input and produce streams that decode properly when +streamed. See the subsection titled "managed bitrate +modes" for details on setting limits on bitrate usage when Vorbis +streams are used in a limited-bandwidth environment. + +

    workflow

    + +

    Libvorbisenc is used only during encoder setup; its function +is to automate initialization of a multitude of settings in a +vorbis_info structure which libvorbis then uses as a reference +during the encoding process. Libvorbisenc plays no part in the +encoding process after setup. + +

    Encode setup using libvorbisenc consists of three steps: + +

      +
    1. high-level initialization of a vorbis_info structure by +calling one of vorbis_encode_setup_vbr() or vorbis_encode_setup_managed() +with the basic input audio parameters (rate and channels) and the +basic desired encoded audio output parameters (VBR quality or ABR/CBR +bitrate)

      + +

    2. optional adjustment of the basic setup defaults using vorbis_encode_ctl()

      + +

    3. calling vorbis_encode_setup_init() to +finalize the high-level setup into the detailed low-level reference +values needed by libvorbis to encode audio. The vorbis_info +structure is then ready to use for encoding by libvorbis.

      + +

    + +These three steps can be collapsed into a single call by using vorbis_encode_init_vbr to set up a +quality-based VBR stream or vorbis_encode_init to set up a managed +bitrate (ABR or CBR) stream.

    + +

    adjustable encoding parameters

    + +

    input audio parameters

    + +

    + + + + + + + + + + + + + +
    parameterdescription
    sampling rate +The sampling rate (in samples per second) of the input audio. Common examples are 8000 for telephony, 44100 for CD audio and 48000 for DAT. Note that a mono sample (one center value) and a stereo sample (one left value and one right value) both are a single sample. + +
    channels + +The number of channels encoded in each input sample. By default, +stereo input modes (two channels) are 'coupled' by Vorbis 1.1 such +that the stereo relationship between the samples is taken into account +when encoding. Stereo coupling my be disabled by using vorbis_encode_ctl() with OV_ECTL_COUPLE_SET. + +
    + +

    quality and VBR modes

    + +Vorbis is natively a VBR codec; a user requests a given constant +quality and the encoder keeps the encoding quality constant +while allowing the bitrate to vary. 'Quality' modes (Variable BitRate) +will always produce the most consistent encoding results as well as +the highest quality for the amount of bits used. + +

    + + + + + + + + + +
    parameterdescription
    quality +A decimal float value requesting a desired quality. Libvorbisenc 1.1 allows quality requests in the range of -0.1 (lowest quality, smallest files) through +1.0 (highest-quality, largest files). Quality -0.1 is intended as an ultra-low setting in which low bitrate is much more important than quality consistency. Quality settings 0.0 and above are intended to produce consistent results at all times. + +
    + + +

    managed bitrate modes

    + +Although the Vorbis codec is natively VBR, libvorbis includes +infrastructure for 'managing' the bitrate of streams by setting +minimum and maximum usage constraints, as well as functionality for +nudging a stream toward a desired average value. These features +should only be used when there is a requirement to limit +bitrate in some way. Although the difference is usually slight, +managed bitrate modes will always produce output inferior to VBR +(given equal bitrate usage). Setting overly or impossibly tight +bitrate management requirements can affect output quality dramatically +for the worse.

    + +Beginning in libvorbis 1.1, bitrate management is implemented using a +bit-reservoir algorithm. The encoder has a fixed-size +reservoir used as a 'savings account' in encoding. When a frame is +smaller than the target rate, the unused bits go into the reservoir so +that they may be used by future frames. When a frame is larger than +target bitrate, it draws 'banked' bits out of the reservoir. Encoding +is managed so that the reservoir never goes negative (when a maximum +bitrate is specified) or fills beyond a fixed limit (when a minimum +bitrate is specified). An 'average bitrate' request is used as the +set-point in a long-range bitrate tracker which adjusts the encoder's +aggressiveness up or down depending on whether or not frames are coming +in larger or smaller than the requested average point. + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    parameterdescription
    maximum bitrate The maximum allowed bitrate, set in bits +per second. If the bitrate would otherwise rise such that oversized +frames would underflow the bit-reservoir by consuming banked bits, +bitrate management will force the encoder to use fewer bits per frame +by encoding with a more aggressive psychoacoustic model.

    This +setting is a hard limit; the bitstream will never be allowed, under +any circumstances, to increase above the specified bitrate over the +average period set by the reservoir; it may momentarily rise over if +inspected on a granularity much finer than the average period across +the reservoir. Normally, the encoder will conserve bits gracefully by +using more aggressive psychoacoustics to shrink a frame when forced +to. However, if the encoder runs out of means of gracefully shrinking +a frame, it will simply take the smallest frame it can otherwise +generate and truncate it to the maximum allowed length. Note that +this is not an error and although it will obviously adversely affect +audio quality, a Vorbis decoder will be able to decode a truncated +frame into audio. + +

    average bitrate + +The average desired bitrate of a stream, set +in bits per second. Average bitrate is tracked via a reservoir like +minimum and maximum bitrate, however the averaging reservior does not +impose a hard limit; it is used to nudge the bitrate toward the +desired average by slowly adjusting the psychoacoustic aggressiveness. +As such, the reservoir size does not affect the average bitrate +behavior. Because this setting alone is not used to impose hard +bitrate limits, the bitrate of a stream produced using only the +average bitrate constraint will track the average over time +but not necessarily adhere strictly to that average for any given +period. Should a strict localized average be required, average +bitrate should be used along with minimum bitrate and +maximum bitrate. +
    minimum bitrate + The minimum allowed bitrate, set in bits per second. If +the bitrate would otherwise fall such that undersized frames would +overflow the bit-reservoir with unused bits, bitrate management will +force the encoder to use more bits per frame by encoding with a less +aggressive psychoacoustic model.

    This setting is a hard limit; the +bitstream will never be allowed, under any circumstances, to drop +below the specified bitrate over the average period set by the +reservoir; it may momentarily fall under if inspected on a granularity +much finer than the average period across the reservoir. Normally, +the encoder will fill out undersided frames with additional useful +coding information by increasing the perceived quality of the stream. +If the encoder runs out of useful ways to consume more bits, it will +pad frames out with zeroes. +

    reservoir size The size of the minimum/maximum bitrate +tracking reservoir, set in bits. The reservoir is used as a 'bit +bank' to average out localized surges and dips in bitrate while +providing predictable, guaranteed buffering behavior for streams to be +used in situations with constrained transport bandwidth. The default +setting is two seconds of average bitrate.

    + +When a single frame is larger than the maximum allowed overall +bitrate, the bits are 'borrowed' from the bitrate reservoir; if the +reservoir contains insufficient bits to cover the defecit, the encoder +must find some way to reduce the frame size.

    + +When a frame is under the minimum limit, the surplus bits are placed +into the reservoir, banking them for future use. If the reservoir is +already full of banked bits, the encoder is forced to find some way to +make the frame larger.

    + +If the frame size is between the minimum and maximum rates (thus +implying the minimum and maximum allowed rates are different), the +reservoir gravitates toward a fill point configured by the +reservoir bias setting described next. If the reservoir is +fuller than the fill point (a 'surplus of surplus'), the encoder will +consume a number bits from the reservoir equal to the number of the +bits by which the frame exceeds minimum size. If the reservoir is +emptier than the fillpoint (a 'surplus of defecit'), bits are returned +to the reservoir equaling the current frame's number of bits under the +maximum frame size. The idea of the fill point is to buffer against +both underruns and overruns, by trying to hold the reservoir to a +middle course. +

    reservoir bias + +Reservoir bias is a setting between 0.0 and 1.0 that biases bitrate +management toward smoothing bitrate spikes (0.0) or bitrate peaks +(1.0); the default setting is 0.1.

    + +Using settings toward 0.0 causes the bitrate manager to hoard bits in +the bit reservoir such that there is a large pool of banked surplus to +draw upon during short spikes in bitrate. As a result, the encoder +will react less aggressively and less drastically to curtail framesize +during brief surges in bitrate.

    + +Using settings toward 1.0 causes the bitrate manager to empty the bit +reservoir such that there is a large buffer available to store surplus +bits during sudden drops in bitrate. As a result, the encoder will +react less aggressively and less drastically to support minimum frame +sizes during drops in bitrate and will tend not to store any extra +bits in the reservoir for future bitrate spikes.

    + +

    average track damping + +A decimal value, in seconds, that controls how quickly the average +bitrate tracker is allowed to slew from enforcing minimum frame sizes +to maximum framesizes and vice versa. Default value is 1.5 +seconds.

    + +When the 'average bitrate' setting is in use, the average bitrate +tracker uses an unbounded reservoir to track overall bitrate-to-date +in the stream. When bitrates are too low, the tracker will try to +nudge bitrates up and when the bitrate is too high, nudge it down. +The damping value regulates the maximum strength of the nudge; it +describes, in seconds, how quickly the tracker may transition from an +extreme nudge in one direction to an extreme nudge in the other.

    + +

    + +

    encoding model adjustments

    + +The
    vorbis_encode_ctl() call provides +a generalized interface for making encoding setup adjustments to the +basic high-level setup provided by vorbis_encode_setup_vbr() or vorbis_encode_setup_managed(). +In reality, these two calls use vorbis_encode_ctl() internally, and vorbis_encode_ctl() can be used to adjust +most of the parameters set by other calls.

    + +In Vorbis 1.1, vorbis_encode_ctl() can +adjust the following additional parameters not described elsewhere: + +

    + + + + + + + + + + + + + + + + + + + + +
    parameterdescription
    management mode Configures whether or not bitrate +management is in use or not. Normally, this value is set implicitly +during encoding setup; however, the supported means of selecting a +quality mode by bitrate (that is, requesting a true VBR stream, but +doing so by asking for an approximate bitrate) is to use vorbis_encode_setup_managed() +and then to explicitly turn off bitrate management by calling vorbis_encode_ctl() with OV_ECTL_RATEMANAGE2_SET +
    coupling Stereo encoding (and in the future, surround +encodings) are normally encoded assuming the channels form a stereo +image and that lossy-stereo modelling is appropriate; this is called +'coupling'. Stereo coupling may be explicitly enabled or disabled. +
    lowpass Sets the hard lowpass of a given encoding mode; +this may be used to conserve a few bits in high-rate audio that has +limited bandwidth, or in testing of the encoder's acoustic model. The +encoder is generally already configured with ideal lowpasses (if any +at all) for given modes; use of this parameter is strongly discouraged +if the point is to try to 'improve' a given encoding mode for general +encoding. +
    impulse coding aggressiveness By default, libvorbis +attempts to compromise between preventing wide bitrate swings and +high-resolution impulse coding (which is required for the crispest +possible attacks, but also requires a relatively large momentary +bitrate increase). This parameter allows an application to tune the +compromise or eliminate it; A value of 0.0 indicates normal behavior +while a value of -15.0 requests maximum possible impulse +resolution.
    + + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    libvorbisenc documentation

    libvorbisenc version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisenc/reference.html b/cs/3rd party/libvorbis/doc/vorbisenc/reference.html new file mode 100644 index 000000000..59d643229 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisenc/reference.html @@ -0,0 +1,54 @@ + + + +Vorbisfile API Reference + + + + + + + + + +

    vorbisenc documentation

    libvorbisenc version 1.3.2 - 20101101

    + +

    Vorbisenc API Reference

    + +

    Data Structures

    + +

    +vorbis_info (from libvorbis)
    +ovectl_ratemanage_arg
    +ovectl_ratemanage2_arg
    +

    + +

    Encoder Setup

    + +

    +vorbis_encode_ctl()
    +vorbis_encode_init()
    +vorbis_encode_init_vbr()
    +vorbis_encode_setup_init()
    +vorbis_encode_setup_managed()
    +vorbis_encode_setup_vbr()
    +

    + +

    The actual encoding is done using the libvorbis API.

    + +
    +
    +
    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    libvorbisenc documentation

    libvorbisenc version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisenc/style.css b/cs/3rd party/libvorbis/doc/vorbisenc/style.css new file mode 100644 index 000000000..81cf41795 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisenc/style.css @@ -0,0 +1,7 @@ +BODY { font-family: Helvetica, sans-serif } +TD { font-family: Helvetica, sans-serif } +P { font-family: Helvetica, sans-serif } +H1 { font-family: Helvetica, sans-serif } +H2 { font-family: Helvetica, sans-serif } +H4 { font-family: Helvetica, sans-serif } +P.tiny { font-size: 8pt } diff --git a/cs/3rd party/libvorbis/doc/vorbisenc/vorbis_encode_ctl.html b/cs/3rd party/libvorbis/doc/vorbisenc/vorbis_encode_ctl.html new file mode 100644 index 000000000..13de574c5 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisenc/vorbis_encode_ctl.html @@ -0,0 +1,183 @@ + + + +libvorbisenc - function - vorbis_encode_ctl + + + + + + + + + +

    libvorbisenc documentation

    libvorbisenc version 1.3.2 - 20101101

    + +

    vorbis_encode_ctl

    + +

    declared in "vorbis/vorbisenc.h";

    + +

    This function implements a generic interface to miscellaneous +encoder settings similar to the clasasic UNIX 'ioctl()' system call. +Applications may use vorbis_encode_ctl() to query or set bitrate +management or quality mode details by using one of several +request arguments detailed below. Vorbis_encode_ctl() must be +called after one of vorbis_encode_setup_managed() +or vorbis_encode_setup_vbr(). +When used to modify settings, vorbis_encode_ctl() must be called +before vorbis_encode_setup_init(). + +

    +

    + + + + +
    +
    
    +extern int vorbis_encode_ctl(vorbis_info *vi,int request,void *arg);
    +
    +
    +
    + +

    Parameters

    +
    +
    vi
    +
    Pointer to an initialized vorbis_info struct.

    +

    request
    +
    Specifies the desired action; possible request fields are detailed below.

    +

    arg
    +
    void * pointing to a data structure matching the request argument.

    +

    + +

    Requests

    +
    + +
    OV_ECTL_RATEMANAGE2_GET
    + +
    Argument: struct +ovectl_ratemanage2_arg *
    Used to query the current +encoder bitrate management setting. Also used to initialize fields of +an ovectl_ratemanage2_arg structure for use with +OV_ECTL_RATEMANAGE2_SET.

    + +

    OV_ECTL_RATEMANAGE2_SET
    +
    Argument: struct +ovectl_ratemanage2_arg *
    Used to set the current +encoder bitrate management settings to the values listed in the +ovectl_ratemanage2_arg. Passing a NULL pointer will disable bitrate +management. +

    + +

    OV_ECTL_LOWPASS_GET
    +
    Argument: double *
    Returns the current encoder hard-lowpass +setting (kHz) in the double pointed to by arg. +

    + +

    OV_ECTL_LOWPASS_SET
    +
    Argument: double *
    Sets the encoder hard-lowpass to the value +(kHz) pointed to by arg. Valid lowpass settings range from 2 to 99. +

    + +

    OV_ECTL_IBLOCK_GET
    +
    Argument: double *
    Returns the current encoder impulse +block setting in the double pointed to by arg.

    + +

    OV_ECTL_IBLOCK_SET
    Argument: double *
    Sets +the impulse block bias to the the value pointed to by arg; valid range +is -15.0 to 0.0 [default]. A negative impulse block bias will direct +to encoder to use more bits when incoding short blocks that contain +strong impulses, thus improving the accuracy of impulse encoding.

    + +

    OV_ECTL_COUPLING_GET
    +
    Argument: int *
    +Returns the current encoder coupling enabled/disabled +setting in the int pointed to by arg. +

    + +

    OV_ECTL_COUPLING_SET
    +
    Argument: int *
    +Enables/disables channel coupling in multichannel encoding according to arg. +*arg of zero disables all channel coupling, nonzero allows the encoder to use +coupling if a coupled mode is available for the input. At present, coupling +is available for stereo and 5.1 input modes. +

    + +

    OV_ECTL_RATEMANAGE_GET [deprecated]
    +
    + +Argument: struct +ovectl_ratemanage_arg *
    Old interface to querying bitrate +management settings; deprecated after move to bit-reservoir style +management in 1.1 rendered this interface partially obsolete. Please +use OV_ECTL_RATEMANGE2_GET instead. + +

    + +

    OV_ECTL_RATEMANAGE_SET [deprecated]
    +
    +Argument: struct +ovectl_ratemanage_arg *
    Old interface to modifying bitrate +management settings; deprecated after move to bit-reservoir style +management in 1.1 rendered this interface partially obsolete. Please +use OV_ECTL_RATEMANGE2_SET instead. +

    + +

    OV_ECTL_RATEMANAGE_AVG [deprecated]
    +
    +Argument: struct +ovectl_ratemanage_arg *
    Old interface to setting +average-bitrate encoding mode; deprecated after move to bit-reservoir +style management in 1.1 rendered this interface partially obsolete. +Please use OV_ECTL_RATEMANGE2_SET instead. +

    + +

    OV_ECTL_RATEMANAGE_HARD [deprecated]
    +
    +Argument: struct +ovectl_ratemanage_arg *
    Old interface to setting +bounded-bitrate encoding modes; deprecated after move to bit-reservoir +style management in 1.1 rendered this interface partially obsolete. +Please use OV_ECTL_RATEMANGE2_SET instead. +

    + + +

    + + +

    Return Values

    vorbis_encode_ctl() returns zero on success, +placing any further return information (such as the result of a query) +into the storage pointed to by *arg. On error, +vorbis_encode_ctl() may return one of the following error codes: + +
    + +
    OV_EINVAL
    Invalid argument, or an attempt to modify a +setting after calling vorbis_encode_setup_init().

    + +

    OV_EIMPL
    Unimplemented or unknown request

    + +

    + +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    libvorbisenc documentation

    libvorbisenc version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisenc/vorbis_encode_init.html b/cs/3rd party/libvorbis/doc/vorbisenc/vorbis_encode_init.html new file mode 100644 index 000000000..d371899f4 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisenc/vorbis_encode_init.html @@ -0,0 +1,88 @@ + + + +libvorbisenc - function - vorbis_encode_init + + + + + + + + + +

    libvorbisenc documentation

    libvorbisenc version 1.3.2 - 20101101

    + +

    vorbis_encode_init

    + +

    declared in "vorbis/vorbisenc.h";

    + +

    This is the primary function within libvorbisenc for setting up managed bitrate modes. +

    Before this function is called, the vorbis_info struct should be initialized by using vorbis_info_init() from the libvorbis API. After encoding, vorbis_info_clear should be called. +

    The max_bitrate, nominal_bitrate, and min_bitrate settings are used to set constraints for the encoded file. This function uses these settings to select the appropriate encoding mode and set it up. +

    +

    + + + + +
    +
    
    +extern int vorbis_encode_init(vorbis_info *vi,
    +			      long channels,
    +			      long rate,
    +			      
    +			      long max_bitrate,
    +			      long nominal_bitrate,
    +			      long min_bitrate);
    +
    +
    +
    + +

    Parameters

    +
    +
    vi
    +
    Pointer to an initialized vorbis_info struct.
    +
    channels
    +
    The number of channels to be encoded.
    +
    rate
    +
    The sampling rate of the source audio.
    +
    max_bitrate
    +
    Desired maximum bitrate (limit). -1 indicates unset.
    +
    nominal_bitrate
    +
    Desired average, or central, bitrate. -1 indicates unset.
    +
    min_bitrate
    +
    Desired minimum bitrate. -1 indicates unset.
    +
    + + +

    Return Values

    +
    +
  • +0 for success
  • + +
  • less than zero for failure:
  • +
      +
    • OV_EFAULT - Internal logic fault; indicates a bug or heap/stack corruption.
    • +
    • OV_EINVAL - Invalid setup request, eg, out of range argument.
    • +
    • OV_EIMPL - Unimplemented mode; unable to comply with bitrate request.
    • +
    +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    libvorbisenc documentation

    libvorbisenc version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisenc/vorbis_encode_init_vbr.html b/cs/3rd party/libvorbis/doc/vorbisenc/vorbis_encode_init_vbr.html new file mode 100644 index 000000000..800d25783 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisenc/vorbis_encode_init_vbr.html @@ -0,0 +1,81 @@ + + + +libvorbisenc - function - vorbis_encode_init_vbr + + + + + + + + + +

    libvorbisenc documentation

    libvorbisenc version 1.3.2 - 20101101

    + +

    vorbis_encode_init_vbr

    + +

    declared in "vorbis/vorbisenc.h";

    + +

    This is the primary function within libvorbisenc for setting up variable bitrate ("quality" based) modes. +

    Before this function is called, the vorbis_info struct should be initialized by using vorbis_info_init() from the libvorbis API. After encoding, vorbis_info_clear should be called. +

    +

    + + + + +
    +
    
    +extern int vorbis_encode_init_vbr(vorbis_info *vi,
    +			      long channels,
    +			      long rate,
    +			      
    +			      float base_quality);
    +
    +
    +
    + +

    Parameters

    +
    +
    vi
    +
    Pointer to an initialized vorbis_info struct.
    +
    channels
    +
    The number of channels to be encoded.
    +
    rate
    +
    The sampling rate of the source audio.
    +
    base_quality
    +
    Desired quality level, currently from -0.1 to 1.0 (lo to hi).
    +
    + + +

    Return Values

    +
    +
  • +0 for success
  • + +
  • less than zero for failure:
  • +
      +
    • OV_EFAULT - Internal logic fault; indicates a bug or heap/stack corruption.
    • +
    • OV_EINVAL - Invalid setup request, eg, out of range argument.
    • +
    • OV_EIMPL - Unimplemented mode; unable to comply with quality level request.
    • +
    +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    libvorbisenc documentation

    libvorbisenc version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisenc/vorbis_encode_setup_init.html b/cs/3rd party/libvorbis/doc/vorbisenc/vorbis_encode_setup_init.html new file mode 100644 index 000000000..aa2c90491 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisenc/vorbis_encode_setup_init.html @@ -0,0 +1,88 @@ + + + +libvorbisenc - function - vorbis_encode_setup_init + + + + + + + + + +

    libvorbisenc documentation

    libvorbisenc version 1.3.2 - 20101101

    + +

    vorbis_encode_setup_init

    + +

    declared in "vorbis/vorbisenc.h";

    + +

    This function performs the last stage of three-step encoding setup, as described in the API overview under managed bitrate modes. + +

    Before this function is called, the vorbis_info struct should be initialized +by using vorbis_info_init() from the libvorbis API, one of vorbis_encode_setup_managed() +or vorbis_encode_setup_vbr() +called to initialize the high-level encoding setup, and vorbis_encode_ctl() called if +necessary to make encoding setup changes. vorbis_encode_setup_init() +finalizes the highlevel encoding structure into a complete encoding +setup after which the application may make no further setup changes.

    + +After encoding, vorbis_info_clear should be called. +

    +

    + + + + +
    +
    
    +extern int vorbis_encode_setup_init(vorbis_info *vi);
    +
    +
    +
    + +

    Parameters

    +
    +
    vi
    +
    Pointer to an initialized vorbis_info struct.
    +
    + + +

    Return Values

    +
    +
  • +0 for success
  • + +
  • less than zero for failure:
  • +
      +
    • OV_EFAULT - Internal logic fault; indicates a bug or heap/stack corruption.
    • +
    • OV_EINVAL - Attempt to use vorbis_encode_setup_init() without first calling one of vorbis_encode_setup_managed() +or vorbis_encode_setup_vbr() +to initialize the high-level encoding setup +
    • +
    +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    libvorbisenc documentation

    libvorbisenc version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisenc/vorbis_encode_setup_managed.html b/cs/3rd party/libvorbis/doc/vorbisenc/vorbis_encode_setup_managed.html new file mode 100644 index 000000000..0389ddecd --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisenc/vorbis_encode_setup_managed.html @@ -0,0 +1,102 @@ + + + +libvorbisenc - function - vorbis_encode_setup_managed + + + + + + + + + +

    libvorbisenc documentation

    libvorbisenc version 1.3.2 - 20101101

    + +

    vorbis_encode_setup_managed

    + +

    declared in "vorbis/vorbisenc.h";

    + +

    This function performs step-one of a three-step bitrate-managed +encode setup. It functions similarly to the one-step setup performed +by vorbis_encode_init() but +allows an application to make further encode setup tweaks using vorbis_encode_ctl() before finally +calling vorbis_encode_setup_init() to +complete the setup process. + +

    Before this function is called, the vorbis_info struct should be initialized +by using vorbis_info_init() from the libvorbis API. After encoding, +vorbis_info_clear should be called. + +

    The max_bitrate, nominal_bitrate, and min_bitrate settings are used +to set constraints for the encoded file. This function uses these +settings to select the appropriate encoding mode and set it up. +

    +

    + + + + +
    +
    
    +extern int vorbis_encode_init(vorbis_info *vi,
    +			      long channels,
    +			      long rate,
    +			      
    +			      long max_bitrate,
    +			      long nominal_bitrate,
    +			      long min_bitrate);
    +
    +
    +
    + +

    Parameters

    +
    +
    vi
    +
    Pointer to an initialized vorbis_info struct.
    +
    channels
    +
    The number of channels to be encoded.
    +
    rate
    +
    The sampling rate of the source audio.
    +
    max_bitrate
    +
    Desired maximum bitrate (limit). -1 indicates unset.
    +
    nominal_bitrate
    +
    Desired average, or central, bitrate. -1 indicates unset.
    +
    min_bitrate
    +
    Desired minimum bitrate. -1 indicates unset.
    +
    + + +

    Return Values

    +
    +
  • +0 for success
  • + +
  • less than zero for failure:
  • +
      +
    • OV_EFAULT - Internal logic fault; indicates a bug or heap/stack corruption.
    • +
    • OV_EINVAL - Invalid setup request, eg, out of range argument.
    • +
    • OV_EIMPL - Unimplemented mode; unable to comply with bitrate request.
    • +
    +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    libvorbisenc documentation

    libvorbisenc version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisenc/vorbis_encode_setup_vbr.html b/cs/3rd party/libvorbis/doc/vorbisenc/vorbis_encode_setup_vbr.html new file mode 100644 index 000000000..e390edfcc --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisenc/vorbis_encode_setup_vbr.html @@ -0,0 +1,90 @@ + + + +libvorbisenc - function - vorbis_encode_setup_vbr + + + + + + + + + +

    libvorbisenc documentation

    libvorbisenc version 1.3.2 - 20101101

    + +

    vorbis_encode_setup_vbr

    + +

    declared in "vorbis/vorbisenc.h";

    + +

    This function performs step-one of a three-step variable bitrate +(quality-based) encode setup. It functions similarly to the one-step +setup performed by vorbis_encode_init_vbr() but +allows an application to make further encode setup tweaks using vorbis_encode_ctl() before finally +calling vorbis_encode_setup_init() to +complete the setup process. + +

    Before this function is called, the vorbis_info struct should be initialized by using vorbis_info_init() from the libvorbis API. After encoding, vorbis_info_clear should be called. +

    +

    + + + + +
    +
    
    +extern int vorbis_encode_init_vbr(vorbis_info *vi,
    +			      long channels,
    +			      long rate,
    +			      
    +			      float base_quality);
    +
    +
    +
    + +

    Parameters

    +
    +
    vi
    +
    Pointer to an initialized vorbis_info struct.
    +
    channels
    +
    The number of channels to be encoded.
    +
    rate
    +
    The sampling rate of the source audio.
    +
    base_quality
    +
    Desired quality level, currently from -0.1 to 1.0 (lo to hi).
    +
    + + +

    Return Values

    +
    +
  • +0 for success
  • + +
  • less than zero for failure:
  • +
      +
    • OV_EFAULT - Internal logic fault; indicates a bug or heap/stack corruption.
    • +
    • OV_EINVAL - Invalid setup request, eg, out of range argument.
    • +
    • OV_EIMPL - Unimplemented mode; unable to comply with quality level request.
    • +
    +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    libvorbisenc documentation

    libvorbisenc version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/Makefile.am b/cs/3rd party/libvorbis/doc/vorbisfile/Makefile.am new file mode 100644 index 000000000..fb27d44ae --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/Makefile.am @@ -0,0 +1,25 @@ +## Process this file with automake to produce Makefile.in + +docdir = $(datadir)/doc/$(PACKAGE)-$(VERSION)/vorbisfile + +doc_DATA = OggVorbis_File.html callbacks.html chaining_example_c.html\ + chainingexample.html crosslap.html datastructures.html decoding.html\ + example.html exampleindex.html fileinfo.html index.html\ + initialization.html ov_bitrate.html ov_bitrate_instant.html\ + ov_callbacks.html ov_clear.html ov_comment.html ov_crosslap.html\ + ov_fopen.html\ + ov_info.html ov_open.html ov_open_callbacks.html ov_pcm_seek.html\ + ov_pcm_seek_lap.html ov_pcm_seek_page.html ov_pcm_seek_page_lap.html\ + ov_pcm_tell.html ov_pcm_total.html ov_raw_seek.html\ + ov_raw_seek_lap.html ov_raw_tell.html ov_raw_total.html ov_read.html\ + ov_read_float.html ov_read_filter.html\ + ov_seekable.html ov_serialnumber.html\ + ov_streams.html ov_test.html ov_test_callbacks.html ov_test_open.html\ + ov_time_seek.html ov_time_seek_lap.html ov_time_seek_page.html\ + ov_time_seek_page_lap.html ov_time_tell.html ov_time_total.html\ + overview.html reference.html seekexample.html seeking.html\ + seeking_example_c.html seeking_test_c.html seekingexample.html\ + style.css threads.html\ + vorbisfile_example_c.html + +EXTRA_DIST = $(doc_DATA) diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/OggVorbis_File.html b/cs/3rd party/libvorbis/doc/vorbisfile/OggVorbis_File.html new file mode 100644 index 000000000..ea77888d0 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/OggVorbis_File.html @@ -0,0 +1,137 @@ + + + +Vorbisfile - datatype - OggVorbis_File + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    OggVorbis_File

    + +

    declared in "vorbis/vorbisfile.h"

    + +

    +The OggVorbis_File structure defines an Ogg Vorbis file. +

    + +This structure is used in all libvorbisfile routines. Before it can +be used, it must be initialized by ov_open(), ov_fopen(), or ov_open_callbacks(). Important +Note: The use of ov_open() is +discouraged under Windows due to a peculiarity of Windows linking +convention; use ov_fopen() or ov_open_callbacks() instead. This +caution only applies to Windows; use of ov_open() is appropriate for all other +platforms. See the ov_open() page for more +information. + +

    +After use, the OggVorbis_File structure must be deallocated with a +call to ov_clear(). + +

    +Note that once a file handle is passed to a successful ov_open() call, the handle is owned by +libvorbisfile and will be closed by libvorbisfile later during the +call to ov_clear(). The handle should not +be used or closed outside of the libvorbisfile API. Similarly, files +opened by ov_fopen() will also be closed +internally by vorbisfile in ov_clear().

    + +ov_open_callbacks() allows the +application to choose whether libvorbisfile will or will not close the +handle in ov_clear(); see the ov_open_callbacks() page for more information.

    + +If a call to ov_open() or ov_open_callbacks() fails, +libvorbisfile does not assume ownership of the handle and the +application is expected to close it if necessary. A failed ov_fopen() call will internally close the +file handle if the open process fails.

    + +

    + + + + +
    +
    typedef struct {
    +  void             *datasource; /* Pointer to a FILE *, etc. */
    +  int              seekable;
    +  ogg_int64_t      offset;
    +  ogg_int64_t      end;
    +  ogg_sync_state   oy; 
    +
    +  /* If the FILE handle isn't seekable (eg, a pipe), only the current
    +     stream appears */
    +  int              links;
    +  ogg_int64_t      *offsets;
    +  ogg_int64_t      *dataoffsets;
    +  long             *serialnos;
    +  ogg_int64_t      *pcmlengths;
    +  vorbis_info      *vi;
    +  vorbis_comment   *vc;
    +
    +  /* Decoding working state local storage */
    +  ogg_int64_t      pcm_offset;
    +  int              ready_state;
    +  long             current_serialno;
    +  int              current_link;
    +
    +  ogg_int64_t      bittrack;
    +  ogg_int64_t      samptrack;
    +
    +  ogg_stream_state os; /* take physical pages, weld into a logical
    +                          stream of packets */
    +  vorbis_dsp_state vd; /* central working state for the packet->PCM decoder */
    +  vorbis_block     vb; /* local working space for packet->PCM decode */
    +
    +  ov_callbacks callbacks;
    +
    +} OggVorbis_File;
    +
    + +

    Relevant Struct Members

    +
    +
    datasource
    + +
    Pointer to file or other ogg source. When using stdio based +file/stream access, this field contains a FILE pointer. When using +custom IO via callbacks, libvorbisfile treats this void pointer as a +black box only to be passed to the callback routines provided by the +application.
    + +
    seekable
    +
    Read-only int indicating whether file is seekable. E.g., a physical file is seekable, a pipe isn't.
    +
    links
    +
    Read-only int indicating the number of logical bitstreams within the physical bitstream.
    +
    ov_callbacks
    +
    Collection of file manipulation routines to be used on this data source. When using stdio/FILE access via ov_open(), the callbacks will be filled in with stdio calls or wrappers to stdio calls.
    +
    + +

    +
    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/callbacks.html b/cs/3rd party/libvorbis/doc/vorbisfile/callbacks.html new file mode 100644 index 000000000..20ae55a1c --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/callbacks.html @@ -0,0 +1,121 @@ + + + +Vorbisfile - Callbacks and non-stdio I/O + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    Callbacks and non-stdio I/O

    + +Although stdio is convenient and nearly universally implemented as per +ANSI C, it is not suited to all or even most potential uses of Vorbis. +For additional flexibility, embedded applications may provide their +own I/O functions for use with Vorbisfile when stdio is unavailable or not +suitable. One common example is decoding a Vorbis stream from a +memory buffer.

    + +Use custom I/O functions by populating an ov_callbacks structure and calling ov_open_callbacks() or ov_test_callbacks() rather than the +typical ov_open() or ov_test(). Past the open call, use of +libvorbisfile is identical to using it with stdio. + +

    Read function

    + +The read-like function provided in the read_func field is +used to fetch the requested amount of data. It expects the fetch +operation to function similar to file-access, that is, a multiple read +operations will retrieve contiguous sequential pieces of data, +advancing a position cursor after each read.

    + +The following behaviors are also expected:

    +

      +
    • a return of '0' indicates end-of-data (if the by-thread errno is unset) +
    • short reads mean nothing special (short reads are not treated as error conditions) +
    • a return of zero with the by-thread errno set to nonzero indicates a read error +
    +

    + +

    Seek function

    + +The seek-like function provided in the seek_func field is +used to request non-sequential data access by libvorbisfile, moving +the access cursor to the requested position. The seek function is +optional; if callbacks are only to handle non-seeking (streaming) data +or the application wishes to force streaming behavior, +seek_func and tell_func should be set to NULL. If +the seek function is non-NULL, libvorbisfile mandates the following +behavior: + +
      +
    • The seek function must always return -1 (failure) if the given +data abstraction is not seekable. It may choose to always return -1 +if the application desires libvorbisfile to treat the Vorbis data +strictly as a stream (which makes for a less expensive open +operation).

      + +

    • If the seek function initially indicates seekability, it must +always succeed upon being given a valid seek request.

      + +

    • The seek function must implement all of SEEK_SET, SEEK_CUR and +SEEK_END. The implementation of SEEK_END should set the access cursor +one past the last byte of accessible data, as would stdio +fseek()

      +

    + +

    Close function

    + +The close function should deallocate any access state used by the +passed in instance of the data access abstraction and invalidate the +instance handle. The close function is assumed to succeed; its return +code is not checked.

    + +The close_func may be set to NULL to indicate that libvorbis +should not attempt to close the file/data handle in ov_clear but allow the application to handle +file/data access cleanup itself. For example, by passing the normal +stdio calls as callback functions, but passing a close_func +that is NULL or does nothing (as in the case of OV_CALLBACKS_NOCLOSE), an +application may call ov_clear() and then +later fclose() the file originally passed to libvorbisfile. + +

    Tell function

    + +The tell function is intended to mimic the +behavior of ftell() and must return the byte position of the +next data byte that would be read. If the data access cursor is at +the end of the 'file' (pointing to one past the last byte of data, as +it would be after calling fseek(file,SEEK_END,0)), the tell +function must return the data position (and thus the total file size), +not an error.

    + +The tell function need not be provided if the data IO abstraction is +not seekable, or the application wishes to force streaming +behavior. In this case, the tell_func and seek_func +fields should be set to NULL.

    + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/chaining_example_c.html b/cs/3rd party/libvorbis/doc/vorbisfile/chaining_example_c.html new file mode 100644 index 000000000..e40689ce9 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/chaining_example_c.html @@ -0,0 +1,90 @@ + + + +vorbisfile - chaining_example.c + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    chaining_example.c

    + +

    +The example program source: + +

    + + + + +
    +
    
    +
    +#include <vorbis/codec.h>
    +#include <vorbis/vorbisfile.h>
    +
    +int main(){
    +  OggVorbis_File ov;
    +  int i;
    +
    +#ifdef _WIN32 /* We need to set stdin to binary mode on windows. */
    +  _setmode( _fileno( stdin ), _O_BINARY );
    +#endif
    +
    +  /* open the file/pipe on stdin */
    +  if(ov_open_callbacks(stdin,&ov,NULL,-1,OV_CALLBACKS_NOCLOSE)<0){
    +    printf("Could not open input as an OggVorbis file.\n\n");
    +    exit(1);
    +  }
    +  
    +  /* print details about each logical bitstream in the input */
    +  if(ov_seekable(&ov)){
    +    printf("Input bitstream contained %ld logical bitstream section(s).\n",
    +           ov_streams(&ov));
    +    printf("Total bitstream playing time: %ld seconds\n\n",
    +           (long)ov_time_total(&ov,-1));
    +
    +  }else{
    +    printf("Standard input was not seekable.\n"
    +           "First logical bitstream information:\n\n");
    +  }
    +
    +  for(i=0;i<ov_streams(&ov);i++){
    +    vorbis_info *vi=ov_info(&ov,i);
    +    printf("\tlogical bitstream section %d information:\n",i+1);
    +    printf("\t\t%ldHz %d channels bitrate %ldkbps serial number=%ld\n",
    +           vi->rate,vi->channels,ov_bitrate(&ov,i)/1000,
    +           ov_serialnumber(&ov,i));
    +    printf("\t\tcompressed length: %ld bytes ",(long)(ov_raw_total(&ov,i)));
    +    printf(" play time: %lds\n",(long)ov_time_total(&ov,i));
    +  }
    +
    +  ov_clear(&ov);
    +  return 0;
    +}
    +
    +
    +
    + + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/chainingexample.html b/cs/3rd party/libvorbis/doc/vorbisfile/chainingexample.html new file mode 100644 index 000000000..9e0440d15 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/chainingexample.html @@ -0,0 +1,175 @@ + + + +vorbisfile - Example Code + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    Chaining Example Code

    + +

    +The following is a run-through of the chaining example program supplied +with vorbisfile - chaining_example.c. +This program demonstrates how to work with a chained bitstream. + +

    +First, relevant headers, including vorbis-specific "codec.h" and "vorbisfile.h" have to be included. + +

    + + + + +
    +
    
    +#include "vorbis/codec.h"
    +#include "vorbis/vorbisfile.h"
    +#include "../lib/misc.h"
    +
    +
    + +

    Inside main(), we declare our primary OggVorbis_File structure. We also declare a other helpful variables to track our progress within the file. +

    + + + + +
    +
    
    +int main(){
    +  OggVorbis_File ov;
    +  int i;
    +
    +
    + +

    This example takes its input on stdin which is in 'text' mode by default under Windows; this will corrupt the input data unless set to binary mode. This applies only to Windows. +

    + + + + +
    +
    
    +#ifdef _WIN32 /* We need to set stdin to binary mode under Windows */
    +  _setmode( _fileno( stdin ), _O_BINARY );
    +#endif
    +
    +
    + +

    We call ov_open_callbacks() to +initialize the OggVorbis_File +structure. ov_open_callbacks() +also checks to ensure that we're reading Vorbis format and not +something else. The OV_CALLBACKS_NOCLOSE callbacks instruct +libvorbisfile not to close stdin later during cleanup.

    + +

    + + + + +
    +
    
    +  if(ov_open_callbacks(stdin,&ov,NULL,-1,OV_CALLBACKS_NOCLOSE)<0){
    +    printf("Could not open input as an OggVorbis file.\n\n");
    +    exit(1);
    +  }
    +
    +
    +
    + +

    +First we check to make sure the stream is seekable using ov_seekable. + +

    Then we're going to find the number of logical bitstreams in the physical bitstream using ov_streams. + +

    We use ov_time_total to determine the total length of the physical bitstream. We specify that we want the entire bitstream by using the argument -1. + +

    + + + + +
    +
    
    +  if(ov_seekable(&ov)){
    +    printf("Input bitstream contained %ld logical bitstream section(s).\n",
    +	   ov_streams(&ov));
    +    printf("Total bitstream playing time: %ld seconds\n\n",
    +	   (long)ov_time_total(&ov,-1));
    +
    +  }else{
    +    printf("Standard input was not seekable.\n"
    +	   "First logical bitstream information:\n\n");
    +  }
    +  
    +
    +
    + +

    Now we're going to iterate through each logical bitstream and print information about that bitstream. + +

    We use ov_info to pull out the vorbis_info struct for each logical bitstream. This struct contains bitstream-specific info. + +

    ov_serialnumber retrieves the unique serial number for the logical bistream. ov_raw_total gives the total compressed bytes for the logical bitstream, and ov_time_total gives the total time in the logical bitstream. + +

    + + + + +
    +
    
    +  for(i=0;i<ov_streams(&ov);i++){
    +    vorbis_info *vi=ov_info(&ov,i);
    +    printf("\tlogical bitstream section %d information:\n",i+1);
    +    printf("\t\t%ldHz %d channels bitrate %ldkbps serial number=%ld\n",
    +	   vi->rate,vi->channels,ov_bitrate(&ov,i)/1000,
    +	   ov_serialnumber(&ov,i));
    +    printf("\t\tcompressed length: %ld bytes ",(long)(ov_raw_total(&ov,i)));
    +    printf(" play time: %lds\n",(long)ov_time_total(&ov,i));
    +  } 
    +
    +
    +

    +When we're done with the entire physical bitstream, we need to call ov_clear() to release the bitstream. + +

    + + + + +
    +
    
    +  ov_clear(&ov);
    +  return 0;
    +}
    +
    +
    + +

    +The full source for chaining_example.c can be found with the vorbis +distribution in chaining_example.c. + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/crosslap.html b/cs/3rd party/libvorbis/doc/vorbisfile/crosslap.html new file mode 100644 index 000000000..9d28b0b42 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/crosslap.html @@ -0,0 +1,121 @@ + + + +Vorbisfile - Sample Crosslapping + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    What is Crosslapping?

    + +

    Crosslapping blends two samples together using a window function, +such that any sudden discontinuities between the samples that may +cause clicks or thumps are eliminated or blended away. The technique +is nearly identical to how Vorbis internally splices together frames +of audio data during normal decode. API functions are provided to crosslap transitions between seperate +streams, or to crosslap when seeking within +a single stream. + +

    Why Crosslap?

    +

    The source of boundary clicks

    + +

    Vorbis is a lossy compression format such that any compressed +signal is at best a close approximation of the original. The +approximation may be very good (ie, indistingushable to the human +ear), but it is an approximation nonetheless. Even if a sample or set +of samples is contructed carefully such that transitions from one to +another match perfectly in the original, the compression process +introduces minute amplitude and phase errors. It's an unavoidable +result of such high compression rates. + +

    If an application transitions instantly from one sample to another, +any tiny discrepancy introduced in the lossy compression process +becomes audible as a stairstep discontinuity. Even if the discrepancy +in a normal lapped frame is only .1dB (usually far below the +threshhold of perception), that's a sudden cliff of 380 steps in a 16 +bit sample (when there's a boundary with no lapping). + +

    I thought Vorbis was gapless

    + +

    It is. Vorbis introduces no extra samples at the beginning or end +of a stream, nor does it remove any samples. Gapless encoding +eliminates 99% of the click, pop or outright blown speaker that would +occur if boundaries had gaps or made no effort to align +transitions. However, gapless encoding is not enough to entirely +eliminate stairstep discontinuities all the time for exactly the +reasons described above. + +

    Frame lapping, like Vorbis performs internally during continuous +playback, is necessary to eliminate that last epsilon of trouble. + +

    Easiest Crosslap

    + +The easiest way to perform crosslapping in Vorbis is to use the +lapping functions with no other extra effort. These functions behave +identically to when lapping isn't used except to provide +at-least-very-good lapping results. Crosslapping will not introduce +any samples into or remove any samples from the decoded audio; the +only difference is that the transition is lapped. Lapping occurs from +the current PCM position (either in the old stream, or at the position +prior to calling a lapping seek) forward into the next +half-short-block of audio data to be read from the new stream or +position. + +

    Ideally, vorbisfile internally reads an extra frame of audio from +the old stream/position to perform lapping into the new +stream/position. However, automagic crosslapping works properly even +if the old stream/position is at EOF. In this case, the synthetic +post-extrapolation generated by the encoder to pad out the last block +with appropriate data (and avoid encoding a stairstep, which is +inefficient) is used for crosslapping purposes. Although this is +synthetic data, the result is still usually completely unnoticable +even in careful listening (and always preferable to a click or pop). + +

    Vorbisfile will lap between streams of differing numbers of +channels. Any extra channels from the old stream are ignored; playback +of these channels simply ends. Extra channels in the new stream are +lapped from silence. Vorbisfile will also lap between streams links +of differing sample rates. In this case, the sample rates are ignored +(no implicit resampling is done to match playback). It is up to the +application developer to decide if this behavior makes any sense in a +given context; in practical use, these default behaviors perform +sensibly. + +

    Best Crosslap

    + +

    To acheive the best possible crosslapping results, avoid the case +where synthetic extrapolation data is used for crosslapping. That is, +design loops and samples such that a little bit of data is left over +in sample A when seeking to sample B. Normally, the end of sample A +and the beginning of B would overlap exactly; this allows +crosslapping to perform exactly as it would within vorbis when +stitching audio frames together into continuous decoded audio. + +

    The optimal amount of overlap is half a short-block, and this +varies by compression mode. Each encoder will vary in exact block +size selection; for vorbis 1.0, for -q0 through -q10 and 44kHz or +greater, a half-short block is 64 samples. + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/datastructures.html b/cs/3rd party/libvorbis/doc/vorbisfile/datastructures.html new file mode 100644 index 000000000..00f8f8d74 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/datastructures.html @@ -0,0 +1,61 @@ + + + +Vorbisfile - Base Data Structures + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    Base Data Structures

    +

    There are several data structures used to hold file and bitstream information during libvorbisfile decoding. These structures are declared in "vorbis/vorbisfile.h" and "vorbis/codec.h". +

    +

    When using libvorbisfile, it's not necessary to know about most of the contents of these data structures, but it may be helpful to understand what they contain. +

    + + + + + + + + + + + + + + + + + + + + + + +
    datatypepurpose
    OggVorbis_FileThis structure represents the basic file information. It contains + a pointer to the physical file or bitstream and various information about that bitstream.
    vorbis_commentThis structure contains the file comments. It contains + a pointer to unlimited user comments, information about the number of comments, and a vendor description.
    vorbis_infoThis structure contains encoder-related information about the bitstream. It includes encoder info, channel info, and bitrate limits.
    ov_callbacksThis structure contains pointers to the application-specified file manipulation routines set for use by ov_open_callbacks(). See also the provided document on using application-provided callbacks instead of stdio.
    + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/decoding.html b/cs/3rd party/libvorbis/doc/vorbisfile/decoding.html new file mode 100644 index 000000000..f39437677 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/decoding.html @@ -0,0 +1,92 @@ + + + +Vorbisfile - Decoding + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    Decoding

    + +

    +All libvorbisfile decoding routines are declared in "vorbis/vorbisfile.h". +

    + +After initialization, decoding audio +is as simple as calling ov_read() (or the +similar functions ov_read_float() and +ov_read_filter). This function works +similarly to reading from a normal file using read().

    + +However, a few differences are worth noting: + +

    multiple stream links

    + +A Vorbis stream may consist of multiple sections (called links) that +encode differing numbers of channels or sample rates. It is vitally +important to pay attention to the link numbers returned by ov_read and handle audio changes that may +occur at link boundaries. Such multi-section files do exist in the +wild and are not merely a specification curiosity. + +

    returned data amount

    + +ov_read does not attempt to completely fill +a large, passed in data buffer; it merely guarantees that the passed +back data does not overflow the passed in buffer size. Large buffers +may be filled by iteratively looping over calls to ov_read (incrementing the buffer pointer) +until the original buffer is filled. + +

    file cursor position

    + +Vorbis files do not necessarily start at a sample number or time offset +of zero. Do not be surprised if a file begins at a positive offset of +several minutes or hours, such as would happen if a large stream (such +as a concert recording) is chopped into multiple seperate files. + +

    + + + + + + + + + + + + + + + + + +
    functionpurpose
    ov_readThis function makes up the main chunk of a decode loop. It takes an +OggVorbis_File structure, which must have been initialized by a previous +call to ov_open(), ov_fopen(), +or ov_open_callbacks().
    ov_read_floatThis function decodes to floats instead of integer samples.
    ov_read_filterThis function works like ov_read, but passes the PCM data through the provided filter before converting to integer sample data.
    + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/example.html b/cs/3rd party/libvorbis/doc/vorbisfile/example.html new file mode 100644 index 000000000..e0c4fa392 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/example.html @@ -0,0 +1,208 @@ + + + +Vorbisfile - Example Code + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    Decoding Example Code

    + +

    +The following is a run-through of the decoding example program supplied +with libvorbisfile, vorbisfile_example.c. +This program takes a vorbis bitstream from stdin and writes raw pcm to stdout. + +

    +First, relevant headers, including vorbis-specific "vorbis/codec.h" and "vorbisfile.h" have to be included. + +

    + + + + +
    +
    
    +#include <stdio.h>
    +#include <stdlib.h>
    +#include <math.h>
    +#include "vorbis/codec.h"
    +#include "vorbisfile.h"
    +
    +
    +

    +We also have to make a concession to Windows users here. If we are using windows for decoding, we must declare these libraries so that we can set stdin/stdout to binary. +

    + + + + +
    +
    
    +#ifdef _WIN32
    +#include <io.h>
    +#include <fcntl.h>
    +#endif
    +
    +
    +

    +Next, a buffer for the pcm audio output is declared. + +

    + + + + +
    +
    
    +char pcmout[4096];
    +
    +
    + +

    Inside main(), we declare our primary OggVorbis_File structure. We also declare a few other helpful variables to track out progress within the file. +Also, we make our final concession to Windows users by setting the stdin and stdout to binary mode. +

    + + + + +
    +
    
    +int main(int argc, char **argv){
    +  OggVorbis_File vf;
    +  int eof=0;
    +  int current_section;
    +
    +#ifdef _WIN32
    +  _setmode( _fileno( stdin ), _O_BINARY );
    +  _setmode( _fileno( stdout ), _O_BINARY );
    +#endif
    +
    +
    + +

    We call ov_open_callbacks() to +initialize the OggVorbis_File structure with default values. +ov_open_callbacks() also checks +to ensure that we're reading Vorbis format and not something else. The +OV_CALLBACKS_NOCLOSE callbacks instruct libvorbisfile not to close +stdin later during cleanup. + +

    + + + + +
    +
    
    +  if(ov_open_callbacks(stdin, &vf, NULL, 0, OV_CALLBACKS_NOCLOSE) < 0) {
    +      fprintf(stderr,"Input does not appear to be an Ogg bitstream.\n");
    +      exit(1);
    +  }
    +
    +
    +
    + +

    +We're going to pull the channel and bitrate info from the file using ov_info() and show them to the user. +We also want to pull out and show the user a comment attached to the file using ov_comment(). + +

    + + + + +
    +
    
    +  {
    +    char **ptr=ov_comment(&vf,-1)->user_comments;
    +    vorbis_info *vi=ov_info(&vf,-1);
    +    while(*ptr){
    +      fprintf(stderr,"%s\n",*ptr);
    +      ++ptr;
    +    }
    +    fprintf(stderr,"\nBitstream is %d channel, %ldHz\n",vi->channels,vi->rate);
    +    fprintf(stderr,"\nDecoded length: %ld samples\n",
    +            (long)ov_pcm_total(&vf,-1));
    +    fprintf(stderr,"Encoded by: %s\n\n",ov_comment(&vf,-1)->vendor);
    +  }
    +  
    +
    +
    + +

    +Here's the read loop: + +

    + + + + +
    +
    
    +
    +  while(!eof){
    +    long ret=ov_read(&vf,pcmout,sizeof(pcmout),0,2,1,&current_section);
    +    if (ret == 0) {
    +      /* EOF */
    +      eof=1;
    +    } else if (ret < 0) {
    +      /* error in the stream.  Not a problem, just reporting it in
    +	 case we (the app) cares.  In this case, we don't. */
    +    } else {
    +      /* we don't bother dealing with sample rate changes, etc, but
    +	 you'll have to*/
    +      fwrite(pcmout,1,ret,stdout);
    +    }
    +  }
    +
    +  
    +
    +
    + +

    +The code is reading blocks of data using ov_read(). +Based on the value returned, we know if we're at the end of the file or have invalid data. If we have valid data, we write it to the pcm output. + +

    +Now that we've finished playing, we can pack up and go home. It's important to call ov_clear() when we're finished. + +

    + + + + +
    +
    
    +
    +  ov_clear(&vf);
    +    
    +  fprintf(stderr,"Done.\n");
    +  return(0);
    +}
    +
    +
    + +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/exampleindex.html b/cs/3rd party/libvorbis/doc/vorbisfile/exampleindex.html new file mode 100644 index 000000000..9227b97bb --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/exampleindex.html @@ -0,0 +1,39 @@ + + + +vorbisfile - Documentation + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    VorbisFile Example Code

    + +

    +Three sample programs are included with the vorbisfile distribution. +

    +vorbisfile decoding
    +vorbisfile seeking
    +vorbisfile bitstream chaining
    + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/fileinfo.html b/cs/3rd party/libvorbis/doc/vorbisfile/fileinfo.html new file mode 100644 index 000000000..f7e001921 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/fileinfo.html @@ -0,0 +1,95 @@ + + + +Vorbisfile - File Information + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    File Information

    +

    Libvorbisfile contains many functions to get information about bitstream attributes and decoding status. +

    +All libvorbisfile file information routines are declared in "vorbis/vorbisfile.h". +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    functionpurpose
    ov_bitrateReturns the average bitrate of the current logical bitstream.
    ov_bitrate_instantReturns the exact bitrate since the last call of this function, or -1 if at the beginning of the bitream or no new information is available.
    ov_streamsGives the number of logical bitstreams within the current physical bitstream.
    ov_seekableIndicates whether the bitstream is seekable.
    ov_serialnumberReturns the unique serial number of the specified logical bitstream.
    ov_raw_totalReturns the total (compressed) bytes in a physical or logical seekable bitstream.
    ov_pcm_totalReturns the total number of samples in a physical or logical seekable bitstream.
    ov_time_totalReturns the total time length in seconds of a physical or logical seekable bitstream.
    ov_raw_tellReturns the byte location of the next sample to be read, giving the approximate location in the stream that the decoding engine has reached.
    ov_pcm_tellReturns the sample location of the next sample to be read, giving the approximate location in the stream that the decoding engine has reached.
    ov_time_tellReturns the time location of the next sample to be read, giving the approximate location in the stream that the decoding engine has reached.
    ov_infoReturns the vorbis_info struct for a specific bitstream section.
    ov_commentReturns attached comments for the current bitstream.
    + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/index.html b/cs/3rd party/libvorbis/doc/vorbisfile/index.html new file mode 100644 index 000000000..167e1c0b7 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/index.html @@ -0,0 +1,49 @@ + + + +Vorbisfile - Documentation + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    Vorbisfile Documentation

    + +

    + +The Vorbisfile library provides a convenient high-level API for +decoding and basic manipulation of all Vorbis I audio streams. +Libvorbisfile is implemented as a layer on top of Xiph.Org's reference +libogg and libvorbis libraries.

    + +Vorbisfile can be used along with any ANSI compliant stdio implementation +for file/stream access, or use custom stream i/o routines provided by +the embedded environment. Both uses are described in detail in this +documentation. + +

    +API overview
    +API reference
    +Code Examples
    + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/initialization.html b/cs/3rd party/libvorbis/doc/vorbisfile/initialization.html new file mode 100644 index 000000000..da8395745 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/initialization.html @@ -0,0 +1,118 @@ + + + +Vorbisfile - Setup/Teardown + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    Setup/Teardown

    In order to decode audio using +libvorbisfile, a bitstream containing Vorbis audio must be properly +initialized before decoding and cleared when decoding is finished. +The simplest possible case is to use ov_fopen() to open the file for access, check +it for Vorbis content, and prepare it for playback. A successful return code from ov_fopen() indicates the file is ready for use. +Once the file is no longer needed, ov_clear() is used to close the file and +deallocate decoding resources.

    + +An application that requires more setup flexibility may open a data +stream using ov_open_callbacks() +to change default libvorbis behavior or specify non-stdio data access +mechanisms.

    + +

    +All libvorbisfile initialization and deallocation routines are declared in "vorbis/vorbisfile.h". +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    functionpurpose
    ov_fopenOpens a file and initializes the Ogg Vorbis bitstream with default values. This must be called before other functions in the library may be + used.
    ov_openInitializes the Ogg Vorbis bitstream with default values from a passed in file handle. This must be called before other functions in the library may be + used. Do not use this call under Windows [a]; Use ov_fopen() or ov_open_callbacks() instead.
    ov_open_callbacksInitializes the Ogg Vorbis bitstream from a file handle and custom file/bitstream manipulation routines. Used instead of ov_open() or ov_fopen() when altering or replacing libvorbis's default stdio I/O behavior, or when a bitstream must be initialized from a FILE * under Windows.
    ov_testPartially opens a file just far enough to determine if the file +is an Ogg Vorbis file or not. A successful return indicates that the +file appears to be an Ogg Vorbis file, but the OggVorbis_File struct is not yet fully +initialized for actual decoding. After a successful return, the file +may be closed using ov_clear() or fully +opened for decoding using ov_test_open().

    This call is intended to +be used as a less expensive file open test than a full ov_open().

    +Note that libvorbisfile owns the passed in file resource is it returns success; do not fclose() files owned by libvorbisfile.

    ov_test_callbacksAs above but allowing application-define I/O callbacks.

    +Note that libvorbisfile owns the passed in file resource is it returns success; do not fclose() files owned by libvorbisfile.

    ov_test_open +Finish opening a file after a successful call to ov_test() or ov_test_callbacks().
    ov_clear Closes the + bitstream and cleans up loose ends. Must be called when + finished with the bitstream. After return, the OggVorbis_File struct is + invalid and may not be used before being initialized again + before begin reinitialized. + +
    + +

    +


    + + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_bitrate.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_bitrate.html new file mode 100644 index 000000000..eb3c4d742 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_bitrate.html @@ -0,0 +1,72 @@ + + + +Vorbisfile - function - ov_bitrate + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_bitrate

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    This function returns the average bitrate for the specified logical bitstream. This may be different from the ov_info->nominal_bitrate value, as it is based on the actual average for this bitstream if the file is seekable. +

    Nonseekable files will return the nominal bitrate setting or the average of the upper and lower bounds, if any of these values are set. +

    + +

    + + + + +
    +
    
    +long ov_bitrate(OggVorbis_File *vf,int i);
    +
    +
    + +

    Parameters

    +
    +
    vf
    +
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisfile +functions.
    +
    i
    +
    Link to the desired logical bitstream. For nonseekable files, this argument is ignored. To retrieve the bitrate for the entire bitstream, this parameter should be set to -1.
    +
    + + +

    Return Values

    +
    +
  • OV_EINVAL indicates that an invalid argument value was submitted or that the stream represented by vf is not open.
  • +
  • OV_FALSE means the call returned a 'false' status, which in this case most likely indicates that the file is nonseekable and the upper, lower, and nominal bitrates were unset. +
  • n indicates the bitrate for the given logical bitstream or the entire + physical bitstream. If the file is open for random (seekable) access, it will + find the *actual* average bitrate. If the file is streaming (nonseekable), it + returns the nominal bitrate (if set) or else the average of the + upper/lower bounds (if set).
  • +
    +

    + + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_bitrate_instant.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_bitrate_instant.html new file mode 100644 index 000000000..da44dcff6 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_bitrate_instant.html @@ -0,0 +1,65 @@ + + + +Vorbisfile - function - ov_bitrate + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_bitrate_instant

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    Used to find the most recent bitrate played back within the file. Will return 0 if the bitrate has not changed or it is the beginning of the file. + +

    + + + + +
    +
    
    +long ov_bitrate_instant(OggVorbis_File *vf);
    +
    +
    + +

    Parameters

    +
    +
    vf
    +
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisfile +functions. +
    + + +

    Return Values

    +
    +
  • 0 indicates the beginning of the file or unchanged bitrate info.
  • +
  • n indicates the actual bitrate since the last call.
  • +
  • OV_FALSE indicates that playback is not in progress, and thus there is no instantaneous bitrate information to report.
  • +
  • OV_EINVAL indicates that the stream represented by vf is not open.
  • +
    +

    + + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_callbacks.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_callbacks.html new file mode 100644 index 000000000..d1b64be89 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_callbacks.html @@ -0,0 +1,117 @@ + + + +Vorbisfile - datatype - ov_callbacks + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_callbacks

    + +

    declared in "vorbis/codec.h"

    + +

    +The ov_callbacks structure contains file manipulation function prototypes necessary for opening, closing, seeking, and location. + +

    +The ov_callbacks structure does not need to be user-defined if you are +working with stdio-based file manipulation; the ov_fopen() and ov_open() calls internally provide default callbacks for +stdio. ov_callbacks are defined and passed to ov_open_callbacks() when +implementing non-stdio based stream manipulation (such as playback +from a memory buffer) or when ov_open()-style initialization from a FILE * is required under Windows [a]. +

    + + + + + +
    +
    typedef struct {
    +  size_t (*read_func)  (void *ptr, size_t size, size_t nmemb, void *datasource);
    +  int    (*seek_func)  (void *datasource, ogg_int64_t offset, int whence);
    +  int    (*close_func) (void *datasource);
    +  long   (*tell_func)  (void *datasource);
    +} ov_callbacks;
    +
    + +

    Relevant Struct Members

    +
    +
    read_func
    +
    Pointer to custom data reading function.
    +
    seek_func
    +
    Pointer to custom data seeking function. If the data source is not seekable (or the application wants the data source to be treated as unseekable at all times), the provided seek callback should always return -1 (failure) or the seek_func and tell_func fields should be set to NULL.
    +
    close_func
    +
    Pointer to custom data source closure function. Set to NULL if libvorbisfile should not attempt to automatically close the file/data handle.
    +
    tell_func
    +
    Pointer to custom data location function. If the data source is not seekable (or the application wants the data source to be treated as unseekable at all times), the provided tell callback should always return -1 (failure) or the seek_func and tell_func fields should be set to NULL.
    +
    + +

    + +

    Predefined callbacks

    +The header vorbis/vorbisfile.h provides several predefined static ov_callbacks structures that may be passed to ov_open_callbacks(): +
    +
    OV_CALLBACKS_DEFAULT
    + +These callbacks provide the same behavior as used internally by ov_fopen() and ov_open(). + +
    OV_CALLBACKS_NOCLOSE
    + +The same as OV_CALLBACKS_DEFAULT, but with the +close_func field set to NULL. The most typical use would be +to use ov_open_callbacks() to +provide the same behavior as ov_open(), but +not close the file/data handle in ov_clear(). + +
    OV_CALLBACKS_STREAMONLY
    + +A set of callbacks that set seek_func and tell_func +to NULL, thus forcing strict streaming-only behavior regardless of +whether or not the input is actually seekable. + +
    OV_CALLBACKS_STREAMONLY_NOCLOSE
    + +The same as OV_CALLBACKS_STREAMONLY, but with +close_func also set to null, preventing libvorbisfile from +attempting to close the file/data handle in ov_clear(). + +
    +

    + +

    Examples and usage

    + +See the callbacks and non-stdio I/O document for more +detailed information on required behavior of the various callback +functions.

    + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_clear.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_clear.html new file mode 100644 index 000000000..e67107c0c --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_clear.html @@ -0,0 +1,64 @@ + + + +Vorbisfile - function - ov_clear + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_clear

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    After a bitstream has been opened using ov_fopen()/ov_open()/ov_open_callbacks() and decoding is complete, the application must call ov_clear() to clear +the decoder's buffers. ov_clear() will also close the file unless it was opened using ov_open_callbacks() with the close_func callback set to NULL.

    + +ov_clear() must also be called after a successful call to ov_test() or ov_test_callbacks().

    + +

    + + + + +
    +
    
    +int ov_clear(OggVorbis_File *vf);
    +
    +
    + +

    Parameters

    +
    +
    vf
    +
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisfile +functions. After ov_clear has been called, the contents of this structure are deallocated, and it can no longer be used without being reinitialized by a call to ov_fopen(), ov_open() or ov_open_callbacks().
    +
    + + +

    Return Values

    +
    +
  • 0 for success
  • +
    + + +

    +
    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_comment.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_comment.html new file mode 100644 index 000000000..9f1b499b3 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_comment.html @@ -0,0 +1,66 @@ + + + +Vorbisfile - function - ov_bitrate + + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_comment

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    Returns a pointer to the vorbis_comment struct for the specified bitstream. For nonseekable streams, returns the struct for the current bitstream. +

    + +

    + + + + +
    +
    
    +vorbis_comment *ov_comment(OggVorbis_File *vf,int link);
    +
    +
    + +

    Parameters

    +
    +
    vf
    +
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisfile +functions.
    +
    i
    +
    Link to the desired logical bitstream. For nonseekable files, this argument is ignored. To retrieve the vorbis_comment struct for the current bitstream, this parameter should be set to -1.
    +
    + + +

    Return Values

    +
    +
  • Returns the vorbis_comment struct for the specified bitstream.
  • +
  • NULL if the specified bitstream does not exist or the file has been initialized improperly.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_crosslap.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_crosslap.html new file mode 100644 index 000000000..0b2b1020f --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_crosslap.html @@ -0,0 +1,100 @@ + + + +Vorbisfile - function - ov_crosslap + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_crosslap()

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    ov_crosslap overlaps and blends the boundary at a transition +between two separate streams represented by separate OggVorbis_File structures. For lapping +transitions due to seeking within a single stream represented by a +single OggVorbis_File structure, +consider using the lapping versions of the vorbisfile seeking functions instead. + +

    ov_crosslap is used between the last (usually ov_read) call on +the old stream and the first ov_read from the new stream. Any +desired positioning of the new stream must occur before the call to +ov_crosslap() as a seek dumps all prior lapping information from a +stream's decode state. Crosslapping does not introduce or remove any +extraneous samples; positioning works exactly as if ov_crosslap was not +called. + +

    ov_crosslap will lap between streams of differing numbers of +channels. Any extra channels from the old stream are ignored; playback +of these channels simply ends. Extra channels in the new stream are +lapped from silence. ov_crosslap will also lap between streams links +of differing sample rates. In this case, the sample rates are ignored +(no implicit resampling is done to match playback). It is up to the +application developer to decide if this behavior makes any sense in a +given context; in practical use, these default behaviors perform +sensibly. + +

    + + + + +
    +
    
    +long ov_crosslap(OggVorbis_File *old, OggVorbis_File *new);
    +
    +
    +
    + +

    Parameters

    +
    +
    old
    +
    A pointer to the OggVorbis_File structure representing the origin stream from which to transition playback.
    + +
    new
    +
    A pointer to the OggVorbis_File structure representing the stream with which playback continues.
    +
    + + +

    Return Values

    +
    +
    +
    OV_EINVAL
    +
    crosslap called with an OggVorbis_File structure that isn't open.
    +
    OV_EFAULT
    +
    internal error; implies a library bug or external heap corruption.
    +
    OV_EREAD
    +
    A read from media returned an error.
    +
    OV_EOF
    +
    indicates stream vf2 is at end of file, or that vf1 is at end of file immediately after a seek (making crosslap impossible as there's no preceding decode state to crosslap).
    +
    0
    +
    success.
    +
    +
    + + + +

    +
    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_fopen.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_fopen.html new file mode 100644 index 000000000..9a7b14b6d --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_fopen.html @@ -0,0 +1,124 @@ + + + +Vorbisfile - function - ov_fopen + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_fopen

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    This is the simplest function used to open and initialize an OggVorbis_File +structure. It sets up all the related decoding structure. +

    The first argument is a file path suitable +for passing to fopen(). vf should be a pointer to an empty +OggVorbis_File structure -- this is used for ALL the externally visible +libvorbisfile functions. Once this has been called, the same OggVorbis_File struct should be passed +to all the libvorbisfile functions. +

    The vf structure initialized using ov_fopen() must +eventually be cleaned using ov_clear(). + +

    +It is often useful to call ov_fopen() simply to determine +whether a given file is a Vorbis bitstream. If the ov_fopen() +call fails, then the file is either inaccessable (errno is set) or not +recognizable as Vorbis (errno unchanged). If the call succeeds but +the initialized vf structure will not be used, the +application is responsible for calling ov_clear() to clear the decoder's buffers and +close the file.

    + +

    + + + + +
    +
    
    +int ov_fopen(const char *path,OggVorbis_File *vf);
    +
    +
    + +

    Parameters

    +
    +
    path
    +
    Null terminated string containing a file path suitable for passing to fopen(). +
    +
    vf
    +
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisfile +functions. Once this has been called, the same OggVorbis_File +struct should be passed to all the libvorbisfile functions.
    +
    + + +

    Return Values

    +
    +
  • 0 indicates success
  • + +
  • less than zero for failure:
  • +
      +
    • OV_EREAD - A read from media returned an error.
    • +
    • OV_ENOTVORBIS - Bitstream does not contain any Vorbis data.
    • +
    • OV_EVERSION - Vorbis version mismatch.
    • +
    • OV_EBADHEADER - Invalid Vorbis bitstream header.
    • +
    • OV_EFAULT - Internal logic fault; indicates a bug or heap/stack corruption.
    • +
    +
    +

    + +

    Notes

    +
    + +
    [a] Threaded decode

    +

    If your decoder is threaded, it is recommended that you NOT call +ov_open_callbacks() +in the main control thread--instead, call ov_open_callbacks() in your decode/playback +thread. This is important because ov_open_callbacks() may be a fairly time-consuming +call, given that the full structure of the file is determined at this point, +which may require reading large parts of the file under certain circumstances +(determining all the logical bitstreams in one physical bitstream, for +example). See Thread Safety for other information on using libvorbisfile with threads. +

    + +

    [b] Mixed media streams

    +

    +As of Vorbisfile release 1.2.0, Vorbisfile is able to access the +Vorbis content in mixed-media Ogg streams, not just Vorbis-only +streams. For example, Vorbisfile may be used to open and access the +audio from an Ogg stream consisting of Theora video and Vorbis audio. +Vorbisfile 1.2.0 decodes the first logical audio stream of each +physical stream section.

    + +

    [c] Faster testing for Vorbis files

    +

    ov_test() and ov_test_callbacks() provide less +computationally expensive ways to test a file for Vorbisness, but +require more setup code.

    + +

    + +

    +
    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_info.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_info.html new file mode 100644 index 000000000..b94fa684f --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_info.html @@ -0,0 +1,64 @@ + + + +Vorbisfile - function - ov_info + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_info

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    Returns the vorbis_info struct for the specified bitstream. For nonseekable files, always returns the current vorbis_info struct. + +

    + + + + +
    +
    
    +vorbis_info *ov_info(OggVorbis_File *vf,int link);
    +
    +
    + +

    Parameters

    +
    +
    vf
    +
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisfile +functions.
    +
    i
    +
    Link to the desired logical bitstream. For nonseekable files, this argument is ignored. To retrieve the vorbis_info struct for the current bitstream, this parameter should be set to -1.
    +
    + + +

    Return Values

    +
    +
  • Returns the vorbis_info struct for the specified bitstream. Returns vorbis_info for current bitstream if the file is nonseekable or i=-1.
  • +
  • NULL if the specified bitstream does not exist or the file has been initialized improperly.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_open.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_open.html new file mode 100644 index 000000000..d0311ce98 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_open.html @@ -0,0 +1,183 @@ + + + +Vorbisfile - function - ov_open + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_open

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    ov_open is one of three initialization functions used to initialize +an OggVorbis_File structure and prepare a bitstream for playback. + +

    WARNING for Windows developers: Do not use ov_open() in +Windows applications; Windows linking places restrictions on +passing FILE * handles successfully, and ov_open() runs +afoul of these restrictions [a]. See the ov_open_callbacks() page for +details on using ov_open_callbacks() instead. + +

    The first argument must be a file pointer to an already opened file +or pipe (it need not be seekable--though this obviously restricts what +can be done with the bitstream). vf should be a pointer to the +OggVorbis_File structure -- this is used for ALL the externally visible libvorbisfile +functions. Once this has been called, the same OggVorbis_File +struct should be passed to all the libvorbisfile functions.

    + +The vf structure initialized using ov_fopen() must eventually +be cleaned using ov_clear(). Once a +FILE * handle is passed to ov_open() successfully, the +application MUST NOT fclose() or in any other way manipulate +that file handle. Vorbisfile will close the file in ov_clear(). If the application must be able +to close the FILE * handle itself, see ov_open_callbacks() with the use of +OV_CALLBACKS_NOCLOSE. + +

    It is often useful to call ov_open() simply to determine +whether a given file is a Vorbis bitstream. If the ov_open() +call fails, then the file is not recognizable as Vorbis. If the call +succeeds but the initialized vf structure will not be used, +the application is responsible for calling ov_clear() to clear the decoder's buffers and +close the file.

    + +If [and only if] an ov_open() call fails, the application +must explicitly fclose() the FILE * pointer itself. + + +

    + + + + +
    +
    
    +int ov_open(FILE *f,OggVorbis_File *vf,char *initial,long ibytes);
    +
    +
    + +

    Parameters

    +
    +
    f
    +
    File pointer to an already opened file +or pipe (it need not be seekable--though this obviously restricts what +can be done with the bitstream).
    +
    vf
    +
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisfile +functions. Once this has been called, the same OggVorbis_File +struct should be passed to all the libvorbisfile functions.
    +
    initial
    +
    Typically set to NULL. This parameter is useful if some data has already been +read from the file and the stream is not seekable. It is used in conjunction with ibytes. In this case, initial +should be a pointer to a buffer containing the data read.
    +
    ibytes
    +
    Typically set to 0. This parameter is useful if some data has already been +read from the file and the stream is not seekable. In this case, ibytes +should contain the length (in bytes) of the buffer. Used together with initial
    +
    + + +

    Return Values

    +
    +
  • 0 indicates success
  • + +
  • less than zero for failure:
  • +
      +
    • OV_EREAD - A read from media returned an error.
    • +
    • OV_ENOTVORBIS - Bitstream is not Vorbis data.
    • +
    • OV_EVERSION - Vorbis version mismatch.
    • +
    • OV_EBADHEADER - Invalid Vorbis bitstream header.
    • +
    • OV_EFAULT - Internal logic fault; indicates a bug or heap/stack corruption.
    • +
    +
    +

    + + +

    Notes

    +
    + + +
    [a] Windows and ov_open()

    + +

    Under Windows, stdio file access is implemented in each of many +variants of crt.o, several of which are typically installed on any one +Windows machine. If libvorbisfile and the application using +libvorbisfile are not linked against the exact same +version/variant/build of crt.o (and they usually won't be, especially +using a prebuilt libvorbis DLL), FILE * handles cannot be +opened in the application and then passed to vorbisfile to be used +by stdio calls from vorbisfile's different version of CRT. For this +reason, using ov_open() under Windows +without careful, expert linking will typically cause a protection +fault. Windows programmers should use ov_fopen() (which will only use libvorbis's +crt.o) or ov_open_callbacks() +(which will only use the application's crt.o) instead.

    + +This warning only applies to Windows and only applies to ov_open(). It is perfectly safe to use ov_open() on all other platforms.

    + +For more information, see the following microsoft pages on C +runtime library linking and a specific description of restrictions +on passing CRT objects across DLL boundaries. + +

    + +

    [b] Threaded decode

    +

    If your decoder is threaded, it is recommended that you NOT call +ov_open() +in the main control thread--instead, call ov_open() in your decode/playback +thread. This is important because ov_open() may be a fairly time-consuming +call, given that the full structure of the file is determined at this point, +which may require reading large parts of the file under certain circumstances +(determining all the logical bitstreams in one physical bitstream, for +example). See Thread Safety for other information on using libvorbisfile with threads. +

    + +

    [c] Mixed media streams

    +

    +As of Vorbisfile release 1.2.0, Vorbisfile is able to access the +Vorbis content in mixed-media Ogg streams, not just Vorbis-only +streams. For example, Vorbisfile may be used to open and access the +audio from an Ogg stream consisting of Theora video and Vorbis audio. +Vorbisfile 1.2.0 decodes the first logical audio stream of each +physical stream section.

    + +

    [d] Faster testing for Vorbis files

    +

    ov_test() and ov_test_callbacks() provide less +computationally expensive ways to test a file for Vorbisness, but +require more setup code.

    + +

    + +

    +
    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_open_callbacks.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_open_callbacks.html new file mode 100644 index 000000000..6d59e0b66 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_open_callbacks.html @@ -0,0 +1,147 @@ + + + +Vorbisfile - function - ov_open_callbacks + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_open_callbacks

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    This is an alternative function used to open and initialize an +OggVorbis_File structure when using a data source other than a file, +when its necessary to modify default file access behavior, or to +initialize a Vorbis decode from a FILE * pointer under +Windows where ov_open() cannot be used. It +allows the application to specify custom file manipulation routines +and sets up all the related decoding structures. + +

    Once ov_open_callbacks() has been called, the same +OggVorbis_File struct should be passed to all the +libvorbisfile functions. Unlike ov_fopen() and ov_open(), ov_open_callbacks() may be used to +instruct vorbisfile to either automatically close or not to close the +file/data access handle in ov_clear(). +Automatic closure is disabled by passing NULL as the close callback, +or using one of the predefined callback sets that specify a NULL close +callback. The application is responsible for closing a file when a +call to ov_open_callbacks() is unsuccessful.

    + +See also Callbacks and Non-stdio I/O for +information on designing and specifying custom callback functions.

    + +

    + + + + +
    +
    
    +int ov_open_callbacks(void *datasource, OggVorbis_File *vf, char *initial, long ibytes, ov_callbacks callbacks);
    +
    +
    + +

    Parameters

    +
    +
    datasource
    +
    Pointer to a data structure allocated by the calling application, containing any state needed by the callbacks provided.
    +
    vf
    +
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisfile +functions. Once this has been called, the same OggVorbis_File +struct should be passed to all the libvorbisfile functions.
    +
    initial
    +
    Typically set to NULL. This parameter is useful if some data has already been +read from the stream and the stream is not seekable. It is used in conjunction with ibytes. In this case, initial +should be a pointer to a buffer containing the data read.
    +
    ibytes
    +
    Typically set to 0. This parameter is useful if some data has already been +read from the stream and the stream is not seekable. In this case, ibytes +should contain the length (in bytes) of the buffer. Used together with initial.
    +
    callbacks
    +
    A completed ov_callbacks struct which indicates desired custom file manipulation routines. vorbisfile.h defines several preprovided callback sets; see ov_callbacks for details.
    +
    + + +

    Return Values

    +
    +
  • 0 for success
  • +
  • less than zero for failure:
  • +
      +
    • OV_EREAD - A read from media returned an error.
    • +
    • OV_ENOTVORBIS - Bitstream does not contain any Vorbis data.
    • +
    • OV_EVERSION - Vorbis version mismatch.
    • +
    • OV_EBADHEADER - Invalid Vorbis bitstream header.
    • +
    • OV_EFAULT - Internal logic fault; indicates a bug or heap/stack corruption.
    • +
    +
    +

    + +

    Notes

    +
    + +
    [a] Windows and use as an ov_open() substitute

    Windows +applications should not use ov_open() due +to the likelihood of CRT linking +mismatches and runtime protection faults +[ov_open:a]. ov_open_callbacks() is a safe substitute; specifically: + +

    ov_open_callbacks(f, vf, initial, ibytes, OV_CALLBACKS_DEFAULT);
    +
    + +... provides exactly the same functionality as ov_open() but will always work correctly under +Windows, regardless of linking setup details.

    + +

    [b] Threaded decode

    +

    If your decoder is threaded, it is recommended that you NOT call +ov_open_callbacks() +in the main control thread--instead, call ov_open_callbacks() in your decode/playback +thread. This is important because ov_open_callbacks() may be a fairly time-consuming +call, given that the full structure of the file is determined at this point, +which may require reading large parts of the file under certain circumstances +(determining all the logical bitstreams in one physical bitstream, for +example). See Thread Safety for other information on using libvorbisfile with threads. +

    + +

    [c] Mixed media streams

    +

    +As of Vorbisfile release 1.2.0, Vorbisfile is able to access the +Vorbis content in mixed-media Ogg streams, not just Vorbis-only +streams. For example, Vorbisfile may be used to open and access the +audio from an Ogg stream consisting of Theora video and Vorbis audio. +Vorbisfile 1.2.0 decodes the first logical audio stream of each +physical stream section.

    + +

    [d] Faster testing for Vorbis files

    +

    ov_test() and ov_test_callbacks() provide less +computationally expensive ways to test a file for Vorbisness, but +require more setup code.

    + +

    + +

    +
    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_pcm_seek.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_pcm_seek.html new file mode 100644 index 000000000..81b0c1c3c --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_pcm_seek.html @@ -0,0 +1,83 @@ + + + +Vorbisfile - function - ov_pcm_seek + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_pcm_seek

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    Seeks to the offset specified (in pcm samples) within the physical bitstream. This function only works for seekable streams. +

    This also updates everything needed within the +decoder, so you can immediately call ov_read() and get data from +the newly seeked to position. +

    + +

    + + + + +
    +
    
    +int ov_pcm_seek(OggVorbis_File *vf,ogg_int64_t pos);
    +
    +
    + +

    Parameters

    +
    +
    vf
    +
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisfile +functions.
    +
    pos
    +
    Position in pcm samples to seek to in the bitstream.
    +
    + + +

    Return Values

    +
    +
      +
    • 0 for success
    • + +
    • +nonzero indicates failure, described by several error codes: +
        +
      • OV_ENOSEEK - Bitstream is not seekable. +
      • +
      • OV_EINVAL - Invalid argument value; possibly called with an OggVorbis_File structure that isn't open. +
      • +
      • OV_EREAD - A read from media returned an error. +
      • +
      • OV_EFAULT - Internal logic fault; indicates a bug or heap/stack + corruption. +
      • +
      • OV_EBADLINK - Invalid stream section supplied to libvorbisfile, or the requested link is corrupt. +
      • +
    • +
    + +

    +
    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_pcm_seek_lap.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_pcm_seek_lap.html new file mode 100644 index 000000000..6310e427b --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_pcm_seek_lap.html @@ -0,0 +1,103 @@ + + + +Vorbisfile - function - ov_pcm_seek_lap + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_pcm_seek_lap

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    Seeks to the offset specified (in pcm samples) within the physical bitstream. This variant of ov_pcm_seek also automatically +crosslaps the transition from the previous playback position into the +new playback position in order to eliminate clicking and boundary +discontinuities. Otherwise, usage and behavior is identical to ov_pcm_seek. + +

    ov_pcm_seek_lap also updates everything needed within the decoder, +so you can immediately call ov_read() and +get data from the newly seeked to position. + +

    ov_pcm_seek_lap will lap between logical stream links of differing +numbers of channels. Any extra channels from the origin of the seek +are ignored; playback of these channels simply ends. Extra channels at +the destination are lapped from silence. ov_pcm_seek_lap will also +lap between logical stream links of differing sample rates. In this +case, the sample rates are ignored (no implicit resampling is done to +match playback). It is up to the application developer to decide if +this behavior makes any sense in a given context; in practical use, +these default behaviors perform sensibly. + +

    This function only works for seekable streams. + +

    + + + + +
    +
    
    +int ov_pcm_seek_lap(OggVorbis_File *vf,ogg_int64_t pos);
    +
    +
    + +

    Parameters

    +
    +
    vf
    +
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisfile +functions.
    +
    pos
    +
    Position in pcm samples to seek to in the bitstream.
    +
    + + +

    Return Values

    +
    +
      +
    • 0 for success
    • + +
    • +nonzero indicates failure, described by several error codes: +
        +
      • OV_ENOSEEK - Bitstream is not seekable. +
      • +
      • OV_EINVAL - Invalid argument value; possibly called with an OggVorbis_File structure that isn't open. +
      • +
      • OV_EREAD - A read from media returned an error. +
      • +
      • OV_EFAULT - Internal logic fault; indicates a bug or heap/stack + corruption. +
      • +
      • OV_EOF - Indicates stream is at end of file immediately after a seek + (making crosslap impossible as there's no preceeding decode state to crosslap). +
      • +
      • OV_EBADLINK - Invalid stream section supplied to libvorbisfile, or the requested link is corrupt. +
      • +
    • +
    + +

    +
    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_pcm_seek_page.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_pcm_seek_page.html new file mode 100644 index 000000000..8f1959ac1 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_pcm_seek_page.html @@ -0,0 +1,84 @@ + + + +Vorbisfile - function - ov_pcm_seek_page + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_pcm_seek_page

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    Seeks to the closest page preceding the specified location (in pcm samples) within the physical bitstream. This function only works for seekable streams. +

    This function is faster than ov_pcm_seek because the function can begin decoding at a page boundary rather than seeking through any remaining samples before the specified location. However, it is less accurate. +

    This also updates everything needed within the +decoder, so you can immediately call ov_read() and get data from +the newly seeked to position. +

    + +

    + + + + +
    +
    
    +int ov_pcm_seek_page(OggVorbis_File *vf,ogg_int64_t pos);
    +
    +
    + +

    Parameters

    +
    +
    vf
    +
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisfile +functions.
    +
    pos
    +
    Position in pcm samples to seek to in the bitstream.
    +
    + + +

    Return Values

    +
    +
      +
    • 0 for success
    • + +
    • +nonzero indicates failure, described by several error codes: +
        +
      • OV_ENOSEEK - Bitstream is not seekable. +
      • +
      • OV_EINVAL - Invalid argument value; possibly called with an OggVorbis_File structure that isn't open. +
      • +
      • OV_EREAD - A read from media returned an error. +
      • +
      • OV_EFAULT - Internal logic fault; indicates a bug or heap/stack + corruption. +
      • +
      • OV_EBADLINK - Invalid stream section supplied to libvorbisfile, or the requested link is corrupt. +
      • +
    • +
    + +

    +
    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_pcm_seek_page_lap.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_pcm_seek_page_lap.html new file mode 100644 index 000000000..d9694e87d --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_pcm_seek_page_lap.html @@ -0,0 +1,112 @@ + + + +Vorbisfile - function - ov_pcm_seek_page_lap + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_pcm_seek_page_lap

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    Seeks to the closest page preceding the specified location (in pcm +samples) within the physical bitstream. This variant of ov_pcm_seek_page also automatically +crosslaps the transition from the previous playback position into the +new playback position in order to eliminate clicking and boundary +discontinuities. Otherwise, usage and behavior is identical to ov_pcm_seek_page. + +

    This function is faster than ov_pcm_seek_lap because the function +can begin decoding at a page boundary rather than seeking through any +remaining samples before the specified location. However, it is less +accurate. + +

    ov_pcm_seek_page_lap also updates everything needed within the +decoder, so you can immediately call ov_read() and get data from the newly seeked +to position. + +

    ov_pcm_seek_page_lap will lap between logical stream links of +differing numbers of channels. Any extra channels from the origin of +the seek are ignored; playback of these channels simply ends. Extra +channels at the destination are lapped from silence. +ov_pcm_seek_page_lap will also lap between logical stream links of +differing sample rates. In this case, the sample rates are ignored +(no implicit resampling is done to match playback). It is up to the +application developer to decide if this behavior makes any sense in a +given context; in practical use, these default behaviors perform +sensibly. + +

    This function only works for seekable streams. + +

    + + + + +
    +
    
    +int ov_pcm_seek_page_lap(OggVorbis_File *vf,ogg_int64_t pos);
    +
    +
    + +

    Parameters

    +
    +
    vf
    +
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisfile +functions.
    +
    pos
    +
    Position in pcm samples to seek to in the bitstream.
    +
    + + +

    Return Values

    +
    +
      +
    • 0 for success
    • + +
    • +nonzero indicates failure, described by several error codes: +
        +
      • OV_ENOSEEK - Bitstream is not seekable. +
      • +
      • OV_EINVAL - Invalid argument value; possibly called with an OggVorbis_File structure that isn't open. +
      • +
      • OV_EREAD - A read from media returned an error. +
      • +
      • OV_EFAULT - Internal logic fault; indicates a bug or heap/stack + corruption. +
      • +
      • OV_EOF - Indicates stream is at end of file immediately after a seek + (making crosslap impossible as there's no preceeding decode state to crosslap). +
      • +
      • OV_EBADLINK - Invalid stream section supplied to libvorbisfile, or the requested link is corrupt. +
      • +
    • +
    + +

    +
    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_pcm_tell.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_pcm_tell.html new file mode 100644 index 000000000..2d8ea83df --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_pcm_tell.html @@ -0,0 +1,63 @@ + + + +Vorbisfile - function - ov_pcm_tell + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_pcm_tell

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    Returns the current offset in samples. + +

    + + + + +
    +
    
    +ogg_int64_t ov_pcm_tell(OggVorbis_File *vf);
    +
    +
    + +

    Parameters

    +
    +
    vf
    +
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisfile +functions.
    +
    + + +

    Return Values

    +
    +
  • n indicates the current offset in samples.
  • +
  • OV_EINVAL means that the argument was invalid. In this case, the requested bitstream did not exist.
  • +
    +

    + + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_pcm_total.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_pcm_total.html new file mode 100644 index 000000000..297a8e182 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_pcm_total.html @@ -0,0 +1,67 @@ + + + +Vorbisfile - function - ov_pcm_total + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_pcm_total

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    Returns the total pcm samples of the physical bitstream or a specified logical bitstream. + +

    + + + + +
    +
    
    +ogg_int64_t ov_pcm_total(OggVorbis_File *vf,int i);
    +
    +
    + +

    Parameters

    +
    +
    vf
    +
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisfile +functions.
    +
    i
    +
    Link to the desired logical bitstream. To retrieve the total pcm samples for the entire physical bitstream, this parameter should be set to -1.
    +
    + + +

    Return Values

    +
    +
  • OV_EINVAL means that the argument was invalid. In this case, the requested bitstream did not exist or the bitstream is unseekable.
  • +
  • +total length in pcm samples of content if i=-1.
  • +
  • length in pcm samples of logical bitstream if i=0 to n.
  • +
    +

    + + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_raw_seek.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_raw_seek.html new file mode 100644 index 000000000..04ed549c3 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_raw_seek.html @@ -0,0 +1,83 @@ + + + +Vorbisfile - function - ov_raw_seek + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_raw_seek

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    Seeks to the offset specified (in compressed raw bytes) within the physical bitstream. This function only works for seekable streams. +

    This also updates everything needed within the +decoder, so you can immediately call ov_read() and get data from +the newly seeked to position. +

    When seek speed is a priority, this is the best seek funtion to use. +

    + + + + +
    +
    
    +int ov_raw_seek(OggVorbis_File *vf,long pos);
    +
    +
    + +

    Parameters

    +
    +
    vf
    +
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisfile +functions.
    +
    pos
    +
    Position in compressed bytes to seek to in the bitstream.
    +
    + + +

    Return Values

    +
    +
      +
    • 0 for success
    • + +
    • +nonzero indicates failure, described by several error codes: +
        +
      • OV_ENOSEEK - Bitstream is not seekable. +
      • +
      • OV_EINVAL - Invalid argument value; possibly called with an OggVorbis_File structure that isn't open. +
      • +
      • OV_EREAD - A read from media returned an error. +
      • +
      • OV_EFAULT - Internal logic fault; indicates a bug or heap/stack + corruption. +
      • +
      • OV_EBADLINK - Invalid stream section supplied to libvorbisfile, or the requested link is corrupt. +
      • +
    • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_raw_seek_lap.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_raw_seek_lap.html new file mode 100644 index 000000000..8e8c24d8a --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_raw_seek_lap.html @@ -0,0 +1,110 @@ + + + +Vorbisfile - function - ov_raw_seek_lap + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_raw_seek_lap

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    Seeks to the offset specified (in compressed raw bytes) within the +physical bitstream. This variant of ov_raw_seek also automatically crosslaps +the transition from the previous playback position into the new +playback position in order to eliminate clicking and boundary +discontinuities. Otherwise, usage and behavior is identical to ov_raw_seek. + +

    When seek speed is a priority, but crosslapping is still desired, +this is the best seek funtion to use. + +

    ov_raw_seek_lap also updates everything needed within the decoder, +so you can immediately call ov_read() and +get data from the newly seeked to position. + +

    ov_raw_seek_lap will lap between logical stream links of differing +numbers of channels. Any extra channels from the origin of the seek +are ignored; playback of these channels simply ends. Extra channels at +the destination are lapped from silence. ov_raw_seek_lap will also +lap between logical stream links of differing sample rates. In this +case, the sample rates are ignored (no implicit resampling is done to +match playback). It is up to the application developer to decide if +this behavior makes any sense in a given context; in practical use, +these default behaviors perform sensibly. + +

    This function only works for seekable streams. + + +

    + + + + +
    +
    
    +int ov_raw_seek_lap(OggVorbis_File *vf,long pos);
    +
    +
    + +

    Parameters

    +
    +
    vf
    +
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisfile +functions.
    +
    pos
    +
    Position in compressed bytes to seek to in the bitstream.
    +
    + + +

    Return Values

    +
    +
      +
    • 0 for success
    • + +
    • +nonzero indicates failure, described by several error codes: +
        +
      • OV_ENOSEEK - Bitstream is not seekable. +
      • +
      • OV_EINVAL - Invalid argument value; possibly called with an OggVorbis_File structure that isn't open. +
      • +
      • OV_EREAD - A read from media returned an error. +
      • +
      • OV_EFAULT - Internal logic fault; indicates a bug or heap/stack + corruption. +
      • +
      • OV_EOF - Indicates stream is at end of file immediately after a seek + (making crosslap impossible as there's no preceeding decode state to crosslap). +
      • +
      • OV_EBADLINK - Invalid stream section supplied to libvorbisfile, or the requested link is corrupt. +
      • +
    • +
    + +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_raw_tell.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_raw_tell.html new file mode 100644 index 000000000..5f30efffc --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_raw_tell.html @@ -0,0 +1,65 @@ + + + +Vorbisfile - function - ov_raw_tell + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_raw_tell

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    Returns the current offset in raw compressed bytes.

    + +

    Note that if you later use ov_raw_seek() to return to this point, you won't generally get back to exactly the same place, due to internal buffering. Also note that a read operation may not cause a change to the current raw offset - only a read that requires reading more data from the underlying data source will do that.

    + +

    + + + + +
    +
    
    +ogg_int64_t ov_raw_tell(OggVorbis_File *vf);
    +
    +
    + +

    Parameters

    +
    +
    vf
    +
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisfile +functions.
    +
    + + +

    Return Values

    +
    +
  • n indicates the current offset in bytes.
  • +
  • OV_EINVAL means that the argument was invalid. In this case, the requested bitstream did not exist.
  • +
    +

    + + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_raw_total.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_raw_total.html new file mode 100644 index 000000000..d9d830367 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_raw_total.html @@ -0,0 +1,68 @@ + + + +Vorbisfile - function - ov_raw_total + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_raw_total

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    Returns the total (compressed) bytes of the physical bitstream or a specified logical bitstream. + +

    + + + + +
    +
    
    +ogg_int64_t ov_raw_total(OggVorbis_File *vf,int i);
    +
    +
    + +

    Parameters

    +
    +
    vf
    +
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisfile +functions.
    +
    i
    +
    Link to the desired logical bitstream. To retrieve the total bytes for the entire physical bitstream, this parameter should be set to -1.
    +
    + + +

    Return Values

    +
    +
  • OV_EINVAL means that the argument was invalid. In this case, the requested bitstream did not exist or the bitstream is nonseekable
  • +
  • n +total length in compressed bytes of content if i=-1.
  • +
  • n length in compressed bytes of logical bitstream if i=0 to n.
  • +
    +

    + + + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_read.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_read.html new file mode 100644 index 000000000..5461a848f --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_read.html @@ -0,0 +1,148 @@ + + + +Vorbisfile - function - ov_read + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_read()

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    + This is the main function used to decode a Vorbis file within a + loop. It returns up to the specified number of bytes of decoded PCM audio + in the requested endianness, signedness, and word size. If the audio is + multichannel, the channels are interleaved in the output buffer. + If the passed in buffer is large, ov_read() will not fill + it; the passed in buffer size is treated as a limit and + not a request. + +

    The output channels are in stream order and not remapped. Vorbis I +defines channel order as follows: + +

      +
    • one channel - the stream is monophonic +
    • two channels - the stream is stereo. channel order: left, right +
    • three channels - the stream is a 1d-surround encoding. channel order: left, +center, right +
    • four channels - the stream is quadraphonic surround. channel order: front left, +front right, rear left, rear right +
    • five channels - the stream is five-channel surround. channel order: front left, +center, front right, rear left, rear right +
    • six channels - the stream is 5.1 surround. channel order: front left, center, +front right, rear left, rear right, LFE +
    • seven channels - the stream is 6.1 surround. channel order: front left, center, +front right, side left, side right, rear center, LFE +
    • eight channels - the stream is 7.1 surround. channel order: front left, center, +front right, side left, side right, rear left, rear right, +LFE +
    • greater than eight channels - channel use and order is undefined +
    + +

    Note that up to this point, the Vorbisfile API could more or less hide the + multiple logical bitstream nature of chaining from the toplevel + application if the toplevel application didn't particularly care. + However, when reading audio back, the application must be aware + that multiple bitstream sections do not necessarily use the same + number of channels or sampling rate.

    ov_read() passes + back the index of the sequential logical bitstream currently being + decoded (in *bitstream) along with the PCM data in order + that the toplevel application can handle channel and/or sample + rate changes. This number will be incremented at chaining + boundaries even for non-seekable streams. For seekable streams, it + represents the actual chaining index within the physical bitstream. +

    + +

    + + + + +
    +
    
    +long ov_read(OggVorbis_File *vf, char *buffer, int length, int bigendianp, int word, int sgned, int *bitstream);
    +
    +
    + +

    Parameters

    +
    +
    vf
    +
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisfile +functions.
    +
    buffer
    +
    A pointer to an output buffer. The decoded output is inserted into this buffer.
    +
    length
    +
    Number of bytes to be read into the buffer. Should be the same size as the buffer. A typical value is 4096.
    +
    bigendianp
    +
    Specifies big or little endian byte packing. 0 for little endian, 1 for b +ig endian. Typical value is 0.
    +
    word
    +
    Specifies word size. Possible arguments are 1 for 8-bit samples, or 2 or +16-bit samples. Typical value is 2.
    +
    sgned
    +
    Signed or unsigned data. 0 for unsigned, 1 for signed. Typically 1.
    +
    bitstream
    +
    A pointer to the number of the current logical bitstream.
    +
    + + +

    Return Values

    +
    +
    +
    OV_HOLE
    +
    indicates there was an interruption in the data. +
    (one of: garbage between pages, loss of sync followed by + recapture, or a corrupt page)
    +
    OV_EBADLINK
    +
    indicates that an invalid stream section was supplied to + libvorbisfile, or the requested link is corrupt.
    +
    OV_EINVAL
    +
    indicates the initial file headers couldn't be read or + are corrupt, or that the initial open call for vf + failed.
    +
    0
    +
    indicates EOF
    +
    n
    +
    indicates actual number of bytes read. ov_read() will + decode at most one vorbis packet per invocation, so the value + returned will generally be less than length. +
    +
    + +

    Notes

    +

    Typical usage: +

    +bytes_read = ov_read(&vf, +buffer, 4096,0,2,1,&current_section) +
    + +This reads up to 4096 bytes into a buffer, with signed 16-bit +little-endian samples. +

    + + + +

    +
    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_read_filter.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_read_filter.html new file mode 100644 index 000000000..e3f2e8453 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_read_filter.html @@ -0,0 +1,114 @@ + + + +Vorbisfile - function - ov_read_filter + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_read_filter()

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    + ov_read_filter() is a variant of ov_read(), the main function used to decode + a Vorbis file within a loop. It passes the decoded floating point + PCM data to the filter specified in the function arguments before + converting the data to integer output samples. All other aspects of + its behavior are as with ov_read(). +

    + +

    + + + + +
    +
    
    +long ov_read_filter(OggVorbis_File *vf, char *buffer, int length, int bigendianp, int word, int sgned, int *bitstream, 
    +                    void (*filter)(float **pcm,long channels,long samples,void *filter_param),void *filter_param);
    +
    +
    + +

    Parameters

    +
    +
    vf
    +
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisfile +functions.
    +
    buffer
    +
    A pointer to an output buffer. The decoded output is inserted into this buffer.
    +
    length
    +
    Number of bytes to be read into the buffer. Should be the same size as the buffer. A typical value is 4096.
    +
    bigendianp
    +
    Specifies big or little endian byte packing. 0 for little endian, 1 for b +ig endian. Typical value is 0.
    +
    word
    +
    Specifies word size. Possible arguments are 1 for 8-bit samples, or 2 or +16-bit samples. Typical value is 2.
    +
    sgned
    +
    Signed or unsigned data. 0 for unsigned, 1 for signed. Typically 1.
    +
    bitstream
    +
    A pointer to the number of the current logical bitstream.
    +
    filter
    +
    Filter function to process float PCM data prior to conversion to interleaved integer output.
    +
    filter_param
    +
    Data to pass through to the filter function.
    + +
    + + +

    Return Values

    +
    +
    +
    OV_HOLE
    +
    indicates there was an interruption in the data. +
    (one of: garbage between pages, loss of sync followed by + recapture, or a corrupt page)
    +
    OV_EBADLINK
    +
    indicates that an invalid stream section was supplied to + libvorbisfile, or the requested link is corrupt.
    +
    0
    +
    indicates EOF
    +
    n
    +
    indicates actual number of bytes read. ov_read() will + decode at most one vorbis packet per invocation, so the value + returned will generally be less than length. +
    +
    + +

    Notes

    +

    Typical usage: +

    +bytes_read = ov_read_filter(&vf, +buffer, 4096,0,2,1,&current_section, filter, (void *)filter_data_ptr) +
    + +This reads up to 4096 bytes into a buffer, with signed 16-bit +little-endian samples. The decoded data is passed to the function filter before integer conversiona nd interleave. +

    + + + +

    +
    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_read_float.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_read_float.html new file mode 100644 index 000000000..0c36eb000 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_read_float.html @@ -0,0 +1,105 @@ + + + +Vorbisfile - function - ov_read_float + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_read_float()

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    + This is the function used to decode a Vorbis file within a loop, but + returns samples in native float format instead of in integer formats. +

    + For information on channel ordering and how ov_read_float() deals with the complex issues + of chaining, etc, refer to the documentation for ov_read(). +

    + +

    + + + + +
    +
    
    +long ov_read_float(OggVorbis_File *vf, float ***pcm_channels, int samples, int *bitstream);
    +
    +
    + +

    Parameters

    +
    +
    vf
    +
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible vorbisfile +functions.
    +
    pcm_channels
    +
    A pointer to an output buffer. The pointer will be set to the decoded output buffer.
    +
    samples
    +
    Maximum number of decoded samples to produce.
    +
    bitstream
    +
    A pointer to the number of the current logical bitstream.
    +
    + + +

    Return Values

    +
    +
    +
    OV_HOLE
    +
    indicates there was an interruption in the data. +
    (one of: garbage between pages, loss of sync followed by + recapture, or a corrupt page)
    +
    OV_EBADLINK
    +
    indicates that an invalid stream section was supplied to + libvorbisfile, or the requested link is corrupt.
    +
    OV_EINVAL
    +
    indicates the initial file headers couldn't be read or + are corrupt, or that the initial open call for vf + failed.
    +
    0
    +
    indicates EOF
    +
    n
    +
    indicates actual number of samples read. ov_read_float() will + decode at most one vorbis packet per invocation, so the value + returned will generally be less than length. +
    +
    + +

    Notes

    +

    Typical usage: +

    +float **pcm; +samples_read = ov_read_float(&vf,pcm, 1024, &current_section) +
    + +This decodes up to 1024 float samples. +

    + +
    +

    +
    + + + + + + + + +

    copyright © 2002 vorbis team

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_seekable.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_seekable.html new file mode 100644 index 000000000..59b6e97af --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_seekable.html @@ -0,0 +1,63 @@ + + + +Vorbisfile - function - ov_seekable + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_seekable

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    This indicates whether or not the bitstream is seekable. + + +

    + + + + +
    +
    
    +long ov_seekable(OggVorbis_File *vf);
    +
    +
    + +

    Parameters

    +
    +
    vf
    +
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisfile +functions.
    +
    + + +

    Return Values

    +
    +
  • 0 indicates that the file is not seekable.
  • +
  • nonzero indicates that the file is seekable.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_serialnumber.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_serialnumber.html new file mode 100644 index 000000000..1b64415f5 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_serialnumber.html @@ -0,0 +1,67 @@ + + + +Vorbisfile - function - ov_serialnumber + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_serialnumber

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    Returns the serialnumber of the specified logical bitstream link number within the overall physical bitstream. + +

    + + + + +
    +
    
    +long ov_serialnumber(OggVorbis_File *vf,int i);
    +
    +
    + +

    Parameters

    +
    +
    vf
    +
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisfile +functions.
    +
    i
    +
    Link to the desired logical bitstream. For nonseekable files, this argument is ignored. To retrieve the serial number of the current bitstream, this parameter should be set to -1.
    +
    + + +

    Return Values

    +
    +
  • +-1 if the specified logical bitstream i does not exist.
  • + +
  • Returns the serial number of the logical bitstream i or the serial number of the current bitstream if the file is nonseekable.
  • +
    +

    + + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_streams.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_streams.html new file mode 100644 index 000000000..e455b0755 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_streams.html @@ -0,0 +1,64 @@ + + + +Vorbisfile - function - ov_streams + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_streams

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    Returns the number of logical bitstreams within our physical bitstream. + +

    + + + + +
    +
    
    +long ov_streams(OggVorbis_File *vf);
    +
    +
    + +

    Parameters

    +
    +
    vf
    +
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisfile +functions.
    +
    + + +

    Return Values

    +
    +
  • +1 indicates a single logical bitstream or an unseekable file.
  • +
  • n indicates the number of logical bitstreams.
  • +
    +

    + + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_test.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_test.html new file mode 100644 index 000000000..cb11d0185 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_test.html @@ -0,0 +1,104 @@ + + + +Vorbisfile - function - ov_test + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_test

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    +This partially opens a vorbis file to test for Vorbis-ness. It loads +the headers for the first chain and tests for seekability (but does +not seek). Use ov_test_open() to +finish opening the file or ov_clear to +close/free it. Note that vorbisfile does not take ownership of +the file if the call fails; the calling applicaiton is responsible for +closing the file if this call returns an error. +

    + +

    WARNING for Windows developers: Do not use ov_test() +in Windows applications; Windows linking places restrictions on +passing FILE * handles successfully, and ov_test() runs afoul +of these restrictions [a] in exactly the same +way as ov_open(). See the ov_test_callbacks() page for +details on using ov_test_callbacks() instead. +

    + + + + + +
    +
    
    +int ov_test(FILE *f,OggVorbis_File *vf,char *initial,long ibytes);
    +
    +
    + +

    Parameters

    +
    +
    f
    +
    File pointer to an already opened file +or pipe (it need not be seekable--though this obviously restricts what +can be done with the bitstream).
    +
    vf
    +
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisfile +functions. Once this has been called, the same OggVorbis_File +struct should be passed to all the libvorbisfile functions.
    +
    initial
    +
    Typically set to NULL. This parameter is useful if some data has already been +read from the file and the stream is not seekable. It is used in conjunction with ibytes. In this case, initial +should be a pointer to a buffer containing the data read.
    +
    ibytes
    +
    Typically set to 0. This parameter is useful if some data has already been +read from the file and the stream is not seekable. In this case, ibytes +should contain the length (in bytes) of the buffer. Used together with initial
    +
    + + +

    Return Values

    +
    +
  • 0 for success
  • + +
  • less than zero for failure:
  • +
      +
    • OV_EREAD - A read from media returned an error.
    • +
    • OV_ENOTVORBIS - Bitstream contains no Vorbis data.
    • +
    • OV_EVERSION - Vorbis version mismatch.
    • +
    • OV_EBADHEADER - Invalid Vorbis bitstream header.
    • +
    • OV_EFAULT - Internal logic fault; indicates a bug or heap/stack corruption.
    • +
    +
    +

    + +

    Notes

    + +All the notes from ov_open() apply to ov_test(). + +

    +
    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_test_callbacks.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_test_callbacks.html new file mode 100644 index 000000000..9abc84c0a --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_test_callbacks.html @@ -0,0 +1,111 @@ + + + +Vorbisfile - function - ov_test_callbacks + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_test_callbacks

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    This is an alternative function used to open and test an OggVorbis_File +structure when using a data source other than a file, +when its necessary to modify default file access behavior, or to +test for Vorbis content from a FILE * pointer under +Windows where ov_test() cannot be used. It +allows the application to specify custom file manipulation routines +and sets up all the related decoding structures. + +

    Once this has been called, the same OggVorbis_File +struct should be passed to all the libvorbisfile functions. +

    +

    + + + + +
    +
    
    +int ov_test_callbacks(void *datasource, OggVorbis_File *vf, char *initial, long ibytes, ov_callbacks callbacks);
    +
    +
    + +

    Parameters

    +
    +
    f
    +
    File pointer to an already opened file +or pipe (it need not be seekable--though this obviously restricts what +can be done with the bitstream).
    +
    vf
    +
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisfile +functions. Once this has been called, the same OggVorbis_File +struct should be passed to all the libvorbisfile functions.
    +
    initial
    +
    Typically set to NULL. This parameter is useful if some data has already been +read from the file and the stream is not seekable. It is used in conjunction with ibytes. In this case, initial +should be a pointer to a buffer containing the data read.
    +
    ibytes
    +
    Typically set to 0. This parameter is useful if some data has already been +read from the file and the stream is not seekable. In this case, ibytes +should contain the length (in bytes) of the buffer. Used together with initial.
    +
    callbacks
    +
    A completed ov_callbacks struct which indicates desired custom file manipulation routines. vorbisfile.h defines several preprovided callback sets; see ov_callbacks for details.
    +
    + + +

    Return Values

    +
    +
  • 0 for success
  • +
  • less than zero for failure:
  • +
      +
    • OV_EREAD - A read from media returned an error.
    • +
    • OV_ENOTVORBIS - Bitstream contains no Vorbis data.
    • +
    • OV_EVERSION - Vorbis version mismatch.
    • +
    • OV_EBADHEADER - Invalid Vorbis bitstream header.
    • +
    • OV_EFAULT - Internal logic fault; indicates a bug or heap/stack corruption.
    • +
    +
    +

    + +

    Notes

    +
    + +
    [a] Windows and use as an ov_test() substitute

    Windows +applications should not use ov_test() due +to the likelihood of CRT linking +mismatches and runtime protection faults +[ov_open:a]. ov_test_callbacks() is a safe substitute; specifically: + +

    ov_test_callbacks(f, vf, initial, ibytes, OV_CALLBACKS_DEFAULT);
    +
    + +... provides exactly the same functionality as ov_test() but will always work correctly under +Windows, regardless of linking setup details.

    + +

    + +

    +
    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_test_open.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_test_open.html new file mode 100644 index 000000000..6fb8ae9b5 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_test_open.html @@ -0,0 +1,82 @@ + + + +Vorbisfile - function - ov_test_open + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_test_open

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    +Finish opening a file partially opened with ov_test() +or ov_test_callbacks(). +

    + + + + + +
    +
    
    +int ov_test_open(OggVorbis_File *vf);
    +
    +
    + +

    Parameters

    +
    +
    vf
    +
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisfile +functions. Once this has been called, the same OggVorbis_File +struct should be passed to all the libvorbisfile functions.
    +
    + + +

    Return Values

    +
    +
  • +0 for success
  • + +
  • less than zero for failure:
  • +
      +
    • OV_EREAD - A read from media returned an error.
    • +
    • OV_ENOTVORBIS - Bitstream is not Vorbis data.
    • +
    • OV_EVERSION - Vorbis version mismatch.
    • +
    • OV_EBADHEADER - Invalid Vorbis bitstream header.
    • +
    • OV_EFAULT - Internal logic fault; indicates a bug or heap/stack corruption.
    • +
    +
    +

    + + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + + + + + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_time_seek.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_time_seek.html new file mode 100644 index 000000000..ec19ce357 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_time_seek.html @@ -0,0 +1,82 @@ + + + +Vorbisfile - function - ov_time_seek + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_time_seek

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    For seekable +streams, this seeks to the given time. For implementing seeking in a player, +this is the only function generally needed. This also updates everything needed within the +decoder, so you can immediately call ov_read() and get data from +the newly seeked to position. This function does not work for unseekable streams. + +

    + + + + +
    +
    
    +int ov_time_seek(OggVorbis_File *vf, double s);
    +
    +
    + +

    Parameters

    +
    +
    vf
    +
    Pointer to our already opened and initialized OggVorbis_File structure.
    +
    pos
    +
    Location to seek to within the file, specified in seconds.
    +
    + + +

    Return Values

    +
    +
      +
    • 0 for success
    • + +
    • +nonzero indicates failure, described by several error codes: +
        +
      • OV_ENOSEEK - Bitstream is not seekable. +
      • +
      • OV_EINVAL - Invalid argument value; possibly called with an OggVorbis_File structure that isn't open. +
      • +
      • OV_EREAD - A read from media returned an error. +
      • +
      • OV_EFAULT - Internal logic fault; indicates a bug or heap/stack + corruption. +
      • +
      • OV_EBADLINK - Invalid stream section supplied to libvorbisfile, or the requested link is corrupt. +
      • +
    • +
    + +

    +
    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_time_seek_lap.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_time_seek_lap.html new file mode 100644 index 000000000..f300f3b21 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_time_seek_lap.html @@ -0,0 +1,105 @@ + + + +Vorbisfile - function - ov_time_seek_lap + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_time_seek_lap

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    For seekable +streams, ov_time_seek_lap seeks to the given time. This variant of ov_time_seek also automatically +crosslaps the transition from the previous playback position into the +new playback position in order to eliminate clicking and boundary +discontinuities. Otherwise, usage and behavior is identical to ov_time_seek. + +

    ov_time_seek_lap also updates everything needed within the decoder, +so you can immediately call ov_read() and +get data from the newly seeked to position. + +

    ov_time_seek_lap will lap between logical stream links of differing +numbers of channels. Any extra channels from the origin of the seek +are ignored; playback of these channels simply ends. Extra channels at +the destination are lapped from silence. ov_time_seek_lap will also +lap between logical stream links of differing sample rates. In this +case, the sample rates are ignored (no implicit resampling is done to +match playback). It is up to the application developer to decide if +this behavior makes any sense in a given context; in practical use, +these default behaviors perform sensibly. + +

    This function does not work for unseekable streams. + + +

    + + + + +
    +
    
    +int ov_time_seek_lap(OggVorbis_File *vf, double s);
    +
    +
    + +

    Parameters

    +
    +
    vf
    +
    Pointer to our already opened and initialized OggVorbis_File structure.
    +
    pos
    +
    Location to seek to within the file, specified in seconds.
    +
    + + +

    Return Values

    +
    +
      +
    • 0 for success
    • + +
    • +nonzero indicates failure, described by several error codes: +
        +
      • OV_ENOSEEK - Bitstream is not seekable. +
      • +
      • OV_EINVAL - Invalid argument value; possibly called with an OggVorbis_File structure that isn't open. +
      • +
      • OV_EREAD - A read from media returned an error. +
      • +
      • OV_EFAULT - Internal logic fault; indicates a bug or heap/stack + corruption. +
      • +
      • OV_EOF - Indicates stream is at end of file immediately after a seek + (making crosslap impossible as there's no preceeding decode state to crosslap). +
      • +
      • OV_EBADLINK - Invalid stream section supplied to libvorbisfile, or the requested link is corrupt. +
      • +
    • +
    + + +

    +
    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_time_seek_page.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_time_seek_page.html new file mode 100644 index 000000000..271d57554 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_time_seek_page.html @@ -0,0 +1,83 @@ + + + +Vorbisfile - function - ov_time_seek_page + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_time_seek_page

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    For seekable +streams, this seeks to closest full page preceding the given time. This function is faster than ov_time_seek because it doesn't seek through the last few samples to reach an exact time, but it is also less accurate. This should be used when speed is important. +

    This function also updates everything needed within the +decoder, so you can immediately call ov_read() and get data from +the newly seeked to position. +

    This function does not work for unseekable streams. + +

    + + + + +
    +
    
    +int ov_time_seek_page(OggVorbis_File *vf, double s);
    +
    +
    + +

    Parameters

    +
    +
    vf
    +
    Pointer to our already opened and initialized OggVorbis_File structure.
    +
    pos
    +
    Location to seek to within the file, specified in seconds.
    +
    + + +

    Return Values

    +
    +
      +
    • 0 for success
    • + +
    • +nonzero indicates failure, described by several error codes: +
        +
      • OV_ENOSEEK - Bitstream is not seekable. +
      • +
      • OV_EINVAL - Invalid argument value; possibly called with an OggVorbis_File structure that isn't open. +
      • +
      • OV_EREAD - A read from media returned an error. +
      • +
      • OV_EFAULT - Internal logic fault; indicates a bug or heap/stack + corruption. +
      • +
      • OV_EBADLINK - Invalid stream section supplied to libvorbisfile, or the requested link is corrupt. +
      • +
    • +
    + +

    +
    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_time_seek_page_lap.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_time_seek_page_lap.html new file mode 100644 index 000000000..3b1effac2 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_time_seek_page_lap.html @@ -0,0 +1,112 @@ + + + +Vorbisfile - function - ov_time_seek_page_lap + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_time_seek_page_lap

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    For seekable streams, ov_time_seek_page_lap seeks to the closest +full page preceeding the given time. This variant of ov_time_seek_page also automatically +crosslaps the transition from the previous playback position into the +new playback position in order to eliminate clicking and boundary +discontinuities. Otherwise, usage and behavior is identical to ov_time_seek_page. + +

    ov_time_seek_page_lap is faster than ov_time_seek_lap because it doesn't +seek through the last few samples to reach an exact time, but it is +also less accurate. This should be used when speed is important, but +crosslapping is still desired. + +

    ov_time_seek_page_lap also updates everything needed within the +decoder, so you can immediately call ov_read() and get data from the newly seeked +to position. + +

    ov_time_seek_page_lap will lap between logical stream links of +differing numbers of channels. Any extra channels from the origin of +the seek are ignored; playback of these channels simply ends. Extra +channels at the destination are lapped from silence. +ov_time_seek_page_lap will also lap between logical stream links of +differing sample rates. In this case, the sample rates are ignored +(no implicit resampling is done to match playback). It is up to the +application developer to decide if this behavior makes any sense in a +given context; in practical use, these default behaviors perform +sensibly. + +

    This function does not work for unseekable streams. + +

    + + + + +
    +
    
    +int ov_time_seek_page_lap(OggVorbis_File *vf, double s);
    +
    +
    + +

    Parameters

    +
    +
    vf
    +
    Pointer to our already opened and initialized OggVorbis_File structure.
    +
    pos
    +
    Location to seek to within the file, specified in seconds.
    +
    + + +

    Return Values

    +
    +
      +
    • 0 for success
    • + +
    • +nonzero indicates failure, described by several error codes: +
        +
      • OV_ENOSEEK - Bitstream is not seekable. +
      • +
      • OV_EINVAL - Invalid argument value; possibly called with an OggVorbis_File structure that isn't open. +
      • +
      • OV_EREAD - A read from media returned an error. +
      • +
      • OV_EFAULT - Internal logic fault; indicates a bug or heap/stack + corruption. +
      • +
      • OV_EOF - Indicates stream is at end of file immediately after a seek + (making crosslap impossible as there's no preceeding decode state to crosslap). +
      • +
      • OV_EBADLINK - Invalid stream section supplied to libvorbisfile, or the requested link is corrupt. +
      • +
    • +
    + + +

    +
    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_time_tell.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_time_tell.html new file mode 100644 index 000000000..92d171c74 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_time_tell.html @@ -0,0 +1,63 @@ + + + +Vorbisfile - function - ov_time_tell + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_time_tell

    + +

    declared in "vorbis/vorbisfile.h";

    + +

    Returns the current decoding offset in seconds. + +

    + + + + +
    +
    
    +double ov_time_tell(OggVorbis_File *vf);
    +
    +
    + +

    Parameters

    +
    +
    vf
    +
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisfile +functions.
    +
    + + +

    Return Values

    +
    +
  • n indicates the current decoding time offset in seconds.
  • +
  • OV_EINVAL means that the argument was invalid. In this case, the requested bitstream did not exist.
  • +
    +

    + + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/ov_time_total.html b/cs/3rd party/libvorbis/doc/vorbisfile/ov_time_total.html new file mode 100644 index 000000000..3b34f93a9 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/ov_time_total.html @@ -0,0 +1,67 @@ + + + +Vorbisfile - function - ov_time_total + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    ov_time_total

    + +

    declared in "vorbis/vorbisfile.h";

    + + +

    Returns the total time in seconds of the physical bitstream or a specified logical bitstream. + + +

    + + + + +
    +
    
    +double ov_time_total(OggVorbis_File *vf,int i);
    +
    +
    + +

    Parameters

    +

    + +On systems other than Windows[a], an +application may also open a file itself using fopen(), then pass the +FILE * to libvorbisfile using ov_open(). Do not call +fclose() on a file handle successfully submitted to ov_open(); libvorbisfile does this in the ov_clear() call.

    +
    vf
    +
    A pointer to the OggVorbis_File structure--this is used for ALL the externally visible libvorbisfile +functions.
    +
    i
    +
    Link to the desired logical bitstream. To retrieve the time total for the entire physical bitstream, this parameter should be set to -1.
    +
    + + +

    Return Values

    +
    +
  • OV_EINVAL means that the argument was invalid. In this case, the requested bitstream did not exist or the bitstream is nonseekable.
  • +
  • n total length in seconds of content if i=-1.
  • +
  • n length in seconds of logical bitstream if i=0 to n.
  • +
    +

    + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/overview.html b/cs/3rd party/libvorbis/doc/vorbisfile/overview.html new file mode 100644 index 000000000..13064953a --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/overview.html @@ -0,0 +1,61 @@ + + + +Vorbisfile - API Overview + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    Vorbisfile API Overview

    + +

    The makeup of the Vorbisfile libvorbisfile library API is relatively +simple. It revolves around a single file resource. This file resource is +passed to libvorbisfile, where it is opened, manipulated, and closed, +in the form of an OggVorbis_File +struct. +

    +The Vorbisfile API consists of the following functional categories: +

    +

    +

    +In addition, the following subjects deserve attention additional to +the above general overview: +

    +

    +

    + + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/reference.html b/cs/3rd party/libvorbis/doc/vorbisfile/reference.html new file mode 100644 index 000000000..7c3c789ce --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/reference.html @@ -0,0 +1,86 @@ + + + +Vorbisfile API Reference + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    Vorbisfile API Reference

    + +

    +Data Structures
    +OggVorbis_File
    +ov_callbacks
    +
    +Data Structures from libvorbis
    +vorbis_comment
    +vorbis_info
    +
    +Setup/Teardown
    +ov_fopen()
    +ov_open()
    +ov_open_callbacks()
    +ov_clear()
    +ov_test()
    +ov_test_callbacks()
    +ov_test_open()
    +
    +Decoding
    +ov_read()
    +ov_read_float()
    +ov_read_filter()
    +ov_crosslap()
    +
    +Seeking
    +ov_raw_seek()
    +ov_pcm_seek()
    +ov_time_seek()
    +ov_pcm_seek_page()
    +ov_time_seek_page()

    +ov_raw_seek_lap()
    +ov_pcm_seek_lap()
    +ov_time_seek_lap()
    +ov_pcm_seek_page_lap()
    +ov_time_seek_page_lap()
    +
    +File Information
    +ov_bitrate()
    +ov_bitrate_instant()
    +ov_streams()
    +ov_seekable()
    +ov_serialnumber()
    +ov_raw_total()
    +ov_pcm_total()
    +ov_time_total()
    +ov_raw_tell()
    +ov_pcm_tell()
    +ov_time_tell()
    +ov_info()
    +ov_comment()
    +
    +Return Codes (from libvorbis)
    + + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/seekexample.html b/cs/3rd party/libvorbis/doc/vorbisfile/seekexample.html new file mode 100644 index 000000000..897403d08 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/seekexample.html @@ -0,0 +1,152 @@ + + + +vorbisfile - Example Code + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    Example Code: seeking

    + +

    +The following is a run-through of the seeking example program supplied +with vorbisfile - seeking_test.c. +This program tests the vorbisfile ov_time_seek function by seeking to random points within the file. + +

    +First, relevant headers, including vorbis-specific "codec.h" and "vorbisfile.h" have to be included. + +

    + + + + +
    +
    
    +#include <stdlib.h>
    +#include <stdio.h>
    +#include "vorbis/codec.h"
    +#include "vorbis/vorbisfile.h"
    +
    +
    + +

    Inside main(), we declare our primary OggVorbis_File structure. We also declare other helpful variables to track our progress within the file. +

    + + + + +
    +
    
    +int main(){
    +  OggVorbis_File ov;
    +  int i;
    +
    +
    + +

    This example takes its input on stdin which is in 'text' mode by default under Windows; this will corrupt the input data unless set to binary mode. This applies only to Windows. +

    + + + + +
    +
    
    +#ifdef _WIN32 /* We need to set stdin to binary mode under Windows */
    +  _setmode( _fileno( stdin ), _O_BINARY );
    +#endif
    +
    +
    + +

    ov_open() must be +called to initialize the OggVorbis_File structure with default values. +ov_open_callbacks() also checks to ensure that we're reading Vorbis format and not something else. + +

    + + + + +
    +
    
    +  if(ov_open_callbacks(stdin,&ov,NULL,-1, OV_CALLBACKS_NOCLOSE)<0){
    +    printf("Could not open input as an OggVorbis file.\n\n");
    +    exit(1);
    +  }
    +
    +
    +
    + +

    +First we check to make sure the stream is seekable using ov_seekable. + +

    Then we seek to 100 random spots in the bitstream using ov_time_seek with randomly generated values. + +

    + + + + +
    +
    
    +  
    +  /* print details about each logical bitstream in the input */
    +  if(ov_seekable(&ov)){
    +    double length=ov_time_total(&ov,-1);
    +    printf("testing seeking to random places in %g seconds....\n",length);
    +    for(i=0;i<100;i++){
    +      double val=(double)rand()/RAND_MAX*length;
    +      ov_time_seek(&ov,val);
    +      printf("\r\t%d [%gs]...     ",i,val);
    +      fflush(stdout);
    +    }
    +    
    +    printf("\r                                   \nOK.\n\n");
    +  }else{
    +    printf("Standard input was not seekable.\n");
    +  }
    +  
    +
    +
    +

    +When we're done seeking, we need to call ov_clear() to release the bitstream. + +

    + + + + +
    +
    
    +  ov_clear(&ov);
    +  return 0;
    +}
    +
    +
    + +

    +The full source for seeking_test.c can be found with the vorbis +distribution in seeking_test.c. + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/seeking.html b/cs/3rd party/libvorbis/doc/vorbisfile/seeking.html new file mode 100644 index 000000000..4bb658127 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/seeking.html @@ -0,0 +1,107 @@ + + + +Vorbisfile - Seeking + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    Seeking

    +

    Seeking functions allow you to specify a specific point in the stream to begin or continue decoding. +

    +All libvorbisfile seeking routines are declared in "vorbis/vorbisfile.h". + +

    Certain seeking functions are best suited to different situations. +When speed is important and exact positioning isn't required, +page-level seeking should be used. Note also that Vorbis files do not +necessarily start at a sample number or time offset of zero. Do not +be surprised if a file begins at a positive offset of several minutes +or hours, such as would happen if a large stream (such as a concert +recording) is chopped into multiple separate files. Requesting to +seek to a position before the beginning of such a file will seek to +the position where audio begins. + +

    As of vorbisfile version 1.68, seeking also optionally provides +automatic crosslapping to eliminate clicks and other discontinuity +artifacts at seeking boundaries. This fetaure is of particular +interest to player and game developers implementing dynamic music and +audio engines, or others looking for smooth transitions within a +single sample or across multiple samples.

    + +

    Naturally, seeking is available only within a seekable file or +stream. Seeking functions will return OV_ENOSEEK on +nonseekable files and streams. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    functionpurpose
    ov_raw_seekThis function seeks to a position specified in the compressed bitstream, specified in bytes.
    ov_pcm_seekThis function seeks to a specific audio sample number, specified in pcm samples.
    ov_pcm_seek_pageThis function seeks to the closest page preceding the specified audio sample number, specified in pcm samples.
    ov_time_seekThis function seeks to the specific time location in the bitstream, specified in seconds
    ov_time_seek_pageThis function seeks to the closest page preceding the specified time position in the bitstream
    ov_raw_seek_lapThis function seeks to a position specified in the compressed bitstream, specified in bytes. The boundary between the old and new playback positions is crosslapped to eliminate discontinuities.
    ov_pcm_seek_lapThis function seeks to a specific audio sample number, specified in pcm samples. The boundary between the old and new playback positions is crosslapped to eliminate discontinuities.
    ov_pcm_seek_page_lapThis function seeks to the closest page preceding the specified audio sample number, specified in pcm samples. The boundary between the old and new playback positions is crosslapped to eliminate discontinuities.
    ov_time_seek_lapThis function seeks to the specific time location in the bitstream, specified in seconds. The boundary between the old and new playback positions is crosslapped to eliminate discontinuities.
    ov_time_seek_page_lapThis function seeks to the closest page preceding the specified time position in the bitstream. The boundary between the old and new playback positions is crosslapped to eliminate discontinuities.
    + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/seeking_example_c.html b/cs/3rd party/libvorbis/doc/vorbisfile/seeking_example_c.html new file mode 100644 index 000000000..eb10a98f0 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/seeking_example_c.html @@ -0,0 +1,86 @@ + + + +vorbisfile - seeking_test.c + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    seeking_test.c

    + +

    +The example program source: + +

    + + + + +
    +
    
    +
    +#include <stdlib.h>
    +#include <stdio.h>
    +#include "vorbis/codec.h"
    +#include "vorbis/vorbisfile.h"
    +
    +int main(){
    +  OggVorbis_File ov;
    +  int i;
    +
    +#ifdef _WIN32 /* We need to set stdin to binary mode under Windows */
    +  _setmode( _fileno( stdin ), _O_BINARY );
    +#endif
    +
    +  /* open the file/pipe on stdin */
    +  if(ov_open_callbacks(stdin,&ov,NULL,-1,OV_CALLBACKS_NOCLOSE)==-1){
    +    printf("Could not open input as an OggVorbis file.\n\n");
    +    exit(1);
    +  }
    +  
    +  /* print details about each logical bitstream in the input */
    +  if(ov_seekable(&ov)){
    +    double length=ov_time_total(&ov,-1);
    +    printf("testing seeking to random places in %g seconds....\n",length);
    +    for(i=0;i<100;i++){
    +      double val=(double)rand()/RAND_MAX*length;
    +      ov_time_seek(&ov,val);
    +      printf("\r\t%d [%gs]...     ",i,val);
    +      fflush(stdout);
    +    }
    +    
    +    printf("\r                                   \nOK.\n\n");
    +  }else{
    +    printf("Standard input was not seekable.\n");
    +  }
    +
    +  ov_clear(&ov);
    +  return 0;
    +}
    +
    +
    +
    + + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/seeking_test_c.html b/cs/3rd party/libvorbis/doc/vorbisfile/seeking_test_c.html new file mode 100644 index 000000000..eb10a98f0 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/seeking_test_c.html @@ -0,0 +1,86 @@ + + + +vorbisfile - seeking_test.c + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    seeking_test.c

    + +

    +The example program source: + +

    + + + + +
    +
    
    +
    +#include <stdlib.h>
    +#include <stdio.h>
    +#include "vorbis/codec.h"
    +#include "vorbis/vorbisfile.h"
    +
    +int main(){
    +  OggVorbis_File ov;
    +  int i;
    +
    +#ifdef _WIN32 /* We need to set stdin to binary mode under Windows */
    +  _setmode( _fileno( stdin ), _O_BINARY );
    +#endif
    +
    +  /* open the file/pipe on stdin */
    +  if(ov_open_callbacks(stdin,&ov,NULL,-1,OV_CALLBACKS_NOCLOSE)==-1){
    +    printf("Could not open input as an OggVorbis file.\n\n");
    +    exit(1);
    +  }
    +  
    +  /* print details about each logical bitstream in the input */
    +  if(ov_seekable(&ov)){
    +    double length=ov_time_total(&ov,-1);
    +    printf("testing seeking to random places in %g seconds....\n",length);
    +    for(i=0;i<100;i++){
    +      double val=(double)rand()/RAND_MAX*length;
    +      ov_time_seek(&ov,val);
    +      printf("\r\t%d [%gs]...     ",i,val);
    +      fflush(stdout);
    +    }
    +    
    +    printf("\r                                   \nOK.\n\n");
    +  }else{
    +    printf("Standard input was not seekable.\n");
    +  }
    +
    +  ov_clear(&ov);
    +  return 0;
    +}
    +
    +
    +
    + + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/seekingexample.html b/cs/3rd party/libvorbis/doc/vorbisfile/seekingexample.html new file mode 100644 index 000000000..8263f02f8 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/seekingexample.html @@ -0,0 +1,203 @@ + + + +vorbisfile - Example Code + + + + + + + + + +

    vorbisfile documentation

    vorbisfile version 1.25 - 20000615

    + +

    Example Code

    + +

    +The following is a run-through of the decoding example program supplied +with vorbisfile - vorbisfile_example.c. +This program takes a vorbis bitstream from stdin and writes raw pcm to stdout. + +

    +First, relevant headers, including vorbis-specific "codec.h" and "vorbisfile.h" have to be included. + +

    + + + + +
    +
    
    +#include <stdio.h>
    +#include <stdlib.h>
    +#include <math.h>
    +#include "vorbis/codec.h"
    +#include "vorbis/vorbisfile.h"
    +
    +
    +

    +We also have to make a concession to Windows users here. If we are using windows for decoding, we must declare these libraries so that we can set stdin/stdout to binary. +

    + + + + +
    +
    
    +#ifdef _WIN32
    +#include <io.h>
    +#include <fcntl.h>
    +#endif
    +
    +
    +

    +Next, a buffer for the pcm audio output is declared. + +

    + + + + +
    +
    
    +char pcmout[4096];
    +
    +
    + +

    Inside main(), we declare our primary OggVorbis_File structure. We also declare a few other helpful variables to track out progress within the file. +Also, we make our final concession to Windows users by setting the stdin and stdout to binary mode. +

    + + + + +
    +
    
    +int main(int argc, char **argv){
    +  OggVorbis_File vf;
    +  int eof=0;
    +  int current_section;
    +
    +#ifdef _WIN32
    +  _setmode( _fileno( stdin ), _O_BINARY );
    +#endif
    +
    +
    + +

    ov_open_callbacks() must be +called to initialize the OggVorbis_File structure with default values. +ov_open_callbacks() also checks to ensure that we're reading Vorbis format and not something else. + +

    + + + + +
    +
    
    +  if(ov_open_callbacks(stdin, &vf, NULL, 0, OV_CALLBACKS_NOCLOSE) < 0) {
    +      fprintf(stderr,"Input does not appear to be an Ogg bitstream.\n");
    +      exit(1);
    +  }
    +
    +
    +
    + +

    +We're going to pull the channel and bitrate info from the file using ov_info() and show them to the user. +We also want to pull out and show the user a comment attached to the file using ov_comment(). + +

    + + + + +
    +
    
    +  {
    +    char **ptr=ov_comment(&vf,-1)->user_comments;
    +    vorbis_info *vi=ov_info(&vf,-1);
    +    while(*ptr){
    +      fprintf(stderr,"%s\n",*ptr);
    +      ++ptr;
    +    }
    +    fprintf(stderr,"\nBitstream is %d channel, %ldHz\n",vi->channels,vi->rate);
    +    fprintf(stderr,"Encoded by: %s\n\n",ov_comment(&vf,-1)->vendor);
    +  }
    +  
    +
    +
    + +

    +Here's the read loop: + +

    + + + + +
    +
    
    +
    +  while(!eof){
    +    long ret=ov_read(&vf,pcmout,sizeof(pcmout),0,2,1,&current_section);
    +    switch(ret){
    +    case 0:
    +      /* EOF */
    +      eof=1;
    +      break;
    +    case -1:
    +      break;
    +    default:
    +      fwrite(pcmout,1,ret,stdout);
    +      break;
    +    }
    +  }
    +  
    +
    +
    + +

    +The code is reading blocks of data using ov_read(). +Based on the value returned, we know if we're at the end of the file or have invalid data. If we have valid data, we write it to the pcm output. + +

    +Now that we've finished playing, we can pack up and go home. It's important to call ov_clear() when we're finished. + +

    + + + + +
    +
    
    +
    +  ov_clear(&vf);
    +    
    +  fprintf(stderr,"Done.\n");
    +  return(0);
    +}
    +
    +
    + +

    +The full source for vorbisfile_example.c can be found with the vorbis +distribution in vorbisfile_example.c. + +

    +


    + + + + + + + + +

    copyright © 2000 vorbis team

    Ogg Vorbis

    vorbisfile documentation

    vorbisfile version 1.25 - 20000615

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/style.css b/cs/3rd party/libvorbis/doc/vorbisfile/style.css new file mode 100644 index 000000000..81cf41795 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/style.css @@ -0,0 +1,7 @@ +BODY { font-family: Helvetica, sans-serif } +TD { font-family: Helvetica, sans-serif } +P { font-family: Helvetica, sans-serif } +H1 { font-family: Helvetica, sans-serif } +H2 { font-family: Helvetica, sans-serif } +H4 { font-family: Helvetica, sans-serif } +P.tiny { font-size: 8pt } diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/threads.html b/cs/3rd party/libvorbis/doc/vorbisfile/threads.html new file mode 100644 index 000000000..274e11519 --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/threads.html @@ -0,0 +1,50 @@ + + + +Vorbisfile - Thread Safety + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    Thread Safety

    + +Vorbisfile's libvorbisfile may be used safely in a threading environment +so long as thread access to individual OggVorbis_File instances is serialized. +
      + +
    • Only one thread at a time may enter a function that takes a given OggVorbis_File instance, even if the +functions involved appear to be read-only.

      + +

    • Multiple threads may enter +libvorbisfile at a given time, so long as each thread's function calls +are using different OggVorbis_File +instances.

      + +

    • Any one OggVorbis_File instance may be used safely from multiple threads so long as only one thread at a time is making calls using that instance.

      +

    + +

    +
    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/vorbisfile/vorbisfile_example_c.html b/cs/3rd party/libvorbis/doc/vorbisfile/vorbisfile_example_c.html new file mode 100644 index 000000000..f3ba1d6cc --- /dev/null +++ b/cs/3rd party/libvorbis/doc/vorbisfile/vorbisfile_example_c.html @@ -0,0 +1,106 @@ + + + +vorbisfile - vorbisfile_example.c + + + + + + + + + +

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + +

    vorbisfile_example.c

    + +

    +The example program source: + +

    + + + + +
    +
    
    +#include <stdio.h>
    +#include <stdlib.h>
    +#include <math.h>
    +#include "vorbis/codec.h"
    +#include "vorbis/vorbisfile.h"
    +
    +#ifdef _WIN32
    +#include <io.h>
    +#include <fcntl.h>
    +#endif
    +
    +char pcmout[4096];
    +
    +int main(int argc, char **argv){
    +  OggVorbis_File vf;
    +  int eof=0;
    +  int current_section;
    +
    +#ifdef _WIN32
    +  _setmode( _fileno( stdin ), _O_BINARY );
    +  _setmode( _fileno( stdout ), _O_BINARY );
    +#endif
    +
    +  if(ov_open_callbacks(stdin, &vf, NULL, 0, OV_CALLBACKS_NOCLOSE) < 0) {
    +      fprintf(stderr,"Input does not appear to be an Ogg bitstream.\n");
    +      exit(1);
    +  }
    +
    +  {
    +    char **ptr=ov_comment(&vf,-1)->user_comments;
    +    vorbis_info *vi=ov_info(&vf,-1);
    +    while(*ptr){
    +      fprintf(stderr,"%s\n",*ptr);
    +      ++ptr;
    +    }
    +    fprintf(stderr,"\nBitstream is %d channel, %ldHz\n",vi->channels,vi->rate);
    +    fprintf(stderr,"Encoded by: %s\n\n",ov_comment(&vf,-1)->vendor);
    +  }
    +  
    +  while(!eof){
    +    long ret=ov_read(&vf,pcmout,sizeof(pcmout),0,2,1,&current_section);
    +    if (ret == 0) {
    +      /* EOF */
    +      eof=1;
    +    } else if (ret < 0) {
    +      /* error in the stream.  Not a problem, just reporting it in
    +	 case we (the app) cares.  In this case, we don't. */
    +    } else {
    +      /* we don't bother dealing with sample rate changes, etc, but
    +	 you'll have to */
    +      fwrite(pcmout,1,ret,stdout);
    +    }
    +  }
    +
    +  ov_clear(&vf);
    +    
    +  fprintf(stderr,"Done.\n");
    +  return(0);
    +}
    +
    +
    +
    + + +

    +


    + + + + + + + + +

    copyright © 2000-2010 Xiph.Org

    Ogg Vorbis

    Vorbisfile documentation

    vorbisfile version 1.3.2 - 20101101

    + + + + diff --git a/cs/3rd party/libvorbis/doc/window1.png b/cs/3rd party/libvorbis/doc/window1.png new file mode 100644 index 0000000000000000000000000000000000000000..968bd3fe975ad8b2c2a66f839289d042f0f11ebe GIT binary patch literal 1703 zcmXw4dpMMB8XsgD%!IO-NzOB*CcLAvh-8#GG)}YXN;RtY%UQ^FG88cgp)v7(nXsZ2 zyAfkY#?U%^=5t7rLwzwHL((|y`Y=he?{r;zU)S^8zx%nL-+ldl|2$8YAL9f@8>fvx zATSgkasUFM?g-FyI$-N>bX9XDN2_!q8_e zl;~Yyx2PUt6Vj#atILx4^g9vklSEZiY7eVFS(r|Vcr|M$%+#j7uM61}*7T>PCL9Fz z?gj5OwzRoHh4XGunoho_H$|ZC`rvPi5VOwpxx?|zPj8F`B+VIZaBaXk3XC8U0Ko_? zVRnpkCiFgor^C*xM)*Z~5|0wUu0xH=7Vbms0~M8(l}xW1QGQ=`&=;1&=Tz{FACTQ= z+0fHD`aHXD&q3YN9k&X?Sp|KTR%WYD*@JG7+xMD(t@tbV**)D=ioOP1%1LhGV^*4r z8T+HGNt~{S9S!>b&7zD+cXt>VmF6yY7Uut5?5Lk%Vw_8l3A!oo^~w(X=1*2n&l#z& zN;sPBMR)2fCTRTLB7XB}+Tm8L!&=4Q5!Ux=XW3i@=y7lPQ-%j5^> zq}87;!EmQrqJcvC<#l)Y_ENkncB&)eLQXadm;4w#w>%S*o!yqExdUup690f%=X&&( z+(8xZ;)aR$HP#}mgH|jhBSi|1Er*pbGGa5+X|)(;d&$}_b3gRo8-E6hQ?nLPnswsf+9bR+h=DzaovxS8G|s%1o~)-f$tWS`X8Qa~x+pf{ojp{`RRh~b{%S>1XCB9sLd?Bt^RpZnFyXomHuD&v-MN4Sm2UDVLqODMpZ@NciGn;=+Ol%t}f{^P}T_Omp-^vYWieojS!JP}QRv>3>-(?8ahO zTl@=6$R^buN}&K!F0p&3Aq!~sSQ1GJ*2l94vy`x|qeMWa&IIUji}d9%GSS|ME(%Fz zaq4?^(OT}7bAqt7#D}yv}mzzS5So-MBDm2~2ypWI4ZA?z)rQlt>^m};b z?=KAc`(dhJQJ0I^m7i^SgTxSFNvSG9C3R1ZrIc|IH7z?r8b6ndwJPiU{Nz-{DB3L- z@iWICh9J+~3+c9w8!qwFB!t5E;H^aD12e2!AB*yT=gDX-1*fHw6D{Zm1dk0=H-+y&1WI@lOz>obPvq>s{yu%pqV4C9 zVH@)iF;P?d)WkZn|J>PQ-h+Mp1Yl{kihZ*l#QfPn)_}{H*7YV5Mj~jSP3jf3nfJc<|z?V_&Z2)Pt z$`sp;Zc-)o{QHUojgxyJ+zb;F$xPp+Imp|qxyJ#2SM;x_A4DOJI1;7ZWo{78O*rF7_C ze=T0Nl`8vy?(+Z$JUKM3p2C-|$i=EaurvJjGSPPW?5wnV5HL`DC!OdJXHCr!b3 zPRMZH)a8KV>2Z=pvV>qsK=B5c7!CGuYALY(ir&#D$GWw#TGvy+b~zYl*1gFF<-OJL zVZc0TUdC!Rs3*zEoY@pF>zk>jf;|MZHKlf7x`9-;78Zq1@ybI4uGf!&3$*byZ^DX8 zt}UnVnIOtY07=FOJ;%M)m9C-UDi7|_!X`7yCYk3VjU21twg1xd%y$o77`(Xph&hPe zYM3}-M$1X#8w~w@fr<0vFh4txnov7mb9Yl;j3an9hw$%oEUvr?k8w=UNCbnQAr=lg zWlMw1)fh)RxphNvjhw@GE}ik@)i0>x?hAoxdJ57%PZN zs<_d2=%1d55n{gNQa8<*M!&6kMbFnT6$i>_HIsLple2mhX_FsMrqqI`w@skB8A!@*`a>{tQpet literal 0 HcmV?d00001 diff --git a/cs/3rd party/libvorbis/examples/Makefile.am b/cs/3rd party/libvorbis/examples/Makefile.am new file mode 100644 index 000000000..58816350d --- /dev/null +++ b/cs/3rd party/libvorbis/examples/Makefile.am @@ -0,0 +1,34 @@ +## Process this file with automake to produce Makefile.in + +AUTOMAKE_OPTIONS = foreign + +noinst_PROGRAMS = decoder_example encoder_example chaining_example\ + vorbisfile_example seeking_example + +EXTRA_DIST = frameview.pl + +AM_CPPFLAGS = -I$(top_srcdir)/include @OGG_CFLAGS@ + +# uncomment to build static executables from the example code +#LDFLAGS = -all-static + +decoder_example_SOURCES = decoder_example.c +decoder_example_LDADD = $(top_builddir)/lib/libvorbis.la @OGG_LIBS@ + +encoder_example_SOURCES = encoder_example.c +encoder_example_LDADD = $(top_builddir)/lib/libvorbisenc.la $(top_builddir)/lib/libvorbis.la @OGG_LIBS@ + +chaining_example_SOURCES = chaining_example.c +chaining_example_LDADD = $(top_builddir)/lib/libvorbisfile.la $(top_builddir)/lib/libvorbis.la @OGG_LIBS@ + +vorbisfile_example_SOURCES = vorbisfile_example.c +vorbisfile_example_LDADD = $(top_builddir)/lib/libvorbisfile.la $(top_builddir)/lib/libvorbis.la @OGG_LIBS@ + +seeking_example_SOURCES = seeking_example.c +seeking_example_LDADD = $(top_builddir)/lib/libvorbisfile.la $(top_builddir)/lib/libvorbis.la @OGG_LIBS@ + +debug: + $(MAKE) all CFLAGS="@DEBUG@" + +profile: + $(MAKE) all CFLAGS="@PROFILE@" diff --git a/cs/3rd party/libvorbis/examples/chaining_example.c b/cs/3rd party/libvorbis/examples/chaining_example.c new file mode 100644 index 000000000..4d652fd1f --- /dev/null +++ b/cs/3rd party/libvorbis/examples/chaining_example.c @@ -0,0 +1,72 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE 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 SOURCE CODE IS (C) COPYRIGHT 1994-2007 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: illustrate simple use of chained bitstream and vorbisfile.a + last mod: $Id$ + + ********************************************************************/ + +#include +#include +#include + +#ifdef _WIN32 /* We need the following two to set stdin/stdout to binary */ +#include +#include +#endif + +int main(){ + OggVorbis_File ov; + int i; + +#ifdef _WIN32 /* We need to set stdin to binary mode. Damn windows. */ + /* Beware the evil ifdef. We avoid these where we can, but this one we + cannot. Don't add any more, you'll probably go to hell if you do. */ + _setmode( _fileno( stdin ), _O_BINARY ); +#endif + + /* open the file/pipe on stdin */ + if(ov_open_callbacks(stdin,&ov,NULL,-1,OV_CALLBACKS_NOCLOSE)<0){ + printf("Could not open input as an OggVorbis file.\n\n"); + exit(1); + } + + /* print details about each logical bitstream in the input */ + if(ov_seekable(&ov)){ + printf("Input bitstream contained %ld logical bitstream section(s).\n", + ov_streams(&ov)); + printf("Total bitstream samples: %ld\n\n", + (long)ov_pcm_total(&ov,-1)); + printf("Total bitstream playing time: %ld seconds\n\n", + (long)ov_time_total(&ov,-1)); + + }else{ + printf("Standard input was not seekable.\n" + "First logical bitstream information:\n\n"); + } + + for(i=0;irate,vi->channels,ov_bitrate(&ov,i)/1000, + ov_serialnumber(&ov,i)); + printf("\t\theader length: %ld bytes\n",(long) + (ov.dataoffsets[i]-ov.offsets[i])); + printf("\t\tcompressed length: %ld bytes\n",(long)(ov_raw_total(&ov,i))); + printf("\t\tplay time: %lds\n",(long)ov_time_total(&ov,i)); + } + + ov_clear(&ov); + return 0; +} + diff --git a/cs/3rd party/libvorbis/examples/decoder_example.c b/cs/3rd party/libvorbis/examples/decoder_example.c new file mode 100644 index 000000000..68c40d136 --- /dev/null +++ b/cs/3rd party/libvorbis/examples/decoder_example.c @@ -0,0 +1,314 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE 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 SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: simple example decoder + last mod: $Id$ + + ********************************************************************/ + +/* Takes a vorbis bitstream from stdin and writes raw stereo PCM to + stdout. Decodes simple and chained OggVorbis files from beginning + to end. Vorbisfile.a is somewhat more complex than the code below. */ + +/* Note that this is POSIX, not ANSI code */ + +#include +#include +#include +#include + +#ifdef _WIN32 /* We need the following two to set stdin/stdout to binary */ +#include +#include +#endif + +#if defined(__MACOS__) && defined(__MWERKS__) +#include /* CodeWarrior's Mac "command-line" support */ +#endif + +ogg_int16_t convbuffer[4096]; /* take 8k out of the data segment, not the stack */ +int convsize=4096; + +extern void _VDBG_dump(void); + +int main(){ + ogg_sync_state oy; /* sync and verify incoming physical bitstream */ + ogg_stream_state os; /* take physical pages, weld into a logical + stream of packets */ + ogg_page og; /* one Ogg bitstream page. Vorbis packets are inside */ + ogg_packet op; /* one raw packet of data for decode */ + + vorbis_info vi; /* struct that stores all the static vorbis bitstream + settings */ + vorbis_comment vc; /* struct that stores all the bitstream user comments */ + vorbis_dsp_state vd; /* central working state for the packet->PCM decoder */ + vorbis_block vb; /* local working space for packet->PCM decode */ + + char *buffer; + int bytes; + +#ifdef _WIN32 /* We need to set stdin/stdout to binary mode. Damn windows. */ + /* Beware the evil ifdef. We avoid these where we can, but this one we + cannot. Don't add any more, you'll probably go to hell if you do. */ + _setmode( _fileno( stdin ), _O_BINARY ); + _setmode( _fileno( stdout ), _O_BINARY ); +#endif + +#if defined(macintosh) && defined(__MWERKS__) + { + int argc; + char **argv; + argc=ccommand(&argv); /* get a "command line" from the Mac user */ + /* this also lets the user set stdin and stdout */ + } +#endif + + /********** Decode setup ************/ + + ogg_sync_init(&oy); /* Now we can read pages */ + + while(1){ /* we repeat if the bitstream is chained */ + int eos=0; + int i; + + /* grab some data at the head of the stream. We want the first page + (which is guaranteed to be small and only contain the Vorbis + stream initial header) We need the first page to get the stream + serialno. */ + + /* submit a 4k block to libvorbis' Ogg layer */ + buffer=ogg_sync_buffer(&oy,4096); + bytes=fread(buffer,1,4096,stdin); + ogg_sync_wrote(&oy,bytes); + + /* Get the first page. */ + if(ogg_sync_pageout(&oy,&og)!=1){ + /* have we simply run out of data? If so, we're done. */ + if(bytes<4096)break; + + /* error case. Must not be Vorbis data */ + fprintf(stderr,"Input does not appear to be an Ogg bitstream.\n"); + exit(1); + } + + /* Get the serial number and set up the rest of decode. */ + /* serialno first; use it to set up a logical stream */ + ogg_stream_init(&os,ogg_page_serialno(&og)); + + /* extract the initial header from the first page and verify that the + Ogg bitstream is in fact Vorbis data */ + + /* I handle the initial header first instead of just having the code + read all three Vorbis headers at once because reading the initial + header is an easy way to identify a Vorbis bitstream and it's + useful to see that functionality seperated out. */ + + vorbis_info_init(&vi); + vorbis_comment_init(&vc); + if(ogg_stream_pagein(&os,&og)<0){ + /* error; stream version mismatch perhaps */ + fprintf(stderr,"Error reading first page of Ogg bitstream data.\n"); + exit(1); + } + + if(ogg_stream_packetout(&os,&op)!=1){ + /* no page? must not be vorbis */ + fprintf(stderr,"Error reading initial header packet.\n"); + exit(1); + } + + if(vorbis_synthesis_headerin(&vi,&vc,&op)<0){ + /* error case; not a vorbis header */ + fprintf(stderr,"This Ogg bitstream does not contain Vorbis " + "audio data.\n"); + exit(1); + } + + /* At this point, we're sure we're Vorbis. We've set up the logical + (Ogg) bitstream decoder. Get the comment and codebook headers and + set up the Vorbis decoder */ + + /* The next two packets in order are the comment and codebook headers. + They're likely large and may span multiple pages. Thus we read + and submit data until we get our two packets, watching that no + pages are missing. If a page is missing, error out; losing a + header page is the only place where missing data is fatal. */ + + i=0; + while(i<2){ + while(i<2){ + int result=ogg_sync_pageout(&oy,&og); + if(result==0)break; /* Need more data */ + /* Don't complain about missing or corrupt data yet. We'll + catch it at the packet output phase */ + if(result==1){ + ogg_stream_pagein(&os,&og); /* we can ignore any errors here + as they'll also become apparent + at packetout */ + while(i<2){ + result=ogg_stream_packetout(&os,&op); + if(result==0)break; + if(result<0){ + /* Uh oh; data at some point was corrupted or missing! + We can't tolerate that in a header. Die. */ + fprintf(stderr,"Corrupt secondary header. Exiting.\n"); + exit(1); + } + result=vorbis_synthesis_headerin(&vi,&vc,&op); + if(result<0){ + fprintf(stderr,"Corrupt secondary header. Exiting.\n"); + exit(1); + } + i++; + } + } + } + /* no harm in not checking before adding more */ + buffer=ogg_sync_buffer(&oy,4096); + bytes=fread(buffer,1,4096,stdin); + if(bytes==0 && i<2){ + fprintf(stderr,"End of file before finding all Vorbis headers!\n"); + exit(1); + } + ogg_sync_wrote(&oy,bytes); + } + + /* Throw the comments plus a few lines about the bitstream we're + decoding */ + { + char **ptr=vc.user_comments; + while(*ptr){ + fprintf(stderr,"%s\n",*ptr); + ++ptr; + } + fprintf(stderr,"\nBitstream is %d channel, %ldHz\n",vi.channels,vi.rate); + fprintf(stderr,"Encoded by: %s\n\n",vc.vendor); + } + + convsize=4096/vi.channels; + + /* OK, got and parsed all three headers. Initialize the Vorbis + packet->PCM decoder. */ + if(vorbis_synthesis_init(&vd,&vi)==0){ /* central decode state */ + vorbis_block_init(&vd,&vb); /* local state for most of the decode + so multiple block decodes can + proceed in parallel. We could init + multiple vorbis_block structures + for vd here */ + + /* The rest is just a straight decode loop until end of stream */ + while(!eos){ + while(!eos){ + int result=ogg_sync_pageout(&oy,&og); + if(result==0)break; /* need more data */ + if(result<0){ /* missing or corrupt data at this page position */ + fprintf(stderr,"Corrupt or missing data in bitstream; " + "continuing...\n"); + }else{ + ogg_stream_pagein(&os,&og); /* can safely ignore errors at + this point */ + while(1){ + result=ogg_stream_packetout(&os,&op); + + if(result==0)break; /* need more data */ + if(result<0){ /* missing or corrupt data at this page position */ + /* no reason to complain; already complained above */ + }else{ + /* we have a packet. Decode it */ + float **pcm; + int samples; + + if(vorbis_synthesis(&vb,&op)==0) /* test for success! */ + vorbis_synthesis_blockin(&vd,&vb); + /* + + **pcm is a multichannel float vector. In stereo, for + example, pcm[0] is left, and pcm[1] is right. samples is + the size of each channel. Convert the float values + (-1.<=range<=1.) to whatever PCM format and write it out */ + + while((samples=vorbis_synthesis_pcmout(&vd,&pcm))>0){ + int j; + int clipflag=0; + int bout=(samples32767){ + val=32767; + clipflag=1; + } + if(val<-32768){ + val=-32768; + clipflag=1; + } + *ptr=val; + ptr+=vi.channels; + } + } + + if(clipflag) + fprintf(stderr,"Clipping in frame %ld\n",(long)(vd.sequence)); + + + fwrite(convbuffer,2*vi.channels,bout,stdout); + + vorbis_synthesis_read(&vd,bout); /* tell libvorbis how + many samples we + actually consumed */ + } + } + } + if(ogg_page_eos(&og))eos=1; + } + } + if(!eos){ + buffer=ogg_sync_buffer(&oy,4096); + bytes=fread(buffer,1,4096,stdin); + ogg_sync_wrote(&oy,bytes); + if(bytes==0)eos=1; + } + } + + /* ogg_page and ogg_packet structs always point to storage in + libvorbis. They're never freed or manipulated directly */ + + vorbis_block_clear(&vb); + vorbis_dsp_clear(&vd); + }else{ + fprintf(stderr,"Error: Corrupt header during playback initialization.\n"); + } + + /* clean up this logical bitstream; before exit we see if we're + followed by another [chained] */ + + ogg_stream_clear(&os); + vorbis_comment_clear(&vc); + vorbis_info_clear(&vi); /* must be called last */ + } + + /* OK, clean up the framer */ + ogg_sync_clear(&oy); + + fprintf(stderr,"Done.\n"); + return(0); +} diff --git a/cs/3rd party/libvorbis/examples/encoder_example.c b/cs/3rd party/libvorbis/examples/encoder_example.c new file mode 100644 index 000000000..d8d92bc3c --- /dev/null +++ b/cs/3rd party/libvorbis/examples/encoder_example.c @@ -0,0 +1,252 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE 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 SOURCE CODE IS (C) COPYRIGHT 1994-2007 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: simple example encoder + last mod: $Id$ + + ********************************************************************/ + +/* takes a stereo 16bit 44.1kHz WAV file from stdin and encodes it into + a Vorbis bitstream */ + +/* Note that this is POSIX, not ANSI, code */ + +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 /* We need the following two to set stdin/stdout to binary */ +#include +#include +#endif + +#if defined(__MACOS__) && defined(__MWERKS__) +#include /* CodeWarrior's Mac "command-line" support */ +#endif + +#define READ 1024 +signed char readbuffer[READ*4+44]; /* out of the data segment, not the stack */ + +int main(){ + ogg_stream_state os; /* take physical pages, weld into a logical + stream of packets */ + ogg_page og; /* one Ogg bitstream page. Vorbis packets are inside */ + ogg_packet op; /* one raw packet of data for decode */ + + vorbis_info vi; /* struct that stores all the static vorbis bitstream + settings */ + vorbis_comment vc; /* struct that stores all the user comments */ + + vorbis_dsp_state vd; /* central working state for the packet->PCM decoder */ + vorbis_block vb; /* local working space for packet->PCM decode */ + + int eos=0,ret; + int i, founddata; + +#if defined(macintosh) && defined(__MWERKS__) + int argc = 0; + char **argv = NULL; + argc = ccommand(&argv); /* get a "command line" from the Mac user */ + /* this also lets the user set stdin and stdout */ +#endif + + /* we cheat on the WAV header; we just bypass 44 bytes (simplest WAV + header is 44 bytes) and assume that the data is 44.1khz, stereo, 16 bit + little endian pcm samples. This is just an example, after all. */ + +#ifdef _WIN32 /* We need to set stdin/stdout to binary mode. Damn windows. */ + /* if we were reading/writing a file, it would also need to in + binary mode, eg, fopen("file.wav","wb"); */ + /* Beware the evil ifdef. We avoid these where we can, but this one we + cannot. Don't add any more, you'll probably go to hell if you do. */ + _setmode( _fileno( stdin ), _O_BINARY ); + _setmode( _fileno( stdout ), _O_BINARY ); +#endif + + + /* we cheat on the WAV header; we just bypass the header and never + verify that it matches 16bit/stereo/44.1kHz. This is just an + example, after all. */ + + readbuffer[0] = '\0'; + for (i=0, founddata=0; i<30 && ! feof(stdin) && ! ferror(stdin); i++) + { + fread(readbuffer,1,2,stdin); + + if ( ! strncmp((char*)readbuffer, "da", 2) ){ + founddata = 1; + fread(readbuffer,1,6,stdin); + break; + } + } + + /********** Encode setup ************/ + + vorbis_info_init(&vi); + + /* choose an encoding mode. A few possibilities commented out, one + actually used: */ + + /********************************************************************* + Encoding using a VBR quality mode. The usable range is -.1 + (lowest quality, smallest file) to 1. (highest quality, largest file). + Example quality mode .4: 44kHz stereo coupled, roughly 128kbps VBR + + ret = vorbis_encode_init_vbr(&vi,2,44100,.4); + + --------------------------------------------------------------------- + + Encoding using an average bitrate mode (ABR). + example: 44kHz stereo coupled, average 128kbps VBR + + ret = vorbis_encode_init(&vi,2,44100,-1,128000,-1); + + --------------------------------------------------------------------- + + Encode using a quality mode, but select that quality mode by asking for + an approximate bitrate. This is not ABR, it is true VBR, but selected + using the bitrate interface, and then turning bitrate management off: + + ret = ( vorbis_encode_setup_managed(&vi,2,44100,-1,128000,-1) || + vorbis_encode_ctl(&vi,OV_ECTL_RATEMANAGE2_SET,NULL) || + vorbis_encode_setup_init(&vi)); + + *********************************************************************/ + + ret=vorbis_encode_init_vbr(&vi,2,44100,0.1); + + /* do not continue if setup failed; this can happen if we ask for a + mode that libVorbis does not support (eg, too low a bitrate, etc, + will return 'OV_EIMPL') */ + + if(ret)exit(1); + + /* add a comment */ + vorbis_comment_init(&vc); + vorbis_comment_add_tag(&vc,"ENCODER","encoder_example.c"); + + /* set up the analysis state and auxiliary encoding storage */ + vorbis_analysis_init(&vd,&vi); + vorbis_block_init(&vd,&vb); + + /* set up our packet->stream encoder */ + /* pick a random serial number; that way we can more likely build + chained streams just by concatenation */ + srand(time(NULL)); + ogg_stream_init(&os,rand()); + + /* Vorbis streams begin with three headers; the initial header (with + most of the codec setup parameters) which is mandated by the Ogg + bitstream spec. The second header holds any comment fields. The + third header holds the bitstream codebook. We merely need to + make the headers, then pass them to libvorbis one at a time; + libvorbis handles the additional Ogg bitstream constraints */ + + { + ogg_packet header; + ogg_packet header_comm; + ogg_packet header_code; + + vorbis_analysis_headerout(&vd,&vc,&header,&header_comm,&header_code); + ogg_stream_packetin(&os,&header); /* automatically placed in its own + page */ + ogg_stream_packetin(&os,&header_comm); + ogg_stream_packetin(&os,&header_code); + + /* This ensures the actual + * audio data will start on a new page, as per spec + */ + while(!eos){ + int result=ogg_stream_flush(&os,&og); + if(result==0)break; + fwrite(og.header,1,og.header_len,stdout); + fwrite(og.body,1,og.body_len,stdout); + } + + } + + while(!eos){ + long i; + long bytes=fread(readbuffer,1,READ*4,stdin); /* stereo hardwired here */ + + if(bytes==0){ + /* end of file. this can be done implicitly in the mainline, + but it's easier to see here in non-clever fashion. + Tell the library we're at end of stream so that it can handle + the last frame and mark end of stream in the output properly */ + vorbis_analysis_wrote(&vd,0); + + }else{ + /* data to encode */ + + /* expose the buffer to submit data */ + float **buffer=vorbis_analysis_buffer(&vd,READ); + + /* uninterleave samples */ + for(i=0;i'AnalyzerGraph'); +my $Xname=$toplevel->Class; +$toplevel->optionAdd("$Xname.geometry", "800x600",20); + +my $geometry=$toplevel->optionGet('geometry',''); +$geometry=~/^(\d+)x(\d+)/; + +$toplevel->configure(-width=>$1); +$toplevel->configure(-height=>$2); + + + + + +$toplevel->optionAdd("$Xname.background", "#4fc627",20); +$toplevel->optionAdd("$Xname*highlightBackground", "#80c0d3",20); +$toplevel->optionAdd("$Xname.Panel.background", "#4fc627",20); +$toplevel->optionAdd("$Xname.Panel.foreground", "#d0d0d0",20); +$toplevel->optionAdd("$Xname.Panel.font", + '-*-helvetica-bold-r-*-*-18-*-*-*-*-*-*-*',20); +$toplevel->optionAdd("$Xname*Statuslabel.font", + '-*-helvetica-bold-r-*-*-18-*-*-*-*-*-*-*',20); +$toplevel->optionAdd("$Xname*Statuslabel.foreground", "#606060"); +$toplevel->optionAdd("$Xname*Status.font", + '-*-helvetica-bold-r-*-*-18-*-*-*-*-*-*-*',20); + +$toplevel->optionAdd("$Xname*AlertDetail.font", + '-*-helvetica-medium-r-*-*-10-*-*-*-*-*-*-*',20); + + +$toplevel->optionAdd("$Xname*background", "#d0d0d0",20); +$toplevel->optionAdd("$Xname*foreground", '#000000',20); + +$toplevel->optionAdd("$Xname*Button*background", "#f0d0b0",20); +$toplevel->optionAdd("$Xname*Button*foreground", '#000000',20); +$toplevel->optionAdd("$Xname*Button*borderWidth", '2',20); +$toplevel->optionAdd("$Xname*Button*relief", 'groove',20); +$toplevel->optionAdd("$Xname*Button*padY", 1,20); + +#$toplevel->optionAdd("$Xname*Scale*background", "#f0d0b0",20); +$toplevel->optionAdd("$Xname*Scale*foreground", '#000000',20); +$toplevel->optionAdd("$Xname*Scale*borderWidth", '1',20); +#$toplevel->optionAdd("$Xname*Scale*relief", 'groove',20); +$toplevel->optionAdd("$Xname*Scale*padY", 1,20); + +$toplevel->optionAdd("$Xname*Checkbutton*background", "#f0d0b0",20); +$toplevel->optionAdd("$Xname*Checkbutton*foreground", '#000000',20); +$toplevel->optionAdd("$Xname*Checkbutton*borderWidth", '2',20); +$toplevel->optionAdd("$Xname*Checkbutton*relief", 'groove',20); + +$toplevel->optionAdd("$Xname*activeBackground", "#ffffff",20); +$toplevel->optionAdd("$Xname*activeForeground", '#0000a0',20); +$toplevel->optionAdd("$Xname*borderWidth", 0,20); +$toplevel->optionAdd("$Xname*relief", 'flat',20); +$toplevel->optionAdd("$Xname*activeBorderWidth", 1,20); +$toplevel->optionAdd("$Xname*highlightThickness", 0,20); +$toplevel->optionAdd("$Xname*padX", 2,20); +$toplevel->optionAdd("$Xname*padY", 2,20); +$toplevel->optionAdd("$Xname*font", + '-*-helvetica-bold-r-*-*-12-*-*-*-*-*-*-*',20); +$toplevel->optionAdd("$Xname*Entry.font", + '-*-helvetica-medium-r-*-*-12-*-*-*-*-*-*-*',20); +$toplevel->optionAdd("$Xname*Exit.font", + '-*-helvetica-bold-r-*-*-10-*-*-*-*-*-*-*',20); +$toplevel->optionAdd("$Xname*Exit.relief", 'groove',20); +$toplevel->optionAdd("$Xname*Exit.padX", 1,20); +$toplevel->optionAdd("$Xname*Exit.padY", 1,20); +$toplevel->optionAdd("$Xname*Exit.borderWidth", 2,20); +$toplevel->optionAdd("$Xname*Exit*background", "#a0a0a0",20); +$toplevel->optionAdd("$Xname*Exit*disabledForeground", "#ffffff",20); + +#$toplevel->optionAdd("$Xname*Canvas.background", "#c0c0c0",20); + +$toplevel->optionAdd("$Xname*Entry.background", "#ffffff",20); +$toplevel->optionAdd("$Xname*Entry.disabledForeground", "#c0c0c0",20); +$toplevel->optionAdd("$Xname*Entry.relief", "sunken",20); +$toplevel->optionAdd("$Xname*Entry.borderWidth", 1,20); + +$toplevel->optionAdd("$Xname*Field.background", "#ffffff",20); +$toplevel->optionAdd("$Xname*Field.disabledForeground", "#c0c0c0",20); +$toplevel->optionAdd("$Xname*Field.relief", "flat",20); +$toplevel->optionAdd("$Xname*Field.borderWidth", 1,20); + +$toplevel->optionAdd("$Xname*Label.disabledForeground", "#c0c0c0",20); +$toplevel->optionAdd("$Xname*Label.borderWidth", 1,20); + +$toplevel->configure(-background=>$toplevel->optionGet("background","")); + +#$toplevel->resizable(FALSE,FALSE); + +my $panel=new MainWindow(-class=>'AnalyzerPanel'); +my $X2name=$panel->Class; + +$panel->optionAdd("$X2name.background", "#353535",20); +$panel->optionAdd("$X2name*highlightBackground", "#80c0d3",20); +$panel->optionAdd("$X2name.Panel.background", "#353535",20); +$panel->optionAdd("$X2name.Panel.foreground", "#4fc627",20); +$panel->optionAdd("$X2name.Panel.font", + '-*-helvetica-bold-o-*-*-18-*-*-*-*-*-*-*',20); +$panel->optionAdd("$X2name*Statuslabel.font", + '-*-helvetica-bold-r-*-*-18-*-*-*-*-*-*-*',20); +$panel->optionAdd("$X2name*Statuslabel.foreground", "#4fc627",20); +$panel->optionAdd("$X2name*Status.font", + '-*-helvetica-bold-r-*-*-18-*-*-*-*-*-*-*',20); + +$panel->optionAdd("$X2name*AlertDetail.font", + '-*-helvetica-medium-r-*-*-10-*-*-*-*-*-*-*',20); + + +$panel->optionAdd("$X2name*background", "#d0d0d0",20); +$panel->optionAdd("$X2name*foreground", '#000000',20); + +$panel->optionAdd("$X2name*Button*background", "#f0d0b0",20); +$panel->optionAdd("$X2name*Button*foreground", '#000000',20); +$panel->optionAdd("$X2name*Button*borderWidth", '2',20); +$panel->optionAdd("$X2name*Button*relief", 'groove',20); +$panel->optionAdd("$X2name*Button*padY", 1,20); + +$panel->optionAdd("$X2name*Checkbutton*background", "#f0d0b0",20); +$panel->optionAdd("$X2name*Checkbutton*foreground", '#000000',20); +$panel->optionAdd("$X2name*Checkbutton*borderWidth", '2',20); +#$panel->optionAdd("$X2name*Checkbutton*padX", '0',20); +#$panel->optionAdd("$X2name*Checkbutton*padY", '0',20); +#$panel->optionAdd("$X2name*Checkbutton*relief", 'groove',20); + +$panel->optionAdd("$X2name*activeBackground", "#ffffff",20); +$panel->optionAdd("$X2name*activeForeground", '#0000a0',20); +$panel->optionAdd("$X2name*borderWidth", 0,20); +$panel->optionAdd("$X2name*relief", 'flat',20); +$panel->optionAdd("$X2name*activeBorderWidth", 1,20); +$panel->optionAdd("$X2name*highlightThickness", 0,20); +$panel->optionAdd("$X2name*padX", 2,20); +$panel->optionAdd("$X2name*padY", 2,20); +$panel->optionAdd("$X2name*font", + '-*-helvetica-bold-r-*-*-12-*-*-*-*-*-*-*',20); +$panel->optionAdd("$X2name*Entry.font", + '-*-helvetica-medium-r-*-*-12-*-*-*-*-*-*-*',20); + +$panel->optionAdd("$X2name*Exit.font", + '-*-helvetica-bold-r-*-*-10-*-*-*-*-*-*-*',20); +$panel->optionAdd("$X2name*Exit.relief", 'groove',20); +$panel->optionAdd("$X2name*Exit.padX", 1,20); +$panel->optionAdd("$X2name*Exit.padY", 1,20); +$panel->optionAdd("$X2name*Exit.borderWidth", 2,20); +$panel->optionAdd("$X2name*Exit*background", "#a0a0a0",20); +$panel->optionAdd("$X2name*Exit*disabledForeground", "#ffffff",20); + +$panel->optionAdd("$X2name*Entry.background", "#ffffff",20); +$panel->optionAdd("$X2name*Entry.disabledForeground", "#c0c0c0",20); +$panel->optionAdd("$X2name*Entry.relief", "sunken",20); +$panel->optionAdd("$X2name*Entry.borderWidth", 1,20); + +$panel->optionAdd("$X2name*Field.background", "#ffffff",20); +$panel->optionAdd("$X2name*Field.disabledForeground", "#c0c0c0",20); +$panel->optionAdd("$X2name*Field.relief", "flat",20); +$panel->optionAdd("$X2name*Field.borderWidth", 1,20); + +$panel->optionAdd("$X2name*Label.disabledForeground", "#c0c0c0",20); +$panel->optionAdd("$X2name*Label.borderWidth", 1,20); + +$panel->configure(-background=>$panel->optionGet("background","")); + +#$panel->resizable("FALSE","FALSE"); + +my $panel_shell=$panel->Label(Name=>"shell",-borderwidth=>1,-relief=>'raised')-> + place(-x=>10,-y=>36,-relwidth=>1.0,-relheight=>1.0, + -width=>-20,-height=>-46,-anchor=>'nw'); + +my $panel_quit=$panel_shell->Button(-class=>"Exit",-text=>"quit",-command=>[sub{Shutdown()}])-> + place(-x=>-1,-y=>-1,-relx=>1.0,-rely=>1.0,-anchor=>'se'); + +$panel->Label(Name=>"logo text",-class=>"Panel",-text=>$version)-> + place(-x=>5,-y=>5,-anchor=>'nw'); + + +my $graph_shell=$toplevel->Label(Name=>"shell",-borderwidth=>1,-relief=>'raised')-> + place(-x=>10,-y=>36,-relwidth=>1.0,-relheight=>1.0, + -width=>-20,-height=>-46,-anchor=>'nw'); + +my $graph_status=$toplevel->Label(Name=>"logo text",-class=>"Panel",-text=>"Starting up")-> + place(-x=>5,-y=>5,-anchor=>'nw'); + + +my $panely=5; +my $panel_rescan=$panel_shell->Button(-text=>"rescan",-command=>[sub{scan_directory()}])-> + place(-x=>-5,-relx=>1.,-y=>$panely,-anchor=>'ne'); +$panely+=$panel_rescan->reqheight()+6; + + +my$temp=$graph_shell->Button(-text=>"<<", + -command=>[sub{$fileno-=10;$fileno=$first_file if($fileno<$first_file); + load_graph();}])-> + place(-x=>5,-y=>-5,-rely=>1.,-relwidth=>.2,-width=>-5,-anchor=>'sw'); +$graph_shell->Button(-text=>">>", + -command=>[sub{$fileno+=10;$fileno=$last_file if($fileno>$last_file); + load_graph();}])-> + place(-x=>-5,-y=>-5,-relwidth=>.2,-rely=>1.,-width=>-5,-relx=>1.,-anchor=>'se'); +$graph_shell->Button(-text=>"<", + -command=>[sub{$fileno-=1;$fileno=$first_file if($fileno<$first_file); + load_graph();}])-> + place(-x=>5,-y=>-5,-relwidth=>.3,-width=>-7,-rely=>1.,-relx=>.2,-anchor=>'sw'); +$graph_shell->Button(-text=>">", + -command=>[sub{$fileno+=1;$fileno=$last_file if($fileno>$last_file); + load_graph();}])-> + place(-x=>-5,-y=>-5,-relwidth=>.3,-width=>-7,-rely=>1.,-relx=>.8,-anchor=>'se'); +my$graphy=-10-$temp->reqheight(); +my$graph_slider=$temp=$graph_shell->Scale(-bigincrement=>1, + -resolution=>1, + -showvalue=>'TRUE',-variable=>\$fileno,-orient=>'horizontal')-> + place(-x=>5,-y=>$graphy,-relwidth=>1.,-rely=>1.,-width=>-10,-anchor=>'sw'); +$graphy-=$temp->reqheight()+5; + +my$onecrop; +my$twocrop; + +my$oneresize=$temp=$graph_shell->Checkbutton(-text=>"rescale",-variable=>\$onecrop, + -command=>[sub{draw_graph();}])-> + place(-x=>5,-y=>5,-anchor=>'nw'); + +my$one=$graph_shell->Canvas()-> + place(-relwidth=>1.,-width=>-10,-relheight=>.5,-height=>($graphy/2)-5-$temp->reqheight(), + -x=>5,-y=>5+$temp->reqheight,-anchor=>'nw'); + + +my$tworesize=$temp=$graph_shell->Checkbutton(-text=>"rescale",-variable=>\$twocrop, + -command=>[sub{draw_graph();}])-> + place(-rely=>1.,-y=>5,-anchor=>'nw',-in=>$one); +my$two=$graph_shell->Canvas()-> + place(-relwidth=>1.,-relheight=>1.,-rely=>1.,-y=>5+$temp->reqheight(),-anchor=>'nw',-in=>$one); + +scan_directory(); + +my%onestate; +my%twostate; +my @data; + +$onestate{"canvas"}=$one; +$onestate{"vars"}=\@panel_onevars; +$twostate{"canvas"}=$two; +$twostate{"vars"}=\@panel_twovars; + +$graph_slider->configure(-command=>[sub{load_graph()}]); +load_graph(); +$toplevel->bind('MainWindow','',[sub{$toplevel->update(); + draw_graph()}]); + +Tk::MainLoop(); + +sub load_graph{ + + scan_directory()if(!defined($panel_count)); + + @data=undef; + + for(my$i=0;$i<$panel_count;$i++){ + my$filename=$panel_keys[$i]."_$fileno.m"; + if(open F, "$filename"){ + $data[$i]=[()]; + close F; + } + } + draw_graph(); +} + +sub graphhelper{ + my($graph)=@_; + my$count=0; + my@colors=("#ff0000","#00df00","#0000ff","#ffff00","#ff00ff","#00ffff","#ffffff", + "#9f0000","#007f00","#00009f","#8f8f00","#8f008f","#008f8f","#000000"); + + my$w=$graph->{"canvas"}; + my$rescale=0; + + Status("Plotting $fileno"); + $w->delete('foo'); + $w->delete('legend'); + $w->delete('lines'); + + # count range + for(my$i=0;$i<$panel_count;$i++){ + if($graph->{"vars"}->[$i]){ + if(defined($data[$i])){ + if(!defined($graph->{"minx"})){ + $data[$i]->[0]=~m/^\s*(-?[0-9\.]*)[ ,]+(-?[0-9\.]*)/; + $graph->{"maxx"}=$1; + $graph->{"minx"}=$1; + $graph->{"maxy"}=$2; + $graph->{"miny"}=$2; + $rescale=1; + } + + for(my$j=0;$j<=$#{$data[$i]};$j++){ + $data[$i]->[$j]=~m/^\s*(-?[0-9\.]*)[ ,]+(-?[0-9\.]*)/; + $rescale=1 if($1>$graph->{"maxx"}); + $rescale=1 if($1<$graph->{"minx"}); + $rescale=1 if($2>$graph->{"maxy"}); + $rescale=1 if($2<$graph->{"miny"}); + $graph->{"maxx"}=$1 if($1>$graph->{"maxx"}); + $graph->{"minx"}=$1 if($1<$graph->{"minx"}); + $graph->{"maxy"}=$2 if($2>$graph->{"maxy"}); + $graph->{"miny"}=$2 if($2<$graph->{"miny"}); + } + } + $count++; + } + } + + my$width=$w->width(); + my$height=$w->height(); + + $rescale=1 if(!defined($graph->{"width"}) || + $width!=$graph->{"width"} || + $height!=$graph->{"height"}); + + $graph->{"width"}=$width; + $graph->{"height"}=$height; + + if(defined($graph->{"maxx"})){ + # draw axes, labels + # look for appropriate axis scales + + if($rescale){ + + $w->delete('ylabel'); + $w->delete('xlabel'); + $w->delete('axes'); + + my$yscale=1.; + my$xscale=1.; + my$iyscale=1.; + my$ixscale=1.; + while(($graph->{"maxx"}-$graph->{"minx"})*$xscale>15){$xscale*=.1;$ixscale*=10.;} + while(($graph->{"maxy"}-$graph->{"miny"})*$yscale>15){$yscale*=.1;$iyscale*=10.;} + + while(($graph->{"maxx"}-$graph->{"minx"})*$xscale<3){$xscale*=10.;$ixscale*=.1;} + while(($graph->{"maxy"}-$graph->{"miny"})*$yscale<3){$yscale*=10.;$iyscale*=.1;} + + # how tall are the x axis labels? + $w->createText(-1,-1,-anchor=>'se',-tags=>['foo'],-text=>"0123456789."); + my($x1,$y1,$x2,$y2)=$w->bbox('foo'); + $w->delete('foo'); + my$maxlabelheight=$y2-$y1; + my$useabley=$height-$maxlabelheight-3; + my$pixelpery=$useabley/($graph->{"maxy"}-$graph->{"miny"}); + + # place y axis labels at proper spacing/height + my$lasty=-$maxlabelheight/2; + my$topyval=int($graph->{"maxy"}*$yscale+1.)*$iyscale; + + for(my$i=0;;$i++){ + my$yval= $topyval-$i*$iyscale; + my$y= ($graph->{"maxy"}-$yval)*$pixelpery; + last if($y>$useabley); + if($y-$maxlabelheight>=$lasty){ + $w->createText(0,$y,-anchor=>'e',-tags=>['ylabel'],-text=>"$yval"); + $lasty=$y; + } + } + + # get the max ylabel width and place them at proper x + ($x1,$y1,$x2,$y2)=$w->bbox('ylabel'); + my$maxylabelwidth=$x2-$x1; + $w->move('ylabel',$maxylabelwidth,0); + + my$beginx=$maxylabelwidth+3; + my$useablex=$width-$beginx; + + # draw basic axes + $w->createLine($beginx,0,$beginx,$useabley,$width,$useabley, + -tags=>['axes'],-width=>2); + # draw y tix + $lasty=-$maxlabelheight/2; + for(my$i=0;;$i++){ + my$yval= $topyval-$i*$iyscale; + my$y= ($graph->{"maxy"}-$yval)*$pixelpery; + last if($y>$useabley); + if($yval==0){ + $w->createLine($beginx,$y,$width,$y, + -tags=>['axes'],-width=>1); + }else{ + if($y-$maxlabelheight>=$lasty){ + $w->createLine($beginx,$y,$width,$y, + -tags=>['axes'],-width=>1, + -stipple=>'gray50'); + + $lasty=$y; + } + } + } + + # place x axis labels at proper spacing + my$topxval=int($graph->{"maxx"}*$xscale+1.)*$ixscale; + my$pixelperx=$useablex/($graph->{"maxx"}-$graph->{"minx"}); + + for(my$i=0;;$i++){ + my$xval= $topxval-$i*$ixscale; + my$x= $width-($graph->{"maxx"}-$xval)*$pixelperx; + + last if($x<$beginx); + # bounding boxen are hard. place temp labels. + $w->createText(-1,-1,-anchor=>'e',-tags=>['foo'],-text=>"$xval"); + } + + ($x1,$y1,$x2,$y2)=$w->bbox('foo'); + my$maxxlabelwidth=$x2-$x1; + $w->delete('foo'); + my$lastx=$width; + + for(my$i=0;;$i++){ + my$xval= $topxval-$i*$ixscale; + my$x= $width-($graph->{"maxx"}-$xval)*$pixelperx; + + last if($x-$maxxlabelwidth/2<0 || $x<$beginx); + if($xval==0 && $x<$width){ + $w->createLine($x,0,$x,$useabley,-tags=>['axes'],-width=>1); + } + + if($x+$maxxlabelwidth<=$lastx){ + $w->createText($x,$height-1,-anchor=>'s',-tags=>['xlabel'],-text=>"$xval"); + $w->createLine($x,0,$x,$useabley,-tags=>['axes'],-width=>1,-stipple=>"gray50"); + $lastx=$x; + } + } + $graph->{"labelheight"}=$maxlabelheight; + $graph->{"xo"}=$beginx; + $graph->{"ppx"}=$pixelperx; + $graph->{"ppy"}=$pixelpery; + } + + # plot the files + $count=0; + my$legendy=$graph->{"labelheight"}/2; + for(my$i=0;$i<$panel_count;$i++){ + if($graph->{"vars"}->[$i]){ + $count++; # count here for legend color selection stability + if(defined($data[$i])){ + # place a legend placard; + my$color=$colors[($count-1)%($#colors+1)]; + $w->createText($width,$legendy,-anchor=>'e',-tags=>['legend'], + -fill=>$color,-text=>$panel_keys[$i]); + $legendy+=$graph->{"labelheight"}; + + # plot the lines + my@pairs=map{if(/^\s*(-?[0-9\.]*)[ ,]+(-?[0-9\.]*)/){ + (($1-$graph->{"minx"})*$graph->{"ppx"}+$graph->{"xo"}, + (-$2+$graph->{"maxy"})*$graph->{"ppy"})}} (@{$data[$i]}); + + $w->createLine((@pairs),-fill=>$color,-tags=>['lines']); + } + } + } + } +} + +sub draw_graph{ + + if($onecrop){ + $onestate{"minx"}=undef; + $onestate{"miny"}=undef; + $onestate{"maxx"}=undef; + $onestate{"maxy"}=undef; + } + if($twocrop){ + $twostate{"minx"}=undef; + $twostate{"miny"}=undef; + $twostate{"maxx"}=undef; + $twostate{"maxy"}=undef; + } + + for(my$i=0;$i<$panel_count;$i++){ + if($twostate{"vars"}->[$i]){ + + #re-place the canvases + + $oneresize->place(-x=>5,-y=>5,-anchor=>'nw'); + + $one->place(-relwidth=>1.,-width=>-10,-relheight=>.5, + -height=>($graphy/2)-5-$oneresize->reqheight(), + -x=>5,-y=>5+$oneresize->reqheight,-anchor=>'nw'); + + $tworesize->place(-rely=>1.,-y=>5,-anchor=>'nw',-in=>$one); + $two->place(-relwidth=>1.,-relheight=>1.,-rely=>1., + -y=>5+$tworesize->reqheight(),-anchor=>'nw',-in=>$one); + + graphhelper(\%onestate); + graphhelper(\%twostate); + return; + } + } + + $oneresize->place(-x=>5,-y=>5,-anchor=>'nw'); + + $one->place(-relwidth=>1.,-width=>-10,-relheight=>1., + -height=>$graphy-5-$oneresize->reqheight(), + -x=>5,-y=>5+$oneresize->reqheight,-anchor=>'nw'); + + $tworesize->placeForget(); + $two->placeForget(); + + graphhelper(\%onestate); +} + +sub depopulate_panel{ + my $win; + foreach $win (@panel_labels){ + $win->destroy(); + } + @panel_labels=(); + foreach $win (@panel_ones){ + $win->destroy(); + } + @panel_ones=(); + foreach $win (@panel_twos){ + $win->destroy(); + } + @panel_twos=(); + @panel_keys=(); +} + +sub populate_panel{ + my $localy=$panely; + my $key; + my $i=0; + foreach $key (sort (keys %bases)){ + $panel_keys[$i]=$key; + if(!defined($panel_onevars[$i])){ + $panel_onevars[$i]=0; + $panel_twovars[$i]=0; + } + + my $temp=$panel_twos[$i]=$panel_shell-> + Checkbutton(-variable=>\$panel_twovars[$i],-command=>['main::draw_graph'],-text=>'2')-> + place(-y=>$localy,-x=>-5,-anchor=>"ne",-relx=>1.); + my $oney=$temp->reqheight(); + my $onex=$temp->reqwidth()+15; + + $temp=$panel_ones[$i]=$panel_shell-> + Checkbutton(-variable=>\$panel_onevars[$i],-command=>['main::draw_graph'],-text=>'1')-> + place(-y=>0,-x=>0,-anchor=>"ne",-in=>$temp,-bordermode=>'outside'); + $oney=$temp->reqheight() if ($oney<$temp->reqheight()); + $onex+=$temp->reqwidth(); + + $temp=$panel_labels[$i]=$panel_shell->Label(-text=>$key,-class=>'Field',-justify=>'left')-> + place(-y=>$localy,-x=>5,-anchor=>"nw",-relwidth=>1.,-width=>-$onex, + -bordermode=>'outside'); + $oney=$temp->reqheight() if ($oney<$temp->reqheight()); + + $localy+=$oney+2; + $i++; + } + $panel_count=$i; + + $localy+=$panel_quit->reqheight()+50; + my $geometry=$panel->geometry(); + $geometry=~/^(\d+)/; + + $panel->configure(-height=>$localy); + $panel->configure(-width=>$1); +} + +sub Shutdown{ + Tk::exit(); +} + +sub Status{ + my$text=shift @_; + $graph_status->configure(-text=>"$text"); + $toplevel->update(); +} + +sub scan_directory{ + + %bases=(); + my$count=0; + + $first_file=undef; + $last_file=undef; + + if(opendir(D,".")){ + my$file; + while(defined($file=readdir(D))){ + if($file=~m/^(\S*)_(\d+).m/){ + $bases{"$1"}="0"; + $first_file=$2 if(!defined($first_file) || $2<$first_file); + $last_file=$2 if(!defined($last_file) || $2>$last_file); + $count++; + + Status("Reading... $count")if($count%117==0); + } + } + closedir(D); + } + Status("Done Reading: $count files"); + depopulate_panel(); + populate_panel(); + + $fileno=$first_file if($fileno<$first_file); + $fileno=$last_file if($fileno>$last_file); + + $graph_slider->configure(-from=>$first_file,-to=>$last_file); + +} + + + + + diff --git a/cs/3rd party/libvorbis/examples/seeking_example.c b/cs/3rd party/libvorbis/examples/seeking_example.c new file mode 100644 index 000000000..83fb7f488 --- /dev/null +++ b/cs/3rd party/libvorbis/examples/seeking_example.c @@ -0,0 +1,278 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE 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 SOURCE CODE IS (C) COPYRIGHT 1994-2007 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: illustrate seeking, and test it too + last mod: $Id$ + + ********************************************************************/ + +#include +#include +#include "vorbis/codec.h" +#include "vorbis/vorbisfile.h" + +#ifdef _WIN32 /* We need the following two to set stdin/stdout to binary */ +# include +# include +#endif + +void _verify(OggVorbis_File *ov, + ogg_int64_t val,ogg_int64_t pcmval,double timeval, + ogg_int64_t pcmlength, + char *bigassbuffer){ + off_t i; + int j; + long bread; + char buffer[4096]; + int dummy; + ogg_int64_t pos; + int hs = ov_halfrate_p(ov); + + /* verify the raw position, the pcm position and position decode */ + if(val!=-1 && ov_raw_tell(ov)pcmval){ + fprintf(stderr,"pcm position out of tolerance: requested %ld, got %ld\n", + (long)pcmval,(long)ov_pcm_tell(ov)); + exit(1); + } + if(timeval!=-1 && ov_time_tell(ov)>timeval){ + fprintf(stderr,"time position out of tolerance: requested %f, got %f\n", + timeval,ov_time_tell(ov)); + exit(1); + } + pos=ov_pcm_tell(ov); + if(pos<0 || pos>pcmlength){ + fprintf(stderr,"pcm position out of bounds: got %ld\n",(long)pos); + exit(1); + } + bread=ov_read(ov,buffer,4096,1,1,1,&dummy); + for(j=0;j>hs)*2)]){ + fprintf(stderr,"data after seek doesn't match declared pcm position %ld\n",(long)pos); + + for(i=0;i<(pcmlength>>hs)*2-bread;i++){ + for(j=0;j>hs)>=0 && (j+((pos*2)>>hs))<(pcmlength>>hs)*2) + fprintf(f,"%d %d\n",j,(int)bigassbuffer[j+((pos*2)>>hs)]); + fclose(f); + } + + exit(1); + } + } +} + +int main(){ + OggVorbis_File ov; + int i,ret; + ogg_int64_t pcmlength; + double timelength; + char *bigassbuffer; + int dummy; + int hs=0; + +#ifdef _WIN32 /* We need to set stdin/stdout to binary mode. Damn windows. */ + _setmode( _fileno( stdin ), _O_BINARY ); +#endif + + + /* open the file/pipe on stdin */ + if(ov_open_callbacks(stdin,&ov,NULL,-1,OV_CALLBACKS_NOCLOSE)<0){ + fprintf(stderr,"Could not open input as an OggVorbis file.\n\n"); + exit(1); + } + +#if 0 /*enable this code to test seeking with halfrate decode */ + if(ov_halfrate(&ov,1)){ + fprintf(stderr,"Sorry; unable to set half-rate decode.\n\n"); + exit(1); + }else + hs=1; +#endif + + if(ov_seekable(&ov)){ + + /* to simplify our own lives, we want to assume the whole file is + stereo. Verify this to avoid potentially mystifying users + (pissing them off is OK, just don't confuse them) */ + for(i=0;ichannels!=2){ + fprintf(stderr,"Sorry; right now seeking_test can only use Vorbis files\n" + "that are entirely stereo.\n\n"); + exit(1); + } + } + + /* because we want to do sample-level verification that the seek + does what it claimed, decode the entire file into memory */ + pcmlength=ov_pcm_total(&ov,-1); + timelength=ov_time_total(&ov,-1); + bigassbuffer=malloc((pcmlength>>hs)*2); /* w00t */ + i=0; + while(i<(pcmlength>>hs)*2){ + int ret=ov_read(&ov,bigassbuffer+i,((pcmlength>>hs)*2)-i,1,1,1,&dummy); + if(ret<0){ + fprintf(stderr,"Error reading file.\n"); + exit(1); + } + if(ret){ + i+=ret; + }else{ + pcmlength=(i/2)<>hs)*2-i)); + } + + { + ogg_int64_t length=ov.end; + fprintf(stderr,"\rtesting raw seeking to random places in %ld bytes....\n", + (long)length); + + for(i=0;i<1000;i++){ + ogg_int64_t val=(double)rand()/RAND_MAX*length; + fprintf(stderr,"\r\t%d [raw position %ld]... ",i,(long)val); + ret=ov_raw_seek(&ov,val); + if(ret<0){ + fprintf(stderr,"seek failed: %d\n",ret); + exit(1); + } + + _verify(&ov,val,-1,-1.,pcmlength,bigassbuffer); + + } + } + + fprintf(stderr,"\r"); + { + fprintf(stderr,"testing pcm page seeking to random places in %ld samples....\n", + (long)pcmlength); + + for(i=0;i<1000;i++){ + ogg_int64_t val= i==0?(ogg_int64_t)0:(double)rand()/RAND_MAX*pcmlength; + fprintf(stderr,"\r\t%d [pcm position %ld]... ",i,(long)val); + ret=ov_pcm_seek_page(&ov,val); + if(ret<0){ + fprintf(stderr,"seek failed: %d\n",ret); + exit(1); + } + + _verify(&ov,-1,val,-1.,pcmlength,bigassbuffer); + + } + } + + fprintf(stderr,"\r"); + { + fprintf(stderr,"testing pcm exact seeking to random places in %f seconds....\n", + timelength); + for(i=0;i<1000;i++){ + ogg_int64_t val= i==0?(ogg_int64_t)0:(double)rand()/RAND_MAX*pcmlength; + fprintf(stderr,"\r\t%d [pcm position %ld]... ",i,(long)val); + ret=ov_pcm_seek(&ov,val); + if(ret<0){ + fprintf(stderr,"seek failed: %d\n",ret); + exit(1); + } + if(ov_pcm_tell(&ov)!=((val>>hs)<val+1){ + fprintf(stderr,"Declared position didn't perfectly match request: %f != %f\n", + val,ov_time_tell(&ov)); + exit(1); + } + + _verify(&ov,-1,-1,val,pcmlength,bigassbuffer); + + } + } + + fprintf(stderr,"\r \nOK.\n\n"); + + + }else{ + fprintf(stderr,"Standard input was not seekable.\n"); + } + + ov_clear(&ov); + return 0; +} + + + + + + + + + + + + + diff --git a/cs/3rd party/libvorbis/examples/vorbisfile_example.c b/cs/3rd party/libvorbis/examples/vorbisfile_example.c new file mode 100644 index 000000000..4c27fa47e --- /dev/null +++ b/cs/3rd party/libvorbis/examples/vorbisfile_example.c @@ -0,0 +1,92 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE 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 SOURCE CODE IS (C) COPYRIGHT 1994-2007 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: simple example decoder using vorbisfile + last mod: $Id$ + + ********************************************************************/ + +/* Takes a vorbis bitstream from stdin and writes raw stereo PCM to + stdout using vorbisfile. Using vorbisfile is much simpler than + dealing with libvorbis. */ + +#include +#include +#include +#include +#include + +#ifdef _WIN32 /* We need the following two to set stdin/stdout to binary */ +#include +#include +#endif + +char pcmout[4096]; /* take 4k out of the data segment, not the stack */ + +int main(){ + OggVorbis_File vf; + int eof=0; + int current_section; + +#ifdef _WIN32 /* We need to set stdin/stdout to binary mode. Damn windows. */ + /* Beware the evil ifdef. We avoid these where we can, but this one we + cannot. Don't add any more, you'll probably go to hell if you do. */ + _setmode( _fileno( stdin ), _O_BINARY ); + _setmode( _fileno( stdout ), _O_BINARY ); +#endif + + if(ov_open_callbacks(stdin, &vf, NULL, 0, OV_CALLBACKS_NOCLOSE) < 0) { + fprintf(stderr,"Input does not appear to be an Ogg bitstream.\n"); + exit(1); + } + + /* Throw the comments plus a few lines about the bitstream we're + decoding */ + { + char **ptr=ov_comment(&vf,-1)->user_comments; + vorbis_info *vi=ov_info(&vf,-1); + while(*ptr){ + fprintf(stderr,"%s\n",*ptr); + ++ptr; + } + fprintf(stderr,"\nBitstream is %d channel, %ldHz\n",vi->channels,vi->rate); + fprintf(stderr,"\nDecoded length: %ld samples\n", + (long)ov_pcm_total(&vf,-1)); + fprintf(stderr,"Encoded by: %s\n\n",ov_comment(&vf,-1)->vendor); + } + + while(!eof){ + long ret=ov_read(&vf,pcmout,sizeof(pcmout),0,2,1,¤t_section); + if (ret == 0) { + /* EOF */ + eof=1; + } else if (ret < 0) { + if(ret==OV_EBADLINK){ + fprintf(stderr,"Corrupt bitstream section! Exiting.\n"); + exit(1); + } + + /* some other error in the stream. Not a problem, just reporting it in + case we (the app) cares. In this case, we don't. */ + } else { + /* we don't bother dealing with sample rate changes, etc, but + you'll have to*/ + fwrite(pcmout,1,ret,stdout); + } + } + + /* cleanup */ + ov_clear(&vf); + + fprintf(stderr,"Done.\n"); + return(0); +} diff --git a/cs/3rd party/libvorbis/include/Makefile.am b/cs/3rd party/libvorbis/include/Makefile.am new file mode 100644 index 000000000..0f34fab4c --- /dev/null +++ b/cs/3rd party/libvorbis/include/Makefile.am @@ -0,0 +1,3 @@ +## Process this file with automake to produce Makefile.in + +SUBDIRS = vorbis diff --git a/cs/3rd party/libvorbis/include/vorbis/Makefile.am b/cs/3rd party/libvorbis/include/vorbis/Makefile.am new file mode 100644 index 000000000..dbba34e55 --- /dev/null +++ b/cs/3rd party/libvorbis/include/vorbis/Makefile.am @@ -0,0 +1,7 @@ +## Process this file with automake to produce Makefile.in + +vorbisincludedir = $(includedir)/vorbis + +vorbisinclude_HEADERS = codec.h vorbisfile.h vorbisenc.h + + diff --git a/cs/3rd party/libvorbis/include/vorbis/codec.h b/cs/3rd party/libvorbis/include/vorbis/codec.h new file mode 100644 index 000000000..f082241d1 --- /dev/null +++ b/cs/3rd party/libvorbis/include/vorbis/codec.h @@ -0,0 +1,243 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE 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 SOURCE CODE IS (C) COPYRIGHT 1994-2001 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + + ******************************************************************** + + function: libvorbis codec headers + last mod: $Id$ + + ********************************************************************/ + +#ifndef _vorbis_codec_h_ +#define _vorbis_codec_h_ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +#include + +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; + + float **pcm; + float **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; + + ogg_int64_t glue_bits; + ogg_int64_t time_bits; + ogg_int64_t floor_bits; + ogg_int64_t res_bits; + + void *backend_state; +} vorbis_dsp_state; + +typedef struct vorbis_block{ + /* necessary stream state for linking to the framing abstraction */ + float **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; + + /* bitmetrics for the frame */ + long glue_bits; + long time_bits; + long floor_bits; + long res_bits; + + void *internal; + +} 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 independent 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, const char *comment); +extern void vorbis_comment_add_tag(vorbis_comment *vc, + const char *tag, const char *contents); +extern char *vorbis_comment_query(vorbis_comment *vc, const char *tag, int count); +extern int vorbis_comment_query_count(vorbis_comment *vc, const 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); +extern double vorbis_granule_time(vorbis_dsp_state *v, + ogg_int64_t granulepos); + +extern const char *vorbis_version_string(void); + +/* Vorbis PRIMITIVES: analysis/DSP layer ****************************/ + +extern int vorbis_analysis_init(vorbis_dsp_state *v,vorbis_info *vi); +extern int vorbis_commentheader_out(vorbis_comment *vc, ogg_packet *op); +extern int vorbis_analysis_headerout(vorbis_dsp_state *v, + vorbis_comment *vc, + ogg_packet *op, + ogg_packet *op_comm, + ogg_packet *op_code); +extern float **vorbis_analysis_buffer(vorbis_dsp_state *v,int vals); +extern int vorbis_analysis_wrote(vorbis_dsp_state *v,int vals); +extern int vorbis_analysis_blockout(vorbis_dsp_state *v,vorbis_block *vb); +extern int vorbis_analysis(vorbis_block *vb,ogg_packet *op); + +extern int vorbis_bitrate_addblock(vorbis_block *vb); +extern int vorbis_bitrate_flushpacket(vorbis_dsp_state *vd, + ogg_packet *op); + +/* 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,float ***pcm); +extern int vorbis_synthesis_lapout(vorbis_dsp_state *v,float ***pcm); +extern int vorbis_synthesis_read(vorbis_dsp_state *v,int samples); +extern long vorbis_packet_blocksize(vorbis_info *vi,ogg_packet *op); + +extern int vorbis_synthesis_halfrate(vorbis_info *v,int flag); +extern int vorbis_synthesis_halfrate_p(vorbis_info *v); + +/* 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/cs/3rd party/libvorbis/include/vorbis/vorbisenc.h b/cs/3rd party/libvorbis/include/vorbis/vorbisenc.h new file mode 100644 index 000000000..8c51ec155 --- /dev/null +++ b/cs/3rd party/libvorbis/include/vorbis/vorbisenc.h @@ -0,0 +1,436 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE 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 SOURCE CODE IS (C) COPYRIGHT 1994-2001 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: vorbis encode-engine setup + last mod: $Id$ + + ********************************************************************/ + +/** \file + * Libvorbisenc is a convenient API for setting up an encoding + * environment using libvorbis. Libvorbisenc encapsulates the + * actions needed to set up the encoder properly. + */ + +#ifndef _OV_ENC_H_ +#define _OV_ENC_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +#include "codec.h" + +/** + * This is the primary function within libvorbisenc for setting up managed + * bitrate modes. + * + * Before this function is called, the \ref vorbis_info + * struct should be initialized by using vorbis_info_init() from the libvorbis + * API. After encoding, vorbis_info_clear() should be called. + * + * The max_bitrate, nominal_bitrate, and min_bitrate settings are used to set + * constraints for the encoded file. This function uses these settings to + * select the appropriate encoding mode and set it up. + * + * \param vi Pointer to an initialized \ref vorbis_info struct. + * \param channels The number of channels to be encoded. + * \param rate The sampling rate of the source audio. + * \param max_bitrate Desired maximum bitrate (limit). -1 indicates unset. + * \param nominal_bitrate Desired average, or central, bitrate. -1 indicates unset. + * \param min_bitrate Desired minimum bitrate. -1 indicates unset. + * + * \return Zero for success, and negative values for failure. + * + * \retval 0 Success. + * \retval OV_EFAULT Internal logic fault; indicates a bug or heap/stack corruption. + * \retval OV_EINVAL Invalid setup request, eg, out of range argument. + * \retval OV_EIMPL Unimplemented mode; unable to comply with bitrate request. + */ +extern int vorbis_encode_init(vorbis_info *vi, + long channels, + long rate, + + long max_bitrate, + long nominal_bitrate, + long min_bitrate); + +/** + * This function performs step-one of a three-step bitrate-managed encode + * setup. It functions similarly to the one-step setup performed by \ref + * vorbis_encode_init but allows an application to make further encode setup + * tweaks using \ref vorbis_encode_ctl before finally calling \ref + * vorbis_encode_setup_init to complete the setup process. + * + * Before this function is called, the \ref vorbis_info struct should be + * initialized by using vorbis_info_init() from the libvorbis API. After + * encoding, vorbis_info_clear() should be called. + * + * The max_bitrate, nominal_bitrate, and min_bitrate settings are used to set + * constraints for the encoded file. This function uses these settings to + * select the appropriate encoding mode and set it up. + * + * \param vi Pointer to an initialized vorbis_info struct. + * \param channels The number of channels to be encoded. + * \param rate The sampling rate of the source audio. + * \param max_bitrate Desired maximum bitrate (limit). -1 indicates unset. + * \param nominal_bitrate Desired average, or central, bitrate. -1 indicates unset. + * \param min_bitrate Desired minimum bitrate. -1 indicates unset. + * + * \return Zero for success, and negative for failure. + * + * \retval 0 Success + * \retval OV_EFAULT Internal logic fault; indicates a bug or heap/stack corruption. + * \retval OV_EINVAL Invalid setup request, eg, out of range argument. + * \retval OV_EIMPL Unimplemented mode; unable to comply with bitrate request. + */ +extern int vorbis_encode_setup_managed(vorbis_info *vi, + long channels, + long rate, + + long max_bitrate, + long nominal_bitrate, + long min_bitrate); + +/** + * This function performs step-one of a three-step variable bitrate + * (quality-based) encode setup. It functions similarly to the one-step setup + * performed by \ref vorbis_encode_init_vbr() but allows an application to + * make further encode setup tweaks using \ref vorbis_encode_ctl() before + * finally calling \ref vorbis_encode_setup_init to complete the setup + * process. + * + * Before this function is called, the \ref vorbis_info struct should be + * initialized by using \ref vorbis_info_init() from the libvorbis API. After + * encoding, vorbis_info_clear() should be called. + * + * \param vi Pointer to an initialized vorbis_info struct. + * \param channels The number of channels to be encoded. + * \param rate The sampling rate of the source audio. + * \param quality Desired quality level, currently from -0.1 to 1.0 (lo to hi). + * + * \return Zero for success, and negative values for failure. + * + * \retval 0 Success + * \retval OV_EFAULT Internal logic fault; indicates a bug or heap/stack corruption. + * \retval OV_EINVAL Invalid setup request, eg, out of range argument. + * \retval OV_EIMPL Unimplemented mode; unable to comply with quality level request. + */ +extern int vorbis_encode_setup_vbr(vorbis_info *vi, + long channels, + long rate, + + float quality + ); + +/** + * This is the primary function within libvorbisenc for setting up variable + * bitrate ("quality" based) modes. + * + * + * Before this function is called, the vorbis_info struct should be + * initialized by using vorbis_info_init() from the libvorbis API. After + * encoding, vorbis_info_clear() should be called. + * + * \param vi Pointer to an initialized vorbis_info struct. + * \param channels The number of channels to be encoded. + * \param rate The sampling rate of the source audio. + * \param base_quality Desired quality level, currently from -0.1 to 1.0 (lo to hi). + * + * + * \return Zero for success, or a negative number for failure. + * + * \retval 0 Success + * \retval OV_EFAULT Internal logic fault; indicates a bug or heap/stack corruption. + * \retval OV_EINVAL Invalid setup request, eg, out of range argument. + * \retval OV_EIMPL Unimplemented mode; unable to comply with quality level request. + */ +extern int vorbis_encode_init_vbr(vorbis_info *vi, + long channels, + long rate, + + float base_quality + ); + +/** + * This function performs the last stage of three-step encoding setup, as + * described in the API overview under managed bitrate modes. + * + * Before this function is called, the \ref vorbis_info struct should be + * initialized by using vorbis_info_init() from the libvorbis API, one of + * \ref vorbis_encode_setup_managed() or \ref vorbis_encode_setup_vbr() called to + * initialize the high-level encoding setup, and \ref vorbis_encode_ctl() + * called if necessary to make encoding setup changes. + * vorbis_encode_setup_init() finalizes the highlevel encoding structure into + * a complete encoding setup after which the application may make no further + * setup changes. + * + * After encoding, vorbis_info_clear() should be called. + * + * \param vi Pointer to an initialized \ref vorbis_info struct. + * + * \return Zero for success, and negative values for failure. + * + * \retval 0 Success. + * \retval OV_EFAULT Internal logic fault; indicates a bug or heap/stack corruption. + * + * \retval OV_EINVAL Attempt to use vorbis_encode_setup_init() without first + * calling one of vorbis_encode_setup_managed() or vorbis_encode_setup_vbr() to + * initialize the high-level encoding setup + * + */ +extern int vorbis_encode_setup_init(vorbis_info *vi); + +/** + * This function implements a generic interface to miscellaneous encoder + * settings similar to the classic UNIX 'ioctl()' system call. Applications + * may use vorbis_encode_ctl() to query or set bitrate management or quality + * mode details by using one of several \e request arguments detailed below. + * vorbis_encode_ctl() must be called after one of + * vorbis_encode_setup_managed() or vorbis_encode_setup_vbr(). When used + * to modify settings, \ref vorbis_encode_ctl() must be called before \ref + * vorbis_encode_setup_init(). + * + * \param vi Pointer to an initialized vorbis_info struct. + * + * \param number Specifies the desired action; See \ref encctlcodes "the list + * of available requests". + * + * \param arg void * pointing to a data structure matching the request + * argument. + * + * \retval 0 Success. Any further return information (such as the result of a + * query) is placed into the storage pointed to by *arg. + * + * \retval OV_EINVAL Invalid argument, or an attempt to modify a setting after + * calling vorbis_encode_setup_init(). + * + * \retval OV_EIMPL Unimplemented or unknown request + */ +extern int vorbis_encode_ctl(vorbis_info *vi,int number,void *arg); + +/** + * \deprecated This is a deprecated interface. Please use vorbis_encode_ctl() + * with the \ref ovectl_ratemanage2_arg struct and \ref + * OV_ECTL_RATEMANAGE2_GET and \ref OV_ECTL_RATEMANAGE2_SET calls in new code. + * + * The \ref ovectl_ratemanage_arg structure is used with vorbis_encode_ctl() + * and the \ref OV_ECTL_RATEMANAGE_GET, \ref OV_ECTL_RATEMANAGE_SET, \ref + * OV_ECTL_RATEMANAGE_AVG, \ref OV_ECTL_RATEMANAGE_HARD calls in order to + * query and modify specifics of the encoder's bitrate management + * configuration. +*/ +struct ovectl_ratemanage_arg { + int management_active; /**< nonzero if bitrate management is active*/ +/** hard lower limit (in kilobits per second) below which the stream bitrate + will never be allowed for any given bitrate_hard_window seconds of time.*/ + long bitrate_hard_min; +/** hard upper limit (in kilobits per second) above which the stream bitrate + will never be allowed for any given bitrate_hard_window seconds of time.*/ + long bitrate_hard_max; +/** the window period (in seconds) used to regulate the hard bitrate minimum + and maximum*/ + double bitrate_hard_window; +/** soft lower limit (in kilobits per second) below which the average bitrate + tracker will start nudging the bitrate higher.*/ + long bitrate_av_lo; +/** soft upper limit (in kilobits per second) above which the average bitrate + tracker will start nudging the bitrate lower.*/ + long bitrate_av_hi; +/** the window period (in seconds) used to regulate the average bitrate + minimum and maximum.*/ + double bitrate_av_window; +/** Regulates the relative centering of the average and hard windows; in + libvorbis 1.0 and 1.0.1, the hard window regulation overlapped but + followed the average window regulation. In libvorbis 1.1 a bit-reservoir + interface replaces the old windowing interface; the older windowing + interface is simulated and this field has no effect.*/ + double bitrate_av_window_center; +}; + +/** + * \name struct ovectl_ratemanage2_arg + * + * The ovectl_ratemanage2_arg structure is used with vorbis_encode_ctl() and + * the OV_ECTL_RATEMANAGE2_GET and OV_ECTL_RATEMANAGE2_SET calls in order to + * query and modify specifics of the encoder's bitrate management + * configuration. + * +*/ +struct ovectl_ratemanage2_arg { + int management_active; /**< nonzero if bitrate management is active */ +/** Lower allowed bitrate limit in kilobits per second */ + long bitrate_limit_min_kbps; +/** Upper allowed bitrate limit in kilobits per second */ + long bitrate_limit_max_kbps; + long bitrate_limit_reservoir_bits; /**struct ovectl_ratemanage2_arg *
    + * + * Used to query the current encoder bitrate management setting. Also used to + * initialize fields of an ovectl_ratemanage2_arg structure for use with + * \ref OV_ECTL_RATEMANAGE2_SET. + */ +#define OV_ECTL_RATEMANAGE2_GET 0x14 + +/** + * Set the current encoder bitrate management settings. + * + * Argument: struct ovectl_ratemanage2_arg * + * + * Used to set the current encoder bitrate management settings to the values + * listed in the ovectl_ratemanage2_arg. Passing a NULL pointer will disable + * bitrate management. +*/ +#define OV_ECTL_RATEMANAGE2_SET 0x15 + +/** + * Returns the current encoder hard-lowpass setting (kHz) in the double + * pointed to by arg. + * + * Argument: double * +*/ +#define OV_ECTL_LOWPASS_GET 0x20 + +/** + * Sets the encoder hard-lowpass to the value (kHz) pointed to by arg. Valid + * lowpass settings range from 2 to 99. + * + * Argument: double * +*/ +#define OV_ECTL_LOWPASS_SET 0x21 + +/** + * Returns the current encoder impulse block setting in the double pointed + * to by arg. + * + * Argument: double * +*/ +#define OV_ECTL_IBLOCK_GET 0x30 + +/** + * Sets the impulse block bias to the the value pointed to by arg. + * + * Argument: double * + * + * Valid range is -15.0 to 0.0 [default]. A negative impulse block bias will + * direct to encoder to use more bits when incoding short blocks that contain + * strong impulses, thus improving the accuracy of impulse encoding. + */ +#define OV_ECTL_IBLOCK_SET 0x31 + +/** + * Returns the current encoder coupling setting in the int pointed + * to by arg. + * + * Argument: int * +*/ +#define OV_ECTL_COUPLING_GET 0x40 + +/** + * Enables/disables channel coupling in multichannel encoding according to arg. + * + * Argument: int * + * + * Zero disables channel coupling for multichannel inputs, nonzer enables + * channel coupling. Setting has no effect on monophonic encoding or + * multichannel counts that do not offer coupling. At present, coupling is + * available for stereo and 5.1 encoding. + */ +#define OV_ECTL_COUPLING_SET 0x41 + + /* deprecated rate management supported only for compatibility */ + +/** + * Old interface to querying bitrate management settings. + * + * Deprecated after move to bit-reservoir style management in 1.1 rendered + * this interface partially obsolete. + + * \deprecated Please use \ref OV_ECTL_RATEMANAGE2_GET instead. + * + * Argument: struct ovectl_ratemanage_arg * + */ +#define OV_ECTL_RATEMANAGE_GET 0x10 +/** + * Old interface to modifying bitrate management settings. + * + * deprecated after move to bit-reservoir style management in 1.1 rendered + * this interface partially obsolete. + * + * \deprecated Please use \ref OV_ECTL_RATEMANAGE2_SET instead. + * + * Argument: struct ovectl_ratemanage_arg * + */ +#define OV_ECTL_RATEMANAGE_SET 0x11 +/** + * Old interface to setting average-bitrate encoding mode. + * + * Deprecated after move to bit-reservoir style management in 1.1 rendered + * this interface partially obsolete. + * + * \deprecated Please use \ref OV_ECTL_RATEMANAGE2_SET instead. + * + * Argument: struct ovectl_ratemanage_arg * + */ +#define OV_ECTL_RATEMANAGE_AVG 0x12 +/** + * Old interface to setting bounded-bitrate encoding modes. + * + * deprecated after move to bit-reservoir style management in 1.1 rendered + * this interface partially obsolete. + * + * \deprecated Please use \ref OV_ECTL_RATEMANAGE2_SET instead. + * + * Argument: struct ovectl_ratemanage_arg * + */ +#define OV_ECTL_RATEMANAGE_HARD 0x13 + +/*@}*/ + + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/cs/3rd party/libvorbis/include/vorbis/vorbisfile.h b/cs/3rd party/libvorbis/include/vorbis/vorbisfile.h new file mode 100644 index 000000000..de540cf72 --- /dev/null +++ b/cs/3rd party/libvorbis/include/vorbis/vorbisfile.h @@ -0,0 +1,206 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE 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 SOURCE CODE IS (C) COPYRIGHT 1994-2007 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: stdio-based convenience library for opening/seeking/decoding + last mod: $Id$ + + ********************************************************************/ + +#ifndef _OV_FILE_H_ +#define _OV_FILE_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +#include +#include "codec.h" + +/* The function prototypes for the callbacks are basically the same as for + * the stdio functions fread, fseek, fclose, ftell. + * The one difference is that the FILE * arguments have been replaced with + * a void * - this is to be used as a pointer to whatever internal data these + * functions might need. In the stdio case, it's just a FILE * cast to a void * + * + * If you use other functions, check the docs for these functions and return + * the right values. For seek_func(), you *MUST* return -1 if the stream is + * unseekable + */ +typedef struct { + size_t (*read_func) (void *ptr, size_t size, size_t nmemb, void *datasource); + int (*seek_func) (void *datasource, ogg_int64_t offset, int whence); + int (*close_func) (void *datasource); + long (*tell_func) (void *datasource); +} ov_callbacks; + +#ifndef OV_EXCLUDE_STATIC_CALLBACKS + +/* a few sets of convenient callbacks, especially for use under + * Windows where ov_open_callbacks() should always be used instead of + * ov_open() to avoid problems with incompatible crt.o version linking + * issues. */ + +static int _ov_header_fseek_wrap(FILE *f,ogg_int64_t off,int whence){ + if(f==NULL)return(-1); + +#ifdef __MINGW32__ + return fseeko64(f,off,whence); +#elif defined (_WIN32) + return _fseeki64(f,off,whence); +#else + return fseek(f,off,whence); +#endif +} + +/* These structs below (OV_CALLBACKS_DEFAULT etc) are defined here as + * static data. That means that every file which includes this header + * will get its own copy of these structs whether it uses them or + * not unless it #defines OV_EXCLUDE_STATIC_CALLBACKS. + * These static symbols are essential on platforms such as Windows on + * which several different versions of stdio support may be linked to + * by different DLLs, and we need to be certain we know which one + * we're using (the same one as the main application). + */ + +static ov_callbacks OV_CALLBACKS_DEFAULT = { + (size_t (*)(void *, size_t, size_t, void *)) fread, + (int (*)(void *, ogg_int64_t, int)) _ov_header_fseek_wrap, + (int (*)(void *)) fclose, + (long (*)(void *)) ftell +}; + +static ov_callbacks OV_CALLBACKS_NOCLOSE = { + (size_t (*)(void *, size_t, size_t, void *)) fread, + (int (*)(void *, ogg_int64_t, int)) _ov_header_fseek_wrap, + (int (*)(void *)) NULL, + (long (*)(void *)) ftell +}; + +static ov_callbacks OV_CALLBACKS_STREAMONLY = { + (size_t (*)(void *, size_t, size_t, void *)) fread, + (int (*)(void *, ogg_int64_t, int)) NULL, + (int (*)(void *)) fclose, + (long (*)(void *)) NULL +}; + +static ov_callbacks OV_CALLBACKS_STREAMONLY_NOCLOSE = { + (size_t (*)(void *, size_t, size_t, void *)) fread, + (int (*)(void *, ogg_int64_t, int)) NULL, + (int (*)(void *)) NULL, + (long (*)(void *)) NULL +}; + +#endif + +#define NOTOPEN 0 +#define PARTOPEN 1 +#define OPENED 2 +#define STREAMSET 3 +#define INITSET 4 + +typedef struct OggVorbis_File { + void *datasource; /* Pointer to a FILE *, etc. */ + int seekable; + ogg_int64_t offset; + ogg_int64_t end; + ogg_sync_state oy; + + /* If the FILE handle isn't seekable (eg, a pipe), only the current + stream appears */ + int links; + ogg_int64_t *offsets; + ogg_int64_t *dataoffsets; + long *serialnos; + ogg_int64_t *pcmlengths; /* overloaded to maintain binary + compatibility; x2 size, stores both + beginning and end values */ + vorbis_info *vi; + vorbis_comment *vc; + + /* Decoding working state local storage */ + ogg_int64_t pcm_offset; + int ready_state; + long current_serialno; + int current_link; + + double bittrack; + double samptrack; + + ogg_stream_state os; /* take physical pages, weld into a logical + stream of packets */ + vorbis_dsp_state vd; /* central working state for the packet->PCM decoder */ + vorbis_block vb; /* local working space for packet->PCM decode */ + + ov_callbacks callbacks; + +} OggVorbis_File; + + +extern int ov_clear(OggVorbis_File *vf); +extern int ov_fopen(const char *path,OggVorbis_File *vf); +extern int ov_open(FILE *f,OggVorbis_File *vf,const char *initial,long ibytes); +extern int ov_open_callbacks(void *datasource, OggVorbis_File *vf, + const char *initial, long ibytes, ov_callbacks callbacks); + +extern int ov_test(FILE *f,OggVorbis_File *vf,const char *initial,long ibytes); +extern int ov_test_callbacks(void *datasource, OggVorbis_File *vf, + const char *initial, long ibytes, ov_callbacks callbacks); +extern int ov_test_open(OggVorbis_File *vf); + +extern long ov_bitrate(OggVorbis_File *vf,int i); +extern long ov_bitrate_instant(OggVorbis_File *vf); +extern long ov_streams(OggVorbis_File *vf); +extern long ov_seekable(OggVorbis_File *vf); +extern long ov_serialnumber(OggVorbis_File *vf,int i); + +extern ogg_int64_t ov_raw_total(OggVorbis_File *vf,int i); +extern ogg_int64_t ov_pcm_total(OggVorbis_File *vf,int i); +extern double ov_time_total(OggVorbis_File *vf,int i); + +extern int ov_raw_seek(OggVorbis_File *vf,ogg_int64_t pos); +extern int ov_pcm_seek(OggVorbis_File *vf,ogg_int64_t pos); +extern int ov_pcm_seek_page(OggVorbis_File *vf,ogg_int64_t pos); +extern int ov_time_seek(OggVorbis_File *vf,double pos); +extern int ov_time_seek_page(OggVorbis_File *vf,double pos); + +extern int ov_raw_seek_lap(OggVorbis_File *vf,ogg_int64_t pos); +extern int ov_pcm_seek_lap(OggVorbis_File *vf,ogg_int64_t pos); +extern int ov_pcm_seek_page_lap(OggVorbis_File *vf,ogg_int64_t pos); +extern int ov_time_seek_lap(OggVorbis_File *vf,double pos); +extern int ov_time_seek_page_lap(OggVorbis_File *vf,double pos); + +extern ogg_int64_t ov_raw_tell(OggVorbis_File *vf); +extern ogg_int64_t ov_pcm_tell(OggVorbis_File *vf); +extern double ov_time_tell(OggVorbis_File *vf); + +extern vorbis_info *ov_info(OggVorbis_File *vf,int link); +extern vorbis_comment *ov_comment(OggVorbis_File *vf,int link); + +extern long ov_read_float(OggVorbis_File *vf,float ***pcm_channels,int samples, + int *bitstream); +extern long ov_read_filter(OggVorbis_File *vf,char *buffer,int length, + int bigendianp,int word,int sgned,int *bitstream, + void (*filter)(float **pcm,long channels,long samples,void *filter_param),void *filter_param); +extern long ov_read(OggVorbis_File *vf,char *buffer,int length, + int bigendianp,int word,int sgned,int *bitstream); +extern int ov_crosslap(OggVorbis_File *vf1,OggVorbis_File *vf2); + +extern int ov_halfrate(OggVorbis_File *vf,int flag); +extern int ov_halfrate_p(OggVorbis_File *vf); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif + diff --git a/cs/3rd party/libvorbis/libvorbis.spec.in b/cs/3rd party/libvorbis/libvorbis.spec.in new file mode 100644 index 000000000..723c07080 --- /dev/null +++ b/cs/3rd party/libvorbis/libvorbis.spec.in @@ -0,0 +1,121 @@ +Name: libvorbis +Version: @VERSION@ +Release: 0.xiph.1 +Summary: The Vorbis General Audio Compression Codec. + +Group: System Environment/Libraries +License: BSD +URL: http://www.xiph.org/ +Vendor: Xiph.org Foundation +Source: http://downloads.xiph.org/releases/vorbis/%{name}-%{version}.tar.gz +BuildRoot: %{_tmppath}/%{name}-%{version}-root + +# We're forced to use an epoch since both Red Hat and Ximian use it in their +# rc packages +Epoch: 2 +# Dirty trick to tell rpm that this package actually provides what the +# last rc and beta was offering +Provides: %{name} = %{epoch}:1.0rc3-%{release} +Provides: %{name} = %{epoch}:1.0beta4-%{release} + +Requires: libogg >= 1.1 +BuildRequires: libogg-devel >= 1.1 + +%description +Ogg Vorbis is a fully open, non-proprietary, patent-and-royalty-free, +general-purpose compressed audio format for audio and music at fixed +and variable bitrates from 16 to 128 kbps/channel. + +%package devel +Summary: Vorbis Library Development +Group: Development/Libraries +Requires: libogg-devel >= 1.1 +Requires: libvorbis = %{version} +# Dirty trick to tell rpm that this package actually provides what the +# last rc and beta was offering +Provides: %{name}-devel = %{epoch}:1.0rc3-%{release} +Provides: %{name}-devel = %{epoch}:1.0beta4-%{release} + +%description devel +The libvorbis-devel package contains the header files, static libraries +and documentation needed to develop applications with libvorbis. + +%prep +%setup -q -n %{name}-%{version} + +%build +CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{_prefix} --enable-static +make + +%install +rm -rf $RPM_BUILD_ROOT + +make DESTDIR=$RPM_BUILD_ROOT install + +%clean +rm -rf $RPM_BUILD_ROOT + +%post -p /sbin/ldconfig + +%postun -p /sbin/ldconfig + +%files +%defattr(-,root,root) +%doc AUTHORS COPYING README +%{_libdir}/libvorbis.so.* +%{_libdir}/libvorbisfile.so.* +%{_libdir}/libvorbisenc.so.* + +%files devel +%doc doc/*.html +%doc doc/*.png +%doc doc/*.txt +%doc doc/vorbisfile +%doc doc/vorbisenc +%{_datadir}/aclocal/vorbis.m4 +%dir %{_includedir}/vorbis +%{_includedir}/vorbis/codec.h +%{_includedir}/vorbis/vorbisfile.h +%{_includedir}/vorbis/vorbisenc.h +%{_libdir}/libvorbis.a +%{_libdir}/libvorbis.la +%{_libdir}/libvorbis.so +%{_libdir}/libvorbisfile.a +%{_libdir}/libvorbisfile.la +%{_libdir}/libvorbisfile.so +%{_libdir}/libvorbisenc.a +%{_libdir}/libvorbisenc.la +%{_libdir}/libvorbisenc.so +%{_libdir}/pkgconfig/vorbis.pc +%{_libdir}/pkgconfig/vorbisfile.pc +%{_libdir}/pkgconfig/vorbisenc.pc + +%changelog +* Sat May 3 2008 Ralph Giles +- updated source location + +* Thu Jun 10 2004 Thomas Vander Stichele +- autogenerate from configure +- fix download location +- remove Prefix +- own include dir +- move ldconfig runs to -p scripts +- change Release tag to include xiph + +* Tue Oct 07 2003 Warren Dukes +- update for 1.0.1 release + +* Sun Jul 14 2002 Thomas Vander Stichele +- Added BuildRequires: +- updated for 1.0 release + +* Sat May 25 2002 Michael Smith +- Fixed requires, copyright string. +* Sun Dec 31 2001 Jack Moffitt +- Updated for rc3 release. + +* Sun Oct 07 2001 Jack Moffitt +- Updated for configurable prefixes + +* Sat Oct 21 2000 Jack Moffitt +- initial spec file created diff --git a/cs/3rd party/libvorbis/m4/Makefile.am b/cs/3rd party/libvorbis/m4/Makefile.am new file mode 100644 index 000000000..cd184850f --- /dev/null +++ b/cs/3rd party/libvorbis/m4/Makefile.am @@ -0,0 +1,4 @@ +## Process this file with automake to produce Makefile.in + +EXTRA_DIST = add_cflags.m4 ogg.m4 pkg.m4 + diff --git a/cs/3rd party/libvorbis/m4/add_cflags.m4 b/cs/3rd party/libvorbis/m4/add_cflags.m4 new file mode 100644 index 000000000..eeb6efda0 --- /dev/null +++ b/cs/3rd party/libvorbis/m4/add_cflags.m4 @@ -0,0 +1,15 @@ +dnl @synopsis AC_ADD_CFLAGS +dnl +dnl Add the given option to CFLAGS, if it doesn't break the compiler + +AC_DEFUN([AC_ADD_CFLAGS], +[AC_MSG_CHECKING([if $CC accepts $1]) + ac_add_cflags__old_cflags="$CFLAGS" + CFLAGS="$CFLAGS $1" + AC_TRY_LINK([#include ], + [puts("Hello, World!"); return 0;], + AC_MSG_RESULT([yes]), + AC_MSG_RESULT([no]) + CFLAGS="$ac_add_cflags__old_cflags") + ]) +])# AC_ADD_CFLAGS diff --git a/cs/3rd party/libvorbis/m4/ogg.m4 b/cs/3rd party/libvorbis/m4/ogg.m4 new file mode 100644 index 000000000..1d3fb8b7b --- /dev/null +++ b/cs/3rd party/libvorbis/m4/ogg.m4 @@ -0,0 +1,116 @@ +# Configure paths for libogg +# Jack Moffitt 10-21-2000 +# Shamelessly stolen from Owen Taylor and Manish Singh + +dnl XIPH_PATH_OGG([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +dnl Test for libogg, and define OGG_CFLAGS and OGG_LIBS +dnl +AC_DEFUN([XIPH_PATH_OGG], +[dnl +dnl Get the cflags and libraries +dnl +AC_ARG_WITH(ogg,AC_HELP_STRING([--with-ogg=PFX],[Prefix where libogg is installed (optional)]), ogg_prefix="$withval", ogg_prefix="") +AC_ARG_WITH(ogg-libraries,AC_HELP_STRING([--with-ogg-libraries=DIR],[Directory where libogg library is installed (optional)]), ogg_libraries="$withval", ogg_libraries="") +AC_ARG_WITH(ogg-includes,AC_HELP_STRING([--with-ogg-includes=DIR],[Directory where libogg header files are installed (optional)]), ogg_includes="$withval", ogg_includes="") +AC_ARG_ENABLE(oggtest,AC_HELP_STRING([--disable-oggtest],[Do not try to compile and run a test Ogg program]),, enable_oggtest=yes) + + if test "x$ogg_libraries" != "x" ; then + OGG_LIBS="-L$ogg_libraries" + elif test "x$ogg_prefix" = "xno" || test "x$ogg_prefix" = "xyes" ; then + OGG_LIBS="" + elif test "x$ogg_prefix" != "x" ; then + OGG_LIBS="-L$ogg_prefix/lib" + elif test "x$prefix" != "xNONE" ; then + OGG_LIBS="-L$prefix/lib" + fi + + if test "x$ogg_prefix" != "xno" ; then + OGG_LIBS="$OGG_LIBS -logg" + fi + + if test "x$ogg_includes" != "x" ; then + OGG_CFLAGS="-I$ogg_includes" + elif test "x$ogg_prefix" = "xno" || test "x$ogg_prefix" = "xyes" ; then + OGG_CFLAGS="" + elif test "x$ogg_prefix" != "x" ; then + OGG_CFLAGS="-I$ogg_prefix/include" + elif test "x$prefix" != "xNONE"; then + OGG_CFLAGS="-I$prefix/include" + fi + + AC_MSG_CHECKING(for Ogg) + if test "x$ogg_prefix" = "xno" ; then + no_ogg="disabled" + enable_oggtest="no" + else + no_ogg="" + fi + + + if test "x$enable_oggtest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $OGG_CFLAGS" + LIBS="$LIBS $OGG_LIBS" +dnl +dnl Now check if the installed Ogg is sufficiently new. +dnl + rm -f conf.oggtest + AC_TRY_RUN([ +#include +#include +#include +#include + +int main () +{ + system("touch conf.oggtest"); + return 0; +} + +],, no_ogg=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + + if test "x$no_ogg" = "xdisabled" ; then + AC_MSG_RESULT(no) + ifelse([$2], , :, [$2]) + elif test "x$no_ogg" = "x" ; then + AC_MSG_RESULT(yes) + ifelse([$1], , :, [$1]) + else + AC_MSG_RESULT(no) + if test -f conf.oggtest ; then + : + else + echo "*** Could not run Ogg test program, checking why..." + CFLAGS="$CFLAGS $OGG_CFLAGS" + LIBS="$LIBS $OGG_LIBS" + AC_TRY_LINK([ +#include +#include +], [ return 0; ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding Ogg or finding the wrong" + echo "*** version of Ogg. If it is not finding Ogg, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means Ogg was incorrectly installed" + echo "*** or that you have moved Ogg since it was installed." ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + OGG_CFLAGS="" + OGG_LIBS="" + ifelse([$2], , :, [$2]) + fi + AC_SUBST(OGG_CFLAGS) + AC_SUBST(OGG_LIBS) + rm -f conf.oggtest +]) diff --git a/cs/3rd party/libvorbis/m4/pkg.m4 b/cs/3rd party/libvorbis/m4/pkg.m4 new file mode 100644 index 000000000..996e29454 --- /dev/null +++ b/cs/3rd party/libvorbis/m4/pkg.m4 @@ -0,0 +1,157 @@ +# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# +# Copyright © 2004 Scott James Remnant . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# PKG_PROG_PKG_CONFIG([MIN-VERSION]) +# ---------------------------------- +AC_DEFUN([PKG_PROG_PKG_CONFIG], +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) +m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=m4_default([$1], [0.9.0]) + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PKG_CONFIG="" + fi + +fi[]dnl +])# PKG_PROG_PKG_CONFIG + +# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# +# Check to see whether a particular set of modules exists. Similar +# to PKG_CHECK_MODULES(), but does not set variables or print errors. +# +# +# Similar to PKG_CHECK_MODULES, make sure that the first instance of +# this or PKG_CHECK_MODULES is called, or make sure to call +# PKG_CHECK_EXISTS manually +# -------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_EXISTS], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +if test -n "$PKG_CONFIG" && \ + AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then + m4_ifval([$2], [$2], [:]) +m4_ifvaln([$3], [else + $3])dnl +fi]) + + +# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +# --------------------------------------------- +m4_define([_PKG_CONFIG], +[if test -n "$PKG_CONFIG"; then + if test -n "$$1"; then + pkg_cv_[]$1="$$1" + else + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], + [pkg_failed=yes]) + fi +else + pkg_failed=untried +fi[]dnl +])# _PKG_CONFIG + +# _PKG_SHORT_ERRORS_SUPPORTED +# ----------------------------- +AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi[]dnl +])# _PKG_SHORT_ERRORS_SUPPORTED + + +# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +# [ACTION-IF-NOT-FOUND]) +# +# +# Note that if there is a possibility the first call to +# PKG_CHECK_MODULES might not happen, you should be sure to include an +# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac +# +# +# -------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_MODULES], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl + +pkg_failed=no +AC_MSG_CHECKING([for $1]) + +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) + +m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS +and $1[]_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details.]) + +if test $pkg_failed = yes; then + _PKG_SHORT_ERRORS_SUPPORTED + if test $_pkg_short_errors_supported = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"` + else + $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` + fi + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD + + ifelse([$4], , [AC_MSG_ERROR(dnl +[Package requirements ($2) were not met: + +$$1_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +_PKG_TEXT +])], + [AC_MSG_RESULT([no]) + $4]) +elif test $pkg_failed = untried; then + ifelse([$4], , [AC_MSG_FAILURE(dnl +[The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +_PKG_TEXT + +To get pkg-config, see .])], + [$4]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + ifelse([$3], , :, [$3]) +fi[]dnl +])# PKG_CHECK_MODULES diff --git a/cs/3rd party/libvorbis/macosx/English.lproj/InfoPlist.strings b/cs/3rd party/libvorbis/macosx/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..cfe1b22a882c2fbdf1a83e1f56d3003b12e59d29 GIT binary patch literal 142 zcmW-Z!3u&<5Jk`0uXwn0VIL4~3IZWoy027-Qo~n4e!O~+Vdl=g9PYfZBO`ET;Lep7 z4<;IFv!6N=O$K^3sI9luwf;HpjgNdxpVI%0%Ir*>BPR}grE9r{i~XG%DBP6Fj**-F IQMV^q0h_28>Hq)$ literal 0 HcmV?d00001 diff --git a/cs/3rd party/libvorbis/macosx/Info.plist b/cs/3rd party/libvorbis/macosx/Info.plist new file mode 100644 index 000000000..63e1b09c9 --- /dev/null +++ b/cs/3rd party/libvorbis/macosx/Info.plist @@ -0,0 +1,30 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + Vorbis + CFBundleGetInfoString + Vorbis framework 1.2.3, Copyright © 1994-2009 Xiph.Org Foundation + CFBundleIconFile + + CFBundleIdentifier + org.xiph.vorbis + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.2.3 + CFBundleSignature + ???? + CFBundleVersion + 1.2.3 + NSHumanReadableCopyright + Vorbis framework 1.2.3, Copyright © 1994-2009 Xiph.Org Foundation + CSResourcesFileMapped + + + diff --git a/cs/3rd party/libvorbis/macosx/Vorbis.xcodeproj/project.pbxproj b/cs/3rd party/libvorbis/macosx/Vorbis.xcodeproj/project.pbxproj new file mode 100644 index 000000000..12f5392a5 --- /dev/null +++ b/cs/3rd party/libvorbis/macosx/Vorbis.xcodeproj/project.pbxproj @@ -0,0 +1,891 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 42; + objects = { + +/* Begin PBXBuildFile section */ + 730F23A3091827B100AB638C /* codec.h in Headers */ = {isa = PBXBuildFile; fileRef = F58520B90191D12B01A802FE /* codec.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 730F23A4091827B100AB638C /* vorbisenc.h in Headers */ = {isa = PBXBuildFile; fileRef = F58520BA0191D12B01A802FE /* vorbisenc.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 730F23A5091827B100AB638C /* vorbisfile.h in Headers */ = {isa = PBXBuildFile; fileRef = F58520BB0191D12B01A802FE /* vorbisfile.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 730F23A6091827B100AB638C /* backends.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F60B03389C830112CE8F /* backends.h */; }; + 730F23A7091827B100AB638C /* bitrate.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F60E03389C830112CE8F /* bitrate.h */; }; + 730F23A8091827B100AB638C /* res_books_stereo.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F61603389C830112CE8F /* res_books_stereo.h */; }; + 730F23A9091827B100AB638C /* floor_books.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F61903389C830112CE8F /* floor_books.h */; }; + 730F23AA091827B100AB638C /* res_books_uncoupled.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F62203389C830112CE8F /* res_books_uncoupled.h */; }; + 730F23AB091827B100AB638C /* codebook.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F62403389C830112CE8F /* codebook.h */; }; + 730F23AC091827B100AB638C /* codec_internal.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F62503389C830112CE8F /* codec_internal.h */; }; + 730F23AD091827B100AB638C /* envelope.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F62703389C830112CE8F /* envelope.h */; }; + 730F23AE091827B100AB638C /* highlevel.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F62A03389C830112CE8F /* highlevel.h */; }; + 730F23AF091827B100AB638C /* lookup.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F62D03389C830112CE8F /* lookup.h */; }; + 730F23B0091827B100AB638C /* lookup_data.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F62E03389C830112CE8F /* lookup_data.h */; }; + 730F23B1091827B100AB638C /* lpc.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F63103389C830112CE8F /* lpc.h */; }; + 730F23B2091827B100AB638C /* lsp.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F63303389C830112CE8F /* lsp.h */; }; + 730F23B3091827B100AB638C /* masking.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F63703389C830112CE8F /* masking.h */; }; + 730F23B4091827B100AB638C /* mdct.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F63903389C830112CE8F /* mdct.h */; }; + 730F23B5091827B100AB638C /* misc.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F63B03389C830112CE8F /* misc.h */; }; + 730F23B6091827B100AB638C /* floor_all.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F63E03389C830112CE8F /* floor_all.h */; }; + 730F23B7091827B100AB638C /* psych_11.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F64103389C830112CE8F /* psych_11.h */; }; + 730F23B8091827B100AB638C /* psych_16.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F64203389C830112CE8F /* psych_16.h */; }; + 730F23B9091827B100AB638C /* psych_44.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F64303389C830112CE8F /* psych_44.h */; }; + 730F23BA091827B100AB638C /* psych_8.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F64403389C830112CE8F /* psych_8.h */; }; + 730F23BB091827B100AB638C /* residue_16.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F64503389C830112CE8F /* residue_16.h */; }; + 730F23BC091827B100AB638C /* residue_44.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F64603389C830112CE8F /* residue_44.h */; }; + 730F23BD091827B100AB638C /* residue_44u.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F64703389C830112CE8F /* residue_44u.h */; }; + 730F23BE091827B100AB638C /* residue_8.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F64803389C830112CE8F /* residue_8.h */; }; + 730F23BF091827B100AB638C /* setup_11.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F64903389C830112CE8F /* setup_11.h */; }; + 730F23C0091827B100AB638C /* setup_16.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F64A03389C830112CE8F /* setup_16.h */; }; + 730F23C1091827B100AB638C /* setup_22.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F64B03389C830112CE8F /* setup_22.h */; }; + 730F23C2091827B100AB638C /* setup_32.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F64C03389C830112CE8F /* setup_32.h */; }; + 730F23C3091827B100AB638C /* setup_44.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F64D03389C830112CE8F /* setup_44.h */; }; + 730F23C4091827B100AB638C /* setup_44u.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F64E03389C830112CE8F /* setup_44u.h */; }; + 730F23C5091827B100AB638C /* setup_8.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F64F03389C830112CE8F /* setup_8.h */; }; + 730F23C6091827B100AB638C /* setup_X.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F65003389C830112CE8F /* setup_X.h */; }; + 730F23C7091827B100AB638C /* os.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F65103389C830112CE8F /* os.h */; }; + 730F23C8091827B100AB638C /* psy.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F65303389C830112CE8F /* psy.h */; }; + 730F23C9091827B100AB638C /* registry.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F65603389C830112CE8F /* registry.h */; }; + 730F23CA091827B100AB638C /* scales.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F65803389C830112CE8F /* scales.h */; }; + 730F23CB091827B100AB638C /* smallft.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F65B03389C830112CE8F /* smallft.h */; }; + 730F23CC091827B100AB638C /* window.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D8F66103389C830112CE8F /* window.h */; }; + 730F23CE091827B100AB638C /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C1666FE841158C02AAC07 /* InfoPlist.strings */; }; + 730F23D3091827B100AB638C /* analysis.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F60A03389C830112CE8F /* analysis.c */; }; + 730F23D4091827B100AB638C /* bitrate.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F60D03389C830112CE8F /* bitrate.c */; }; + 730F23D5091827B100AB638C /* block.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F60F03389C830112CE8F /* block.c */; }; + 730F23D6091827B100AB638C /* codebook.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F62303389C830112CE8F /* codebook.c */; }; + 730F23D7091827B100AB638C /* envelope.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F62603389C830112CE8F /* envelope.c */; }; + 730F23D8091827B100AB638C /* floor0.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F62803389C830112CE8F /* floor0.c */; }; + 730F23D9091827B100AB638C /* floor1.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F62903389C830112CE8F /* floor1.c */; }; + 730F23DA091827B100AB638C /* info.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F62B03389C830112CE8F /* info.c */; }; + 730F23DB091827B100AB638C /* lookup.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F62C03389C830112CE8F /* lookup.c */; }; + 730F23DC091827B100AB638C /* lpc.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F63003389C830112CE8F /* lpc.c */; }; + 730F23DD091827B100AB638C /* lsp.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F63203389C830112CE8F /* lsp.c */; }; + 730F23DE091827B100AB638C /* mapping0.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F63603389C830112CE8F /* mapping0.c */; }; + 730F23DF091827B100AB638C /* mdct.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F63803389C830112CE8F /* mdct.c */; }; + 730F23E0091827B100AB638C /* psy.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F65203389C830112CE8F /* psy.c */; }; + 730F23E1091827B100AB638C /* registry.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F65503389C830112CE8F /* registry.c */; }; + 730F23E2091827B100AB638C /* res0.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F65703389C830112CE8F /* res0.c */; }; + 730F23E3091827B100AB638C /* sharedbook.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F65903389C830112CE8F /* sharedbook.c */; }; + 730F23E4091827B100AB638C /* smallft.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F65A03389C830112CE8F /* smallft.c */; }; + 730F23E5091827B100AB638C /* synthesis.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F65C03389C830112CE8F /* synthesis.c */; }; + 730F23E6091827B100AB638C /* vorbisenc.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F65E03389C830112CE8F /* vorbisenc.c */; }; + 730F23E7091827B100AB638C /* vorbisfile.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F65F03389C830112CE8F /* vorbisfile.c */; }; + 730F23E8091827B100AB638C /* window.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F66003389C830112CE8F /* window.c */; }; + 730F23FB0918281100AB638C /* Ogg.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 730F23FA0918281100AB638C /* Ogg.framework */; }; + 738835F40B18FF50005C7A69 /* mdct.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F63803389C830112CE8F /* mdct.c */; }; + 738835F70B18FF58005C7A69 /* smallft.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F65A03389C830112CE8F /* smallft.c */; }; + 738835F80B18FF61005C7A69 /* block.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F60F03389C830112CE8F /* block.c */; }; + 738835F90B18FF67005C7A69 /* envelope.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F62603389C830112CE8F /* envelope.c */; }; + 738835FA0B18FF71005C7A69 /* window.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F66003389C830112CE8F /* window.c */; }; + 738835FB0B18FF7A005C7A69 /* lsp.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F63203389C830112CE8F /* lsp.c */; }; + 738835FC0B18FF82005C7A69 /* lpc.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F63003389C830112CE8F /* lpc.c */; }; + 738835FD0B18FF93005C7A69 /* analysis.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F60A03389C830112CE8F /* analysis.c */; }; + 738835FE0B18FF9C005C7A69 /* synthesis.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F65C03389C830112CE8F /* synthesis.c */; }; + 738835FF0B18FF9E005C7A69 /* psy.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F65203389C830112CE8F /* psy.c */; }; + 738836000B18FFCB005C7A69 /* info.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F62B03389C830112CE8F /* info.c */; }; + 738836010B18FFE5005C7A69 /* floor1.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F62903389C830112CE8F /* floor1.c */; }; + 738836020B18FFE5005C7A69 /* floor0.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F62803389C830112CE8F /* floor0.c */; }; + 738836030B18FFED005C7A69 /* res0.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F65703389C830112CE8F /* res0.c */; }; + 738836040B18FFF0005C7A69 /* mapping0.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F63603389C830112CE8F /* mapping0.c */; }; + 738836050B18FFF8005C7A69 /* registry.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F65503389C830112CE8F /* registry.c */; }; + 738836060B18FFFD005C7A69 /* codebook.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F62303389C830112CE8F /* codebook.c */; }; + 738836070B190001005C7A69 /* sharedbook.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F65903389C830112CE8F /* sharedbook.c */; }; + 738836080B190008005C7A69 /* lookup.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F62C03389C830112CE8F /* lookup.c */; }; + 738836090B19000B005C7A69 /* bitrate.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F60D03389C830112CE8F /* bitrate.c */; }; + 738836140B1904A5005C7A69 /* vorbisenc.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F65E03389C830112CE8F /* vorbisenc.c */; }; + 738836230B190601005C7A69 /* vorbisfile.c in Sources */ = {isa = PBXBuildFile; fileRef = F5D8F65F03389C830112CE8F /* vorbisfile.c */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 089C1667FE841158C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; + 730F23F0091827B100AB638C /* Info.plist */ = {isa = PBXFileReference; explicitFileType = text.plist; fileEncoding = 4; path = Info.plist; sourceTree = ""; }; + 730F23F1091827B100AB638C /* Vorbis.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Vorbis.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 730F23FA0918281100AB638C /* Ogg.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Ogg.framework; path = /Library/Frameworks/Ogg.framework; sourceTree = ""; }; + 738835E40B18F870005C7A69 /* libvorbis.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libvorbis.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 738836130B190488005C7A69 /* libvorbisenc.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libvorbisenc.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 738836220B1905E5005C7A69 /* libvorbisfile.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libvorbisfile.a; sourceTree = BUILT_PRODUCTS_DIR; }; + F58520B90191D12B01A802FE /* codec.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = codec.h; sourceTree = ""; }; + F58520BA0191D12B01A802FE /* vorbisenc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = vorbisenc.h; sourceTree = ""; }; + F58520BB0191D12B01A802FE /* vorbisfile.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = vorbisfile.h; sourceTree = ""; }; + F5D8F60A03389C830112CE8F /* analysis.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = analysis.c; sourceTree = ""; }; + F5D8F60B03389C830112CE8F /* backends.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = backends.h; sourceTree = ""; }; + F5D8F60C03389C830112CE8F /* barkmel.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = barkmel.c; sourceTree = ""; }; + F5D8F60D03389C830112CE8F /* bitrate.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = bitrate.c; sourceTree = ""; }; + F5D8F60E03389C830112CE8F /* bitrate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = bitrate.h; sourceTree = ""; }; + F5D8F60F03389C830112CE8F /* block.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = block.c; sourceTree = ""; }; + F5D8F61603389C830112CE8F /* res_books_stereo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = res_books_stereo.h; sourceTree = ""; }; + F5D8F61903389C830112CE8F /* floor_books.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = floor_books.h; sourceTree = ""; }; + F5D8F62203389C830112CE8F /* res_books_uncoupled.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = res_books_uncoupled.h; sourceTree = ""; }; + F5D8F62303389C830112CE8F /* codebook.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = codebook.c; sourceTree = ""; }; + F5D8F62403389C830112CE8F /* codebook.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = codebook.h; sourceTree = ""; }; + F5D8F62503389C830112CE8F /* codec_internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = codec_internal.h; sourceTree = ""; }; + F5D8F62603389C830112CE8F /* envelope.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = envelope.c; sourceTree = ""; }; + F5D8F62703389C830112CE8F /* envelope.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = envelope.h; sourceTree = ""; }; + F5D8F62803389C830112CE8F /* floor0.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = floor0.c; sourceTree = ""; }; + F5D8F62903389C830112CE8F /* floor1.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = floor1.c; sourceTree = ""; }; + F5D8F62A03389C830112CE8F /* highlevel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = highlevel.h; sourceTree = ""; }; + F5D8F62B03389C830112CE8F /* info.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = info.c; sourceTree = ""; }; + F5D8F62C03389C830112CE8F /* lookup.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = lookup.c; sourceTree = ""; }; + F5D8F62D03389C830112CE8F /* lookup.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = lookup.h; sourceTree = ""; }; + F5D8F62E03389C830112CE8F /* lookup_data.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = lookup_data.h; sourceTree = ""; }; + F5D8F63003389C830112CE8F /* lpc.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = lpc.c; sourceTree = ""; }; + F5D8F63103389C830112CE8F /* lpc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = lpc.h; sourceTree = ""; }; + F5D8F63203389C830112CE8F /* lsp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = lsp.c; sourceTree = ""; }; + F5D8F63303389C830112CE8F /* lsp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = lsp.h; sourceTree = ""; }; + F5D8F63603389C830112CE8F /* mapping0.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = mapping0.c; sourceTree = ""; }; + F5D8F63703389C830112CE8F /* masking.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = masking.h; sourceTree = ""; }; + F5D8F63803389C830112CE8F /* mdct.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = mdct.c; sourceTree = ""; }; + F5D8F63903389C830112CE8F /* mdct.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mdct.h; sourceTree = ""; }; + F5D8F63A03389C830112CE8F /* misc.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = misc.c; sourceTree = ""; }; + F5D8F63B03389C830112CE8F /* misc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = misc.h; sourceTree = ""; }; + F5D8F63E03389C830112CE8F /* floor_all.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = floor_all.h; sourceTree = ""; }; + F5D8F64103389C830112CE8F /* psych_11.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = psych_11.h; sourceTree = ""; }; + F5D8F64203389C830112CE8F /* psych_16.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = psych_16.h; sourceTree = ""; }; + F5D8F64303389C830112CE8F /* psych_44.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = psych_44.h; sourceTree = ""; }; + F5D8F64403389C830112CE8F /* psych_8.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = psych_8.h; sourceTree = ""; }; + F5D8F64503389C830112CE8F /* residue_16.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = residue_16.h; sourceTree = ""; }; + F5D8F64603389C830112CE8F /* residue_44.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = residue_44.h; sourceTree = ""; }; + F5D8F64703389C830112CE8F /* residue_44u.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = residue_44u.h; sourceTree = ""; }; + F5D8F64803389C830112CE8F /* residue_8.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = residue_8.h; sourceTree = ""; }; + F5D8F64903389C830112CE8F /* setup_11.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = setup_11.h; sourceTree = ""; }; + F5D8F64A03389C830112CE8F /* setup_16.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = setup_16.h; sourceTree = ""; }; + F5D8F64B03389C830112CE8F /* setup_22.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = setup_22.h; sourceTree = ""; }; + F5D8F64C03389C830112CE8F /* setup_32.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = setup_32.h; sourceTree = ""; }; + F5D8F64D03389C830112CE8F /* setup_44.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = setup_44.h; sourceTree = ""; }; + F5D8F64E03389C830112CE8F /* setup_44u.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = setup_44u.h; sourceTree = ""; }; + F5D8F64F03389C830112CE8F /* setup_8.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = setup_8.h; sourceTree = ""; }; + F5D8F65003389C830112CE8F /* setup_X.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = setup_X.h; sourceTree = ""; }; + F5D8F65103389C830112CE8F /* os.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = os.h; sourceTree = ""; }; + F5D8F65203389C830112CE8F /* psy.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = psy.c; sourceTree = ""; }; + F5D8F65303389C830112CE8F /* psy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = psy.h; sourceTree = ""; }; + F5D8F65403389C830112CE8F /* psytune.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = psytune.c; sourceTree = ""; }; + F5D8F65503389C830112CE8F /* registry.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = registry.c; sourceTree = ""; }; + F5D8F65603389C830112CE8F /* registry.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = registry.h; sourceTree = ""; }; + F5D8F65703389C830112CE8F /* res0.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = res0.c; sourceTree = ""; }; + F5D8F65803389C830112CE8F /* scales.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = scales.h; sourceTree = ""; }; + F5D8F65903389C830112CE8F /* sharedbook.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = sharedbook.c; sourceTree = ""; }; + F5D8F65A03389C830112CE8F /* smallft.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = smallft.c; sourceTree = ""; }; + F5D8F65B03389C830112CE8F /* smallft.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = smallft.h; sourceTree = ""; }; + F5D8F65C03389C830112CE8F /* synthesis.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = synthesis.c; sourceTree = ""; }; + F5D8F65D03389C830112CE8F /* tone.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = tone.c; sourceTree = ""; }; + F5D8F65E03389C830112CE8F /* vorbisenc.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = vorbisenc.c; sourceTree = ""; }; + F5D8F65F03389C830112CE8F /* vorbisfile.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = vorbisfile.c; sourceTree = ""; }; + F5D8F66003389C830112CE8F /* window.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = window.c; sourceTree = ""; }; + F5D8F66103389C830112CE8F /* window.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = window.h; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 730F23E9091827B100AB638C /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 730F23FB0918281100AB638C /* Ogg.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 738835E20B18F870005C7A69 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 738836110B190488005C7A69 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 738836200B1905E5005C7A69 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 034768DFFF38A50411DB9C8B /* Products */ = { + isa = PBXGroup; + children = ( + 730F23F1091827B100AB638C /* Vorbis.framework */, + 738835E40B18F870005C7A69 /* libvorbis.a */, + 738836130B190488005C7A69 /* libvorbisenc.a */, + 738836220B1905E5005C7A69 /* libvorbisfile.a */, + ); + name = Products; + sourceTree = ""; + }; + 0867D691FE84028FC02AAC07 /* vorbis */ = { + isa = PBXGroup; + children = ( + F58520B70191D12B01A802FE /* Headers */, + F5D8F60803389C830112CE8F /* lib */, + 089C1665FE841158C02AAC07 /* Resources */, + 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */, + 034768DFFF38A50411DB9C8B /* Products */, + ); + name = vorbis; + sourceTree = ""; + }; + 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = { + isa = PBXGroup; + children = ( + 730F23FA0918281100AB638C /* Ogg.framework */, + ); + name = "External Frameworks and Libraries"; + sourceTree = ""; + }; + 089C1665FE841158C02AAC07 /* Resources */ = { + isa = PBXGroup; + children = ( + 730F23F0091827B100AB638C /* Info.plist */, + 089C1666FE841158C02AAC07 /* InfoPlist.strings */, + ); + name = Resources; + sourceTree = ""; + }; + F58520B70191D12B01A802FE /* Headers */ = { + isa = PBXGroup; + children = ( + F58520B90191D12B01A802FE /* codec.h */, + F58520BA0191D12B01A802FE /* vorbisenc.h */, + F58520BB0191D12B01A802FE /* vorbisfile.h */, + ); + name = Headers; + path = ../include/vorbis; + sourceTree = SOURCE_ROOT; + }; + F5D8F60803389C830112CE8F /* lib */ = { + isa = PBXGroup; + children = ( + F5D8F60A03389C830112CE8F /* analysis.c */, + F5D8F60B03389C830112CE8F /* backends.h */, + F5D8F60C03389C830112CE8F /* barkmel.c */, + F5D8F60D03389C830112CE8F /* bitrate.c */, + F5D8F60E03389C830112CE8F /* bitrate.h */, + F5D8F60F03389C830112CE8F /* block.c */, + F5D8F61003389C830112CE8F /* books */, + F5D8F62303389C830112CE8F /* codebook.c */, + F5D8F62403389C830112CE8F /* codebook.h */, + F5D8F62503389C830112CE8F /* codec_internal.h */, + F5D8F62603389C830112CE8F /* envelope.c */, + F5D8F62703389C830112CE8F /* envelope.h */, + F5D8F62803389C830112CE8F /* floor0.c */, + F5D8F62903389C830112CE8F /* floor1.c */, + F5D8F62A03389C830112CE8F /* highlevel.h */, + F5D8F62B03389C830112CE8F /* info.c */, + F5D8F62C03389C830112CE8F /* lookup.c */, + F5D8F62D03389C830112CE8F /* lookup.h */, + F5D8F62E03389C830112CE8F /* lookup_data.h */, + F5D8F63003389C830112CE8F /* lpc.c */, + F5D8F63103389C830112CE8F /* lpc.h */, + F5D8F63203389C830112CE8F /* lsp.c */, + F5D8F63303389C830112CE8F /* lsp.h */, + F5D8F63603389C830112CE8F /* mapping0.c */, + F5D8F63703389C830112CE8F /* masking.h */, + F5D8F63803389C830112CE8F /* mdct.c */, + F5D8F63903389C830112CE8F /* mdct.h */, + F5D8F63A03389C830112CE8F /* misc.c */, + F5D8F63B03389C830112CE8F /* misc.h */, + F5D8F63C03389C830112CE8F /* modes */, + F5D8F65103389C830112CE8F /* os.h */, + F5D8F65203389C830112CE8F /* psy.c */, + F5D8F65303389C830112CE8F /* psy.h */, + F5D8F65403389C830112CE8F /* psytune.c */, + F5D8F65503389C830112CE8F /* registry.c */, + F5D8F65603389C830112CE8F /* registry.h */, + F5D8F65703389C830112CE8F /* res0.c */, + F5D8F65803389C830112CE8F /* scales.h */, + F5D8F65903389C830112CE8F /* sharedbook.c */, + F5D8F65A03389C830112CE8F /* smallft.c */, + F5D8F65B03389C830112CE8F /* smallft.h */, + F5D8F65C03389C830112CE8F /* synthesis.c */, + F5D8F65D03389C830112CE8F /* tone.c */, + F5D8F65E03389C830112CE8F /* vorbisenc.c */, + F5D8F65F03389C830112CE8F /* vorbisfile.c */, + F5D8F66003389C830112CE8F /* window.c */, + F5D8F66103389C830112CE8F /* window.h */, + ); + name = lib; + path = ../lib; + sourceTree = ""; + }; + F5D8F61003389C830112CE8F /* books */ = { + isa = PBXGroup; + children = ( + F5D8F61203389C830112CE8F /* coupled */, + F5D8F61703389C830112CE8F /* floor */, + F5D8F61E03389C830112CE8F /* uncoupled */, + ); + path = books; + sourceTree = ""; + }; + F5D8F61203389C830112CE8F /* coupled */ = { + isa = PBXGroup; + children = ( + F5D8F61603389C830112CE8F /* res_books_stereo.h */, + ); + path = coupled; + sourceTree = ""; + }; + F5D8F61703389C830112CE8F /* floor */ = { + isa = PBXGroup; + children = ( + F5D8F61903389C830112CE8F /* floor_books.h */, + ); + path = floor; + sourceTree = ""; + }; + F5D8F61E03389C830112CE8F /* uncoupled */ = { + isa = PBXGroup; + children = ( + F5D8F62203389C830112CE8F /* res_books_uncoupled.h */, + ); + path = uncoupled; + sourceTree = ""; + }; + F5D8F63C03389C830112CE8F /* modes */ = { + isa = PBXGroup; + children = ( + F5D8F63E03389C830112CE8F /* floor_all.h */, + F5D8F64103389C830112CE8F /* psych_11.h */, + F5D8F64203389C830112CE8F /* psych_16.h */, + F5D8F64303389C830112CE8F /* psych_44.h */, + F5D8F64403389C830112CE8F /* psych_8.h */, + F5D8F64503389C830112CE8F /* residue_16.h */, + F5D8F64603389C830112CE8F /* residue_44.h */, + F5D8F64703389C830112CE8F /* residue_44u.h */, + F5D8F64803389C830112CE8F /* residue_8.h */, + F5D8F64903389C830112CE8F /* setup_11.h */, + F5D8F64A03389C830112CE8F /* setup_16.h */, + F5D8F64B03389C830112CE8F /* setup_22.h */, + F5D8F64C03389C830112CE8F /* setup_32.h */, + F5D8F64D03389C830112CE8F /* setup_44.h */, + F5D8F64E03389C830112CE8F /* setup_44u.h */, + F5D8F64F03389C830112CE8F /* setup_8.h */, + F5D8F65003389C830112CE8F /* setup_X.h */, + ); + path = modes; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 730F23A2091827B100AB638C /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 730F23A3091827B100AB638C /* codec.h in Headers */, + 730F23A4091827B100AB638C /* vorbisenc.h in Headers */, + 730F23A5091827B100AB638C /* vorbisfile.h in Headers */, + 730F23A6091827B100AB638C /* backends.h in Headers */, + 730F23A7091827B100AB638C /* bitrate.h in Headers */, + 730F23A8091827B100AB638C /* res_books_stereo.h in Headers */, + 730F23A9091827B100AB638C /* floor_books.h in Headers */, + 730F23AA091827B100AB638C /* res_books_uncoupled.h in Headers */, + 730F23AB091827B100AB638C /* codebook.h in Headers */, + 730F23AC091827B100AB638C /* codec_internal.h in Headers */, + 730F23AD091827B100AB638C /* envelope.h in Headers */, + 730F23AE091827B100AB638C /* highlevel.h in Headers */, + 730F23AF091827B100AB638C /* lookup.h in Headers */, + 730F23B0091827B100AB638C /* lookup_data.h in Headers */, + 730F23B1091827B100AB638C /* lpc.h in Headers */, + 730F23B2091827B100AB638C /* lsp.h in Headers */, + 730F23B3091827B100AB638C /* masking.h in Headers */, + 730F23B4091827B100AB638C /* mdct.h in Headers */, + 730F23B5091827B100AB638C /* misc.h in Headers */, + 730F23B6091827B100AB638C /* floor_all.h in Headers */, + 730F23B7091827B100AB638C /* psych_11.h in Headers */, + 730F23B8091827B100AB638C /* psych_16.h in Headers */, + 730F23B9091827B100AB638C /* psych_44.h in Headers */, + 730F23BA091827B100AB638C /* psych_8.h in Headers */, + 730F23BB091827B100AB638C /* residue_16.h in Headers */, + 730F23BC091827B100AB638C /* residue_44.h in Headers */, + 730F23BD091827B100AB638C /* residue_44u.h in Headers */, + 730F23BE091827B100AB638C /* residue_8.h in Headers */, + 730F23BF091827B100AB638C /* setup_11.h in Headers */, + 730F23C0091827B100AB638C /* setup_16.h in Headers */, + 730F23C1091827B100AB638C /* setup_22.h in Headers */, + 730F23C2091827B100AB638C /* setup_32.h in Headers */, + 730F23C3091827B100AB638C /* setup_44.h in Headers */, + 730F23C4091827B100AB638C /* setup_44u.h in Headers */, + 730F23C5091827B100AB638C /* setup_8.h in Headers */, + 730F23C6091827B100AB638C /* setup_X.h in Headers */, + 730F23C7091827B100AB638C /* os.h in Headers */, + 730F23C8091827B100AB638C /* psy.h in Headers */, + 730F23C9091827B100AB638C /* registry.h in Headers */, + 730F23CA091827B100AB638C /* scales.h in Headers */, + 730F23CB091827B100AB638C /* smallft.h in Headers */, + 730F23CC091827B100AB638C /* window.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 738835E00B18F870005C7A69 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7388360F0B190488005C7A69 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7388361E0B1905E5005C7A69 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 730F23A1091827B100AB638C /* Vorbis */ = { + isa = PBXNativeTarget; + buildConfigurationList = 730F23EC091827B100AB638C /* Build configuration list for PBXNativeTarget "Vorbis" */; + buildPhases = ( + 730F23A2091827B100AB638C /* Headers */, + 730F23CD091827B100AB638C /* Resources */, + 730F23D2091827B100AB638C /* Sources */, + 730F23E9091827B100AB638C /* Frameworks */, + 730F23EB091827B100AB638C /* Rez */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Vorbis; + productInstallPath = /Library/Frameworks; + productName = vorbis; + productReference = 730F23F1091827B100AB638C /* Vorbis.framework */; + productType = "com.apple.product-type.framework"; + }; + 738835E30B18F870005C7A69 /* libvorbis (static) */ = { + isa = PBXNativeTarget; + buildConfigurationList = 738835E50B18F88E005C7A69 /* Build configuration list for PBXNativeTarget "libvorbis (static)" */; + buildPhases = ( + 738835E00B18F870005C7A69 /* Headers */, + 738835E10B18F870005C7A69 /* Sources */, + 738835E20B18F870005C7A69 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "libvorbis (static)"; + productName = vorbis; + productReference = 738835E40B18F870005C7A69 /* libvorbis.a */; + productType = "com.apple.product-type.library.static"; + }; + 738836120B190488005C7A69 /* libvorbisenc (static) */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7388361A0B1904D6005C7A69 /* Build configuration list for PBXNativeTarget "libvorbisenc (static)" */; + buildPhases = ( + 7388360F0B190488005C7A69 /* Headers */, + 738836100B190488005C7A69 /* Sources */, + 738836110B190488005C7A69 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "libvorbisenc (static)"; + productName = vorbisenc; + productReference = 738836130B190488005C7A69 /* libvorbisenc.a */; + productType = "com.apple.product-type.library.static"; + }; + 738836210B1905E5005C7A69 /* libvorbisfile (static) */ = { + isa = PBXNativeTarget; + buildConfigurationList = 738836250B19065D005C7A69 /* Build configuration list for PBXNativeTarget "libvorbisfile (static)" */; + buildPhases = ( + 7388361E0B1905E5005C7A69 /* Headers */, + 7388361F0B1905E5005C7A69 /* Sources */, + 738836200B1905E5005C7A69 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "libvorbisfile (static)"; + productName = vorbisfile; + productReference = 738836220B1905E5005C7A69 /* libvorbisfile.a */; + productType = "com.apple.product-type.library.static"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 0867D690FE84028FC02AAC07 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 730F23F3091827B200AB638C /* Build configuration list for PBXProject "Vorbis" */; + hasScannedForEncodings = 0; + mainGroup = 0867D691FE84028FC02AAC07 /* vorbis */; + productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; + projectDirPath = ""; + targets = ( + 730F23A1091827B100AB638C /* Vorbis */, + 738835E30B18F870005C7A69 /* libvorbis (static) */, + 738836120B190488005C7A69 /* libvorbisenc (static) */, + 738836210B1905E5005C7A69 /* libvorbisfile (static) */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 730F23CD091827B100AB638C /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 730F23CE091827B100AB638C /* InfoPlist.strings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXRezBuildPhase section */ + 730F23EB091827B100AB638C /* Rez */ = { + isa = PBXRezBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXRezBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 730F23D2091827B100AB638C /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 730F23D3091827B100AB638C /* analysis.c in Sources */, + 730F23D4091827B100AB638C /* bitrate.c in Sources */, + 730F23D5091827B100AB638C /* block.c in Sources */, + 730F23D6091827B100AB638C /* codebook.c in Sources */, + 730F23D7091827B100AB638C /* envelope.c in Sources */, + 730F23D8091827B100AB638C /* floor0.c in Sources */, + 730F23D9091827B100AB638C /* floor1.c in Sources */, + 730F23DA091827B100AB638C /* info.c in Sources */, + 730F23DB091827B100AB638C /* lookup.c in Sources */, + 730F23DC091827B100AB638C /* lpc.c in Sources */, + 730F23DD091827B100AB638C /* lsp.c in Sources */, + 730F23DE091827B100AB638C /* mapping0.c in Sources */, + 730F23DF091827B100AB638C /* mdct.c in Sources */, + 730F23E0091827B100AB638C /* psy.c in Sources */, + 730F23E1091827B100AB638C /* registry.c in Sources */, + 730F23E2091827B100AB638C /* res0.c in Sources */, + 730F23E3091827B100AB638C /* sharedbook.c in Sources */, + 730F23E4091827B100AB638C /* smallft.c in Sources */, + 730F23E5091827B100AB638C /* synthesis.c in Sources */, + 730F23E6091827B100AB638C /* vorbisenc.c in Sources */, + 730F23E7091827B100AB638C /* vorbisfile.c in Sources */, + 730F23E8091827B100AB638C /* window.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 738835E10B18F870005C7A69 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 738835F40B18FF50005C7A69 /* mdct.c in Sources */, + 738835F70B18FF58005C7A69 /* smallft.c in Sources */, + 738835F80B18FF61005C7A69 /* block.c in Sources */, + 738835F90B18FF67005C7A69 /* envelope.c in Sources */, + 738835FA0B18FF71005C7A69 /* window.c in Sources */, + 738835FB0B18FF7A005C7A69 /* lsp.c in Sources */, + 738835FC0B18FF82005C7A69 /* lpc.c in Sources */, + 738835FD0B18FF93005C7A69 /* analysis.c in Sources */, + 738835FE0B18FF9C005C7A69 /* synthesis.c in Sources */, + 738835FF0B18FF9E005C7A69 /* psy.c in Sources */, + 738836000B18FFCB005C7A69 /* info.c in Sources */, + 738836010B18FFE5005C7A69 /* floor1.c in Sources */, + 738836020B18FFE5005C7A69 /* floor0.c in Sources */, + 738836030B18FFED005C7A69 /* res0.c in Sources */, + 738836040B18FFF0005C7A69 /* mapping0.c in Sources */, + 738836050B18FFF8005C7A69 /* registry.c in Sources */, + 738836060B18FFFD005C7A69 /* codebook.c in Sources */, + 738836070B190001005C7A69 /* sharedbook.c in Sources */, + 738836080B190008005C7A69 /* lookup.c in Sources */, + 738836090B19000B005C7A69 /* bitrate.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 738836100B190488005C7A69 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 738836140B1904A5005C7A69 /* vorbisenc.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7388361F0B1905E5005C7A69 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 738836230B190601005C7A69 /* vorbisfile.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 089C1666FE841158C02AAC07 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 089C1667FE841158C02AAC07 /* English */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 730F23ED091827B100AB638C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_SEARCH_PATHS = /Library/Frameworks; + FRAMEWORK_VERSION = A; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + HEADER_SEARCH_PATHS = ../lib; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = /Library/Frameworks; + LIBRARY_SEARCH_PATHS = ""; + OTHER_LDFLAGS = ""; + PRODUCT_NAME = Vorbis; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + WRAPPER_EXTENSION = framework; + ZERO_LINK = YES; + }; + name = Debug; + }; + 730F23EE091827B100AB638C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_SEARCH_PATHS = /Library/Frameworks; + FRAMEWORK_VERSION = A; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + HEADER_SEARCH_PATHS = ../lib; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = /Library/Frameworks; + LIBRARY_SEARCH_PATHS = ""; + OTHER_LDFLAGS = ""; + PRODUCT_NAME = Vorbis; + SECTORDER_FLAGS = ""; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + WRAPPER_EXTENSION = framework; + ZERO_LINK = NO; + }; + name = Release; + }; + 730F23F4091827B200AB638C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = __MACOSX__; + SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; + }; + name = Debug; + }; + 730F23F5091827B200AB638C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = ( + ppc, + i386, + ); + GCC_OPTIMIZATION_LEVEL = 3; + GCC_PREPROCESSOR_DEFINITIONS = __MACOSX__; + OTHER_CFLAGS = ( + "$(OTHER_CFLAGS)", + "-ffast-math", + "-falign-loops=16", + ); + SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; + }; + name = Release; + }; + 738835E60B18F88E005C7A69 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + ../../ogg/include, + ); + INSTALL_PATH = /usr/local/lib; + PREBINDING = NO; + PRODUCT_NAME = vorbis; + ZERO_LINK = YES; + }; + name = Debug; + }; + 738835E70B18F88E005C7A69 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + ../../ogg/include, + ); + INSTALL_PATH = /usr/local/lib; + PREBINDING = NO; + PRODUCT_NAME = vorbis; + ZERO_LINK = NO; + }; + name = Release; + }; + 7388361B0B1904D6005C7A69 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + ../lib, + ../../ogg/include, + ); + INSTALL_PATH = /usr/local/lib; + PREBINDING = NO; + PRODUCT_NAME = vorbisenc; + ZERO_LINK = YES; + }; + name = Debug; + }; + 7388361C0B1904D6005C7A69 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + ../lib, + ../../ogg/include, + ); + INSTALL_PATH = /usr/local/lib; + PREBINDING = NO; + PRODUCT_NAME = vorbisenc; + ZERO_LINK = NO; + }; + name = Release; + }; + 738836260B19065D005C7A69 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + ../../ogg/include, + ); + INSTALL_PATH = /usr/local/lib; + PREBINDING = NO; + PRODUCT_NAME = vorbisfile; + ZERO_LINK = YES; + }; + name = Debug; + }; + 738836270B19065D005C7A69 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + ../../ogg/include, + ); + INSTALL_PATH = /usr/local/lib; + PREBINDING = NO; + PRODUCT_NAME = vorbisfile; + ZERO_LINK = NO; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 730F23EC091827B100AB638C /* Build configuration list for PBXNativeTarget "Vorbis" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 730F23ED091827B100AB638C /* Debug */, + 730F23EE091827B100AB638C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 730F23F3091827B200AB638C /* Build configuration list for PBXProject "Vorbis" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 730F23F4091827B200AB638C /* Debug */, + 730F23F5091827B200AB638C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 738835E50B18F88E005C7A69 /* Build configuration list for PBXNativeTarget "libvorbis (static)" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 738835E60B18F88E005C7A69 /* Debug */, + 738835E70B18F88E005C7A69 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 7388361A0B1904D6005C7A69 /* Build configuration list for PBXNativeTarget "libvorbisenc (static)" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7388361B0B1904D6005C7A69 /* Debug */, + 7388361C0B1904D6005C7A69 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 738836250B19065D005C7A69 /* Build configuration list for PBXNativeTarget "libvorbisfile (static)" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 738836260B19065D005C7A69 /* Debug */, + 738836270B19065D005C7A69 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 0867D690FE84028FC02AAC07 /* Project object */; +} diff --git a/cs/3rd party/libvorbis/symbian/bld.inf b/cs/3rd party/libvorbis/symbian/bld.inf new file mode 100644 index 000000000..341e93639 --- /dev/null +++ b/cs/3rd party/libvorbis/symbian/bld.inf @@ -0,0 +1,35 @@ +/* + Copyright (C) 2003 Commonwealth Scientific and Industrial Research + Organisation (CSIRO) Australia + + 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 CSIRO Australia 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 ORGANISATION 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. +*/ + +PRJ_MMPFILES + +vorbis.mmp diff --git a/cs/3rd party/libvorbis/symbian/vorbis.mmp b/cs/3rd party/libvorbis/symbian/vorbis.mmp new file mode 100644 index 000000000..4fdeb4093 --- /dev/null +++ b/cs/3rd party/libvorbis/symbian/vorbis.mmp @@ -0,0 +1,43 @@ +/* + Copyright (C) 2003 Commonwealth Scientific and Industrial Research + Organisation (CSIRO) Australia + + 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 CSIRO Australia 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 ORGANISATION 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. +*/ + +TARGET vorbis.lib +TARGETTYPE lib +UID 0 +MACRO HAVE_CONFIG_H +SOURCEPATH ..\lib +SOURCE analysis.c barkmel.c bitrate.c block.c codebook.c envelope.c floor0.c floor1.c info.c +SOURCE lookup.c lpc.c lsp.c mapping0.c mdct.c psy.c registry.c res0.c sharedbook.c +SOURCE smallft.c synthesis.c vorbisfile.c window.c + +USERINCLUDE . ..\include +SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\include ..\..\ogg\include ..\..\ogg\symbian diff --git a/cs/3rd party/libvorbis/test/Makefile.am b/cs/3rd party/libvorbis/test/Makefile.am new file mode 100644 index 000000000..b68ebdb12 --- /dev/null +++ b/cs/3rd party/libvorbis/test/Makefile.am @@ -0,0 +1,19 @@ +## Process this file with automake to produce Makefile.in + +AUTOMAKE_OPTIONS = foreign + +check_PROGRAMS = test + +check: $(check_PROGRAMS) + ./test$(EXEEXT) + +AM_CPPFLAGS = -I$(top_srcdir)/include @OGG_CFLAGS@ + +test_SOURCES = util.c util.h write_read.c write_read.h test.c +test_LDADD = ../lib/libvorbisenc.la ../lib/libvorbis.la @OGG_LIBS@ @VORBIS_LIBS@ + +debug: + $(MAKE) check CFLAGS="@DEBUG@" + +profile: + $(MAKE) check CFLAGS="@PROFILE@" diff --git a/cs/3rd party/libvorbis/test/test.c b/cs/3rd party/libvorbis/test/test.c new file mode 100644 index 000000000..1d2a16c00 --- /dev/null +++ b/cs/3rd party/libvorbis/test/test.c @@ -0,0 +1,100 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE 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 SOURCE CODE IS (C) COPYRIGHT 1994-2007 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: vorbis coded test suite using vorbisfile + last mod: $Id$ + + ********************************************************************/ + +#include +#include +#include + +#include "util.h" +#include "write_read.h" + +#define DATA_LEN 2048 + +#define MAX(a,b) ((a) > (b) ? (a) : (b)) + + +static int check_output (const float * data_in, unsigned len, float allowable); + +int +main(void){ + static float data_out [DATA_LEN] ; + static float data_in [DATA_LEN] ; + + /* Do safest and most used sample rates first. */ + int sample_rates [] = { 44100, 48000, 32000, 22050, 16000, 96000 } ; + unsigned k ; + int errors = 0 ; + int ch; + + gen_windowed_sine (data_out, ARRAY_LEN (data_out), 0.95); + + for(ch=1;ch<=8;ch++){ + float q=-.05; + printf("\nTesting %d channel%s\n\n",ch,ch==1?"":"s"); + while(q<1.){ + for (k = 0 ; k < ARRAY_LEN (sample_rates); k ++) { + char filename [64] ; + snprintf (filename, sizeof (filename), "vorbis_%dch_q%.1f_%u.ogg", ch,q*10,sample_rates [k]); + + printf (" %-20s : ", filename); + fflush (stdout); + + /* Set to know value. */ + set_data_in (data_in, ARRAY_LEN (data_in), 3.141); + + write_vorbis_data_or_die (filename, sample_rates [k], q, data_out, ARRAY_LEN (data_out),ch); + read_vorbis_data_or_die (filename, sample_rates [k], data_in, ARRAY_LEN (data_in)); + + if (check_output (data_in, ARRAY_LEN (data_in), (.15f - .1f*q)) != 0) + errors ++ ; + else { + puts ("ok"); + remove (filename); + } + } + q+=.1; + } + } + + if (errors) + exit (1); + + return 0; +} + +static int +check_output (const float * data_in, unsigned len, float allowable) +{ + float max_abs = 0.0 ; + unsigned k ; + + for (k = 0 ; k < len ; k++) { + float temp = fabs (data_in [k]); + max_abs = MAX (max_abs, temp); + } + + if (max_abs < 0.95-allowable) { + printf ("Error : max_abs (%f) too small.\n", max_abs); + return 1 ; + } else if (max_abs > .95+allowable) { + printf ("Error : max_abs (%f) too big.\n", max_abs); + return 1 ; + } + + return 0 ; +} + diff --git a/cs/3rd party/libvorbis/test/util.c b/cs/3rd party/libvorbis/test/util.c new file mode 100644 index 000000000..884732bc9 --- /dev/null +++ b/cs/3rd party/libvorbis/test/util.c @@ -0,0 +1,53 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE 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 SOURCE CODE IS (C) COPYRIGHT 1994-2007 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: utility functions for vorbis codec test suite. + last mod: $Id$ + + ********************************************************************/ + +#include +#include +#include +#include +#include + +#include +#include + +#include "util.h" + +void +gen_windowed_sine (float *data, int len, float maximum) +{ int k ; + + memset (data, 0, len * sizeof (float)) ; + + len /= 2 ; + + for (k = 0 ; k < len ; k++) + { data [k] = sin (2.0 * k * M_PI * 1.0 / 32.0 + 0.4) ; + + /* Apply Hanning Window. */ + data [k] *= maximum * (0.5 - 0.5 * cos (2.0 * M_PI * k / ((len) - 1))) ; + } + + return ; +} + +void +set_data_in (float * data, unsigned len, float value) +{ unsigned k ; + + for (k = 0 ; k < len ; k++) + data [k] = value ; +} diff --git a/cs/3rd party/libvorbis/test/util.h b/cs/3rd party/libvorbis/test/util.h new file mode 100644 index 000000000..ac43656af --- /dev/null +++ b/cs/3rd party/libvorbis/test/util.h @@ -0,0 +1,24 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE 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 SOURCE CODE IS (C) COPYRIGHT 1994-2007 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: utility functions for vorbis codec test suite. + last mod: $Id$ + + ********************************************************************/ + +#define ARRAY_LEN(x) (sizeof(x)/sizeof(x[0])) + +/* Create simple test data consisting of a windowed sine wave. */ +void gen_windowed_sine (float *data, int len, float maximum) ; + +/* Set len values of data array to given value. */ +void set_data_in (float * data, unsigned len, float value) ; diff --git a/cs/3rd party/libvorbis/test/write_read.c b/cs/3rd party/libvorbis/test/write_read.c new file mode 100644 index 000000000..5f6d71239 --- /dev/null +++ b/cs/3rd party/libvorbis/test/write_read.c @@ -0,0 +1,298 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE 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 SOURCE CODE IS (C) COPYRIGHT 1994-2007 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: utility functions for vorbis codec test suite. + last mod: $Id$ + + ********************************************************************/ + +#include +#include +#include +#include +#include + +#include +#include + +#include "write_read.h" + +/* The following function is basically a hacked version of the code in + * examples/encoder_example.c */ +void +write_vorbis_data_or_die (const char *filename, int srate, float q, const float * data, int count, int ch) +{ + FILE * file ; + ogg_stream_state os; + ogg_page og; + ogg_packet op; + vorbis_info vi; + vorbis_comment vc; + vorbis_dsp_state vd; + vorbis_block vb; + + int eos = 0, ret; + + if ((file = fopen (filename, "wb")) == NULL) { + printf("\n\nError : fopen failed : %s\n", strerror (errno)) ; + exit (1) ; + } + + /********** Encode setup ************/ + + vorbis_info_init (&vi); + + ret = vorbis_encode_init_vbr (&vi,ch,srate,q); + if (ret) { + printf ("vorbis_encode_init_vbr return %d\n", ret) ; + exit (1) ; + } + + vorbis_comment_init (&vc); + vorbis_comment_add_tag (&vc,"ENCODER","test/util.c"); + vorbis_analysis_init (&vd,&vi); + vorbis_block_init (&vd,&vb); + + ogg_stream_init (&os,12345678); + + { + ogg_packet header; + ogg_packet header_comm; + ogg_packet header_code; + + vorbis_analysis_headerout (&vd,&vc,&header,&header_comm,&header_code); + ogg_stream_packetin (&os,&header); + ogg_stream_packetin (&os,&header_comm); + ogg_stream_packetin (&os,&header_code); + + /* Ensures the audio data will start on a new page. */ + while (!eos){ + int result = ogg_stream_flush (&os,&og); + if (result == 0) + break; + fwrite (og.header,1,og.header_len,file); + fwrite (og.body,1,og.body_len,file); + } + + } + + { + /* expose the buffer to submit data */ + float **buffer = vorbis_analysis_buffer (&vd,count); + int i; + + for(i=0;i 0 && read_total < count) { + int bout = samples < count ? samples : count; + bout = read_total + bout > count ? count - read_total : bout; + + memcpy (data + read_total, pcm[0], bout * sizeof (float)) ; + + vorbis_synthesis_read (&vd,bout); + read_total += bout ; + } + } + } + + if (ogg_page_eos (&og)) eos = 1; + } + } + + if (!eos) { + buffer = ogg_sync_buffer (&oy,4096); + bytes = fread (buffer,1,4096,file); + ogg_sync_wrote (&oy,bytes); + if (bytes == 0) eos = 1; + } + } + + ogg_stream_clear (&os); + + vorbis_block_clear (&vb); + vorbis_dsp_clear (&vd); + vorbis_comment_clear (&vc); + vorbis_info_clear (&vi); + } +done_decode: + + /* OK, clean up the framer */ + ogg_sync_clear (&oy); + + fclose (file) ; +} + diff --git a/cs/3rd party/libvorbis/test/write_read.h b/cs/3rd party/libvorbis/test/write_read.h new file mode 100644 index 000000000..07af6b776 --- /dev/null +++ b/cs/3rd party/libvorbis/test/write_read.h @@ -0,0 +1,28 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE 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 SOURCE CODE IS (C) COPYRIGHT 1994-2007 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: utility functions for vorbis codec test suite. + last mod: $Id$ + + ********************************************************************/ + +/* Write supplied data to an Ogg/Vorbis file with specified filename at + * specified sample rate. Assumes a single channel of audio. */ +void write_vorbis_data_or_die (const char *filename, int srate, float q, + const float * data, int count, int ch) ; + +/* Read given Ogg/Vorbis file into data specified data array. This + * function is basically the inverse of the one above. Again, assumes + * a single channel of audio. */ +void read_vorbis_data_or_die (const char *filename, int srate, + float * data, int count) ; + diff --git a/cs/3rd party/libvorbis/vorbis-uninstalled.pc.in b/cs/3rd party/libvorbis/vorbis-uninstalled.pc.in new file mode 100644 index 000000000..aa70a0190 --- /dev/null +++ b/cs/3rd party/libvorbis/vorbis-uninstalled.pc.in @@ -0,0 +1,14 @@ +# vorbis uninstalled pkg-config file + +prefix= +exec_prefix= +libdir=${pcfiledir}/lib +includedir=${pcfiledir}/include + +Name: vorbis +Description: vorbis is the primary Ogg Vorbis library (uninstalled) +Version: @VERSION@ +Requires: ogg +Conflicts: +Libs: @VORBIS_LIBS@ ${libdir}/libvorbis.la +Cflags: -I${includedir} diff --git a/cs/3rd party/libvorbis/vorbis.m4 b/cs/3rd party/libvorbis/vorbis.m4 new file mode 100644 index 000000000..7b67c584e --- /dev/null +++ b/cs/3rd party/libvorbis/vorbis.m4 @@ -0,0 +1,136 @@ +# Configure paths for libvorbis +# Jack Moffitt 10-21-2000 +# Shamelessly stolen from Owen Taylor and Manish Singh +# thomasvs added check for vorbis_bitrate_addblock which is new in rc3 + +dnl XIPH_PATH_VORBIS([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +dnl Test for libvorbis, and define VORBIS_CFLAGS and VORBIS_LIBS +dnl +AC_DEFUN([XIPH_PATH_VORBIS], +[dnl +dnl Get the cflags and libraries +dnl +AC_ARG_WITH(vorbis,AC_HELP_STRING([--with-vorbis=PFX],[Prefix where libvorbis is installed (optional)]), vorbis_prefix="$withval", vorbis_prefix="") +AC_ARG_WITH(vorbis-libraries,AC_HELP_STRING([--with-vorbis-libraries=DIR],[Directory where libvorbis library is installed (optional)]), vorbis_libraries="$withval", vorbis_libraries="") +AC_ARG_WITH(vorbis-includes,AC_HELP_STRING([--with-vorbis-includes=DIR],[Directory where libvorbis header files are installed (optional)]), vorbis_includes="$withval", vorbis_includes="") +AC_ARG_ENABLE(vorbistest,AC_HELP_STRING([--disable-vorbistest],[Do not try to compile and run a test Vorbis program]),, enable_vorbistest=yes) + + if test "x$vorbis_libraries" != "x" ; then + VORBIS_LIBS="-L$vorbis_libraries" + elif test "x$vorbis_prefix" = "xno" || test "x$vorbis_prefix" = "xyes" ; then + VORBIS_LIBS="" + elif test "x$vorbis_prefix" != "x" ; then + VORBIS_LIBS="-L$vorbis_prefix/lib" + elif test "x$prefix" != "xNONE"; then + VORBIS_LIBS="-L$prefix/lib" + fi + + if test "x$vorbis_prefix" != "xno" ; then + VORBIS_LIBS="$VORBIS_LIBS -lvorbis -lm" + fi + VORBISFILE_LIBS="-lvorbisfile" + VORBISENC_LIBS="-lvorbisenc" + + if test "x$vorbis_includes" != "x" ; then + VORBIS_CFLAGS="-I$vorbis_includes" + elif test "x$vorbis_prefix" = "xno" || test "x$vorbis_prefix" = "xyes" ; then + VORBIS_CFLAGS="" + elif test "x$vorbis_prefix" != "x" ; then + VORBIS_CFLAGS="-I$vorbis_prefix/include" + elif test "x$prefix" != "xNONE"; then + VORBIS_CFLAGS="-I$prefix/include" + fi + + + AC_MSG_CHECKING(for Vorbis) + if test "x$vorbis_prefix" = "xno" ; then + no_vorbis="disabled" + enable_vorbistest="no" + else + no_vorbis="" + fi + + + if test "x$enable_vorbistest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $VORBIS_CFLAGS $OGG_CFLAGS" + LIBS="$LIBS $VORBIS_LIBS $VORBISENC_LIBS $OGG_LIBS" +dnl +dnl Now check if the installed Vorbis is sufficiently new. +dnl + rm -f conf.vorbistest + AC_TRY_RUN([ +#include +#include +#include +#include +#include + +int main () +{ + vorbis_block vb; + vorbis_dsp_state vd; + vorbis_info vi; + + vorbis_info_init (&vi); + vorbis_encode_init (&vi, 2, 44100, -1, 128000, -1); + vorbis_analysis_init (&vd, &vi); + vorbis_block_init (&vd, &vb); + /* this function was added in 1.0rc3, so this is what we're testing for */ + vorbis_bitrate_addblock (&vb); + + system("touch conf.vorbistest"); + return 0; +} + +],, no_vorbis=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + + if test "x$no_vorbis" = "xdisabled" ; then + AC_MSG_RESULT(no) + ifelse([$2], , :, [$2]) + elif test "x$no_vorbis" = "x" ; then + AC_MSG_RESULT(yes) + ifelse([$1], , :, [$1]) + else + AC_MSG_RESULT(no) + if test -f conf.vorbistest ; then + : + else + echo "*** Could not run Vorbis test program, checking why..." + CFLAGS="$CFLAGS $VORBIS_CFLAGS" + LIBS="$LIBS $VORBIS_LIBS $OGG_LIBS" + AC_TRY_LINK([ +#include +#include +], [ return 0; ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding Vorbis or finding the wrong" + echo "*** version of Vorbis. If it is not finding Vorbis, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means Vorbis was incorrectly installed" + echo "*** or that you have moved Vorbis since it was installed." ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + VORBIS_CFLAGS="" + VORBIS_LIBS="" + VORBISFILE_LIBS="" + VORBISENC_LIBS="" + ifelse([$2], , :, [$2]) + fi + AC_SUBST(VORBIS_CFLAGS) + AC_SUBST(VORBIS_LIBS) + AC_SUBST(VORBISFILE_LIBS) + AC_SUBST(VORBISENC_LIBS) + rm -f conf.vorbistest +]) diff --git a/cs/3rd party/libvorbis/vorbis.pc.in b/cs/3rd party/libvorbis/vorbis.pc.in new file mode 100644 index 000000000..0eacf66f5 --- /dev/null +++ b/cs/3rd party/libvorbis/vorbis.pc.in @@ -0,0 +1,15 @@ +# libvorbis pkg-config source file + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: vorbis +Description: vorbis is the primary Ogg Vorbis library +Version: @VERSION@ +Requires.private: ogg +Conflicts: +Libs: -L${libdir} -lvorbis +Libs.private: -lm +Cflags: -I${includedir} diff --git a/cs/3rd party/libvorbis/vorbisenc-uninstalled.pc.in b/cs/3rd party/libvorbis/vorbisenc-uninstalled.pc.in new file mode 100644 index 000000000..4667d9cfd --- /dev/null +++ b/cs/3rd party/libvorbis/vorbisenc-uninstalled.pc.in @@ -0,0 +1,14 @@ +# vorbisenc uninstalled pkg-config file + +prefix= +exec_prefix= +libdir=${pcfiledir}/lib +includedir=${pcfiledir}/include + +Name: vorbisenc +Description: vorbisenc is a library that provides a convenient API for setting up an encoding environment using libvorbis (uninstalled) +Version: @VERSION@ +Requires: vorbis +Conflicts: +Libs: ${libdir}/libvorbisenc.la +Cflags: -I${includedir} diff --git a/cs/3rd party/libvorbis/vorbisenc.pc.in b/cs/3rd party/libvorbis/vorbisenc.pc.in new file mode 100644 index 000000000..a412b7a55 --- /dev/null +++ b/cs/3rd party/libvorbis/vorbisenc.pc.in @@ -0,0 +1,14 @@ +# libvorbisenc pkg-config source file + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: vorbisenc +Description: vorbisenc is a library that provides a convenient API for setting up an encoding environment using libvorbis +Version: @VERSION@ +Requires.private: vorbis +Conflicts: +Libs: -L${libdir} -lvorbisenc +Cflags: -I${includedir} diff --git a/cs/3rd party/libvorbis/vorbisfile-uninstalled.pc.in b/cs/3rd party/libvorbis/vorbisfile-uninstalled.pc.in new file mode 100644 index 000000000..2e7e96d8e --- /dev/null +++ b/cs/3rd party/libvorbis/vorbisfile-uninstalled.pc.in @@ -0,0 +1,14 @@ +# vorbisfile uninstalled pkg-config file + +prefix= +exec_prefix= +libdir=${pcfiledir}/lib +includedir=${pcfiledir}/include + +Name: vorbisfile +Description: vorbisfile is a library that provides a convenient high-level API for decoding and basic manipulation of all Vorbis I audio streams (uninstalled) +Version: @VERSION@ +Requires: vorbis +Conflicts: +Libs: ${libdir}/libvorbisfile.la +Cflags: -I${includedir} diff --git a/cs/3rd party/libvorbis/vorbisfile.pc.in b/cs/3rd party/libvorbis/vorbisfile.pc.in new file mode 100644 index 000000000..e58a071f2 --- /dev/null +++ b/cs/3rd party/libvorbis/vorbisfile.pc.in @@ -0,0 +1,14 @@ +# libvorbisfile pkg-config source file + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: vorbisfile +Description: vorbisfile is a library that provides a convenient high-level API for decoding and basic manipulation of all Vorbis I audio streams +Version: @VERSION@ +Requires.private: vorbis +Conflicts: +Libs: -L${libdir} -lvorbisfile +Cflags: -I${includedir} diff --git a/cs/3rd party/libvorbis/vq/16.vqs b/cs/3rd party/libvorbis/vq/16.vqs new file mode 100644 index 000000000..3d15f4085 --- /dev/null +++ b/cs/3rd party/libvorbis/vq/16.vqs @@ -0,0 +1,74 @@ + +GO + +>_16c0_s noninterleaved +haux 16c0_s/resaux_0.vqd _16c0_s_single 0,64,2 10 + +:_p1_0 16c0_s/res_sub0_part1_pass2.vqd, 8, nonseq cull, 0 +- 1 +:_p2_0 16c0_s/res_sub0_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p3_0 16c0_s/res_sub0_part3_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p4_0 16c0_s/res_sub0_part4_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p5_0 16c0_s/res_sub0_part5_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p6_0 16c0_s/res_sub0_part6_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 6 7 8 + + +:_p7_0 16c0_s/res_sub0_part7_pass0.vqd, 4, nonseq cull, 0 +- 11 +:_p7_1 16c0_s/res_sub0_part7_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 + +:_p8_0 16c0_s/res_sub0_part8_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_p8_1 16c0_s/res_sub0_part8_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_p9_0 16c0_s/res_sub0_part9_pass0.vqd, 4, nonseq, 0 +- 315 +:_p9_1 16c0_s/res_sub0_part9_pass1.vqd, 2, nonseq, 0 +- 21 42 63 84 105 126 147 +:_p9_2 16c0_s/res_sub0_part9_pass2.vqd, 2, nonseq, 0 +- 1 2 3 4 5 6 7 8 9 10 + +>_16c1s_s noninterleaved +haux 16c1_s/resaux_0.vqd _16c1_s_short 0,64,2 10 + +>_16c1_s noninterleaved +haux 16c1_s/resaux_1.vqd _16c1_s_long 0,64,2 10 + +:_p1_0 16c1_s/res_sub0_part1_pass2.vqd, 8, nonseq cull, 0 +- 1 +:_p2_0 16c1_s/res_sub0_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p3_0 16c1_s/res_sub0_part3_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p4_0 16c1_s/res_sub0_part4_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p5_0 16c1_s/res_sub0_part5_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p6_0 16c1_s/res_sub0_part6_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 6 7 8 + + +:_p7_0 16c1_s/res_sub0_part7_pass0.vqd, 4, nonseq cull, 0 +- 11 +:_p7_1 16c1_s/res_sub0_part7_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 + +:_p8_0 16c1_s/res_sub0_part8_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_p8_1 16c1_s/res_sub0_part8_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_p9_0 16c1_s/res_sub0_part9_pass0.vqd, 2, nonseq, 0 +- 315 630 945 1260 1575 1890 +:_p9_1 16c1_s/res_sub0_part9_pass1.vqd, 2, nonseq, 0 +- 21 42 63 84 105 126 147 +:_p9_2 16c1_s/res_sub0_part9_pass2.vqd, 2, nonseq, 0 +- 1 2 3 4 5 6 7 8 9 10 + +>_16c2s_s noninterleaved +haux 16c2_s/resaux_0.vqd _16c2_s_short 0,64,2 10 +>_16c2_s noninterleaved +haux 16c2_s/resaux_1.vqd _16c2_s_long 0,64,2 10 + +:_p1_0 16c2_s/res_sub0_part1_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p2_0 16c2_s/res_sub0_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p3_0 16c2_s/res_sub0_part3_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p4_0 16c2_s/res_sub0_part4_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 6 7 8 + +:_p5_0 16c2_s/res_sub0_part5_pass0.vqd, 4, nonseq cull, 0 +- 11 +:_p5_1 16c2_s/res_sub0_part5_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 + +:_p6_0 16c2_s/res_sub0_part6_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_p6_1 16c2_s/res_sub0_part6_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_p7_0 16c2_s/res_sub0_part7_pass0.vqd, 2, nonseq, 0 +- 11 22 33 44 55 66 +:_p7_1 16c2_s/res_sub0_part7_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 + +:_p8_0 16c2_s/res_sub0_part8_pass0.vqd, 2, nonseq, 0 +- 21 42 63 84 105 126 147 +:_p8_1 16c2_s/res_sub0_part8_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 6 7 8 9 10 + +:_p9_0 16c2_s/res_sub0_part9_pass0.vqd, 2, nonseq, 0 +- 931 1862 2793 3724 4655 5586 6517 7448 +:_p9_1 16c2_s/res_sub0_part9_pass1.vqd, 2, nonseq, 0 +- 49 98 147 196 245 294 343 392 441 +:_p9_2 16c2_s/res_sub0_part9_pass2.vqd, 1, nonseq, 0 +- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 + diff --git a/cs/3rd party/libvorbis/vq/16u.vqs b/cs/3rd party/libvorbis/vq/16u.vqs new file mode 100644 index 000000000..854de98f7 --- /dev/null +++ b/cs/3rd party/libvorbis/vq/16u.vqs @@ -0,0 +1,69 @@ + +GO + +>_16u0_ noninterleaved +haux 16u0/resaux_0.vqd _16u0__single 0,64,2 8 + +:_p1_0 16u0/res_sub0_part1_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p2_0 16u0/res_sub0_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p3_0 16u0/res_sub0_part3_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p4_0 16u0/res_sub0_part4_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p5_0 16u0/res_sub0_part5_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 + +:_p6_0 16u0/res_sub0_part6_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_p6_1 16u0/res_sub0_part6_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_p7_0 16u0/res_sub0_part7_pass0.vqd, 4, nonseq, 0 +- 315 +:_p7_1 16u0/res_sub0_part7_pass1.vqd, 2, nonseq, 0 +- 21 42 63 84 105 126 147 +:_p7_2 16u0/res_sub0_part7_pass2.vqd, 2, nonseq, 0 +- 1 2 3 4 5 6 7 8 9 10 + + +>_16u1s_ noninterleaved +haux 16u1/resaux_0.vqd _16u1__short 0,64,2 10 +>_16u1_ noninterleaved +haux 16u1/resaux_1.vqd _16u1__long 0,64,2 10 + +:_p1_0 16u1/res_sub0_part1_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p2_0 16u1/res_sub0_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p3_0 16u1/res_sub0_part3_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p4_0 16u1/res_sub0_part4_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p5_0 16u1/res_sub0_part5_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p6_0 16u1/res_sub0_part6_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 + +:_p7_0 16u1/res_sub0_part7_pass0.vqd, 4, nonseq, 0 +- 11 +:_p7_1 16u1/res_sub0_part7_pass1.vqd, 2, nonseq, 0 +- 1 2 3 4 5 + +:_p8_0 16u1/res_sub0_part8_pass0.vqd, 2, nonseq, 0 +- 11 22 33 44 55 +:_p8_1 16u1/res_sub0_part8_pass1.vqd, 2, nonseq, 0 +- 1 2 3 4 5 + +:_p9_0 16u1/res_sub0_part9_pass0.vqd, 2, nonseq, 0 +- 255 510 765 1020 1275 1530 1785 +:_p9_1 16u1/res_sub0_part9_pass1.vqd, 2, nonseq, 0 +- 17 34 51 68 85 102 119 +:_p9_2 16u1/res_sub0_part9_pass2.vqd, 2, nonseq, 0 +- 1 2 3 4 5 6 7 8 + +>_16u2s noninterleaved +haux 16u2/resaux_0.vqd _16u2__short 0,16,2 10 + +>_16u2 noninterleaved +haux 16u2/resaux_1.vqd _16u2__long 0,64,2 10 + +:_p1_0 16u2/res_sub0_part1_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p2_0 16u2/res_sub0_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p3_0 16u2/res_sub0_part3_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p4_0 16u2/res_sub0_part4_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 6 7 8 + +:_p5_0 16u2/res_sub0_part5_pass0.vqd, 4, nonseq cull, 0 +- 11 +:_p5_1 16u2/res_sub0_part5_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 + +:_p6_0 16u2/res_sub0_part6_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_p6_1 16u2/res_sub0_part6_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_p7_0 16u2/res_sub0_part7_pass0.vqd, 2, nonseq, 0 +- 11 22 33 44 55 66 +:_p7_1 16u2/res_sub0_part7_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 + +:_p8_0 16u2/res_sub0_part8_pass0.vqd, 2, nonseq, 0 +- 21 42 63 84 105 126 147 +:_p8_1 16u2/res_sub0_part8_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 6 7 8 9 10 + +:_p9_0 16u2/res_sub0_part9_pass0.vqd, 2, nonseq, 0 +- 931 1862 2793 3724 4655 5586 6517 +:_p9_1 16u2/res_sub0_part9_pass1.vqd, 2, nonseq, 0 +- 49 98 147 196 245 294 343 392 441 +:_p9_2 16u2/res_sub0_part9_pass2.vqd, 1, nonseq, 0 +- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 + diff --git a/cs/3rd party/libvorbis/vq/44c-1.vqs b/cs/3rd party/libvorbis/vq/44c-1.vqs new file mode 100644 index 000000000..ff30d65d1 --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44c-1.vqs @@ -0,0 +1,63 @@ +GO + +>_44cn1s_s noninterleaved +haux 44c-1_s/resaux_0.vqd _44cn1_s_short 0,16,2 9 + +>_44cn1_s noninterleaved +haux 44c-1_s/resaux_1.vqd _44cn1_s_long 0,64,2 9 + +# 0 1 2 2 4 8 16 32 + +# 0 0 99 4 8 16 32 + + +# 0 1 2 3 4 5 6 7 8 +# 1 . . . +# 2 . . . +# 4 . . . . . . + +:_p1_0 44c-1_s/res_part1_pass2.vqd, 8, nonseq cull, 0 +- 1 +:_p2_0 44c-1_s/res_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p3_0 44c-1_s/res_part3_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p4_0 44c-1_s/res_part4_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p5_0 44c-1_s/res_part5_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 6 7 8 + +:_p6_0 44c-1_s/res_part6_pass0.vqd, 4, nonseq cull, 0 +- 11 +:_p6_1 44c-1_s/res_part6_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 + +:_p7_0 44c-1_s/res_part7_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_p7_1 44c-1_s/res_part7_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_p8_0 44c-1_s/res_part8_pass0.vqd, 4, nonseq, 0 +- 221 442 +:_p8_1 44c-1_s/res_part8_pass1.vqd, 2, nonseq, 0 +- 17 34 51 68 85 102 +:_p8_2 44c-1_s/res_part8_pass2.vqd, 2, nonseq, 0 +- 1 2 3 4 5 6 7 8 + + +>_44cn1s_sm noninterleaved +haux 44c-1_sm/resaux_0.vqd _44cn1_sm_short 0,16,2 9 + +>_44cn1_sm noninterleaved +haux 44c-1_sm/resaux_1.vqd _44cn1_sm_long 0,64,2 9 + +# 0 1 2 2 4 8 16 32 + +# 0 0 99 4 8 16 32 + + +# 0 1 2 3 4 5 6 7 8 +# 1 . . . +# 2 . . . +# 4 . . . . . . + +:_p1_0 44c-1_sm/res_part1_pass2.vqd, 8, nonseq cull, 0 +- 1 +:_p2_0 44c-1_sm/res_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p3_0 44c-1_sm/res_part3_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p4_0 44c-1_sm/res_part4_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p5_0 44c-1_sm/res_part5_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 6 7 8 + +:_p6_0 44c-1_sm/res_part6_pass0.vqd, 4, nonseq cull, 0 +- 11 +:_p6_1 44c-1_sm/res_part6_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 + +:_p7_0 44c-1_sm/res_part7_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_p7_1 44c-1_sm/res_part7_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_p8_0 44c-1_sm/res_part8_pass0.vqd, 2, nonseq, 0 +- 221 442 663 884 +:_p8_1 44c-1_sm/res_part8_pass1.vqd, 2, nonseq, 0 +- 17 34 51 68 85 102 +:_p8_2 44c-1_sm/res_part8_pass2.vqd, 2, nonseq, 0 +- 1 2 3 4 5 6 7 8 + diff --git a/cs/3rd party/libvorbis/vq/44c0.vqs b/cs/3rd party/libvorbis/vq/44c0.vqs new file mode 100644 index 000000000..f650f8f4f --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44c0.vqs @@ -0,0 +1,65 @@ +GO + +>_44c0s_s noninterleaved +haux 44c0_s/resaux_0.vqd _44c0_s_short 0,16,2 9 + +>_44c0_s noninterleaved +haux 44c0_s/resaux_1.vqd _44c0_s_long 0,64,2 9 + +# 0 1 2 2 4 8 16 32 + +# 0 0 99 4 8 16 32 + + +# 0 1 2 3 4 5 6 7 8 +# 1 . . . +# 2 . . . +# 4 . . . . . . + +:_p1_0 44c0_s/res_part1_pass2.vqd, 8, nonseq cull, 0 +- 1 +:_p2_0 44c0_s/res_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p3_0 44c0_s/res_part3_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p4_0 44c0_s/res_part4_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p5_0 44c0_s/res_part5_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 6 7 8 + + +:_p6_0 44c0_s/res_part6_pass0.vqd, 4, nonseq cull, 0 +- 11 +:_p6_1 44c0_s/res_part6_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 + +:_p7_0 44c0_s/res_part7_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_p7_1 44c0_s/res_part7_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_p8_0 44c0_s/res_part8_pass0.vqd, 4, nonseq, 0 +- 221 442 +:_p8_1 44c0_s/res_part8_pass1.vqd, 2, nonseq, 0 +- 17 34 51 68 85 102 +:_p8_2 44c0_s/res_part8_pass2.vqd, 2, nonseq, 0 +- 1 2 3 4 5 6 7 8 + + +>_44c0s_sm noninterleaved +haux 44c0_sm/resaux_0.vqd _44c0_sm_short 0,16,2 9 + +>_44c0_sm noninterleaved +haux 44c0_sm/resaux_1.vqd _44c0_sm_long 0,64,2 9 + +# 0 1 2 2 4 8 16 32 + +# 0 0 99 4 8 16 32 + + +# 0 1 2 3 4 5 6 7 8 +# 1 . . . +# 2 . . . +# 4 . . . . . . + +:_p1_0 44c0_sm/res_part1_pass2.vqd, 8, nonseq cull, 0 +- 1 +:_p2_0 44c0_sm/res_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p3_0 44c0_sm/res_part3_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p4_0 44c0_sm/res_part4_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p5_0 44c0_sm/res_part5_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 6 7 8 + + +:_p6_0 44c0_sm/res_part6_pass0.vqd, 4, nonseq cull, 0 +- 11 +:_p6_1 44c0_sm/res_part6_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 + +:_p7_0 44c0_sm/res_part7_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_p7_1 44c0_sm/res_part7_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_p8_0 44c0_sm/res_part8_pass0.vqd, 2, nonseq, 0 +- 221 442 663 884 +:_p8_1 44c0_sm/res_part8_pass1.vqd, 2, nonseq, 0 +- 17 34 51 68 85 102 +:_p8_2 44c0_sm/res_part8_pass2.vqd, 2, nonseq, 0 +- 1 2 3 4 5 6 7 8 + diff --git a/cs/3rd party/libvorbis/vq/44c1.vqs b/cs/3rd party/libvorbis/vq/44c1.vqs new file mode 100644 index 000000000..c21a6b369 --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44c1.vqs @@ -0,0 +1,66 @@ + +GO + +>_44c1s_s noninterleaved +haux 44c1_s/resaux_0.vqd _44c1_s_short 0,16,2 9 + +>_44c1_s noninterleaved +haux 44c1_s/resaux_1.vqd _44c1_s_long 0,64,2 9 + +# 0 1 2 2 4 8 16 32 + +# 0 0 99 4 8 16 32 + + +# 0 1 2 3 4 5 6 7 8 +# 1 . . . +# 2 . . . +# 4 . . . . . . + +:_p1_0 44c1_s/res_part1_pass2.vqd, 8, nonseq cull, 0 +- 1 +:_p2_0 44c1_s/res_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p3_0 44c1_s/res_part3_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p4_0 44c1_s/res_part4_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p5_0 44c1_s/res_part5_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 6 7 8 + + +:_p6_0 44c1_s/res_part6_pass0.vqd, 4, nonseq cull, 0 +- 11 +:_p6_1 44c1_s/res_part6_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 + +:_p7_0 44c1_s/res_part7_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_p7_1 44c1_s/res_part7_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_p8_0 44c1_s/res_part8_pass0.vqd, 2, nonseq, 0 +- 221 442 663 884 1105 1326 +:_p8_1 44c1_s/res_part8_pass1.vqd, 2, nonseq, 0 +- 17 34 51 68 85 102 +:_p8_2 44c1_s/res_part8_pass2.vqd, 2, nonseq, 0 +- 1 2 3 4 5 6 7 8 + + +>_44c1s_sm noninterleaved +haux 44c1_sm/resaux_0.vqd _44c1_sm_short 0,16,2 9 + +>_44c1_sm noninterleaved +haux 44c1_sm/resaux_1.vqd _44c1_sm_long 0,64,2 9 + +# 0 1 2 2 4 8 16 32 + +# 0 0 99 4 8 16 32 + + +# 0 1 2 3 4 5 6 7 8 +# 1 . . . +# 2 . . . +# 4 . . . . . . + +:_p1_0 44c1_sm/res_part1_pass2.vqd, 8, nonseq cull, 0 +- 1 +:_p2_0 44c1_sm/res_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p3_0 44c1_sm/res_part3_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p4_0 44c1_sm/res_part4_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p5_0 44c1_sm/res_part5_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 6 7 8 + + +:_p6_0 44c1_sm/res_part6_pass0.vqd, 4, nonseq cull, 0 +- 11 +:_p6_1 44c1_sm/res_part6_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 + +:_p7_0 44c1_sm/res_part7_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_p7_1 44c1_sm/res_part7_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_p8_0 44c1_sm/res_part8_pass0.vqd, 2, nonseq, 0 +- 221 442 663 884 1105 1326 +:_p8_1 44c1_sm/res_part8_pass1.vqd, 2, nonseq, 0 +- 17 34 51 68 85 102 +:_p8_2 44c1_sm/res_part8_pass2.vqd, 2, nonseq, 0 +- 1 2 3 4 5 6 7 8 + diff --git a/cs/3rd party/libvorbis/vq/44c2.vqs b/cs/3rd party/libvorbis/vq/44c2.vqs new file mode 100644 index 000000000..9fdbd03fe --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44c2.vqs @@ -0,0 +1,37 @@ +GO + +>_44c2s_s noninterleaved +haux 44c2_s/resaux_0.vqd _44c2_s_short 0,16,2 10 + +>_44c2_s noninterleaved +haux 44c2_s/resaux_1.vqd _44c2_s_long 0,64,2 10 + +#iter 0 + +# 0 1 1 2 2 4 8 16 32 + +# 0 99 0 99 4 8 16 32 + + +# 0 1 2 3 4 5 6 7 8 9 +# 1 . . . +# 2 . . . +# 4 . . . . . . . + +:_p1_0 44c2_s/res_part1_pass2.vqd, 8, nonseq cull, 0 +- 1 +:_p2_0 44c2_s/res_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p3_0 44c2_s/res_part3_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p4_0 44c2_s/res_part4_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p5_0 44c2_s/res_part5_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p6_0 44c2_s/res_part6_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 6 7 8 + + +:_p7_0 44c2_s/res_part7_pass0.vqd, 4, nonseq cull, 0 +- 11 +:_p7_1 44c2_s/res_part7_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 + +:_p8_0 44c2_s/res_part8_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_p8_1 44c2_s/res_part8_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_p9_0 44c2_s/res_part9_pass0.vqd, 2, nonseq, 0 +- 221 442 663 884 1105 1326 +:_p9_1 44c2_s/res_part9_pass1.vqd, 2, nonseq, 0 +- 17 34 51 68 85 102 +:_p9_2 44c2_s/res_part9_pass2.vqd, 2, nonseq, 0 +- 1 2 3 4 5 6 7 8 + + \ No newline at end of file diff --git a/cs/3rd party/libvorbis/vq/44c3.vqs b/cs/3rd party/libvorbis/vq/44c3.vqs new file mode 100644 index 000000000..57a1317f3 --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44c3.vqs @@ -0,0 +1,36 @@ + +GO + +>_44c3s_s noninterleaved +haux 44c3_s/resaux_0.vqd _44c3_s_short 0,16,2 10 + +>_44c3_s noninterleaved +haux 44c3_s/resaux_1.vqd _44c3_s_long 0,64,2 10 + +#iter 0 + +# 0 1 1 2 2 4 8 16 32 + +# 0 99 0 99 4 8 16 32 + + +# 0 1 2 3 4 5 6 7 8 9 +# 1 . . . +# 2 . . . +# 4 . . . . . . . + +:_p1_0 44c3_s/res_part1_pass2.vqd, 8, nonseq cull, 0 +- 1 +:_p2_0 44c3_s/res_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p3_0 44c3_s/res_part3_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p4_0 44c3_s/res_part4_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p5_0 44c3_s/res_part5_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p6_0 44c3_s/res_part6_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 6 7 8 + + +:_p7_0 44c3_s/res_part7_pass0.vqd, 4, nonseq cull, 0 +- 11 +:_p7_1 44c3_s/res_part7_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 + +:_p8_0 44c3_s/res_part8_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_p8_1 44c3_s/res_part8_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_p9_0 44c3_s/res_part9_pass0.vqd, 2, nonseq, 0 +- 255 510 765 1020 1275 1530 +:_p9_1 44c3_s/res_part9_pass1.vqd, 2, nonseq, 0 +- 17 34 51 68 85 102 119 +:_p9_2 44c3_s/res_part9_pass2.vqd, 2, nonseq, 0 +- 1 2 3 4 5 6 7 8 diff --git a/cs/3rd party/libvorbis/vq/44c4.vqs b/cs/3rd party/libvorbis/vq/44c4.vqs new file mode 100644 index 000000000..82a36e192 --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44c4.vqs @@ -0,0 +1,36 @@ + +GO + +>_44c4s_s noninterleaved +haux 44c4_s/resaux_0.vqd _44c4_s_short 0,16,2 10 + +>_44c4_s noninterleaved +haux 44c4_s/resaux_1.vqd _44c4_s_long 0,64,2 10 + +#iter 0 + +# 0 1 1 2 2 4 8 16 32 + +# 0 99 0 99 4 8 16 32 + + +# 0 1 2 3 4 5 6 7 8 9 +# 1 . . . +# 2 . . . +# 4 . . . . . . . + +:_p1_0 44c4_s/res_part1_pass2.vqd, 8, nonseq cull, 0 +- 1 +:_p2_0 44c4_s/res_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p3_0 44c4_s/res_part3_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p4_0 44c4_s/res_part4_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p5_0 44c4_s/res_part5_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p6_0 44c4_s/res_part6_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 6 7 8 + + +:_p7_0 44c4_s/res_part7_pass0.vqd, 4, nonseq cull, 0 +- 11 +:_p7_1 44c4_s/res_part7_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 + +:_p8_0 44c4_s/res_part8_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_p8_1 44c4_s/res_part8_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_p9_0 44c4_s/res_part9_pass0.vqd, 2, nonseq, 0 +- 315 630 945 1260 1575 1890 +:_p9_1 44c4_s/res_part9_pass1.vqd, 2, nonseq, 0 +- 21 42 63 84 105 126 147 +:_p9_2 44c4_s/res_part9_pass2.vqd, 2, nonseq, 0 +- 1 2 3 4 5 6 7 8 9 10 diff --git a/cs/3rd party/libvorbis/vq/44c5.vqs b/cs/3rd party/libvorbis/vq/44c5.vqs new file mode 100644 index 000000000..9790843bb --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44c5.vqs @@ -0,0 +1,37 @@ + +GO + +>_44c5s_s noninterleaved +haux 44c5_s/resaux_0.vqd _44c5_s_short 0,16,2 10 + +>_44c5_s noninterleaved +haux 44c5_s/resaux_1.vqd _44c5_s_long 0,64,2 10 + +#iter 0 + +# 0 1 1 2 2 4 8 16 32 + +# 0 99 0 99 4 8 16 32 + + +# 0 1 2 3 4 5 6 7 8 9 +# 1 . . . +# 2 . . . +# 4 . . . . . . . + +:_p1_0 44c5_s/res_part1_pass2.vqd, 8, nonseq cull, 0 +- 1 +:_p2_0 44c5_s/res_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p3_0 44c5_s/res_part3_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p4_0 44c5_s/res_part4_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p5_0 44c5_s/res_part5_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p6_0 44c5_s/res_part6_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 6 7 8 + + +:_p7_0 44c5_s/res_part7_pass0.vqd, 4, nonseq cull, 0 +- 11 +:_p7_1 44c5_s/res_part7_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 + +:_p8_0 44c5_s/res_part8_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_p8_1 44c5_s/res_part8_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_p9_0 44c5_s/res_part9_pass0.vqd, 2, nonseq, 0 +- 357 714 1071 1428 1785 2142 2499 +:_p9_1 44c5_s/res_part9_pass1.vqd, 2, nonseq, 0 +- 21 42 63 84 105 126 147 168 +:_p9_2 44c5_s/res_part9_pass2.vqd, 2, nonseq, 0 +- 1 2 3 4 5 6 7 8 9 10 + diff --git a/cs/3rd party/libvorbis/vq/44c6.vqs b/cs/3rd party/libvorbis/vq/44c6.vqs new file mode 100644 index 000000000..f420dd012 --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44c6.vqs @@ -0,0 +1,37 @@ +GO + +>_44c6s_s noninterleaved +haux 44c6_s/resaux_0.vqd _44c6_s_short 0,16,2 10 + +>_44c6_s noninterleaved +haux 44c6_s/resaux_1.vqd _44c6_s_long 0,64,2 10 + + +# 0 1 2 4 8 16 32 71 157 + +# 1 2 3 4 8 16 71 157 + + +# 0 1 2 3 4 5 6 7 8 9 +# 1 . . . . . +# 2 . . . . . +# 4 . . . . . + +:_p1_0 44c6_s/res_part1_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p2_0 44c6_s/res_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p3_0 44c6_s/res_part3_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p4_0 44c6_s/res_part4_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 6 7 8 + +:_p5_0 44c6_s/res_part5_pass0.vqd, 4, nonseq cull, 0 +- 11 +:_p5_1 44c6_s/res_part5_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 + +:_p6_0 44c6_s/res_part6_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_p6_1 44c6_s/res_part6_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_p7_0 44c6_s/res_part7_pass0.vqd, 2, nonseq, 0 +- 11 22 33 44 55 66 +:_p7_1 44c6_s/res_part7_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 + +:_p8_0 44c6_s/res_part8_pass0.vqd, 2, nonseq, 0 +- 21 42 63 84 105 126 147 +:_p8_1 44c6_s/res_part8_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 6 7 8 9 10 + +:_p9_0 44c6_s/res_part9_pass0.vqd, 2, nonseq, 0 +- 637 1274 1911 2548 3185 3822 +:_p9_1 44c6_s/res_part9_pass1.vqd, 2, nonseq, 0 +- 49 98 147 196 245 294 +:_p9_2 44c6_s/res_part9_pass2.vqd, 1, nonseq, 0 +- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 diff --git a/cs/3rd party/libvorbis/vq/44c7.vqs b/cs/3rd party/libvorbis/vq/44c7.vqs new file mode 100644 index 000000000..088d81db0 --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44c7.vqs @@ -0,0 +1,38 @@ + +GO + +>_44c7s_s noninterleaved +haux 44c7_s/resaux_0.vqd _44c7_s_short 0,16,2 10 + +>_44c7_s noninterleaved +haux 44c7_s/resaux_1.vqd _44c7_s_long 0,64,2 10 + + +# 0 1 2 4 8 16 32 71 157 + +# 1 2 3 4 8 16 71 157 + + +# 0 1 2 3 4 5 6 7 8 9 +# 1 . . . . . +# 2 . . . . . +# 4 . . . . . + +:_p1_0 44c7_s/res_part1_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p2_0 44c7_s/res_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p3_0 44c7_s/res_part3_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p4_0 44c7_s/res_part4_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 6 7 8 + +:_p5_0 44c7_s/res_part5_pass0.vqd, 4, nonseq cull, 0 +- 11 +:_p5_1 44c7_s/res_part5_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 + +:_p6_0 44c7_s/res_part6_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_p6_1 44c7_s/res_part6_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_p7_0 44c7_s/res_part7_pass0.vqd, 2, nonseq, 0 +- 11 22 33 44 55 66 +:_p7_1 44c7_s/res_part7_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 + +:_p8_0 44c7_s/res_part8_pass0.vqd, 2, nonseq, 0 +- 21 42 63 84 105 126 147 +:_p8_1 44c7_s/res_part8_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 6 7 8 9 10 + +:_p9_0 44c7_s/res_part9_pass0.vqd, 2, nonseq, 0 +- 637 1274 1911 2548 3185 3822 +:_p9_1 44c7_s/res_part9_pass1.vqd, 2, nonseq, 0 +- 49 98 147 196 245 294 +:_p9_2 44c7_s/res_part9_pass2.vqd, 1, nonseq, 0 +- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 diff --git a/cs/3rd party/libvorbis/vq/44c8.vqs b/cs/3rd party/libvorbis/vq/44c8.vqs new file mode 100644 index 000000000..ce5bdbe07 --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44c8.vqs @@ -0,0 +1,39 @@ + +GO + +>_44c8s_s noninterleaved +haux 44c8_s/resaux_0.vqd _44c8_s_short 0,16,2 10 + +>_44c8_s noninterleaved +haux44c8_s/resaux_1.vqd _44c8_s_long 0,64,2 10 + + +# 0 1 2 4 8 16 32 71 157 + +# 1 2 3 4 8 16 71 157 + + +# 0 1 2 3 4 5 6 7 8 9 +# 1 . . . . . +# 2 . . . . . +# 4 . . . . . + +:_p1_0 44c8_s/res_part1_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p2_0 44c8_s/res_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p3_0 44c8_s/res_part3_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p4_0 44c8_s/res_part4_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 6 7 8 + +:_p5_0 44c8_s/res_part5_pass0.vqd, 4, nonseq cull, 0 +- 11 +:_p5_1 44c8_s/res_part5_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 + +:_p6_0 44c8_s/res_part6_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_p6_1 44c8_s/res_part6_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_p7_0 44c8_s/res_part7_pass0.vqd, 2, nonseq, 0 +- 11 22 33 44 55 66 +:_p7_1 44c8_s/res_part7_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 + +:_p8_0 44c8_s/res_part8_pass0.vqd, 2, nonseq, 0 +- 21 42 63 84 105 126 147 +:_p8_1 44c8_s/res_part8_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 6 7 8 9 10 + +:_p9_0 44c8_s/res_part9_pass0.vqd, 2, nonseq, 0 +- 931 1862 2793 3724 4655 5586 6517 7448 +:_p9_1 44c8_s/res_part9_pass1.vqd, 2, nonseq, 0 +- 49 98 147 196 245 294 343 392 441 +:_p9_2 44c8_s/res_part9_pass2.vqd, 1, nonseq, 0 +- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 + diff --git a/cs/3rd party/libvorbis/vq/44c9.vqs b/cs/3rd party/libvorbis/vq/44c9.vqs new file mode 100644 index 000000000..1c54786cb --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44c9.vqs @@ -0,0 +1,37 @@ +GO + +>_44c9s_s noninterleaved +haux 44c9_s/resaux_0.vqd _44c9_s_short 0,16,2 10 + +>_44c9_s noninterleaved +haux 44c9_s/resaux_1.vqd _44c9_s_long 0,64,2 10 + + +# 0 1 2 4 8 16 32 71 157 + +# 1 2 3 4 8 16 71 157 + + +# 0 1 2 3 4 5 6 7 8 9 +# 1 . . . . . +# 2 . . . . . +# 4 . . . . . + +:_p1_0 44c9_s/res_part1_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p2_0 44c9_s/res_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p3_0 44c9_s/res_part3_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p4_0 44c9_s/res_part4_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 6 7 8 + +:_p5_0 44c9_s/res_part5_pass0.vqd, 4, nonseq cull, 0 +- 11 +:_p5_1 44c9_s/res_part5_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 + +:_p6_0 44c9_s/res_part6_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_p6_1 44c9_s/res_part6_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_p7_0 44c9_s/res_part7_pass0.vqd, 2, nonseq, 0 +- 11 22 33 44 55 66 +:_p7_1 44c9_s/res_part7_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 + +:_p8_0 44c9_s/res_part8_pass0.vqd, 2, nonseq, 0 +- 21 42 63 84 105 126 147 +:_p8_1 44c9_s/res_part8_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 6 7 8 9 10 + +:_p9_0 44c9_s/res_part9_pass0.vqd, 2, nonseq, 0 +- 931 1862 2793 3724 4655 5586 6517 7448 8379 +:_p9_1 44c9_s/res_part9_pass1.vqd, 2, nonseq, 0 +- 49 98 147 196 245 294 343 392 441 +:_p9_2 44c9_s/res_part9_pass2.vqd, 1, nonseq, 0 +- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 diff --git a/cs/3rd party/libvorbis/vq/44p-1.vqs b/cs/3rd party/libvorbis/vq/44p-1.vqs new file mode 100644 index 000000000..02d26fb79 --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44p-1.vqs @@ -0,0 +1,49 @@ +GO + +>_44pn1 noninterleaved +haux 44pn1/resaux_0.vqd _44pn1_short 0,80,2 7 +haux 44pn1/resaux_1.vqd _44pn1_long 0,300,2 7 +haux 44pn1/resaux_2.vqd _44pn1_lfe 0,2,2 2 + +#iter 0 + +# 0 1 2 7 17 31 + +# 0 99 7 17 31 + + +# 0 1 2 3 4 5 6 +# 1 . . . . . +# 2 . . . . . . +# 4 . . + +:_p1_0 44pn1/res_sub0_part1_pass1.vqd, 5, nonseq cull, 0 +- 1 + +:_p2_0 44pn1/res_sub0_part2_pass0.vqd, 5, nonseq cull, 0 +- 3 +:_p2_1 44pn1/res_sub0_part2_pass1.vqd, 5, nonseq cull, 0 +- 1 + +:_p3_0 44pn1/res_sub0_part3_pass0.vqd, 5, nonseq cull, 0 +- 5 +:_p3_1 44pn1/res_sub0_part3_pass1.vqd, 5, nonseq cull, 0 +- 1 2 + +:_p4_0 44pn1/res_sub0_part4_pass0.vqd, 5, nonseq cull, 0 +- 7 14 +:_p4_1 44pn1/res_sub0_part4_pass1.vqd, 1, nonseq cull, 0 +- 1 2 3 + +:_p5_0 44pn1/res_sub0_part5_pass0.vqd, 5, nonseq cull, 0 +- 21 +:_p5_1 44pn1/res_sub0_part5_pass1.vqd, 5, nonseq cull, 0 +- 7 +# reuse p4_1 :_p5_2 + +:_p6_0 44pn1/res_sub0_part6_pass0.vqd, 5, nonseq, 0 +- 625 +:_p6_1 44pn1/res_sub0_part6_pass1.vqd, 1, nonseq, 0 +- 25 50 75 100 125 150 175 200 225 250 275 300 +:_p6_2 44pn1/res_sub0_part6_pass2.vqd, 1, nonseq, 0 +- 1 2 3 4 5 6 7 8 9 10 11 12 + +# 32 + +# 0 0 +# +# 0 1 +# 1 . . +# 2 . . +# 4 . + +:_l0_0 44pn1/res_sub1_part0_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_l0_1 44pn1/res_sub1_part0_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_l1_0 44pn1/res_sub1_part1_pass0.vqd, 2, nonseq, 0 +- 625 +# reuse p7_2/3 for l1_1/2 diff --git a/cs/3rd party/libvorbis/vq/44p0.vqs b/cs/3rd party/libvorbis/vq/44p0.vqs new file mode 100644 index 000000000..16479ba66 --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44p0.vqs @@ -0,0 +1,49 @@ +GO + +>_44p0 noninterleaved +haux 44p0/resaux_0.vqd _44p0_short 0,42,2 7 +haux 44p0/resaux_1.vqd _44p0_long 0,170,2 7 +haux 44p0/resaux_2.vqd _44p0_lfe 0,2,2 2 + +#iter 0 + +# 0 1 2 7 17 31 + +# 0 99 7 17 31 + + +# 0 1 2 3 4 5 6 +# 1 . . . . . +# 2 . . . . . . +# 4 . . + +:_p1_0 44p0/res_sub0_part1_pass1.vqd, 5, nonseq cull, 0 +- 1 + +:_p2_0 44p0/res_sub0_part2_pass0.vqd, 5, nonseq cull, 0 +- 3 +:_p2_1 44p0/res_sub0_part2_pass1.vqd, 5, nonseq cull, 0 +- 1 + +:_p3_0 44p0/res_sub0_part3_pass0.vqd, 5, nonseq cull, 0 +- 5 +:_p3_1 44p0/res_sub0_part3_pass1.vqd, 5, nonseq cull, 0 +- 1 2 + +:_p4_0 44p0/res_sub0_part4_pass0.vqd, 5, nonseq cull, 0 +- 7 14 +:_p4_1 44p0/res_sub0_part4_pass1.vqd, 1, nonseq cull, 0 +- 1 2 3 + +:_p5_0 44p0/res_sub0_part5_pass0.vqd, 5, nonseq cull, 0 +- 21 +:_p5_1 44p0/res_sub0_part5_pass1.vqd, 5, nonseq cull, 0 +- 7 +# reuse p4_1 :_p5_2 + +:_p6_0 44p0/res_sub0_part6_pass0.vqd, 5, nonseq, 0 +- 625 +:_p6_1 44p0/res_sub0_part6_pass1.vqd, 1, nonseq, 0 +- 25 50 75 100 125 150 175 200 225 250 275 300 +:_p6_2 44p0/res_sub0_part6_pass2.vqd, 1, nonseq, 0 +- 1 2 3 4 5 6 7 8 9 10 11 12 + +# 32 + +# 0 0 +# +# 0 1 +# 1 . . +# 2 . . +# 4 . + +:_l0_0 44p0/res_sub1_part0_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_l0_1 44p0/res_sub1_part0_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_l1_0 44p0/res_sub1_part1_pass0.vqd, 2, nonseq, 0 +- 625 +# reuse p7_2/3 for l1_1/2 diff --git a/cs/3rd party/libvorbis/vq/44p1.vqs b/cs/3rd party/libvorbis/vq/44p1.vqs new file mode 100644 index 000000000..74352c31c --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44p1.vqs @@ -0,0 +1,49 @@ +GO + +>_44p1 noninterleaved +haux 44p1/resaux_0.vqd _44p1_short 0,42,2 7 +haux 44p1/resaux_1.vqd _44p1_long 0,170,2 7 +haux 44p1/resaux_2.vqd _44p1_lfe 0,2,2 2 + +#iter 0 + +# 0 1 2 7 17 31 + +# 0 99 7 17 31 + + +# 0 1 2 3 4 5 6 +# 1 . . . . . +# 2 . . . . . . +# 4 . . + +:_p1_0 44p1/res_sub0_part1_pass1.vqd, 5, nonseq cull, 0 +- 1 + +:_p2_0 44p1/res_sub0_part2_pass0.vqd, 5, nonseq cull, 0 +- 3 +:_p2_1 44p1/res_sub0_part2_pass1.vqd, 5, nonseq cull, 0 +- 1 + +:_p3_0 44p1/res_sub0_part3_pass0.vqd, 5, nonseq cull, 0 +- 5 +:_p3_1 44p1/res_sub0_part3_pass1.vqd, 5, nonseq cull, 0 +- 1 2 + +:_p4_0 44p1/res_sub0_part4_pass0.vqd, 5, nonseq cull, 0 +- 7 14 +:_p4_1 44p1/res_sub0_part4_pass1.vqd, 1, nonseq cull, 0 +- 1 2 3 + +:_p5_0 44p1/res_sub0_part5_pass0.vqd, 5, nonseq cull, 0 +- 21 +:_p5_1 44p1/res_sub0_part5_pass1.vqd, 5, nonseq cull, 0 +- 7 +# reuse p4_1 :_p5_2 + +:_p6_0 44p1/res_sub0_part6_pass0.vqd, 5, nonseq, 0 +- 625 +:_p6_1 44p1/res_sub0_part6_pass1.vqd, 1, nonseq, 0 +- 25 50 75 100 125 150 175 200 225 250 275 300 +:_p6_2 44p1/res_sub0_part6_pass2.vqd, 1, nonseq, 0 +- 1 2 3 4 5 6 7 8 9 10 11 12 + +# 32 + +# 0 0 +# +# 0 1 +# 1 . . +# 2 . . +# 4 . + +:_l0_0 44p1/res_sub1_part0_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_l0_1 44p1/res_sub1_part0_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_l1_0 44p1/res_sub1_part1_pass0.vqd, 2, nonseq, 0 +- 625 +# reuse p7_2/3 for l1_1/2 diff --git a/cs/3rd party/libvorbis/vq/44p2.vqs b/cs/3rd party/libvorbis/vq/44p2.vqs new file mode 100644 index 000000000..7eabbab4a --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44p2.vqs @@ -0,0 +1,52 @@ +GO + +>_44p2 noninterleaved +haux 44p2/resaux_0.vqd _44p2_short 0,42,2 8 +haux 44p2/resaux_1.vqd _44p2_long 0,170,2 8 +haux 44p2/resaux_2.vqd _44p2_lfe 0,2,2 2 + +#iter 0 + +# 0 1 1 2 7 17 31 + +# 0 99 99 7 17 31 + + +# 0 1 2 3 4 5 6 7 +# 1 . . . . . +# 2 . . . . . . +# 4 . . . +# 8 . + +:_p1_0 44p2/res_sub0_part1_pass2.vqd, 5, nonseq cull, 0 +- 1 +:_p2_0 44p2/res_sub0_part2_pass1.vqd, 5, nonseq cull, 0 +- 1 2 + +:_p3_0 44p2/res_sub0_part3_pass0.vqd, 5, nonseq cull, 0 +- 3 +:_p3_1 44p2/res_sub0_part3_pass1.vqd, 5, nonseq cull, 0 +- 1 + +:_p4_0 44p2/res_sub0_part4_pass0.vqd, 5, nonseq cull, 0 +- 5 +:_p4_1 44p2/res_sub0_part4_pass1.vqd, 5, nonseq cull, 0 +- 1 2 + +:_p5_0 44p2/res_sub0_part5_pass0.vqd, 5, nonseq cull, 0 +- 7 14 +:_p5_1 44p2/res_sub0_part5_pass1.vqd, 1, nonseq cull, 0 +- 1 2 3 + +:_p6_0 44p2/res_sub0_part6_pass0.vqd, 5, nonseq cull, 0 +- 21 +:_p6_1 44p2/res_sub0_part6_pass1.vqd, 5, nonseq cull, 0 +- 7 +# reuse p5_1 :_p6_2 + +:_p7_0 44p2/res_sub0_part7_pass0.vqd, 5, nonseq, 0 +- 1875 +:_p7_1 44p2/res_sub0_part7_pass1.vqd, 5, nonseq, 0 +- 625 +:_p7_2 44p2/res_sub0_part7_pass2.vqd, 1, nonseq, 0 +- 25 50 75 100 125 150 175 200 225 250 275 300 +:_p7_3 44p2/res_sub0_part7_pass3.vqd, 1, nonseq, 0 +- 1 2 3 4 5 6 7 8 9 10 11 12 + +# 32 + +# 0 0 +# +# 0 1 +# 1 . . +# 2 . . +# 4 . + +:_l0_0 44p2/res_sub1_part0_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_l0_1 44p2/res_sub1_part0_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_l1_0 44p2/res_sub1_part1_pass0.vqd, 2, nonseq, 0 +- 625 +# reuse p7_2/3 for l1_1/2 diff --git a/cs/3rd party/libvorbis/vq/44p3.vqs b/cs/3rd party/libvorbis/vq/44p3.vqs new file mode 100644 index 000000000..b1c66a603 --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44p3.vqs @@ -0,0 +1,52 @@ +GO + +>_44p3 noninterleaved +haux 44p3/resaux_0.vqd _44p3_short 0,42,2 8 +haux 44p3/resaux_1.vqd _44p3_long 0,170,2 8 +haux 44p3/resaux_2.vqd _44p3_lfe 0,2,2 2 + +#iter 0 + +# 0 1 1 2 7 17 31 + +# 0 99 99 7 17 31 + + +# 0 1 2 3 4 5 6 7 +# 1 . . . . . +# 2 . . . . . . +# 4 . . . +# 8 . + +:_p1_0 44p3/res_sub0_part1_pass2.vqd, 5, nonseq cull, 0 +- 1 +:_p2_0 44p3/res_sub0_part2_pass1.vqd, 5, nonseq cull, 0 +- 1 2 + +:_p3_0 44p3/res_sub0_part3_pass0.vqd, 5, nonseq cull, 0 +- 3 +:_p3_1 44p3/res_sub0_part3_pass1.vqd, 5, nonseq cull, 0 +- 1 + +:_p4_0 44p3/res_sub0_part4_pass0.vqd, 5, nonseq cull, 0 +- 5 +:_p4_1 44p3/res_sub0_part4_pass1.vqd, 5, nonseq cull, 0 +- 1 2 + +:_p5_0 44p3/res_sub0_part5_pass0.vqd, 5, nonseq cull, 0 +- 7 14 +:_p5_1 44p3/res_sub0_part5_pass1.vqd, 1, nonseq cull, 0 +- 1 2 3 + +:_p6_0 44p3/res_sub0_part6_pass0.vqd, 5, nonseq cull, 0 +- 21 +:_p6_1 44p3/res_sub0_part6_pass1.vqd, 5, nonseq cull, 0 +- 7 +# reuse p5_1 :_p6_2 44p3/res_sub0_part6_pass2.vqd, 1, nonseq cull, 0 +- 1 2 3 + +:_p7_0 44p3/res_sub0_part7_pass0.vqd, 5, nonseq, 0 +- 1875 +:_p7_1 44p3/res_sub0_part7_pass1.vqd, 5, nonseq, 0 +- 625 +:_p7_2 44p3/res_sub0_part7_pass2.vqd, 1, nonseq, 0 +- 25 50 75 100 125 150 175 200 225 250 275 300 +:_p7_3 44p3/res_sub0_part7_pass3.vqd, 1, nonseq, 0 +- 1 2 3 4 5 6 7 8 9 10 11 12 + +# 32 + +# 0 0 +# +# 0 1 +# 1 . . +# 2 . . +# 4 . + +:_l0_0 44p3/res_sub1_part0_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_l0_1 44p3/res_sub1_part0_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_l1_0 44p3/res_sub1_part1_pass0.vqd, 2, nonseq, 0 +- 625 +# reuse p7_2/3 for l1_1/2 diff --git a/cs/3rd party/libvorbis/vq/44p4.vqs b/cs/3rd party/libvorbis/vq/44p4.vqs new file mode 100644 index 000000000..4b70436d4 --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44p4.vqs @@ -0,0 +1,52 @@ +GO + +>_44p4 noninterleaved +haux 44p4/resaux_0.vqd _44p4_short 0,42,2 8 +haux 44p4/resaux_1.vqd _44p4_long 0,170,2 8 +haux 44p4/resaux_2.vqd _44p4_lfe 0,2,2 2 + +#iter 0 + +# 0 1 1 2 7 17 31 + +# 0 99 99 7 17 31 + + +# 0 1 2 3 4 5 6 7 +# 1 . . . . . +# 2 . . . . . . +# 4 . . . +# 8 . + +:_p1_0 44p4/res_sub0_part1_pass2.vqd, 5, nonseq cull, 0 +- 1 +:_p2_0 44p4/res_sub0_part2_pass1.vqd, 5, nonseq cull, 0 +- 1 2 + +:_p3_0 44p4/res_sub0_part3_pass0.vqd, 5, nonseq cull, 0 +- 3 +:_p3_1 44p4/res_sub0_part3_pass1.vqd, 5, nonseq cull, 0 +- 1 + +:_p4_0 44p4/res_sub0_part4_pass0.vqd, 5, nonseq cull, 0 +- 5 +:_p4_1 44p4/res_sub0_part4_pass1.vqd, 5, nonseq cull, 0 +- 1 2 + +:_p5_0 44p4/res_sub0_part5_pass0.vqd, 5, nonseq cull, 0 +- 7 14 +:_p5_1 44p4/res_sub0_part5_pass1.vqd, 1, nonseq cull, 0 +- 1 2 3 + +:_p6_0 44p4/res_sub0_part6_pass0.vqd, 5, nonseq cull, 0 +- 21 +:_p6_1 44p4/res_sub0_part6_pass1.vqd, 5, nonseq cull, 0 +- 7 +# reuse p5_1 :_p6_2 44p3/res_sub0_part6_pass2.vqd, 1, nonseq cull, 0 +- 1 2 3 + +:_p7_0 44p4/res_sub0_part7_pass0.vqd, 5, nonseq, 0 +- 1875 +:_p7_1 44p4/res_sub0_part7_pass1.vqd, 5, nonseq, 0 +- 625 +:_p7_2 44p4/res_sub0_part7_pass2.vqd, 1, nonseq, 0 +- 25 50 75 100 125 150 175 200 225 250 275 300 +:_p7_3 44p4/res_sub0_part7_pass3.vqd, 1, nonseq, 0 +- 1 2 3 4 5 6 7 8 9 10 11 12 + +# 32 + +# 0 0 +# +# 0 1 +# 1 . . +# 2 . . +# 4 . + +:_l0_0 44p4/res_sub1_part0_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_l0_1 44p4/res_sub1_part0_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_l1_0 44p4/res_sub1_part1_pass0.vqd, 2, nonseq, 0 +- 625 +# reuse p7_2/3 for l1_1/2 diff --git a/cs/3rd party/libvorbis/vq/44p5.vqs b/cs/3rd party/libvorbis/vq/44p5.vqs new file mode 100644 index 000000000..0372321a0 --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44p5.vqs @@ -0,0 +1,52 @@ +GO + +>_44p5 noninterleaved +haux 44p5/resaux_0.vqd _44p5_short 0,42,2 8 +haux 44p5/resaux_1.vqd _44p5_long 0,170,2 8 +haux 44p5/resaux_2.vqd _44p5_lfe 0,2,2 2 + +#iter 0 + +# 0 1 2 4 7 17 31 + +# 1 2 4 7 17 31 + + +# 0 1 2 3 4 5 6 7 +# 1 . . . . . +# 2 . . . . . . +# 4 . . . +# 8 . + +:_p1_0 44p5/res_sub0_part1_pass2.vqd, 5, nonseq cull, 0 +- 1 +:_p2_0 44p5/res_sub0_part2_pass1.vqd, 5, nonseq cull, 0 +- 1 2 + +:_p3_0 44p5/res_sub0_part3_pass0.vqd, 5, nonseq cull, 0 +- 3 +:_p3_1 44p5/res_sub0_part3_pass1.vqd, 5, nonseq cull, 0 +- 1 + +:_p4_0 44p5/res_sub0_part4_pass0.vqd, 5, nonseq cull, 0 +- 5 +:_p4_1 44p5/res_sub0_part4_pass1.vqd, 5, nonseq cull, 0 +- 1 2 + +:_p5_0 44p5/res_sub0_part5_pass0.vqd, 5, nonseq cull, 0 +- 7 14 +:_p5_1 44p5/res_sub0_part5_pass1.vqd, 1, nonseq cull, 0 +- 1 2 3 + +:_p6_0 44p5/res_sub0_part6_pass0.vqd, 5, nonseq cull, 0 +- 21 +:_p6_1 44p5/res_sub0_part6_pass1.vqd, 5, nonseq cull, 0 +- 7 +# reuse p5_1 :_p6_2 44p3/res_sub0_part6_pass2.vqd, 1, nonseq cull, 0 +- 1 2 3 + +:_p7_0 44p5/res_sub0_part7_pass0.vqd, 5, nonseq, 0 +- 1875 +:_p7_1 44p5/res_sub0_part7_pass1.vqd, 5, nonseq, 0 +- 625 +:_p7_2 44p5/res_sub0_part7_pass2.vqd, 1, nonseq, 0 +- 25 50 75 100 125 150 175 200 225 250 275 300 +:_p7_3 44p5/res_sub0_part7_pass3.vqd, 1, nonseq, 0 +- 1 2 3 4 5 6 7 8 9 10 11 12 + +# 32 + +# 0 0 +# +# 0 1 +# 1 . . +# 2 . . +# 4 . + +:_l0_0 44p5/res_sub1_part0_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_l0_1 44p5/res_sub1_part0_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_l1_0 44p5/res_sub1_part1_pass0.vqd, 2, nonseq, 0 +- 625 +# reuse p6_2/3 for l1_2/3 diff --git a/cs/3rd party/libvorbis/vq/44p6.vqs b/cs/3rd party/libvorbis/vq/44p6.vqs new file mode 100644 index 000000000..9daad60bb --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44p6.vqs @@ -0,0 +1,52 @@ +GO + +>_44p6 noninterleaved +haux 44p6/resaux_0.vqd _44p6_short 0,42,2 8 +haux 44p6/resaux_1.vqd _44p6_long 0,170,2 8 +haux 44p6/resaux_2.vqd _44p6_lfe 0,2,2 2 + +#iter 0 + +# 0 1 2 4 7 17 31 + +# 1 2 4 7 17 31 + + +# 0 1 2 3 4 5 6 7 +# 1 . . . . . +# 2 . . . . . . +# 4 . . . +# 8 . + +:_p1_0 44p6/res_sub0_part1_pass2.vqd, 5, nonseq cull, 0 +- 1 +:_p2_0 44p6/res_sub0_part2_pass1.vqd, 5, nonseq cull, 0 +- 1 2 + +:_p3_0 44p6/res_sub0_part3_pass0.vqd, 5, nonseq cull, 0 +- 3 +:_p3_1 44p6/res_sub0_part3_pass1.vqd, 5, nonseq cull, 0 +- 1 + +:_p4_0 44p6/res_sub0_part4_pass0.vqd, 5, nonseq cull, 0 +- 5 +:_p4_1 44p6/res_sub0_part4_pass1.vqd, 5, nonseq cull, 0 +- 1 2 + +:_p5_0 44p6/res_sub0_part5_pass0.vqd, 5, nonseq cull, 0 +- 7 14 +:_p5_1 44p6/res_sub0_part5_pass1.vqd, 1, nonseq cull, 0 +- 1 2 3 + +:_p6_0 44p6/res_sub0_part6_pass0.vqd, 5, nonseq cull, 0 +- 21 +:_p6_1 44p6/res_sub0_part6_pass1.vqd, 5, nonseq cull, 0 +- 7 +# reuse p5_1 :_p6_2 44p3/res_sub0_part6_pass2.vqd, 1, nonseq cull, 0 +- 1 2 3 + +:_p7_0 44p6/res_sub0_part7_pass0.vqd, 5, nonseq, 0 +- 1875 +:_p7_1 44p6/res_sub0_part7_pass1.vqd, 5, nonseq, 0 +- 625 +:_p7_2 44p6/res_sub0_part7_pass2.vqd, 1, nonseq, 0 +- 25 50 75 100 125 150 175 200 225 250 275 300 +:_p7_3 44p6/res_sub0_part7_pass3.vqd, 1, nonseq, 0 +- 1 2 3 4 5 6 7 8 9 10 11 12 + +# 32 + +# 0 0 +# +# 0 1 +# 1 . . +# 2 . . +# 4 . + +:_l0_0 44p6/res_sub1_part0_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_l0_1 44p6/res_sub1_part0_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_l1_0 44p6/res_sub1_part1_pass0.vqd, 2, nonseq, 0 +- 625 +# reuse p6_2/3 for l1_2/3 diff --git a/cs/3rd party/libvorbis/vq/44p7.vqs b/cs/3rd party/libvorbis/vq/44p7.vqs new file mode 100644 index 000000000..9ec5d026e --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44p7.vqs @@ -0,0 +1,52 @@ +GO + +>_44p7 noninterleaved +haux 44p7/resaux_0.vqd _44p7_short 0,42,2 8 +haux 44p7/resaux_1.vqd _44p7_long 0,170,2 8 +haux 44p7/resaux_2.vqd _44p7_lfe 0,2,2 2 + +#iter 0 + +# 0 1 2 4 7 17 31 + +# 1 2 4 7 17 31 + + +# 0 1 2 3 4 5 6 7 +# 1 . . . . . +# 2 . . . . . . +# 4 . . . +# 8 . + +:_p1_0 44p7/res_sub0_part1_pass2.vqd, 5, nonseq cull, 0 +- 1 +:_p2_0 44p7/res_sub0_part2_pass1.vqd, 5, nonseq cull, 0 +- 1 2 + +:_p3_0 44p7/res_sub0_part3_pass0.vqd, 5, nonseq cull, 0 +- 3 +:_p3_1 44p7/res_sub0_part3_pass1.vqd, 5, nonseq cull, 0 +- 1 + +:_p4_0 44p7/res_sub0_part4_pass0.vqd, 5, nonseq cull, 0 +- 5 +:_p4_1 44p7/res_sub0_part4_pass1.vqd, 5, nonseq cull, 0 +- 1 2 + +:_p5_0 44p7/res_sub0_part5_pass0.vqd, 5, nonseq cull, 0 +- 7 14 +:_p5_1 44p7/res_sub0_part5_pass1.vqd, 1, nonseq cull, 0 +- 1 2 3 + +:_p6_0 44p7/res_sub0_part6_pass0.vqd, 5, nonseq cull, 0 +- 21 +:_p6_1 44p7/res_sub0_part6_pass1.vqd, 5, nonseq cull, 0 +- 7 +# reuse p5_1 :_p6_2 44p3/res_sub0_part6_pass2.vqd, 1, nonseq cull, 0 +- 1 2 3 + +:_p7_0 44p7/res_sub0_part7_pass0.vqd, 5, nonseq, 0 +- 1875 +:_p7_1 44p7/res_sub0_part7_pass1.vqd, 5, nonseq, 0 +- 625 +:_p7_2 44p7/res_sub0_part7_pass2.vqd, 1, nonseq, 0 +- 25 50 75 100 125 150 175 200 225 250 275 300 +:_p7_3 44p7/res_sub0_part7_pass3.vqd, 1, nonseq, 0 +- 1 2 3 4 5 6 7 8 9 10 11 12 + +# 32 + +# 0 0 +# +# 0 1 +# 1 . . +# 2 . . +# 4 . + +:_l0_0 44p7/res_sub1_part0_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_l0_1 44p7/res_sub1_part0_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_l1_0 44p7/res_sub1_part1_pass0.vqd, 2, nonseq, 0 +- 625 1350 +# reuse p6_2/3 for l1_2/3 diff --git a/cs/3rd party/libvorbis/vq/44p8.vqs b/cs/3rd party/libvorbis/vq/44p8.vqs new file mode 100644 index 000000000..a75af84af --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44p8.vqs @@ -0,0 +1,52 @@ +GO + +>_44p8 noninterleaved +haux 44p8/resaux_0.vqd _44p8_short 0,42,2 8 +haux 44p8/resaux_1.vqd _44p8_long 0,170,2 8 +haux 44p8/resaux_2.vqd _44p8_lfe 0,2,2 2 + +#iter 0 + +# 0 1 2 4 7 17 31 + +# 1 2 4 7 17 31 + + +# 0 1 2 3 4 5 6 7 +# 1 . . . . . +# 2 . . . . . . +# 4 . . . +# 8 . + +:_p1_0 44p8/res_sub0_part1_pass2.vqd, 5, nonseq cull, 0 +- 1 +:_p2_0 44p8/res_sub0_part2_pass1.vqd, 5, nonseq cull, 0 +- 1 2 + +:_p3_0 44p8/res_sub0_part3_pass0.vqd, 5, nonseq cull, 0 +- 3 +:_p3_1 44p8/res_sub0_part3_pass1.vqd, 5, nonseq cull, 0 +- 1 + +:_p4_0 44p8/res_sub0_part4_pass0.vqd, 5, nonseq cull, 0 +- 5 +:_p4_1 44p8/res_sub0_part4_pass1.vqd, 5, nonseq cull, 0 +- 1 2 + +:_p5_0 44p8/res_sub0_part5_pass0.vqd, 5, nonseq cull, 0 +- 7 14 +:_p5_1 44p8/res_sub0_part5_pass1.vqd, 1, nonseq cull, 0 +- 1 2 3 + +:_p6_0 44p8/res_sub0_part6_pass0.vqd, 5, nonseq cull, 0 +- 21 +:_p6_1 44p8/res_sub0_part6_pass1.vqd, 5, nonseq cull, 0 +- 7 +# reuse p5_1 :_p6_2 44p3/res_sub0_part6_pass2.vqd, 1, nonseq cull, 0 +- 1 2 3 + +:_p7_0 44p8/res_sub0_part7_pass0.vqd, 5, nonseq, 0 +- 3125 +:_p7_1 44p8/res_sub0_part7_pass1.vqd, 5, nonseq, 0 +- 625 1250 +:_p7_2 44p8/res_sub0_part7_pass2.vqd, 1, nonseq, 0 +- 25 50 75 100 125 150 175 200 225 250 275 300 +:_p7_3 44p8/res_sub0_part7_pass3.vqd, 1, nonseq, 0 +- 1 2 3 4 5 6 7 8 9 10 11 12 + +# 32 + +# 0 0 +# +# 0 1 +# 1 . . +# 2 . . +# 4 . + +:_l0_0 44p8/res_sub1_part0_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_l0_1 44p8/res_sub1_part0_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_l1_0 44p8/res_sub1_part1_pass0.vqd, 2, nonseq, 0 +- 625 1350 +# reuse p6_2/3 for l1_2/3 diff --git a/cs/3rd party/libvorbis/vq/44p9.vqs b/cs/3rd party/libvorbis/vq/44p9.vqs new file mode 100644 index 000000000..4c007800e --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44p9.vqs @@ -0,0 +1,52 @@ +GO + +>_44p9 noninterleaved +haux 4pp9/resaux_0.vqd _44p9_short 0,42,2 8 +haux 4pp9/resaux_1.vqd _44p9_long 0,170,2 8 +haux 4pp9/resaux_2.vqd _44p9_lfe 0,2,2 2 + +#iter 0 + +# 0 1 2 4 7 17 31 + +# 1 2 4 7 17 31 + + +# 0 1 2 3 4 5 6 7 +# 1 . . . . . +# 2 . . . . . . +# 4 . . . +# 8 . + +:_p1_0 44p9/res_sub0_part1_pass2.vqd, 5, nonseq cull, 0 +- 1 +:_p2_0 44p9/res_sub0_part2_pass1.vqd, 5, nonseq cull, 0 +- 1 2 + +:_p3_0 44p9/res_sub0_part3_pass0.vqd, 5, nonseq cull, 0 +- 3 +:_p3_1 44p9/res_sub0_part3_pass1.vqd, 5, nonseq cull, 0 +- 1 + +:_p4_0 44p9/res_sub0_part4_pass0.vqd, 5, nonseq cull, 0 +- 5 +:_p4_1 44p9/res_sub0_part4_pass1.vqd, 5, nonseq cull, 0 +- 1 2 + +:_p5_0 44p9/res_sub0_part5_pass0.vqd, 5, nonseq cull, 0 +- 7 14 +:_p5_1 44p9/res_sub0_part5_pass1.vqd, 1, nonseq cull, 0 +- 1 2 3 + +:_p6_0 44p9/res_sub0_part6_pass0.vqd, 5, nonseq cull, 0 +- 21 +:_p6_1 44p9/res_sub0_part6_pass1.vqd, 5, nonseq cull, 0 +- 7 +# reuse p5_1 :_p6_2 44p3/res_sub0_part6_pass2.vqd, 1, nonseq cull, 0 +- 1 2 3 + +:_p7_0 44p9/res_sub0_part7_pass0.vqd, 5, nonseq, 0 +- 3125 6250 +:_p7_1 44p9/res_sub0_part7_pass1.vqd, 5, nonseq, 0 +- 625 1250 +:_p7_2 44p9/res_sub0_part7_pass2.vqd, 1, nonseq, 0 +- 25 50 75 100 125 150 175 200 225 250 275 300 +:_p7_3 44p9/res_sub0_part7_pass3.vqd, 1, nonseq, 0 +- 1 2 3 4 5 6 7 8 9 10 11 12 + +# 32 + +# 0 0 +# +# 0 1 +# 1 . . +# 2 . . +# 4 . + +:_l0_0 44p9/res_sub1_part0_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_l0_1 44p9/res_sub1_part0_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_l1_0 44p9/res_sub1_part1_pass0.vqd, 2, nonseq, 0 +- 625 1250 +# reuse p6_2/3 for l1_2/3 diff --git a/cs/3rd party/libvorbis/vq/44u0.vqs b/cs/3rd party/libvorbis/vq/44u0.vqs new file mode 100644 index 000000000..5bc3f60c8 --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44u0.vqs @@ -0,0 +1,33 @@ +GO + +>_44u0_ noninterleaved +haux 44u0/resaux_0.vqd _44u0__short 0,16,2 8 + +>_44u0_ noninterleaved +haux 44u0/resaux_1.vqd _44u0__long 0,64,2 8 + +#iter 0 + + + +# 0 1 1 2 2 4 32 + +# 25 0 45 0 0 0 0 +# +# 0 1 2 3 4 5 6 7 +# 1 . . +# 2 . . +# 4 . . . . . . + +:_p1_0 44u0/res_part1_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p2_0 44u0/res_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p3_0 44u0/res_part3_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p4_0 44u0/res_part4_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p5_0 44u0/res_part5_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 + +:_p6_0 44u0/res_part6_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_p6_1 44u0/res_part6_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_p7_0 44u0/res_part7_pass0.vqd, 4, nonseq, 0 +- 169 338 +:_p7_1 44u0/res_part7_pass1.vqd, 2, nonseq, 0 +- 13 26 39 52 65 78 +:_p7_2 44u0/res_part7_pass2.vqd, 2, nonseq, 0 +- 1 2 3 4 5 6 + diff --git a/cs/3rd party/libvorbis/vq/44u1.vqs b/cs/3rd party/libvorbis/vq/44u1.vqs new file mode 100644 index 000000000..ed19dc6ce --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44u1.vqs @@ -0,0 +1,33 @@ +GO + +>_44u1_ noninterleaved +haux 44u1/resaux_0.vqd _44u1__short 0,16,2 8 + +>_44u1_ noninterleaved +haux 44u1/resaux_1.vqd _44u1__long 0,64,2 8 + +#iter 0 + + + +# 0 1 1 2 2 4 32 + +# 25 0 45 0 0 0 0 +# +# 0 1 2 3 4 5 6 7 +# 1 . . +# 2 . . +# 4 . . . . . . + +:_p1_0 44u1/res_part1_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p2_0 44u1/res_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p3_0 44u1/res_part3_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p4_0 44u1/res_part4_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p5_0 44u1/res_part5_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 + +:_p6_0 44u1/res_part6_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_p6_1 44u1/res_part6_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_p7_0 44u1/res_part7_pass0.vqd, 2, nonseq, 0 +- 169 338 507 +:_p7_1 44u1/res_part7_pass1.vqd, 2, nonseq, 0 +- 13 26 39 52 65 78 +:_p7_2 44u1/res_part7_pass2.vqd, 2, nonseq, 0 +- 1 2 3 4 5 6 + diff --git a/cs/3rd party/libvorbis/vq/44u2.vqs b/cs/3rd party/libvorbis/vq/44u2.vqs new file mode 100644 index 000000000..314461e4a --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44u2.vqs @@ -0,0 +1,32 @@ +GO + +>_44u2_ noninterleaved +haux 44u2/resaux_0.vqd _44u2__short 0,16,2 8 + +>_44u2_ noninterleaved +haux 44u2/resaux_1.vqd _44u2__long 0,64,2 8 + +#iter 0 + + + +# 0 1 1 2 2 4 32 + +# 25 0 45 0 0 0 0 +# +# 0 1 2 3 4 5 6 7 +# 1 . . +# 2 . . +# 4 . . . . . . + +:_p1_0 44u2/res_part1_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p2_0 44u2/res_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p3_0 44u2/res_part3_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p4_0 44u2/res_part4_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p5_0 44u2/res_part5_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 + +:_p6_0 44u2/res_part6_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_p6_1 44u2/res_part6_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_p7_0 44u2/res_part7_pass0.vqd, 2, nonseq, 0 +- 169 338 507 676 +:_p7_1 44u2/res_part7_pass1.vqd, 2, nonseq, 0 +- 13 26 39 52 65 78 +:_p7_2 44u2/res_part7_pass2.vqd, 2, nonseq, 0 +- 1 2 3 4 5 6 diff --git a/cs/3rd party/libvorbis/vq/44u3.vqs b/cs/3rd party/libvorbis/vq/44u3.vqs new file mode 100644 index 000000000..c882109d4 --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44u3.vqs @@ -0,0 +1,33 @@ + +GO + +>_44u3_ noninterleaved +haux 44u3/resaux_0.vqd _44u3__short 0,16,2 8 + +>_44u3_ noninterleaved +haux 44u3/resaux_1.vqd _44u3__long 0,64,2 8 + +#iter 0 + + + +# 0 1 1 2 2 4 32 + +# 25 0 45 0 0 0 0 +# +# 0 1 2 3 4 5 6 7 +# 1 . . +# 2 . . +# 4 . . . . . . + +:_p1_0 44u3/res_part1_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p2_0 44u3/res_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p3_0 44u3/res_part3_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p4_0 44u3/res_part4_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p5_0 44u3/res_part5_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 + +:_p6_0 44u3/res_part6_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_p6_1 44u3/res_part6_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_p7_0 44u3/res_part7_pass0.vqd, 2, nonseq, 0 +- 255 510 765 1020 +:_p7_1 44u3/res_part7_pass1.vqd, 2, nonseq, 0 +- 17 34 51 68 85 102 119 +:_p7_2 44u3/res_part7_pass2.vqd, 2, nonseq, 0 +- 1 2 3 4 5 6 7 8 diff --git a/cs/3rd party/libvorbis/vq/44u4.vqs b/cs/3rd party/libvorbis/vq/44u4.vqs new file mode 100644 index 000000000..cb4d9baea --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44u4.vqs @@ -0,0 +1,33 @@ + +GO + +>_44u4_ noninterleaved +haux 44u4/resaux_0.vqd _44u4__short 0,16,2 8 + +>_44u4_ noninterleaved +haux 44u4/resaux_1.vqd _44u4__long 0,64,2 8 + +#iter 0 + + + +# 0 1 1 2 2 4 32 + +# 25 0 45 0 0 0 0 +# +# 0 1 2 3 4 5 6 7 +# 1 . . +# 2 . . +# 4 . . . . . . + +:_p1_0 44u4/res_part1_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p2_0 44u4/res_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p3_0 44u4/res_part3_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p4_0 44u4/res_part4_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p5_0 44u4/res_part5_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 + +:_p6_0 44u4/res_part6_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_p6_1 44u4/res_part6_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_p7_0 44u4/res_part7_pass0.vqd, 2, nonseq, 0 +- 255 510 765 1020 1275 1530 +:_p7_1 44u4/res_part7_pass1.vqd, 2, nonseq, 0 +- 17 34 51 68 85 102 119 +:_p7_2 44u4/res_part7_pass2.vqd, 2, nonseq, 0 +- 1 2 3 4 5 6 7 8 diff --git a/cs/3rd party/libvorbis/vq/44u5.vqs b/cs/3rd party/libvorbis/vq/44u5.vqs new file mode 100644 index 000000000..a3c175d94 --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44u5.vqs @@ -0,0 +1,35 @@ + +GO + +>_44u5_ noninterleaved +haux 44u5/resaux_0.vqd _44u5__short 0,16,2 10 + +>_44u5_ noninterleaved +haux 44u5/resaux_1.vqd _44u5__long 0,64,2 10 + +#iter 0 + +# 0 1 1 2 2 4 4 16 60 + +# 30 0 50 0 80 0 0 0 +# +# 0 1 2 3 4 5 6 7 8 9 +# 1 . . . +# 2 . . . +# 4 . . . . . . . + +:_p1_0 44u5/res_part1_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p2_0 44u5/res_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p3_0 44u5/res_part3_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p4_0 44u5/res_part4_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p5_0 44u5/res_part5_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p6_0 44u5/res_part6_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 + +:_p7_0 44u5/res_part7_pass0.vqd, 4, nonseq, 0 +- 11 +:_p7_1 44u5/res_part7_pass1.vqd, 2, nonseq, 0 +- 1 2 3 4 5 + +:_p8_0 44u5/res_part8_pass0.vqd, 2, nonseq, 0 +- 11 22 33 44 55 +:_p8_1 44u5/res_part8_pass1.vqd, 2, nonseq, 0 +- 1 2 3 4 5 + +:_p9_0 44u5/res_part9_pass0.vqd, 2, nonseq, 0 +- 255 510 765 1020 1275 1530 +:_p9_1 44u5/res_part9_pass1.vqd, 2, nonseq, 0 +- 17 34 51 68 85 102 119 +:_p9_2 44u5/res_part9_pass2.vqd, 2, nonseq, 0 +- 1 2 3 4 5 6 7 8 diff --git a/cs/3rd party/libvorbis/vq/44u6.vqs b/cs/3rd party/libvorbis/vq/44u6.vqs new file mode 100644 index 000000000..ca8b7b124 --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44u6.vqs @@ -0,0 +1,35 @@ + +GO + +>_44u6_ noninterleaved +haux 44u6/resaux_0.vqd _44u6__short 0,16,2 10 + +>_44u6_ noninterleaved +haux 44u6/resaux_1.vqd _44u6__long 0,64,2 10 + +#iter 0 + +# 0 1 1 2 2 4 4 16 60 + +# 30 0 50 0 80 0 0 0 +# +# 0 1 2 3 4 5 6 7 8 9 +# 1 . . . +# 2 . . . +# 4 . . . . . . . + +:_p1_0 44u6/res_part1_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p2_0 44u6/res_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p3_0 44u6/res_part3_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p4_0 44u6/res_part4_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p5_0 44u6/res_part5_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p6_0 44u6/res_part6_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 + +:_p7_0 44u6/res_part7_pass0.vqd, 4, nonseq, 0 +- 11 +:_p7_1 44u6/res_part7_pass1.vqd, 2, nonseq, 0 +- 1 2 3 4 5 + +:_p8_0 44u6/res_part8_pass0.vqd, 2, nonseq, 0 +- 11 22 33 44 55 +:_p8_1 44u6/res_part8_pass1.vqd, 2, nonseq, 0 +- 1 2 3 4 5 + +:_p9_0 44u6/res_part9_pass0.vqd, 2, nonseq, 0 +- 255 510 765 1020 1275 1530 1785 +:_p9_1 44u6/res_part9_pass1.vqd, 2, nonseq, 0 +- 17 34 51 68 85 102 119 +:_p9_2 44u6/res_part9_pass2.vqd, 2, nonseq, 0 +- 1 2 3 4 5 6 7 8 diff --git a/cs/3rd party/libvorbis/vq/44u7.vqs b/cs/3rd party/libvorbis/vq/44u7.vqs new file mode 100644 index 000000000..2efe5aa90 --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44u7.vqs @@ -0,0 +1,34 @@ +GO + +>_44u7_ noninterleaved +haux 44u7/resaux_0.vqd _44u7__short 0,16,2 10 + +>_44u7_ noninterleaved +haux 44u7/resaux_1.vqd _44u7__long 0,64,2 10 + +#iter 0 + +# 0 1 1 2 2 4 4 16 60 + +# 30 0 50 0 80 0 0 0 +# +# 0 1 2 3 4 5 6 7 8 9 +# 1 . . . +# 2 . . . +# 4 . . . . . . . + +:_p1_0 44u7/res_part1_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p2_0 44u7/res_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p3_0 44u7/res_part3_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p4_0 44u7/res_part4_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p5_0 44u7/res_part5_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p6_0 44u7/res_part6_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 + +:_p7_0 44u7/res_part7_pass0.vqd, 4, nonseq, 0 +- 11 +:_p7_1 44u7/res_part7_pass1.vqd, 2, nonseq, 0 +- 1 2 3 4 5 + +:_p8_0 44u7/res_part8_pass0.vqd, 2, nonseq, 0 +- 11 22 33 44 55 +:_p8_1 44u7/res_part8_pass1.vqd, 2, nonseq, 0 +- 1 2 3 4 5 + +:_p9_0 44u7/res_part9_pass0.vqd, 2, nonseq, 0 +- 637 1274 1911 2548 3185 +:_p9_1 44u7/res_part9_pass1.vqd, 2, nonseq, 0 +- 49 98 147 196 245 294 +:_p9_2 44u7/res_part9_pass2.vqd, 1, nonseq, 0 +- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 diff --git a/cs/3rd party/libvorbis/vq/44u8.vqs b/cs/3rd party/libvorbis/vq/44u8.vqs new file mode 100644 index 000000000..ecedb09a8 --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44u8.vqs @@ -0,0 +1,35 @@ +GO + +>_44u8s noninterleaved +haux 44u8/resaux_0.vqd _44u8__short 0,16,2 10 + +>_44u8 noninterleaved +haux 44u8/resaux_1.vqd _44u8__long 0,64,2 10 + + +# 0 1 2 4 8 16 32 71 157 + +# 0 1 2 3 4 5 6 7 8 9 +# 1 . . . . . +# 2 . . . . . +# 4 . . . . . + +:_p1_0 44u8/res_part1_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p2_0 44u8/res_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p3_0 44u8/res_part3_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p4_0 44u8/res_part4_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 6 7 8 + +:_p5_0 44u8/res_part5_pass0.vqd, 4, nonseq cull, 0 +- 11 +:_p5_1 44u8/res_part5_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 + +:_p6_0 44u8/res_part6_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_p6_1 44u8/res_part6_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_p7_0 44u8/res_part7_pass0.vqd, 2, nonseq, 0 +- 11 22 33 44 55 66 +:_p7_1 44u8/res_part7_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 + +:_p8_0 44u8/res_part8_pass0.vqd, 2, nonseq, 0 +- 21 42 63 84 105 126 147 +:_p8_1 44u8/res_part8_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 6 7 8 9 10 + +:_p9_0 44u8/res_part9_pass0.vqd, 2, nonseq, 0 +- 931 1862 2793 3724 +:_p9_1 44u8/res_part9_pass1.vqd, 2, nonseq, 0 +- 49 98 147 196 245 294 343 392 441 +:_p9_2 44u8/res_part9_pass2.vqd, 1, nonseq, 0 +- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 diff --git a/cs/3rd party/libvorbis/vq/44u9.vqs b/cs/3rd party/libvorbis/vq/44u9.vqs new file mode 100644 index 000000000..42a3877bf --- /dev/null +++ b/cs/3rd party/libvorbis/vq/44u9.vqs @@ -0,0 +1,36 @@ + +GO + +>_44u9s noninterleaved +haux 44u9/resaux_0.vqd _44u9__short 0,16,2 10 + +>_44u9 noninterleaved +haux 44u9/resaux_1.vqd _44u9__long 0,64,2 10 + + +# 0 1 2 4 8 16 32 71 157 + +# 0 1 2 3 4 5 6 7 8 9 +# 1 . . . . . +# 2 . . . . . +# 4 . . . . . + +:_p1_0 44u9/res_part1_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p2_0 44u9/res_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p3_0 44u9/res_part3_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p4_0 44u9/res_part4_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 6 7 8 + +:_p5_0 44u9/res_part5_pass0.vqd, 4, nonseq cull, 0 +- 11 +:_p5_1 44u9/res_part5_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 + +:_p6_0 44u9/res_part6_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_p6_1 44u9/res_part6_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_p7_0 44u9/res_part7_pass0.vqd, 2, nonseq, 0 +- 11 22 33 44 55 66 +:_p7_1 44u9/res_part7_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 + +:_p8_0 44u9/res_part8_pass0.vqd, 2, nonseq, 0 +- 21 42 63 84 105 126 147 +:_p8_1 44u9/res_part8_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 6 7 8 9 10 + +:_p9_0 44u9/res_part9_pass0.vqd, 2, nonseq, 0 +- 931 1862 2793 3724 4655 5586 6517 +:_p9_1 44u9/res_part9_pass1.vqd, 2, nonseq, 0 +- 49 98 147 196 245 294 343 392 441 +:_p9_2 44u9/res_part9_pass2.vqd, 1, nonseq, 0 +- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 diff --git a/cs/3rd party/libvorbis/vq/8.vqs b/cs/3rd party/libvorbis/vq/8.vqs new file mode 100644 index 000000000..517a589e4 --- /dev/null +++ b/cs/3rd party/libvorbis/vq/8.vqs @@ -0,0 +1,43 @@ +GO + +>_8c0_s noninterleaved +haux 8c0_s/resaux_0.vqd _8c0_s_single 0,64,2 10 + +:_p1_0 8c0_s/res_part1_pass2.vqd, 8, nonseq cull, 0 +- 1 +:_p2_0 8c0_s/res_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p3_0 8c0_s/res_part3_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p4_0 8c0_s/res_part4_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p5_0 8c0_s/res_part5_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p6_0 8c0_s/res_part6_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 6 7 8 + + +:_p7_0 8c0_s/res_part7_pass0.vqd, 4, nonseq cull, 0 +- 11 +:_p7_1 8c0_s/res_part7_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 + +:_p8_0 8c0_s/res_part8_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_p8_1 8c0_s/res_part8_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_p9_0 8c0_s/res_part9_pass0.vqd, 4, nonseq, 0 +- 315 +:_p9_1 8c0_s/res_part9_pass1.vqd, 2, nonseq, 0 +- 21 42 63 84 105 126 147 +:_p9_2 8c0_s/res_part9_pass2.vqd, 2, nonseq, 0 +- 1 2 3 4 5 6 7 8 9 10 + +>_8c1_s noninterleaved +haux 8c1_s/resaux_0.vqd _8c1_s_single 0,64,2 10 + +:_p1_0 8c1_s/res_part1_pass2.vqd, 8, nonseq cull, 0 +- 1 +:_p2_0 8c1_s/res_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p3_0 8c1_s/res_part3_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p4_0 8c1_s/res_part4_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p5_0 8c1_s/res_part5_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p6_0 8c1_s/res_part6_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 6 7 8 + + +:_p7_0 8c1_s/res_part7_pass0.vqd, 4, nonseq cull, 0 +- 11 +:_p7_1 8c1_s/res_part7_pass1.vqd, 2, nonseq cull, 0 +- 1 2 3 4 5 + +:_p8_0 8c1_s/res_part8_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_p8_1 8c1_s/res_part8_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_p9_0 8c1_s/res_part9_pass0.vqd, 2, nonseq, 0 +- 315 630 945 1260 1575 1890 +:_p9_1 8c1_s/res_part9_pass1.vqd, 2, nonseq, 0 +- 21 42 63 84 105 126 147 +:_p9_2 8c1_s/res_part9_pass2.vqd, 2, nonseq, 0 +- 1 2 3 4 5 6 7 8 9 10 diff --git a/cs/3rd party/libvorbis/vq/8u.vqs b/cs/3rd party/libvorbis/vq/8u.vqs new file mode 100644 index 000000000..0ed0ec8b8 --- /dev/null +++ b/cs/3rd party/libvorbis/vq/8u.vqs @@ -0,0 +1,41 @@ + +GO + +>_8u0_ noninterleaved +haux 8u0/resaux_0.vqd _8u0__single 0,64,2 8 + + +:_p1_0 8u0/res_part1_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p2_0 8u0/res_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p3_0 8u0/res_part3_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p4_0 8u0/res_part4_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p5_0 8u0/res_part5_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 + +:_p6_0 8u0/res_part6_pass0.vqd, 2, nonseq cull, 0 +- 5 10 15 20 25 30 +:_p6_1 8u0/res_part6_pass1.vqd, 2, nonseq cull, 0 +- 1 2 + +:_p7_0 8u0/res_part7_pass0.vqd, 4, nonseq, 0 +- 315 +:_p7_1 8u0/res_part7_pass1.vqd, 2, nonseq, 0 +- 21 42 63 84 105 126 147 +:_p7_2 8u0/res_part7_pass2.vqd, 2, nonseq, 0 +- 1 2 3 4 5 6 7 8 9 10 + + +>_8u1_ noninterleaved +haux 8u1/resaux_0.vqd _8u1__single 0,64,2 10 + +:_p1_0 8u1/res_part1_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p2_0 8u1/res_part2_pass2.vqd, 4, nonseq cull, 0 +- 1 +:_p3_0 8u1/res_part3_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p4_0 8u1/res_part4_pass2.vqd, 4, nonseq cull, 0 +- 1 2 +:_p5_0 8u1/res_part5_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 +:_p6_0 8u1/res_part6_pass2.vqd, 2, nonseq cull, 0 +- 1 2 3 4 + +:_p7_0 8u1/res_part7_pass0.vqd, 4, nonseq, 0 +- 11 +:_p7_1 8u1/res_part7_pass1.vqd, 2, nonseq, 0 +- 1 2 3 4 5 + +:_p8_0 8u1/res_part8_pass0.vqd, 2, nonseq, 0 +- 11 22 33 44 55 +:_p8_1 8u1/res_part8_pass1.vqd, 2, nonseq, 0 +- 1 2 3 4 5 + +:_p9_0 8u1/res_part9_pass0.vqd, 2, nonseq, 0 +- 255 510 765 1020 1275 1530 1785 +:_p9_1 8u1/res_part9_pass1.vqd, 2, nonseq, 0 +- 17 34 51 68 85 102 119 +:_p9_2 8u1/res_part9_pass2.vqd, 2, nonseq, 0 +- 1 2 3 4 5 6 7 8 + diff --git a/cs/3rd party/libvorbis/vq/Makefile.am b/cs/3rd party/libvorbis/vq/Makefile.am new file mode 100644 index 000000000..e9c272e0c --- /dev/null +++ b/cs/3rd party/libvorbis/vq/Makefile.am @@ -0,0 +1,36 @@ +## Process this file with automake to produce Makefile.in + +EXTRA_PROGRAMS = latticebuild latticetune huffbuild distribution +CLEANFILES = $(EXTRA_PROGRAMS) + +AM_CPPFLAGS = -I../lib -I$(top_srcdir)/include @OGG_CFLAGS@ +AM_LDFLAGS = -static +LDADD = ../lib/libvorbis.la + +latticebuild_SOURCES = latticebuild.c vqgen.c bookutil.c\ + vqgen.h bookutil.h localcodebook.h +latticetune_SOURCES = latticetune.c vqgen.c bookutil.c\ + vqgen.h bookutil.h localcodebook.h +huffbuild_SOURCES = huffbuild.c vqgen.c bookutil.c\ + vqgen.h bookutil.h localcodebook.h +distribution_SOURCES = distribution.c bookutil.c\ + bookutil.h localcodebook.h + +vqs_files = 16.vqs 16u.vqs 44c-1.vqs 44c0.vqs 44c1.vqs 44c2.vqs \ + 44c3.vqs 44c4.vqs 44c5.vqs 44c6.vqs 44c7.vqs 44c8.vqs 44c9.vqs \ + 44u0.vqs 44u1.vqs 44u2.vqs 44u3.vqs 44u4.vqs 44u5.vqs 44u6.vqs \ + 44u7.vqs 44u8.vqs 44u9.vqs 8.vqs 8u.vqs floor_11.vqs floor_22.vqs \ + floor_44.vqs 44p-1.vqs 44p0.vqs 44p1.vqs 44p2.vqs 44p3.vqs 44p4.vqs \ + 44p5.vqs 44p6.vqs 44p7.vqs 44p8.vqs 44p9.vqs + +EXTRA_DIST = $(vqs_files) make_floor_books.pl make_residue_books.pl \ + metrics.c + +debugvq: + $(MAKE) vq CFLAGS="@DEBUG@" + +profilevq: + $(MAKE) vq CFLAGS="@PROFILE@" + +vq: + $(MAKE) $(EXTRA_PROGRAMS) diff --git a/cs/3rd party/libvorbis/vq/bookutil.c b/cs/3rd party/libvorbis/vq/bookutil.c new file mode 100644 index 000000000..58d78beeb --- /dev/null +++ b/cs/3rd party/libvorbis/vq/bookutil.c @@ -0,0 +1,477 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE 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 SOURCE CODE IS (C) COPYRIGHT 1994-2014 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: utility functions for loading .vqh and .vqd files + last mod: $Id$ + + ********************************************************************/ + +#include +#include +#include +#include +#include +#include "bookutil.h" + +int _best(codebook *book, float *a, int step){ + + int dim=book->dim; + int i,j,o; + int minval=book->minval; + int del=book->delta; + int qv=book->quantvals; + int ze=(qv>>1); + int index=0; + /* assumes integer/centered encoder codebook maptype 1 no more than dim 8 */ + + if(del!=1){ + for(i=0,o=step*(dim-1);i>1))/del; + int m = (v=qv?qv-1:m)); + } + }else{ + for(i=0,o=step*(dim-1);i=qv?qv-1:m)); + } + } + + if(book->c->lengthlist[index]<=0){ + const static_codebook *c=book->c; + int best=-1; + /* assumes integer/centered encoder codebook maptype 1 no more than dim 8 */ + int e[8]={0,0,0,0,0,0,0,0}; + int maxval = book->minval + book->delta*(book->quantvals-1); + for(i=0;ientries;i++){ + if(c->lengthlist[i]>0){ + float this=0; + for(j=0;j=maxval) + e[j++]=0; + if(e[j]>=0) + e[j]+=book->delta; + e[j]= -e[j]; + } + } + + return index; +} + +/* A few little utils for reading files */ +/* read a line. Use global, persistent buffering */ +static char *linebuffer=NULL; +static int lbufsize=0; +char *get_line(FILE *in){ + long sofar=0; + if(feof(in))return NULL; + + while(1){ + int gotline=0; + + while(!gotline){ + if(sofar+1>=lbufsize){ + if(!lbufsize){ + lbufsize=1024; + linebuffer=_ogg_malloc(lbufsize); + }else{ + lbufsize*=2; + linebuffer=_ogg_realloc(linebuffer,lbufsize); + } + } + { + long c=fgetc(in); + switch(c){ + case EOF: + if(sofar==0)return(NULL); + /* fallthrough correct */ + case '\n': + linebuffer[sofar]='\0'; + gotline=1; + break; + default: + linebuffer[sofar++]=c; + linebuffer[sofar]='\0'; + break; + } + } + } + + if(linebuffer[0]=='#'){ + sofar=0; + }else{ + return(linebuffer); + } + } +} + +/* read the next numerical value from the given file */ +static char *value_line_buff=NULL; + +int get_line_value(FILE *in,float *value){ + char *next; + + if(!value_line_buff)return(-1); + + *value=strtod(value_line_buff, &next); + if(next==value_line_buff){ + value_line_buff=NULL; + return(-1); + }else{ + value_line_buff=next; + while(*value_line_buff>44)value_line_buff++; + if(*value_line_buff==44)value_line_buff++; + return(0); + } +} + +int get_next_value(FILE *in,float *value){ + while(1){ + if(get_line_value(in,value)){ + value_line_buff=get_line(in); + if(!value_line_buff)return(-1); + }else{ + return(0); + } + } +} + +int get_next_ivalue(FILE *in,long *ivalue){ + float value; + int ret=get_next_value(in,&value); + *ivalue=value; + return(ret); +} + +static float sequence_base=0.f; +static int v_sofar=0; +void reset_next_value(void){ + value_line_buff=NULL; + sequence_base=0.f; + v_sofar=0; +} + +char *setup_line(FILE *in){ + reset_next_value(); + value_line_buff=get_line(in); + return(value_line_buff); +} + + +int get_vector(codebook *b,FILE *in,int start, int n,float *a){ + int i; + const static_codebook *c=b->c; + + while(1){ + + if(v_sofar==n || get_line_value(in,a)){ + reset_next_value(); + if(get_next_value(in,a)) + break; + for(i=0;idim;i++) + if(get_line_value(in,a+i)) + break; + + if(i==c->dim){ + float temp=a[c->dim-1]; + for(i=0;idim;i++)a[i]-=sequence_base; + if(c->q_sequencep)sequence_base=temp; + v_sofar++; + return(0); + } + sequence_base=0.f; + } + + return(-1); +} + +/* read lines fromt he beginning until we find one containing the + specified string */ +char *find_seek_to(FILE *in,char *s){ + rewind(in); + while(1){ + char *line=get_line(in); + if(line){ + if(strstr(line,s)) + return(line); + }else + return(NULL); + } +} + + +/* this reads the format as written by vqbuild/latticebuild; innocent + (legal) tweaking of the file that would not affect its valid + header-ness will break this routine */ + +codebook *codebook_load(char *filename){ + codebook *b=_ogg_calloc(1,sizeof(codebook)); + static_codebook *c=(static_codebook *)(b->c=_ogg_calloc(1,sizeof(static_codebook))); + int quant_to_read=0; + FILE *in=fopen(filename,"r"); + char *line; + long i; + + if(in==NULL){ + fprintf(stderr,"Couldn't open codebook %s\n",filename); + exit(1); + } + + /* find the codebook struct */ + find_seek_to(in,"static const static_codebook "); + + /* get the major important values */ + line=get_line(in); + if(sscanf(line,"%ld, %ld,", + &(c->dim),&(c->entries))!=2){ + fprintf(stderr,"1: syntax in %s in line:\t %s",filename,line); + exit(1); + } + line=get_line(in); + line=get_line(in); + if(sscanf(line,"%d, %ld, %ld, %d, %d,", + &(c->maptype),&(c->q_min),&(c->q_delta),&(c->q_quant), + &(c->q_sequencep))!=5){ + fprintf(stderr,"1: syntax in %s in line:\t %s",filename,line); + exit(1); + } + + switch(c->maptype){ + case 0: + quant_to_read=0; + break; + case 1: + quant_to_read=_book_maptype1_quantvals(c); + break; + case 2: + quant_to_read=c->entries*c->dim; + break; + } + + /* load the quantized entries */ + find_seek_to(in,"static const long _vq_quantlist_"); + reset_next_value(); + c->quantlist=_ogg_malloc(sizeof(long)*quant_to_read); + for(i=0;iquantlist+i)){ + fprintf(stderr,"out of data while reading codebook %s\n",filename); + exit(1); + } + + /* load the lengthlist */ + find_seek_to(in,"_lengthlist"); + reset_next_value(); + c->lengthlist=_ogg_malloc(sizeof(long)*c->entries); + for(i=0;ientries;i++) + if(get_next_ivalue(in,c->lengthlist+i)){ + fprintf(stderr,"out of data while reading codebook %s\n",filename); + exit(1); + } + + /* got it all */ + fclose(in); + + vorbis_book_init_encode(b,c); + b->valuelist=_book_unquantize(c,c->entries,NULL); + + return(b); +} + +void spinnit(char *s,int n){ + static int p=0; + static long lasttime=0; + long test; + struct timeval thistime; + + gettimeofday(&thistime,NULL); + test=thistime.tv_sec*10+thistime.tv_usec/100000; + if(lasttime!=test){ + lasttime=test; + + fprintf(stderr,"%s%d ",s,n); + + p++;if(p>3)p=0; + switch(p){ + case 0: + fprintf(stderr,"| \r"); + break; + case 1: + fprintf(stderr,"/ \r"); + break; + case 2: + fprintf(stderr,"- \r"); + break; + case 3: + fprintf(stderr,"\\ \r"); + break; + } + fflush(stderr); + } +} + +void build_tree_from_lengths(int vals, long *hist, long *lengths){ + int i,j; + long *membership=_ogg_malloc(vals*sizeof(long)); + long *histsave=alloca(vals*sizeof(long)); + memcpy(histsave,hist,vals*sizeof(long)); + + for(i=0;i1;i--){ + int first=-1,second=-1; + long least=-1; + + spinnit("building... ",i); + + /* find the two nodes to join */ + for(j=0;j0) + newhist[upper++]=hist[i]; + + if(upper != vals){ + fprintf(stderr,"\rEliminating %d unused entries; %d entries remain\n", + vals-upper,upper); + } + + build_tree_from_lengths(upper,newhist,lengthlist); + + upper=0; + for(i=0;i0) + lengths[i]=lengthlist[upper++]; + else + lengths[i]=0; + + free(lengthlist); +} + +void write_codebook(FILE *out,char *name,const static_codebook *c){ + int i,j,k; + + /* save the book in C header form */ + + /* first, the static vectors, then the book structure to tie it together. */ + /* quantlist */ + if(c->quantlist){ + long vals=(c->maptype==1?_book_maptype1_quantvals(c):c->entries*c->dim); + fprintf(out,"static const long _vq_quantlist_%s[] = {\n",name); + for(j=0;jquantlist[j]); + } + fprintf(out,"};\n\n"); + } + + /* lengthlist */ + fprintf(out,"static const char _vq_lengthlist_%s[] = {\n",name); + for(j=0;jentries;){ + fprintf(out,"\t"); + for(k=0;k<16 && jentries;k++,j++) + fprintf(out,"%2ld,",c->lengthlist[j]); + fprintf(out,"\n"); + } + fprintf(out,"};\n\n"); + + /* tie it all together */ + + fprintf(out,"static const static_codebook %s = {\n",name); + + fprintf(out,"\t%ld, %ld,\n",c->dim,c->entries); + fprintf(out,"\t(char *)_vq_lengthlist_%s,\n",name); + fprintf(out,"\t%d, %ld, %ld, %d, %d,\n", + c->maptype,c->q_min,c->q_delta,c->q_quant,c->q_sequencep); + if(c->quantlist) + fprintf(out,"\t(long *)_vq_quantlist_%s,\n",name); + else + fprintf(out,"\tNULL,\n"); + + fprintf(out,"\t0\n};\n\n"); +} diff --git a/cs/3rd party/libvorbis/vq/bookutil.h b/cs/3rd party/libvorbis/vq/bookutil.h new file mode 100644 index 000000000..bb77c048a --- /dev/null +++ b/cs/3rd party/libvorbis/vq/bookutil.h @@ -0,0 +1,43 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE 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 SOURCE CODE IS (C) COPYRIGHT 1994-2001 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: utility functions for loading .vqh and .vqd files + last mod: $Id$ + + ********************************************************************/ + +#ifndef _V_BOOKUTIL_H_ +#define _V_BOOKUTIL_H_ + +#include +#include + +#include "localcodebook.h" + +extern char *get_line(FILE *in); +extern char *setup_line(FILE *in); +extern int get_line_value(FILE *in,float *value); +extern int get_next_value(FILE *in,float *value); +extern int get_next_ivalue(FILE *in,long *ivalue); +extern void reset_next_value(void); +extern int get_vector(codebook *b,FILE *in,int start,int num,float *a); +extern char *find_seek_to(FILE *in,char *s); + +extern codebook *codebook_load(char *filename); +extern void write_codebook(FILE *out,char *name,const static_codebook *c); + +extern void spinnit(char *s,int n); +extern void build_tree_from_lengths(int vals, long *hist, long *lengths); +extern void build_tree_from_lengths0(int vals, long *hist, long *lengths); + +#endif + diff --git a/cs/3rd party/libvorbis/vq/distribution.c b/cs/3rd party/libvorbis/vq/distribution.c new file mode 100644 index 000000000..76beee4d2 --- /dev/null +++ b/cs/3rd party/libvorbis/vq/distribution.c @@ -0,0 +1,248 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE 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 SOURCE CODE IS (C) COPYRIGHT 1994-2001 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: utility for finding the distribution in a data set + last mod: $Id$ + + ********************************************************************/ + +#include +#include +#include +#include +#include +#include "bookutil.h" + +/* command line: + distribution file.vqd +*/ + +int ascend(const void *a,const void *b){ + return(**((long **)a)-**((long **)b)); +} + +int main(int argc,char *argv[]){ + FILE *in; + long lines=0; + float min; + float max; + long bins=-1; + int flag=0; + long *countarray; + long total=0; + char *line; + + if(argv[1]==NULL){ + fprintf(stderr,"Usage: distribution {data.vqd [bins]| book.vqh} \n\n"); + exit(1); + } + if(argv[2]!=NULL) + bins=atoi(argv[2])-1; + + in=fopen(argv[1],"r"); + if(!in){ + fprintf(stderr,"Could not open input file %s\n",argv[1]); + exit(1); + } + + if(strrchr(argv[1],'.') && strcmp(strrchr(argv[1],'.'),".vqh")==0){ + /* load/decode a book */ + + codebook *b=codebook_load(argv[1]); + static_codebook *c=(static_codebook *)(b->c); + float delta; + int i; + fclose(in); + + switch(c->maptype){ + case 0: + printf("entropy codebook only; no mappings\n"); + exit(0); + break; + case 1: + bins=_book_maptype1_quantvals(c); + break; + case 2: + bins=c->entries*c->dim; + break; + } + + max=min=_float32_unpack(c->q_min); + delta=_float32_unpack(c->q_delta); + + for(i=0;iquantlist[i]*delta+min; + if(val>max)max=val; + } + + printf("Minimum scalar value: %f\n",min); + printf("Maximum scalar value: %f\n",max); + + switch(c->maptype){ + case 1: + { + /* lattice codebook. dump it. */ + int j,k; + long maxcount=0; + long **sort=calloc(bins,sizeof(long *)); + long base=c->lengthlist[0]; + countarray=calloc(bins,sizeof(long)); + + for(i=0;iquantlist+i; + qsort(sort,bins,sizeof(long *),ascend); + + for(i=0;ientries;i++) + if(c->lengthlist[i]>base)base=c->lengthlist[i]; + + /* dump a full, correlated count */ + for(j=0;jentries;j++){ + if(c->lengthlist[j]){ + int indexdiv=1; + printf("%4d: ",j); + for(k=0;kdim;k++){ + int index= (j/indexdiv)%bins; + printf("%+3.1f,", c->quantlist[index]*_float32_unpack(c->q_delta)+ + _float32_unpack(c->q_min)); + indexdiv*=bins; + } + printf("\t|"); + for(k=0;klengthlist[j];k++)printf("*"); + printf("\n"); + } + } + + /* do a rough count */ + for(j=0;jentries;j++){ + int indexdiv=1; + for(k=0;kdim;k++){ + if(c->lengthlist[j]){ + int index= (j/indexdiv)%bins; + countarray[index]+=(1<<(base-c->lengthlist[j])); + indexdiv*=bins; + } + } + } + + /* dump the count */ + + { + long maxcount=0,i,j; + for(i=0;imaxcount)maxcount=countarray[i]; + + for(i=0;iquantlist; + int stars=rint(50./maxcount*countarray[ptr]); + printf("%+08f (%8ld) |",c->quantlist[ptr]*delta+min,countarray[ptr]); + for(j=0;jmax)max=code; + } + + line=setup_line(in); + } + + if(bins<1){ + if((int)(max-min)==min-max){ + bins=max-min; + }else{ + bins=25; + } + } + + printf("\r \r"); + printf("Minimum scalar value: %f\n",min); + printf("Maximum scalar value: %f\n",max); + + if(argv[2]){ + + printf("\n counting hits into %ld bins...\n",bins+1); + countarray=calloc(bins+1,sizeof(long)); + + rewind(in); + line=setup_line(in); + while(line){ + float code; + lines--; + if(!(lines&0xff))spinnit("counting distribution. lines so far...",lines); + + while(line && sscanf(line,"%f",&code)==1){ + line=strchr(line,','); + if(line)line++; + + code-=min; + code/=(max-min); + code*=bins; + countarray[(int)rint(code)]++; + total++; + } + + line=setup_line(in); + } + + /* make a pretty graph */ + { + long maxcount=0,i,j; + for(i=0;imaxcount)maxcount=countarray[i]; + + printf("\r \r"); + printf("Total scalars: %ld\n",total); + for(i=0;ifloor_11 +=8-11c0_s 8-11c1_s + +build line_256x4_class0 0-256 +build line_256x4_0sub0 0-4 +build line_256x4_0sub1 4-10 +build line_256x4_0sub2 10-25 +build line_256x4_0sub3 25-64 + diff --git a/cs/3rd party/libvorbis/vq/floor_22.vqs b/cs/3rd party/libvorbis/vq/floor_22.vqs new file mode 100644 index 000000000..b80328e9a --- /dev/null +++ b/cs/3rd party/libvorbis/vq/floor_22.vqs @@ -0,0 +1,27 @@ +GO +>floor_22 +=22c0_s 22c1_s 22c2_s + +build line_256x7_class0 0-64 +build line_256x7_class1 0-256 +build line_256x7_0sub1 1-9 +build line_256x7_0sub2 9-25 +build line_256x7_0sub3 25-64 +build line_256x7_1sub1 1-9 +build line_256x7_1sub2 9-25 +build line_256x7_1sub3 25-64 + +build line_512x17_class1 0-8 +build line_512x17_class2 0-64 +build line_512x17_class3 0-64 +build line_512x17_0sub0 0-128 +build line_512x17_1sub0 0-32 +build line_512x17_1sub1 32-128 +build line_512x17_2sub1 1-18 +build line_512x17_2sub2 18-50 +build line_512x17_2sub3 50-128 +build line_512x17_3sub1 1-18 +build line_512x17_3sub2 18-50 +build line_512x17_3sub3 50-128 + + diff --git a/cs/3rd party/libvorbis/vq/floor_44.vqs b/cs/3rd party/libvorbis/vq/floor_44.vqs new file mode 100644 index 000000000..dd213f7b1 --- /dev/null +++ b/cs/3rd party/libvorbis/vq/floor_44.vqs @@ -0,0 +1,83 @@ +GO +>floor_44 +=44c-1_s 44c0_s 44c1_s 44c2_s 44c3_s 44c4_s 44c5_s 44c6_s 44c7_s 44c8_s 44c9_s + +build line_128x4_class0 0-256 +build line_128x4_0sub0 0-4 +build line_128x4_0sub1 4-10 +build line_128x4_0sub2 10-25 +build line_128x4_0sub3 25-64 + +build line_256x4_class0 0-256 +build line_256x4_0sub0 0-4 +build line_256x4_0sub1 4-10 +build line_256x4_0sub2 10-25 +build line_256x4_0sub3 25-64 + +build line_128x7_class0 0-64 +build line_128x7_class1 0-256 +build line_128x7_0sub1 1-9 +build line_128x7_0sub2 9-25 +build line_128x7_0sub3 25-64 +build line_128x7_1sub1 1-9 +build line_128x7_1sub2 9-25 +build line_128x7_1sub3 25-64 + +build line_128x11_class1 0-8 +build line_128x11_class2 0-64 +build line_128x11_class3 0-64 +build line_128x11_0sub0 0-128 +build line_128x11_1sub0 0-32 +build line_128x11_1sub1 32-128 +build line_128x11_2sub1 1-18 +build line_128x11_2sub2 18-50 +build line_128x11_2sub3 50-128 +build line_128x11_3sub1 1-18 +build line_128x11_3sub2 18-50 +build line_128x11_3sub3 50-128 + +build line_128x17_class1 0-8 +build line_128x17_class2 0-64 +build line_128x17_class3 0-64 +build line_128x17_0sub0 0-128 +build line_128x17_1sub0 0-32 +build line_128x17_1sub1 32-128 +build line_128x17_2sub1 1-18 +build line_128x17_2sub2 18-50 +build line_128x17_2sub3 50-128 +build line_128x17_3sub1 1-18 +build line_128x17_3sub2 18-50 +build line_128x17_3sub3 50-128 + +build line_1024x27_class1 0-16 +build line_1024x27_class2 0-8 +build line_1024x27_class3 0-256 +build line_1024x27_class4 0-64 +build line_1024x27_0sub0 0-128 +build line_1024x27_1sub0 0-32 +build line_1024x27_1sub1 32-128 +build line_1024x27_2sub0 0-32 +build line_1024x27_2sub1 32-128 +build line_1024x27_3sub1 1-18 +build line_1024x27_3sub2 18-50 +build line_1024x27_3sub3 50-128 +build line_1024x27_4sub1 1-18 +build line_1024x27_4sub2 18-50 +build line_1024x27_4sub3 50-128 + +build line_2048x27_class1 0-16 +build line_2048x27_class2 0-8 +build line_2048x27_class3 0-256 +build line_2048x27_class4 0-64 +build line_2048x27_0sub0 0-128 +build line_2048x27_1sub0 0-32 +build line_2048x27_1sub1 32-128 +build line_2048x27_2sub0 0-32 +build line_2048x27_2sub1 32-128 +build line_2048x27_3sub1 1-18 +build line_2048x27_3sub2 18-50 +build line_2048x27_3sub3 50-128 +build line_2048x27_4sub1 1-18 +build line_2048x27_4sub2 18-50 +build line_2048x27_4sub3 50-128 + diff --git a/cs/3rd party/libvorbis/vq/huffbuild.c b/cs/3rd party/libvorbis/vq/huffbuild.c new file mode 100644 index 000000000..50880f25a --- /dev/null +++ b/cs/3rd party/libvorbis/vq/huffbuild.c @@ -0,0 +1,198 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE 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 SOURCE CODE IS (C) COPYRIGHT 1994-2014 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: hufftree builder + last mod: $Id$ + + ********************************************************************/ + +#include +#include +#include +#include +#include "bookutil.h" + +static int nsofar=0; +static int getval(FILE *in,int begin,int n,int group,int max){ + float v; + int i; + long val=0; + + if(nsofar>=n || get_line_value(in,&v)){ + reset_next_value(); + nsofar=0; + if(get_next_value(in,&v)) + return(-1); + for(i=1;i<=begin;i++) + get_line_value(in,&v); + } + + val=(int)v; + nsofar++; + + for(i=1;i=n || get_line_value(in,&v)) + return(getval(in,begin,n,group,max)); + else + val = val*max+(int)v; + return(val); +} + +static void usage(){ + fprintf(stderr, + "usage:\n" + "huffbuild .vqd | [noguard]\n" + " where begin,n,group is first scalar, \n" + " number of scalars of each in line,\n" + " number of scalars in a group\n" + "eg: huffbuild reslongaux.vqd 0,1024,4\n" + "produces reslongaux.vqh\n\n"); + exit(1); +} + +int main(int argc, char *argv[]){ + char *base; + char *infile; + int i,j,k,begin,n,subn,guard=1; + FILE *file; + int maxval=0; + int loval=0; + + if(argc<3)usage(); + if(argc==4)guard=0; + + infile=strdup(argv[1]); + base=strdup(infile); + if(strrchr(base,'.')) + strrchr(base,'.')[0]='\0'; + + { + char *pos=strchr(argv[2],','); + char *dpos=strchr(argv[2],'-'); + if(dpos){ + loval=atoi(argv[2]); + maxval=atoi(dpos+1); + subn=1; + begin=0; + }else{ + begin=atoi(argv[2]); + if(!pos) + usage(); + else + n=atoi(pos+1); + pos=strchr(pos+1,','); + if(!pos) + usage(); + else + subn=atoi(pos+1); + if(n/subn*subn != n){ + fprintf(stderr,"n must be divisible by group\n"); + exit(1); + } + } + } + + /* scan the file for maximum value */ + file=fopen(infile,"r"); + if(!file){ + fprintf(stderr,"Could not open file %s\n",infile); + if(!maxval) + exit(1); + else + fprintf(stderr," making untrained books.\n"); + + } + + if(!maxval){ + i=0; + while(1){ + long v; + if(get_next_ivalue(file,&v))break; + if(v>maxval)maxval=v; + + if(!(i++&0xff))spinnit("loading... ",i); + } + rewind(file); + maxval++; + } + + { + long vals=pow(maxval,subn); + long *hist=_ogg_calloc(vals,sizeof(long)); + long *lengths=_ogg_calloc(vals,sizeof(long)); + + for(j=loval;j=vals)break; + hist[val]++; + if(!(i--&0xff))spinnit("loading... ",i*subn); + } + fclose(file); + } + + /* we have the probabilities, build the tree */ + fprintf(stderr,"Building tree for %ld entries\n",vals); + build_tree_from_lengths0(vals,hist,lengths); + + /* save the book */ + { + char *buffer=alloca(strlen(base)+5); + strcpy(buffer,base); + strcat(buffer,".vqh"); + file=fopen(buffer,"w"); + if(!file){ + fprintf(stderr,"Could not open file %s\n",buffer); + exit(1); + } + } + + /* first, the static vectors, then the book structure to tie it together. */ + /* lengthlist */ + fprintf(file,"static const char _huff_lengthlist_%s[] = {\n",base); + for(j=0;j +#include +#include +#include +#include +#include "bookutil.h" + +/* The purpose of this util is just to finish packaging the + description into a static codebook. It used to count hits for a + histogram, but I've divorced that out to add some flexibility (it + currently generates an equal probability codebook) + + command line: + latticebuild description.vql + + the lattice description file contains two lines: + + + ... + + a threshmap (or pigeonmap) struct is generated by latticehint; + there are fun tricks one can do with the threshmap and cascades, + but the utils don't know them... + + entropy encoding is done by feeding an entry list collected from a + training set and feeding it to latticetune along with the book. + + latticebuild produces a codebook on stdout */ + +static int ilog(unsigned int v){ + int ret=0; + while(v){ + ret++; + v>>=1; + } + return(ret); +} + +int main(int argc,char *argv[]){ + codebook b; + static_codebook c; + double *quantlist; + long *hits; + + int entries=-1,dim=-1,quantvals=-1,addmul=-1,sequencep=0; + FILE *in=NULL; + char *line,*name; + long i,j; + + memset(&b,0,sizeof(b)); + memset(&c,0,sizeof(c)); + + if(argv[1]==NULL){ + fprintf(stderr,"Need a lattice description file on the command line.\n"); + exit(1); + } + + { + char *ptr; + char *filename=_ogg_calloc(strlen(argv[1])+4,1); + + strcpy(filename,argv[1]); + in=fopen(filename,"r"); + if(!in){ + fprintf(stderr,"Could not open input file %s\n",filename); + exit(1); + } + + ptr=strrchr(filename,'.'); + if(ptr){ + *ptr='\0'; + name=strdup(filename); + }else{ + name=strdup(filename); + } + + } + + /* read the description */ + line=get_line(in); + if(sscanf(line,"%d %d %d %d",&quantvals,&dim,&addmul,&sequencep)!=4){ + if(sscanf(line,"%d %d %d",&quantvals,&dim,&addmul)!=3){ + fprintf(stderr,"Syntax error reading description file (line 1)\n"); + exit(1); + } + } + entries=pow(quantvals,dim); + c.dim=dim; + c.entries=entries; + c.lengthlist=_ogg_malloc(entries*sizeof(long)); + c.maptype=1; + c.q_sequencep=sequencep; + c.quantlist=_ogg_calloc(quantvals,sizeof(long)); + + quantlist=_ogg_malloc(sizeof(double)*c.dim*c.entries); + hits=_ogg_malloc(c.entries*sizeof(long)); + for(j=0;j.00001f) break; + } + if(fac>100)break; + if(jc.q_quant)c.q_quant=ilog(c.quantlist[j]); + } + } + + /* build the [default] codeword lengths */ + memset(c.lengthlist,0,sizeof(long)*entries); + for(i=0;i +#include +#include +#include +#include +#include "bookutil.h" + +static int strrcmp_i(char *s,char *cmp){ + return(strncmp(s+strlen(s)-strlen(cmp),cmp,strlen(cmp))); +} + +/* This util takes a training-collected file listing codewords used in + LSP fitting, then generates new codeword lengths for maximally + efficient integer-bits entropy encoding. + + command line: + latticetune book.vqh input.vqd [unused_entriesp] + + latticetune produces book.vqh on stdout */ + +int main(int argc,char *argv[]){ + codebook *b; + static_codebook *c; + long *lengths; + long *hits; + + int entries=-1,dim=-1,guard=1; + FILE *in=NULL; + char *line,*name; + long j; + + if(argv[1]==NULL){ + fprintf(stderr,"Need a lattice codebook on the command line.\n"); + exit(1); + } + if(argv[2]==NULL){ + fprintf(stderr,"Need a codeword data file on the command line.\n"); + exit(1); + } + if(argv[3]!=NULL)guard=0; + + { + char *ptr; + char *filename=strdup(argv[1]); + + b=codebook_load(filename); + c=(static_codebook *)(b->c); + + ptr=strrchr(filename,'.'); + if(ptr){ + *ptr='\0'; + name=strdup(filename); + }else{ + name=strdup(filename); + } + } + + if(c->maptype!=1){ + fprintf(stderr,"Provided book is not a latticebook.\n"); + exit(1); + } + + entries=b->entries; + dim=b->dim; + + hits=_ogg_malloc(entries*sizeof(long)); + lengths=_ogg_calloc(entries,sizeof(long)); + for(j=0;jlengthlist=lengths; + write_codebook(stdout,name,c); + + { + long bins=_book_maptype1_quantvals(c); + long i,k,base=c->lengthlist[0]; + for(i=0;ilengthlist[i]>base)base=c->lengthlist[i]; + + for(j=0;jlengthlist[j]){ + int indexdiv=1; + fprintf(stderr,"%4ld: ",j); + for(k=0;kdim;k++){ + int index= (j/indexdiv)%bins; + fprintf(stderr,"%+3.1f,", c->quantlist[index]*_float32_unpack(c->q_delta)+ + _float32_unpack(c->q_min)); + indexdiv*=bins; + } + fprintf(stderr,"\t|"); + for(k=0;klengthlist[j];k++)fprintf(stderr,"*"); + fprintf(stderr,"\n"); + } + } + } + + fprintf(stderr,"\r " + "\nDone.\n"); + exit(0); +} diff --git a/cs/3rd party/libvorbis/vq/localcodebook.h b/cs/3rd party/libvorbis/vq/localcodebook.h new file mode 100644 index 000000000..c95502ad6 --- /dev/null +++ b/cs/3rd party/libvorbis/vq/localcodebook.h @@ -0,0 +1,121 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE 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 SOURCE CODE IS (C) COPYRIGHT 1994-2007 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: basic shared codebook operations + last mod: $Id$ + + ********************************************************************/ + +#ifndef _V_CODEBOOK_H_ +#define _V_CODEBOOK_H_ + +#include + +/* 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 + */ + int allocedp; +} static_codebook; + +typedef struct codebook{ + long dim; /* codebook dimensions (elements per vector) */ + long entries; /* codebook entries */ + long used_entries; /* populated codebook entries */ + static_codebook *c; + + /* for encode, the below are entry-ordered, fully populated */ + /* for decode, the below are ordered by bitreversed codeword and only + used entries are populated */ + float *valuelist; /* list of dim*entries actual entry values */ + ogg_uint32_t *codelist; /* list of bitstream codewords for each entry */ + + int *dec_index; /* only used if sparseness collapsed */ + char *dec_codelengths; + ogg_uint32_t *dec_firsttable; + int dec_firsttablen; + int dec_maxlength; + + /* The current encoder uses only centered, integer-only lattice books. */ + int quantvals; + int minval; + int delta; + +} codebook; + +extern void vorbis_staticbook_clear(static_codebook *b); +extern void vorbis_staticbook_destroy(static_codebook *b); +extern int vorbis_book_init_encode(codebook *dest,const static_codebook *source); +extern int vorbis_book_init_decode(codebook *dest,const static_codebook *source); +extern void vorbis_book_clear(codebook *b); + +extern float *_book_unquantize(const static_codebook *b,int n,int *map); +extern float *_book_logdist(const static_codebook *b,float *vals); +extern float _float32_unpack(long val); +extern long _float32_pack(float val); +extern int _best(codebook *book, float *a, int step); +extern int _ilog(unsigned int v); +extern long _book_maptype1_quantvals(const static_codebook *b); + +extern int vorbis_book_besterror(codebook *book,float *a,int step,int addmul); +extern long vorbis_book_codeword(codebook *book,int entry); +extern long vorbis_book_codelen(codebook *book,int entry); + + + +extern int vorbis_staticbook_pack(const static_codebook *c,oggpack_buffer *b); +extern int vorbis_staticbook_unpack(oggpack_buffer *b,static_codebook *c); + +extern int vorbis_book_encode(codebook *book, int a, oggpack_buffer *b); + +extern long vorbis_book_decode(codebook *book, oggpack_buffer *b); +extern long vorbis_book_decodevs_add(codebook *book, float *a, + oggpack_buffer *b,int n); +extern long vorbis_book_decodev_set(codebook *book, float *a, + oggpack_buffer *b,int n); +extern long vorbis_book_decodev_add(codebook *book, float *a, + oggpack_buffer *b,int n); +extern long vorbis_book_decodevv_add(codebook *book, float **a, + long off,int ch, + oggpack_buffer *b,int n); + + + +#endif diff --git a/cs/3rd party/libvorbis/vq/make_floor_books.pl b/cs/3rd party/libvorbis/vq/make_floor_books.pl new file mode 100644 index 000000000..5c3736617 --- /dev/null +++ b/cs/3rd party/libvorbis/vq/make_floor_books.pl @@ -0,0 +1,108 @@ +#!/usr/bin/perl + +# quick, very dirty little script so that we can put all the +# information for building a floor book set in one spec file. + +#eg: + +# >floor_44 +# =44c0_s 44c1_s 44c2_s +# build line_128x4_class0 0-256 +# build line_128x4_0sub0 0-4 + +die "Could not open $ARGV[0]: $!" unless open (F,$ARGV[0]); + +$goflag=0; +while($line=){ + + print "#### $line"; + if($line=~m/^GO/){ + $goflag=1; + next; + } + + if($goflag==0){ + if($line=~m/\S+/ && !($line=~m/^\#/) ){ + my $command=$line; + print ">>> $command"; + die "Couldn't shell command.\n\tcommand:$command\n" + if syst($command); + } + next; + } + + # >floor_44 + # this sets the output bookset file name + if($line=~m/^>(\S+)\s+(\S*)/){ + # set the output name + $globalname=$1; + + $command="rm -f $globalname.vqh"; + die "Couldn't remove file.\n\tcommand:$command\n" + if syst($command); + + next; + } + + #=path1 path2 path3 + #set the search path for input files; each build line will look + #for input files in all of the directories in the search path and + #append them for huffbuild input + if($line=~m/^=(.*)/){ + # set the output name + @paths=split(' ',$1); + next; + } + + # build book.vqd 0-3 [noguard] + if($line=~m/^build (.*)/){ + # build a huffman book (no mapping) + my($datafile,$range,$guard)=split(' ',$1); + + $command="rm -f $datafile.tmp"; + print "\n\n>>> $command\n"; + die "Couldn't remove temp file.\n\tcommand:$command\n" + if syst($command); + + # first find all the inputs we want; they'll need to be collected into a single input file + foreach $dir (@paths){ + if (-e "$dir/$datafile.vqd"){ + $command="cat $dir/$datafile.vqd >> $datafile.tmp"; + print ">>> $command\n"; + die "Couldn't append training data.\n\tcommand:$command\n" + if syst($command); + } + } + + my $command="huffbuild $datafile.tmp $range $guard"; + print ">>> $command\n"; + die "Couldn't build huffbook.\n\tcommand:$command\n" + if syst($command); + + $command="cat $datafile.vqh >> $globalname.vqh"; + print ">>> $command\n"; + die "Couldn't append to output book.\n\tcommand:$command\n" + if syst($command); + + $command="rm $datafile.vqh"; + print ">>> $command\n"; + die "Couldn't remove temporary output file.\n\tcommand:$command\n" + if syst($command); + + $command="rm -f $datafile.tmp"; + print ">>> $command\n"; + die "Couldn't remove temporary output file.\n\tcommand:$command\n" + if syst($command); + next; + } + +} + +$command="rm -f temp$$.vqd"; +print ">>> $command\n"; +die "Couldn't remove temp files.\n\tcommand:$command\n" + if syst($command); + +sub syst{ + system(@_)/256; +} diff --git a/cs/3rd party/libvorbis/vq/make_residue_books.pl b/cs/3rd party/libvorbis/vq/make_residue_books.pl new file mode 100644 index 000000000..b37d0dcd2 --- /dev/null +++ b/cs/3rd party/libvorbis/vq/make_residue_books.pl @@ -0,0 +1,177 @@ +#!/usr/bin/perl + +# quick, very dirty little script so that we can put all the +# information for building a residue book set (except the original +# partitioning) in one spec file. + +#eg: + +# >res0_128_128 interleaved +# haux 44c0_s/resaux_0.vqd res0_96_128aux 0,4,2 9 +# :1 res0_128_128_1.vqd, 4, nonseq cull, 0 +- 1 +# :2 res0_128_128_2.vqd, 4, nonseq, 0 +- 1(.7) 2 +# :3 res0_128_128_3.vqd, 4, nonseq, 0 +- 1(.7) 3 5 +# :4 res0_128_128_4.vqd, 2, nonseq, 0 +- 1(.7) 3 5 8 11 +# :5 res0_128_128_5.vqd, 1, nonseq, 0 +- 1 3 5 8 11 14 17 20 24 28 31 35 39 + + +die "Could not open $ARGV[0]: $!" unless open (F,$ARGV[0]); + +$goflag=0; +while($line=){ + + print "#### $line"; + if($line=~m/^GO/){ + $goflag=1; + next; + } + + if($goflag==0){ + if($line=~m/\S+/ && !($line=~m/^\#/) ){ + my $command=$line; + print ">>> $command"; + die "Couldn't shell command.\n\tcommand:$command\n" + if syst($command); + } + next; + } + + # >res0_128_128 + if($line=~m/^>(\S+)\s+(\S*)/){ + # set the output name + $globalname=$1; + $interleave=$2; + next; + } + + # haux 44c0_s/resaux_0.vqd res0_96_128aux 0,4,2 9 + if($line=~m/^h(.*)/){ + # build a huffman book (no mapping) + my($name,$datafile,$bookname,$interval,$range)=split(' ',$1); + + # check the desired subdir to see if the data file exists + if(-e $datafile){ + my $command="cp $datafile $bookname.tmp"; + print ">>> $command\n"; + die "Couldn't access partition data file.\n\tcommand:$command\n" + if syst($command); + + my $command="huffbuild $bookname.tmp $interval"; + print ">>> $command\n"; + die "Couldn't build huffbook.\n\tcommand:$command\n" + if syst($command); + + my $command="rm $bookname.tmp"; + print ">>> $command\n"; + die "Couldn't remove temporary file.\n\tcommand:$command\n" + if syst($command); + }else{ + my $command="huffbuild $bookname.tmp 0-$range"; + print ">>> $command\n"; + die "Couldn't build huffbook.\n\tcommand:$command\n" + if syst($command); + + } + next; + } + + # :1 res0_128_128_1.vqd, 4, nonseq, 0 +- 1 + if($line=~m/^:(.*)/){ + my($namedata,$dim,$seqp,$vals)=split(',',$1); + my($name,$datafile)=split(' ',$namedata); + # build value list + my$plusminus="+"; + my$list; + my$thlist; + my$count=0; + foreach my$val (split(' ',$vals)){ + if($val=~/\-?\+?\d+/){ + my$th; + + # got an explicit threshhint? + if($val=~/([0-9\.]+)\(([^\)]+)/){ + $val=$1; + $th=$2; + } + + if($plusminus=~/-/){ + $list.="-$val "; + if(defined($th)){ + $thlist.="," if(defined($thlist)); + $thlist.="-$th"; + } + $count++; + } + if($plusminus=~/\+/){ + $list.="$val "; + if(defined($th)){ + $thlist.="," if(defined($thlist)); + $thlist.="$th"; + } + $count++; + } + }else{ + $plusminus=$val; + } + } + die "Couldn't open temp file $globalname$name.vql: $!" unless + open(G,">$globalname$name.vql"); + print G "$count $dim 0 "; + if($seqp=~/non/){ + print G "0\n$list\n"; + }else{ + print G "1\n$list\n"; + } + close(G); + + my $command="latticebuild $globalname$name.vql > $globalname$name.vqh"; + print ">>> $command\n"; + die "Couldn't build latticebook.\n\tcommand:$command\n" + if syst($command); + + if(-e $datafile){ + + if($interleave=~/non/){ + $restune="res1tune"; + }else{ + $restune="res0tune"; + } + + if($seqp=~/cull/){ + my $command="$restune $globalname$name.vqh $datafile 1 > temp$$.vqh"; + print ">>> $command\n"; + die "Couldn't tune latticebook.\n\tcommand:$command\n" + if syst($command); + }else{ + my $command="$restune $globalname$name.vqh $datafile > temp$$.vqh"; + print ">>> $command\n"; + die "Couldn't tune latticebook.\n\tcommand:$command\n" + if syst($command); + } + + my $command="mv temp$$.vqh $globalname$name.vqh"; + print ">>> $command\n"; + die "Couldn't rename latticebook.\n\tcommand:$command\n" + if syst($command); + + }else{ + print "No matching training file; leaving this codebook untrained.\n"; + } + + my $command="rm $globalname$name.vql"; + print ">>> $command\n"; + die "Couldn't remove temp files.\n\tcommand:$command\n" + if syst($command); + + next; + } +} + +$command="rm -f temp$$.vqd"; +print ">>> $command\n"; +die "Couldn't remove temp files.\n\tcommand:$command\n" + if syst($command); + +sub syst{ + system(@_)/256; +} diff --git a/cs/3rd party/libvorbis/vq/metrics.c b/cs/3rd party/libvorbis/vq/metrics.c new file mode 100644 index 000000000..e344a8def --- /dev/null +++ b/cs/3rd party/libvorbis/vq/metrics.c @@ -0,0 +1,295 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE 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 SOURCE CODE IS (C) COPYRIGHT 1994-2001 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: function calls to collect codebook metrics + last mod: $Id$ + + ********************************************************************/ + + +#include +#include +#include +#include "bookutil.h" + +/* collect the following metrics: + + mean and mean squared amplitude + mean and mean squared error + mean and mean squared error (per sample) by entry + worst case fit by entry + entry cell size + hits by entry + total bits + total samples + (average bits per sample)*/ + + +/* set up metrics */ + +float meanamplitude_acc=0.f; +float meanamplitudesq_acc=0.f; +float meanerror_acc=0.f; +float meanerrorsq_acc=0.f; + +float **histogram=NULL; +float **histogram_error=NULL; +float **histogram_errorsq=NULL; +float **histogram_hi=NULL; +float **histogram_lo=NULL; +float bits=0.f; +float count=0.f; + +static float *_now(codebook *c, int i){ + return c->valuelist+i*c->c->dim; +} + +int books=0; + +void process_preprocess(codebook **bs,char *basename){ + int i; + while(bs[books])books++; + + if(books){ + histogram=_ogg_calloc(books,sizeof(float *)); + histogram_error=_ogg_calloc(books,sizeof(float *)); + histogram_errorsq=_ogg_calloc(books,sizeof(float *)); + histogram_hi=_ogg_calloc(books,sizeof(float *)); + histogram_lo=_ogg_calloc(books,sizeof(float *)); + }else{ + fprintf(stderr,"Specify at least one codebook\n"); + exit(1); + } + + for(i=0;ientries,sizeof(float)); + histogram_error[i]=_ogg_calloc(b->entries*b->dim,sizeof(float)); + histogram_errorsq[i]=_ogg_calloc(b->entries*b->dim,sizeof(float)); + histogram_hi[i]=_ogg_calloc(b->entries*b->dim,sizeof(float)); + histogram_lo[i]=_ogg_calloc(b->entries*b->dim,sizeof(float)); + } +} + +static float _dist(int el,float *a, float *b){ + int i; + float acc=0.f; + for(i=0;ic->entries;j++){ + if(c->c->lengthlist[j]>0){ + float localmin=-1.; + for(k=0;kc->entries;k++){ + if(c->c->lengthlist[k]>0){ + float this=_dist(c->c->dim,_now(c,j),_now(c,k)); + if(j!=k && + (localmin==-1 || thismax)max=localmin; + mean+=sqrt(localmin); + meansq+=localmin; + total++; + } + } + + fprintf(stderr,"\tminimum cell spacing (closest side): %g\n",sqrt(min)); + fprintf(stderr,"\tmaximum cell spacing (closest side): %g\n",sqrt(max)); + fprintf(stderr,"\tmean closest side spacing: %g\n",mean/total); + fprintf(stderr,"\tmean sq closest side spacing: %g\n",sqrt(meansq/total)); +} + +void process_postprocess(codebook **bs,char *basename){ + int i,k,book; + char *buffer=alloca(strlen(basename)+80); + + fprintf(stderr,"Done. Processed %ld data points:\n\n", + (long)count); + + fprintf(stderr,"Global statistics:******************\n\n"); + + fprintf(stderr,"\ttotal samples: %ld\n",(long)count); + fprintf(stderr,"\ttotal bits required to code: %ld\n",(long)bits); + fprintf(stderr,"\taverage bits per sample: %g\n\n",bits/count); + + fprintf(stderr,"\tmean sample amplitude: %g\n", + meanamplitude_acc/count); + fprintf(stderr,"\tmean squared sample amplitude: %g\n\n", + sqrt(meanamplitudesq_acc/count)); + + fprintf(stderr,"\tmean code error: %g\n", + meanerror_acc/count); + fprintf(stderr,"\tmean squared code error: %g\n\n", + sqrt(meanerrorsq_acc/count)); + + for(book=0;bookc->entries; + int dim=b->c->dim; + + fprintf(stderr,"Book %d statistics:------------------\n",book); + + cell_spacing(b); + + sprintf(buffer,"%s-%d-mse.m",basename,book); + out=fopen(buffer,"w"); + if(!out){ + fprintf(stderr,"Could not open file %s for writing\n",buffer); + exit(1); + } + + for(i=0;ivaluelist+i*dim)[k], + sqrt((histogram_errorsq[book]+i*dim)[k]/histogram[book][i])); + } + } + fclose(out); + + sprintf(buffer,"%s-%d-me.m",basename,book); + out=fopen(buffer,"w"); + if(!out){ + fprintf(stderr,"Could not open file %s for writing\n",buffer); + exit(1); + } + + for(i=0;ivaluelist+i*dim)[k], + (histogram_error[book]+i*dim)[k]/histogram[book][i]); + } + } + fclose(out); + + sprintf(buffer,"%s-%d-worst.m",basename,book); + out=fopen(buffer,"w"); + if(!out){ + fprintf(stderr,"Could not open file %s for writing\n",buffer); + exit(1); + } + + for(i=0;ivaluelist+i*dim)[k], + (b->valuelist+i*dim)[k]+(histogram_lo[book]+i*dim)[k], + (b->valuelist+i*dim)[k]+(histogram_hi[book]+i*dim)[k]); + } + } + fclose(out); + } +} + +float process_one(codebook *b,int book,float *a,int dim,int step,int addmul, + float base){ + int j,entry; + float amplitude=0.f; + + if(book==0){ + float last=base; + for(j=0;jc->q_sequencep?last:0); + meanamplitude_acc+=fabs(amplitude); + meanamplitudesq_acc+=amplitude*amplitude; + count++; + last=a[j*step]; + } + } + + if(b->c->q_sequencep){ + float temp; + for(j=0;jerror) + histogram_lo[book][entry*dim+j]=error; + } + return base; +} + + +void process_vector(codebook **bs,int *addmul,int inter,float *a,int n){ + int bi; + int i; + + for(bi=0;bidim; + float base=0.f; + + if(inter){ + for(i=0;i.vqh [ +|* ]... \n" + " datafile.vqd [datafile.vqd]...\n\n" + " data can be taken on stdin. -i indicates interleaved coding.\n" + " Output goes to output files:\n" + " basename-me.m: gnuplot: mean error by entry value\n" + " basename-mse.m: gnuplot: mean square error by entry value\n" + " basename-worst.m: gnuplot: worst error by entry value\n" + " basename-distance.m: gnuplot file showing distance probability\n" + "\n"); + +} diff --git a/cs/3rd party/libvorbis/vq/vqgen.c b/cs/3rd party/libvorbis/vq/vqgen.c new file mode 100644 index 000000000..2e46dd1f4 --- /dev/null +++ b/cs/3rd party/libvorbis/vq/vqgen.c @@ -0,0 +1,567 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE 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 SOURCE CODE IS (C) COPYRIGHT 1994-2001 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: train a VQ codebook + last mod: $Id$ + + ********************************************************************/ + +/* This code is *not* part of libvorbis. It is used to generate + trained codebooks offline and then spit the results into a + pregenerated codebook that is compiled into libvorbis. It is an + expensive (but good) algorithm. Run it on big iron. */ + +/* There are so many optimizations to explore in *both* stages that + considering the undertaking is almost withering. For now, we brute + force it all */ + +#include +#include +#include +#include + +#include "vqgen.h" +#include "bookutil.h" + +/* Codebook generation happens in two steps: + + 1) Train the codebook with data collected from the encoder: We use + one of a few error metrics (which represent the distance between a + given data point and a candidate point in the training set) to + divide the training set up into cells representing roughly equal + probability of occurring. + + 2) Generate the codebook and auxiliary data from the trained data set +*/ + +/* Codebook training **************************************************** + * + * The basic idea here is that a VQ codebook is like an m-dimensional + * foam with n bubbles. The bubbles compete for space/volume and are + * 'pressurized' [biased] according to some metric. The basic alg + * iterates through allowing the bubbles to compete for space until + * they converge (if the damping is dome properly) on a steady-state + * solution. Individual input points, collected from libvorbis, are + * used to train the algorithm monte-carlo style. */ + +/* internal helpers *****************************************************/ +#define vN(data,i) (data+v->elements*i) + +/* default metric; squared 'distance' from desired value. */ +float _dist(vqgen *v,float *a, float *b){ + int i; + int el=v->elements; + float acc=0.f; + for(i=0;ientries;i++) + memcpy(_now(v,i),_point(v,i),sizeof(float)*v->elements); + v->seeded=1; +} + +int directdsort(const void *a, const void *b){ + float av=*((float *)a); + float bv=*((float *)b); + return (avbv); +} + +void vqgen_cellmetric(vqgen *v){ + int j,k; + float min=-1.f,max=-1.f,mean=0.f,acc=0.f; + long dup=0,unused=0; + #ifdef NOISY + int i; + char buff[80]; + float spacings[v->entries]; + int count=0; + FILE *cells; + sprintf(buff,"cellspace%d.m",v->it); + cells=fopen(buff,"w"); +#endif + + /* minimum, maximum, cell spacing */ + for(j=0;jentries;j++){ + float localmin=-1.; + + for(k=0;kentries;k++){ + if(j!=k){ + float this=_dist(v,_now(v,j),_now(v,k)); + if(this>0){ + if(v->assigned[k] && (localmin==-1 || thisentries)continue; + + if(v->assigned[j]==0){ + unused++; + continue; + } + + localmin=v->max[j]+localmin/2; /* this gives us rough diameter */ + if(min==-1 || localminmax)max=localmin; + mean+=localmin; + acc++; +#ifdef NOISY + spacings[count++]=localmin; +#endif + } + + fprintf(stderr,"cell diameter: %.03g::%.03g::%.03g (%ld unused/%ld dup)\n", + min,mean/acc,max,unused,dup); + +#ifdef NOISY + qsort(spacings,count,sizeof(float),directdsort); + for(i=0;iquant)-1); + + int j,k; + + mindel=maxdel=_now(v,0)[0]; + + for(j=0;jentries;j++){ + float last=0.f; + for(k=0;kelements;k++){ + if(mindel>_now(v,j)[k]-last)mindel=_now(v,j)[k]-last; + if(maxdel<_now(v,j)[k]-last)maxdel=_now(v,j)[k]-last; + if(q->sequencep)last=_now(v,j)[k]; + } + } + + + /* first find the basic delta amount from the maximum span to be + encoded. Loosen the delta slightly to allow for additional error + during sequence quantization */ + + delta=(maxdel-mindel)/((1<quant)-1.5f); + + q->min=_float32_pack(mindel); + q->delta=_float32_pack(delta); + + mindel=_float32_unpack(q->min); + delta=_float32_unpack(q->delta); + + for(j=0;jentries;j++){ + float last=0; + for(k=0;kelements;k++){ + float val=_now(v,j)[k]; + float now=rint((val-last-mindel)/delta); + + _now(v,j)[k]=now; + if(now<0){ + /* be paranoid; this should be impossible */ + fprintf(stderr,"fault; quantized value<0\n"); + exit(1); + } + + if(now>maxquant){ + /* be paranoid; this should be impossible */ + fprintf(stderr,"fault; quantized value>max\n"); + exit(1); + } + if(q->sequencep)last=(now*delta)+mindel+last; + } + } +} + +/* much easier :-). Unlike in the codebook, we don't un-log log + scales; we just make sure they're properly offset. */ +void vqgen_unquantize(vqgen *v,quant_meta *q){ + long j,k; + float mindel=_float32_unpack(q->min); + float delta=_float32_unpack(q->delta); + + for(j=0;jentries;j++){ + float last=0.f; + for(k=0;kelements;k++){ + float now=_now(v,j)[k]; + now=fabs(now)*delta+last+mindel; + if(q->sequencep)last=now; + _now(v,j)[k]=now; + } + } +} + +void vqgen_init(vqgen *v,int elements,int aux,int entries,float mindist, + float (*metric)(vqgen *,float *, float *), + float *(*weight)(vqgen *,float *),int centroid){ + memset(v,0,sizeof(vqgen)); + + v->centroid=centroid; + v->elements=elements; + v->aux=aux; + v->mindist=mindist; + v->allocated=32768; + v->pointlist=_ogg_malloc(v->allocated*(v->elements+v->aux)*sizeof(float)); + + v->entries=entries; + v->entrylist=_ogg_malloc(v->entries*v->elements*sizeof(float)); + v->assigned=_ogg_malloc(v->entries*sizeof(long)); + v->bias=_ogg_calloc(v->entries,sizeof(float)); + v->max=_ogg_calloc(v->entries,sizeof(float)); + if(metric) + v->metric_func=metric; + else + v->metric_func=_dist; + if(weight) + v->weight_func=weight; + else + v->weight_func=_weight_null; + + v->asciipoints=tmpfile(); + +} + +void vqgen_addpoint(vqgen *v, float *p,float *a){ + int k; + for(k=0;kelements;k++) + fprintf(v->asciipoints,"%.12g\n",p[k]); + for(k=0;kaux;k++) + fprintf(v->asciipoints,"%.12g\n",a[k]); + + if(v->points>=v->allocated){ + v->allocated*=2; + v->pointlist=_ogg_realloc(v->pointlist,v->allocated*(v->elements+v->aux)* + sizeof(float)); + } + + memcpy(_point(v,v->points),p,sizeof(float)*v->elements); + if(v->aux)memcpy(_point(v,v->points)+v->elements,a,sizeof(float)*v->aux); + + /* quantize to the density mesh if it's selected */ + if(v->mindist>0.f){ + /* quantize to the mesh */ + for(k=0;kelements+v->aux;k++) + _point(v,v->points)[k]= + rint(_point(v,v->points)[k]/v->mindist)*v->mindist; + } + v->points++; + if(!(v->points&0xff))spinnit("loading... ",v->points); +} + +/* yes, not threadsafe. These utils aren't */ +static int sortit=0; +static int sortsize=0; +static int meshcomp(const void *a,const void *b){ + if(((sortit++)&0xfff)==0)spinnit("sorting mesh...",sortit); + return(memcmp(a,b,sortsize)); +} + +void vqgen_sortmesh(vqgen *v){ + sortit=0; + if(v->mindist>0.f){ + long i,march=1; + + /* sort to make uniqueness detection trivial */ + sortsize=(v->elements+v->aux)*sizeof(float); + qsort(v->pointlist,v->points,sortsize,meshcomp); + + /* now march through and eliminate dupes */ + for(i=1;ipoints;i++){ + if(memcmp(_point(v,i),_point(v,i-1),sortsize)){ + /* a new, unique entry. march it down */ + if(i>march)memcpy(_point(v,march),_point(v,i),sortsize); + march++; + } + spinnit("eliminating density... ",v->points-i); + } + + /* we're done */ + fprintf(stderr,"\r%ld training points remining out of %ld" + " after density mesh (%ld%%)\n",march,v->points,march*100/v->points); + v->points=march; + + } + v->sorted=1; +} + +float vqgen_iterate(vqgen *v,int biasp){ + long i,j,k; + + float fdesired; + long desired; + long desired2; + + float asserror=0.f; + float meterror=0.f; + float *new; + float *new2; + long *nearcount; + float *nearbias; + #ifdef NOISY + char buff[80]; + FILE *assig; + FILE *bias; + FILE *cells; + sprintf(buff,"cells%d.m",v->it); + cells=fopen(buff,"w"); + sprintf(buff,"assig%d.m",v->it); + assig=fopen(buff,"w"); + sprintf(buff,"bias%d.m",v->it); + bias=fopen(buff,"w"); + #endif + + + if(v->entries<2){ + fprintf(stderr,"generation requires at least two entries\n"); + exit(1); + } + + if(!v->sorted)vqgen_sortmesh(v); + if(!v->seeded)_vqgen_seed(v); + + fdesired=(float)v->points/v->entries; + desired=fdesired; + desired2=desired*2; + new=_ogg_malloc(sizeof(float)*v->entries*v->elements); + new2=_ogg_malloc(sizeof(float)*v->entries*v->elements); + nearcount=_ogg_malloc(v->entries*sizeof(long)); + nearbias=_ogg_malloc(v->entries*desired2*sizeof(float)); + + /* fill in nearest points for entry biasing */ + /*memset(v->bias,0,sizeof(float)*v->entries);*/ + memset(nearcount,0,sizeof(long)*v->entries); + memset(v->assigned,0,sizeof(long)*v->entries); + if(biasp){ + for(i=0;ipoints;i++){ + float *ppt=v->weight_func(v,_point(v,i)); + float firstmetric=v->metric_func(v,_now(v,0),ppt)+v->bias[0]; + float secondmetric=v->metric_func(v,_now(v,1),ppt)+v->bias[1]; + long firstentry=0; + long secondentry=1; + + if(!(i&0xff))spinnit("biasing... ",v->points+v->points+v->entries-i); + + if(firstmetric>secondmetric){ + float temp=firstmetric; + firstmetric=secondmetric; + secondmetric=temp; + firstentry=1; + secondentry=0; + } + + for(j=2;jentries;j++){ + float thismetric=v->metric_func(v,_now(v,j),ppt)+v->bias[j]; + if(thismetricentries;j++){ + + float thismetric,localmetric; + float *nearbiasptr=nearbias+desired2*j; + long k=nearcount[j]; + + localmetric=v->metric_func(v,_now(v,j),ppt); + /* 'thismetric' is to be the bias value necessary in the current + arrangement for entry j to capture point i */ + if(firstentry==j){ + /* use the secondary entry as the threshhold */ + thismetric=secondmetric-localmetric; + }else{ + /* use the primary entry as the threshhold */ + thismetric=firstmetric-localmetric; + } + + /* support the idea of 'minimum distance'... if we want the + cells in a codebook to be roughly some minimum size (as with + the low resolution residue books) */ + + /* a cute two-stage delayed sorting hack */ + if(kpoints+v->points+v->entries-i); + qsort(nearbiasptr,desired,sizeof(float),directdsort); + } + + }else if(thismetric>nearbiasptr[desired-1]){ + nearbiasptr[k]=thismetric; + k++; + if(k==desired2){ + spinnit("biasing... ",v->points+v->points+v->entries-i); + qsort(nearbiasptr,desired2,sizeof(float),directdsort); + k=desired; + } + } + nearcount[j]=k; + } + } + + /* inflate/deflate */ + + for(i=0;ientries;i++){ + float *nearbiasptr=nearbias+desired2*i; + + spinnit("biasing... ",v->points+v->entries-i); + + /* due to the delayed sorting, we likely need to finish it off....*/ + if(nearcount[i]>desired) + qsort(nearbiasptr,nearcount[i],sizeof(float),directdsort); + + v->bias[i]=nearbiasptr[desired-1]; + + } + }else{ + memset(v->bias,0,v->entries*sizeof(float)); + } + + /* Now assign with new bias and find new midpoints */ + for(i=0;ipoints;i++){ + float *ppt=v->weight_func(v,_point(v,i)); + float firstmetric=v->metric_func(v,_now(v,0),ppt)+v->bias[0]; + long firstentry=0; + + if(!(i&0xff))spinnit("centering... ",v->points-i); + + for(j=0;jentries;j++){ + float thismetric=v->metric_func(v,_now(v,j),ppt)+v->bias[j]; + if(thismetricbias[j]; + meterror+=firstmetric; + + if(v->centroid==0){ + /* set up midpoints for next iter */ + if(v->assigned[j]++){ + for(k=0;kelements;k++) + vN(new,j)[k]+=ppt[k]; + if(firstmetric>v->max[j])v->max[j]=firstmetric; + }else{ + for(k=0;kelements;k++) + vN(new,j)[k]=ppt[k]; + v->max[j]=firstmetric; + } + }else{ + /* centroid */ + if(v->assigned[j]++){ + for(k=0;kelements;k++){ + if(vN(new,j)[k]>ppt[k])vN(new,j)[k]=ppt[k]; + if(vN(new2,j)[k]v->max[firstentry])v->max[j]=firstmetric; + }else{ + for(k=0;kelements;k++){ + vN(new,j)[k]=ppt[k]; + vN(new2,j)[k]=ppt[k]; + } + v->max[firstentry]=firstmetric; + } + } + } + + /* assign midpoints */ + + for(j=0;jentries;j++){ +#ifdef NOISY + fprintf(assig,"%ld\n",v->assigned[j]); + fprintf(bias,"%g\n",v->bias[j]); +#endif + asserror+=fabs(v->assigned[j]-fdesired); + if(v->assigned[j]){ + if(v->centroid==0){ + for(k=0;kelements;k++) + _now(v,j)[k]=vN(new,j)[k]/v->assigned[j]; + }else{ + for(k=0;kelements;k++) + _now(v,j)[k]=(vN(new,j)[k]+vN(new2,j)[k])/2.f; + } + } + } + + asserror/=(v->entries*fdesired); + + fprintf(stderr,"Pass #%d... ",v->it); + fprintf(stderr,": dist %g(%g) metric error=%g \n", + asserror,fdesired,meterror/v->points); + v->it++; + + free(new); + free(nearcount); + free(nearbias); +#ifdef NOISY + fclose(assig); + fclose(bias); + fclose(cells); +#endif + return(asserror); +} + diff --git a/cs/3rd party/libvorbis/vq/vqgen.h b/cs/3rd party/libvorbis/vq/vqgen.h new file mode 100644 index 000000000..6d3093e7b --- /dev/null +++ b/cs/3rd party/libvorbis/vq/vqgen.h @@ -0,0 +1,85 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE 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 SOURCE CODE IS (C) COPYRIGHT 1994-2001 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: build a VQ codebook + last mod: $Id$ + + ********************************************************************/ + +#ifndef _VQGEN_H_ +#define _VQGEN_H_ + +typedef struct vqgen{ + int seeded; + int sorted; + + int it; + int elements; + + int aux; + float mindist; + int centroid; + + /* point cache */ + float *pointlist; + long points; + long allocated; + + /* entries */ + float *entrylist; + long *assigned; + float *bias; + long entries; + float *max; + + float (*metric_func) (struct vqgen *v,float *entry,float *point); + float *(*weight_func) (struct vqgen *v,float *point); + + FILE *asciipoints; +} vqgen; + +typedef struct { + long min; /* packed 24 bit float */ + long delta; /* packed 24 bit float */ + int quant; /* 0 < quant <= 16 */ + int sequencep; /* bitflag */ +} quant_meta; + +static inline float *_point(vqgen *v,long ptr){ + return v->pointlist+((v->elements+v->aux)*ptr); +} + +static inline float *_aux(vqgen *v,long ptr){ + return _point(v,ptr)+v->aux; +} + +static inline float *_now(vqgen *v,long ptr){ + return v->entrylist+(v->elements*ptr); +} + +extern void vqgen_init(vqgen *v, + int elements,int aux,int entries,float mindist, + float (*metric)(vqgen *,float *, float *), + float *(*weight)(vqgen *,float *),int centroid); +extern void vqgen_addpoint(vqgen *v, float *p,float *aux); + +extern float vqgen_iterate(vqgen *v,int biasp); +extern void vqgen_unquantize(vqgen *v,quant_meta *q); +extern void vqgen_quantize(vqgen *v,quant_meta *q); +extern void vqgen_cellmetric(vqgen *v); + +#endif + + + + + diff --git a/cs/3rd party/libvorbis/win32/VS2005/README b/cs/3rd party/libvorbis/win32/VS2005/README new file mode 100644 index 000000000..3e3ea55f2 --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2005/README @@ -0,0 +1,16 @@ +libvorbis has libogg as a dependency, you need to have libogg +compiled beforehand. + +Lets say you have libogg and libvorbis in the same directory: + +libogg-1.1.3 +libvorbis-1.2.0 + +Because there is no automatic library detection you have to, +either: + +1. Rename libogg-1.1.3 to libogg + +2. Open libogg.vsprops with a text editor (even notepad.exe +will suffice) and see if LIBOGG_VERSION is set to the correct +version, in this case "1.1.3" diff --git a/cs/3rd party/libvorbis/win32/VS2005/libogg.vsprops b/cs/3rd party/libvorbis/win32/VS2005/libogg.vsprops new file mode 100644 index 000000000..dca120819 --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2005/libogg.vsprops @@ -0,0 +1,19 @@ + + + + + + diff --git a/cs/3rd party/libvorbis/win32/VS2005/libvorbis/libvorbis_dynamic.vcproj b/cs/3rd party/libvorbis/win32/VS2005/libvorbis/libvorbis_dynamic.vcproj new file mode 100644 index 000000000..a2669a7ba --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2005/libvorbis/libvorbis_dynamic.vcproj @@ -0,0 +1,1200 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cs/3rd party/libvorbis/win32/VS2005/libvorbis/libvorbis_static.vcproj b/cs/3rd party/libvorbis/win32/VS2005/libvorbis/libvorbis_static.vcproj new file mode 100644 index 000000000..cf8c8d2b3 --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2005/libvorbis/libvorbis_static.vcproj @@ -0,0 +1,1062 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cs/3rd party/libvorbis/win32/VS2005/libvorbisfile/libvorbisfile_dynamic.vcproj b/cs/3rd party/libvorbis/win32/VS2005/libvorbisfile/libvorbisfile_dynamic.vcproj new file mode 100644 index 000000000..54acf7d4e --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2005/libvorbisfile/libvorbisfile_dynamic.vcproj @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cs/3rd party/libvorbis/win32/VS2005/libvorbisfile/libvorbisfile_static.vcproj b/cs/3rd party/libvorbis/win32/VS2005/libvorbisfile/libvorbisfile_static.vcproj new file mode 100644 index 000000000..dfbcc1643 --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2005/libvorbisfile/libvorbisfile_static.vcproj @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cs/3rd party/libvorbis/win32/VS2005/vorbis_dynamic.sln b/cs/3rd party/libvorbis/win32/VS2005/vorbis_dynamic.sln new file mode 100644 index 000000000..395ed4f0a --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2005/vorbis_dynamic.sln @@ -0,0 +1,56 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libvorbisfile", "libvorbisfile\libvorbisfile_dynamic.vcproj", "{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libvorbis", "libvorbis\libvorbis_dynamic.vcproj", "{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vorbisdec", "vorbisdec\vorbisdec_dynamic.vcproj", "{5833EEA1-1068-431F-A6E5-316E7DC5D90A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vorbisenc", "vorbisenc\vorbisenc_dynamic.vcproj", "{E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|Win32.ActiveCfg = Debug|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|Win32.Build.0 = Debug|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|x64.ActiveCfg = Debug|x64 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|x64.Build.0 = Debug|x64 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|Win32.ActiveCfg = Release|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|Win32.Build.0 = Release|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|x64.ActiveCfg = Release|x64 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|x64.Build.0 = Release|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|Win32.ActiveCfg = Debug|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|Win32.Build.0 = Debug|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|x64.ActiveCfg = Debug|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|x64.Build.0 = Debug|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|Win32.ActiveCfg = Release|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|Win32.Build.0 = Release|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|x64.ActiveCfg = Release|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|x64.Build.0 = Release|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Debug|Win32.ActiveCfg = Debug|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Debug|Win32.Build.0 = Debug|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Debug|x64.ActiveCfg = Debug|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Debug|x64.Build.0 = Debug|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release|Win32.ActiveCfg = Release|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release|Win32.Build.0 = Release|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release|x64.ActiveCfg = Release|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release|x64.Build.0 = Release|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Debug|Win32.ActiveCfg = Debug|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Debug|Win32.Build.0 = Debug|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Debug|x64.ActiveCfg = Debug|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Debug|x64.Build.0 = Debug|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release|Win32.ActiveCfg = Release|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release|Win32.Build.0 = Release|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release|x64.ActiveCfg = Release|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/cs/3rd party/libvorbis/win32/VS2005/vorbis_static.sln b/cs/3rd party/libvorbis/win32/VS2005/vorbis_static.sln new file mode 100644 index 000000000..52b9382d6 --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2005/vorbis_static.sln @@ -0,0 +1,56 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libvorbisfile", "libvorbisfile\libvorbisfile_static.vcproj", "{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libvorbis", "libvorbis\libvorbis_static.vcproj", "{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vorbisdec", "vorbisdec\vorbisdec_static.vcproj", "{5833EEA1-1068-431F-A6E5-316E7DC5D90A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vorbisenc", "vorbisenc\vorbisenc_static.vcproj", "{E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|Win32.ActiveCfg = Debug|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|Win32.Build.0 = Debug|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|x64.ActiveCfg = Debug|x64 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|x64.Build.0 = Debug|x64 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|Win32.ActiveCfg = Release|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|Win32.Build.0 = Release|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|x64.ActiveCfg = Release|x64 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|x64.Build.0 = Release|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|Win32.ActiveCfg = Debug|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|Win32.Build.0 = Debug|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|x64.ActiveCfg = Debug|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|x64.Build.0 = Debug|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|Win32.ActiveCfg = Release|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|Win32.Build.0 = Release|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|x64.ActiveCfg = Release|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|x64.Build.0 = Release|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Debug|Win32.ActiveCfg = Debug|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Debug|Win32.Build.0 = Debug|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Debug|x64.ActiveCfg = Debug|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Debug|x64.Build.0 = Debug|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release|Win32.ActiveCfg = Release|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release|Win32.Build.0 = Release|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release|x64.ActiveCfg = Release|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release|x64.Build.0 = Release|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Debug|Win32.ActiveCfg = Debug|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Debug|Win32.Build.0 = Debug|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Debug|x64.ActiveCfg = Debug|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Debug|x64.Build.0 = Debug|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release|Win32.ActiveCfg = Release|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release|Win32.Build.0 = Release|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release|x64.ActiveCfg = Release|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/cs/3rd party/libvorbis/win32/VS2005/vorbisdec/vorbisdec_dynamic.vcproj b/cs/3rd party/libvorbis/win32/VS2005/vorbisdec/vorbisdec_dynamic.vcproj new file mode 100644 index 000000000..cca3db555 --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2005/vorbisdec/vorbisdec_dynamic.vcproj @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cs/3rd party/libvorbis/win32/VS2005/vorbisdec/vorbisdec_static.vcproj b/cs/3rd party/libvorbis/win32/VS2005/vorbisdec/vorbisdec_static.vcproj new file mode 100644 index 000000000..dfc4c6a9e --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2005/vorbisdec/vorbisdec_static.vcproj @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cs/3rd party/libvorbis/win32/VS2005/vorbisenc/vorbisenc_dynamic.vcproj b/cs/3rd party/libvorbis/win32/VS2005/vorbisenc/vorbisenc_dynamic.vcproj new file mode 100644 index 000000000..78f1a5bd1 --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2005/vorbisenc/vorbisenc_dynamic.vcproj @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cs/3rd party/libvorbis/win32/VS2005/vorbisenc/vorbisenc_static.vcproj b/cs/3rd party/libvorbis/win32/VS2005/vorbisenc/vorbisenc_static.vcproj new file mode 100644 index 000000000..8a0d6fba3 --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2005/vorbisenc/vorbisenc_static.vcproj @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cs/3rd party/libvorbis/win32/VS2008/README b/cs/3rd party/libvorbis/win32/VS2008/README new file mode 100644 index 000000000..3e3ea55f2 --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2008/README @@ -0,0 +1,16 @@ +libvorbis has libogg as a dependency, you need to have libogg +compiled beforehand. + +Lets say you have libogg and libvorbis in the same directory: + +libogg-1.1.3 +libvorbis-1.2.0 + +Because there is no automatic library detection you have to, +either: + +1. Rename libogg-1.1.3 to libogg + +2. Open libogg.vsprops with a text editor (even notepad.exe +will suffice) and see if LIBOGG_VERSION is set to the correct +version, in this case "1.1.3" diff --git a/cs/3rd party/libvorbis/win32/VS2008/libogg.vsprops b/cs/3rd party/libvorbis/win32/VS2008/libogg.vsprops new file mode 100644 index 000000000..807b74a67 --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2008/libogg.vsprops @@ -0,0 +1,19 @@ + + + + + + diff --git a/cs/3rd party/libvorbis/win32/VS2008/libvorbis/libvorbis_dynamic.vcproj b/cs/3rd party/libvorbis/win32/VS2008/libvorbis/libvorbis_dynamic.vcproj new file mode 100644 index 000000000..72fba16f2 --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2008/libvorbis/libvorbis_dynamic.vcproj @@ -0,0 +1,348 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cs/3rd party/libvorbis/win32/VS2008/libvorbis/libvorbis_static.vcproj b/cs/3rd party/libvorbis/win32/VS2008/libvorbis/libvorbis_static.vcproj new file mode 100644 index 000000000..279397c4b --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2008/libvorbis/libvorbis_static.vcproj @@ -0,0 +1,1069 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cs/3rd party/libvorbis/win32/VS2008/libvorbisfile/libvorbisfile_dynamic.vcproj b/cs/3rd party/libvorbis/win32/VS2008/libvorbisfile/libvorbisfile_dynamic.vcproj new file mode 100644 index 000000000..98cfd88f2 --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2008/libvorbisfile/libvorbisfile_dynamic.vcproj @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cs/3rd party/libvorbis/win32/VS2008/libvorbisfile/libvorbisfile_static.vcproj b/cs/3rd party/libvorbis/win32/VS2008/libvorbisfile/libvorbisfile_static.vcproj new file mode 100644 index 000000000..f36ed21c2 --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2008/libvorbisfile/libvorbisfile_static.vcproj @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cs/3rd party/libvorbis/win32/VS2008/vorbis_dynamic.sln b/cs/3rd party/libvorbis/win32/VS2008/vorbis_dynamic.sln new file mode 100644 index 000000000..d3e846ac6 --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2008/vorbis_dynamic.sln @@ -0,0 +1,92 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libvorbisfile", "libvorbisfile\libvorbisfile_dynamic.vcproj", "{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libvorbis", "libvorbis\libvorbis_dynamic.vcproj", "{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vorbisdec", "vorbisdec\vorbisdec_dynamic.vcproj", "{5833EEA1-1068-431F-A6E5-316E7DC5D90A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vorbisenc", "vorbisenc\vorbisenc_dynamic.vcproj", "{E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release_SSE|Win32 = Release_SSE|Win32 + Release_SSE|x64 = Release_SSE|x64 + Release_SSE2|Win32 = Release_SSE2|Win32 + Release_SSE2|x64 = Release_SSE2|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|Win32.ActiveCfg = Debug|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|Win32.Build.0 = Debug|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|x64.ActiveCfg = Debug|x64 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|x64.Build.0 = Debug|x64 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release_SSE|Win32.ActiveCfg = Release|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release_SSE|Win32.Build.0 = Release|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release_SSE|x64.ActiveCfg = Release_SSE|x64 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release_SSE|x64.Build.0 = Release_SSE|x64 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release_SSE2|Win32.ActiveCfg = Release|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release_SSE2|Win32.Build.0 = Release|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release_SSE2|x64.ActiveCfg = Release_SSE2|x64 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release_SSE2|x64.Build.0 = Release_SSE2|x64 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|Win32.ActiveCfg = Release|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|Win32.Build.0 = Release|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|x64.ActiveCfg = Release|x64 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|x64.Build.0 = Release|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|Win32.ActiveCfg = Debug|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|Win32.Build.0 = Debug|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|x64.ActiveCfg = Debug|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|x64.Build.0 = Debug|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release_SSE|x64.ActiveCfg = Release_SSE|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release_SSE|x64.Build.0 = Release_SSE|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release_SSE2|Win32.ActiveCfg = Release_SSE2|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release_SSE2|Win32.Build.0 = Release_SSE2|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release_SSE2|x64.ActiveCfg = Release_SSE2|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release_SSE2|x64.Build.0 = Release_SSE2|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|Win32.ActiveCfg = Release|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|Win32.Build.0 = Release|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|x64.ActiveCfg = Release|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|x64.Build.0 = Release|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Debug|Win32.ActiveCfg = Debug|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Debug|Win32.Build.0 = Debug|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Debug|x64.ActiveCfg = Debug|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Debug|x64.Build.0 = Debug|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release_SSE|x64.ActiveCfg = Release_SSE|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release_SSE|x64.Build.0 = Release_SSE|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release_SSE2|Win32.ActiveCfg = Release_SSE2|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release_SSE2|Win32.Build.0 = Release_SSE2|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release_SSE2|x64.ActiveCfg = Release_SSE2|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release_SSE2|x64.Build.0 = Release_SSE2|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release|Win32.ActiveCfg = Release|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release|Win32.Build.0 = Release|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release|x64.ActiveCfg = Release|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release|x64.Build.0 = Release|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Debug|Win32.ActiveCfg = Debug|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Debug|Win32.Build.0 = Debug|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Debug|x64.ActiveCfg = Debug|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Debug|x64.Build.0 = Debug|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release_SSE|x64.ActiveCfg = Release_SSE|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release_SSE|x64.Build.0 = Release_SSE|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release_SSE2|Win32.ActiveCfg = Release_SSE2|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release_SSE2|Win32.Build.0 = Release_SSE2|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release_SSE2|x64.ActiveCfg = Release_SSE2|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release_SSE2|x64.Build.0 = Release_SSE2|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release|Win32.ActiveCfg = Release|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release|Win32.Build.0 = Release|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release|x64.ActiveCfg = Release|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/cs/3rd party/libvorbis/win32/VS2008/vorbis_static.sln b/cs/3rd party/libvorbis/win32/VS2008/vorbis_static.sln new file mode 100644 index 000000000..8574664cc --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2008/vorbis_static.sln @@ -0,0 +1,92 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libvorbisfile", "libvorbisfile\libvorbisfile_static.vcproj", "{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libvorbis", "libvorbis\libvorbis_static.vcproj", "{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vorbisdec", "vorbisdec\vorbisdec_static.vcproj", "{5833EEA1-1068-431F-A6E5-316E7DC5D90A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vorbisenc", "vorbisenc\vorbisenc_static.vcproj", "{E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release_SSE|Win32 = Release_SSE|Win32 + Release_SSE|x64 = Release_SSE|x64 + Release_SSE2|Win32 = Release_SSE2|Win32 + Release_SSE2|x64 = Release_SSE2|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|Win32.ActiveCfg = Debug|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|Win32.Build.0 = Debug|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|x64.ActiveCfg = Debug|x64 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|x64.Build.0 = Debug|x64 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release_SSE|Win32.ActiveCfg = Release|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release_SSE|Win32.Build.0 = Release|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release_SSE|x64.ActiveCfg = Release_SSE|x64 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release_SSE|x64.Build.0 = Release_SSE|x64 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release_SSE2|Win32.ActiveCfg = Release|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release_SSE2|Win32.Build.0 = Release|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release_SSE2|x64.ActiveCfg = Release_SSE2|x64 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release_SSE2|x64.Build.0 = Release_SSE2|x64 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|Win32.ActiveCfg = Release|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|Win32.Build.0 = Release|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|x64.ActiveCfg = Release|x64 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|x64.Build.0 = Release|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|Win32.ActiveCfg = Debug|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|Win32.Build.0 = Debug|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|x64.ActiveCfg = Debug|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|x64.Build.0 = Debug|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release_SSE|x64.ActiveCfg = Release_SSE|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release_SSE|x64.Build.0 = Release_SSE|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release_SSE2|Win32.ActiveCfg = Release_SSE2|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release_SSE2|Win32.Build.0 = Release_SSE2|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release_SSE2|x64.ActiveCfg = Release_SSE2|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release_SSE2|x64.Build.0 = Release_SSE2|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|Win32.ActiveCfg = Release|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|Win32.Build.0 = Release|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|x64.ActiveCfg = Release|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|x64.Build.0 = Release|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Debug|Win32.ActiveCfg = Debug|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Debug|Win32.Build.0 = Debug|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Debug|x64.ActiveCfg = Debug|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Debug|x64.Build.0 = Debug|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release_SSE|x64.ActiveCfg = Release_SSE|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release_SSE|x64.Build.0 = Release_SSE|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release_SSE2|Win32.ActiveCfg = Release_SSE2|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release_SSE2|Win32.Build.0 = Release_SSE2|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release_SSE2|x64.ActiveCfg = Release_SSE2|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release_SSE2|x64.Build.0 = Release_SSE2|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release|Win32.ActiveCfg = Release|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release|Win32.Build.0 = Release|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release|x64.ActiveCfg = Release|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release|x64.Build.0 = Release|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Debug|Win32.ActiveCfg = Debug|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Debug|Win32.Build.0 = Debug|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Debug|x64.ActiveCfg = Debug|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Debug|x64.Build.0 = Debug|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release_SSE|x64.ActiveCfg = Release_SSE|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release_SSE|x64.Build.0 = Release_SSE|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release_SSE2|Win32.ActiveCfg = Release_SSE2|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release_SSE2|Win32.Build.0 = Release_SSE2|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release_SSE2|x64.ActiveCfg = Release_SSE2|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release_SSE2|x64.Build.0 = Release_SSE2|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release|Win32.ActiveCfg = Release|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release|Win32.Build.0 = Release|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release|x64.ActiveCfg = Release|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/cs/3rd party/libvorbis/win32/VS2008/vorbisdec/vorbisdec_dynamic.vcproj b/cs/3rd party/libvorbis/win32/VS2008/vorbisdec/vorbisdec_dynamic.vcproj new file mode 100644 index 000000000..fe945b350 --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2008/vorbisdec/vorbisdec_dynamic.vcproj @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cs/3rd party/libvorbis/win32/VS2008/vorbisdec/vorbisdec_static.vcproj b/cs/3rd party/libvorbis/win32/VS2008/vorbisdec/vorbisdec_static.vcproj new file mode 100644 index 000000000..a1bce41cd --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2008/vorbisdec/vorbisdec_static.vcproj @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cs/3rd party/libvorbis/win32/VS2008/vorbisenc/vorbisenc_dynamic.vcproj b/cs/3rd party/libvorbis/win32/VS2008/vorbisenc/vorbisenc_dynamic.vcproj new file mode 100644 index 000000000..936cc00e3 --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2008/vorbisenc/vorbisenc_dynamic.vcproj @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cs/3rd party/libvorbis/win32/VS2008/vorbisenc/vorbisenc_static.vcproj b/cs/3rd party/libvorbis/win32/VS2008/vorbisenc/vorbisenc_static.vcproj new file mode 100644 index 000000000..f45847ee4 --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2008/vorbisenc/vorbisenc_static.vcproj @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cs/3rd party/libvorbis/win32/VS2010/README b/cs/3rd party/libvorbis/win32/VS2010/README new file mode 100644 index 000000000..c2123773f --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2010/README @@ -0,0 +1,16 @@ +libvorbis has libogg as a dependency, you need to have libogg +compiled beforehand. + +Lets say you have libogg and libvorbis in the same directory: + +libogg-1.3.2 +libvorbis-1.4.0 + +Because there is no automatic library detection you have to, +either: + +1. Rename libogg-1.3.2 to libogg. + +2. Open libogg.props with a text editor (even notepad.exe +will suffice) and see if LIBOGG_VERSION is set to the correct +version, in this case "1.3.2". diff --git a/cs/3rd party/libvorbis/win32/VS2010/libogg.props b/cs/3rd party/libvorbis/win32/VS2010/libogg.props new file mode 100644 index 000000000..c83512ed4 --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2010/libogg.props @@ -0,0 +1,22 @@ + + + + 1.3.2 + + + <_ProjectFileVersion>10.0.30319.1 + + + + ..\..\..\..\libogg-$(LIBOGG_VERSION)\include;..\..\..\..\libogg\include;..\..\..\..\..\..\..\core\ogg\libogg\include;%(AdditionalIncludeDirectories) + + + ..\..\..\..\libogg-$(LIBOGG_VERSION)\win32\VS2015\$(PlatformName)\$(ConfigurationName);..\..\..\..\libogg\win32\VS2015\$(PlatformName)\$(ConfigurationName);..\..\..\..\..\..\..\core\ogg\libogg\win32\VS2015\$(PlatformName)\$(ConfigurationName) + + + + + $(LIBOGG_VERSION) + + + diff --git a/cs/3rd party/libvorbis/win32/VS2010/libvorbis/libvorbis_dynamic.vcxproj b/cs/3rd party/libvorbis/win32/VS2010/libvorbis/libvorbis_dynamic.vcxproj new file mode 100644 index 000000000..d45c80ec8 --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2010/libvorbis/libvorbis_dynamic.vcxproj @@ -0,0 +1,286 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + libvorbis + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD} + libvorbis + Win32Proj + + + + DynamicLibrary + Unicode + true + + + DynamicLibrary + Unicode + + + DynamicLibrary + Unicode + true + + + DynamicLibrary + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + false + + + + Disabled + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBVORBIS_EXPORTS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + CompileAsC + Cdecl + + + libogg_static.lib;%(AdditionalDependencies) + $(OutDir)libvorbis.dll + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + ..\..\vorbis.def + true + $(OutDir)libvorbis.pdb + Windows + $(OutDir)libvorbis.lib + MachineX86 + + + + + X64 + + + Disabled + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBVORBIS_EXPORTS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + ProgramDatabase + CompileAsC + Cdecl + + + libogg_static.lib;%(AdditionalDependencies) + $(OutDir)libvorbis.dll + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + ..\..\vorbis.def + true + $(OutDir)libvorbis.pdb + Windows + $(OutDir)libvorbis.lib + MachineX64 + + + + + Full + AnySuitable + true + Speed + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBVORBIS_EXPORTS;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + + + Level4 + ProgramDatabase + CompileAsC + 4244;4100;4267;4189;4305;4127;4706;%(DisableSpecificWarnings) + Cdecl + + + libogg_static.lib;%(AdditionalDependencies) + $(OutDir)libvorbis.dll + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + ..\..\vorbis.def + false + Windows + true + true + $(OutDir)libvorbis.lib + MachineX86 + + + + + X64 + + + Full + AnySuitable + true + Speed + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBVORBIS_EXPORTS;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + + + Level4 + ProgramDatabase + CompileAsC + 4244;4100;4267;4189;4305;4127;4706;%(DisableSpecificWarnings) + Cdecl + + + libogg_static.lib;%(AdditionalDependencies) + $(OutDir)libvorbis.dll + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + ..\..\vorbis.def + false + Windows + true + true + $(OutDir)libvorbis.lib + MachineX64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cs/3rd party/libvorbis/win32/VS2010/libvorbis/libvorbis_static.vcxproj b/cs/3rd party/libvorbis/win32/VS2010/libvorbis/libvorbis_static.vcxproj new file mode 100644 index 000000000..573766b43 --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2010/libvorbis/libvorbis_static.vcxproj @@ -0,0 +1,235 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD} + libvorbis + Win32Proj + + + + StaticLibrary + Unicode + true + + + StaticLibrary + Unicode + + + StaticLibrary + Unicode + true + + + StaticLibrary + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + + + + Disabled + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBVORBIS_EXPORTS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + CompileAsC + Cdecl + + + + + X64 + + + Disabled + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBVORBIS_EXPORTS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + ProgramDatabase + CompileAsC + Cdecl + + + + + Full + AnySuitable + true + Speed + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBVORBIS_EXPORTS;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + + + Level4 + ProgramDatabase + CompileAsC + 4244;4100;4267;4189;4305;4127;4706;%(DisableSpecificWarnings) + Cdecl + + + + + X64 + + + Full + AnySuitable + true + Speed + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBVORBIS_EXPORTS;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + + + Level4 + ProgramDatabase + CompileAsC + 4244;4100;4267;4189;4305;4127;4706;%(DisableSpecificWarnings) + Cdecl + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cs/3rd party/libvorbis/win32/VS2010/libvorbisfile/libvorbisfile_dynamic.vcxproj b/cs/3rd party/libvorbis/win32/VS2010/libvorbisfile/libvorbisfile_dynamic.vcxproj new file mode 100644 index 000000000..0fa750d7e --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2010/libvorbisfile/libvorbisfile_dynamic.vcxproj @@ -0,0 +1,203 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + libvorbisfile + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC} + libvorbisfile + Win32Proj + + + + DynamicLibrary + Unicode + + + DynamicLibrary + Unicode + + + DynamicLibrary + Unicode + + + DynamicLibrary + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + false + + + + Disabled + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBVORBISFILE_EXPORTS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + Cdecl + + + libogg_static.lib;libvorbis.lib;%(AdditionalDependencies) + $(OutDir)libvorbisfile.dll + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + ..\..\vorbisfile.def + true + $(OutDir)libvorbisfile.pdb + Windows + $(OutDir)libvorbisfile.lib + MachineX86 + + + + + X64 + + + Disabled + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBVORBISFILE_EXPORTS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + Cdecl + + + libogg_static.lib;libvorbis.lib;%(AdditionalDependencies) + $(OutDir)libvorbisfile.dll + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + ..\..\vorbisfile.def + true + $(OutDir)libvorbisfile.pdb + Windows + $(OutDir)libvorbisfile.lib + MachineX64 + + + + + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBVORBISFILE_EXPORTS;%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + Cdecl + + + libogg_static.lib;libvorbis.lib;%(AdditionalDependencies) + $(OutDir)libvorbisfile.dll + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + ..\..\vorbisfile.def + false + Windows + true + true + $(OutDir)libvorbisfile.lib + MachineX86 + + + + + X64 + + + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBVORBISFILE_EXPORTS;%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + Cdecl + + + libogg_static.lib;libvorbis.lib;%(AdditionalDependencies) + $(OutDir)libvorbisfile.dll + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + ..\..\vorbisfile.def + false + Windows + true + true + $(OutDir)libvorbisfile.lib + MachineX64 + + + + + + + + + + + {3a214e06-b95e-4d61-a291-1f8df2ec10fd} + + + + + + diff --git a/cs/3rd party/libvorbis/win32/VS2010/libvorbisfile/libvorbisfile_static.vcxproj b/cs/3rd party/libvorbis/win32/VS2010/libvorbisfile/libvorbisfile_static.vcxproj new file mode 100644 index 000000000..4e363bfae --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2010/libvorbisfile/libvorbisfile_static.vcxproj @@ -0,0 +1,165 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + libvorbisfile + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC} + libvorbisfile + Win32Proj + + + + StaticLibrary + Unicode + + + StaticLibrary + Unicode + + + StaticLibrary + Unicode + + + StaticLibrary + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + + + + Disabled + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBVORBISFILE_EXPORTS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + Cdecl + + + $(OutDir)$(ProjectName)_static.lib + + + + + X64 + + + Disabled + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBVORBISFILE_EXPORTS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + Cdecl + + + $(OutDir)$(ProjectName)_static.lib + + + + + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBVORBISFILE_EXPORTS;%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + Cdecl + + + $(OutDir)$(ProjectName)_static.lib + + + + + X64 + + + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBVORBISFILE_EXPORTS;%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + Cdecl + + + $(OutDir)$(ProjectName)_static.lib + + + + + + + + + + + {3a214e06-b95e-4d61-a291-1f8df2ec10fd} + + + + + + \ No newline at end of file diff --git a/cs/3rd party/libvorbis/win32/VS2010/vorbis_dynamic.sln b/cs/3rd party/libvorbis/win32/VS2010/vorbis_dynamic.sln new file mode 100644 index 000000000..a572fecb3 --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2010/vorbis_dynamic.sln @@ -0,0 +1,56 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libvorbisfile", "libvorbisfile\libvorbisfile_dynamic.vcxproj", "{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libvorbis", "libvorbis\libvorbis_dynamic.vcxproj", "{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vorbisdec", "vorbisdec\vorbisdec_dynamic.vcxproj", "{5833EEA1-1068-431F-A6E5-316E7DC5D90A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vorbisenc", "vorbisenc\vorbisenc_dynamic.vcxproj", "{E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|Win32.ActiveCfg = Debug|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|Win32.Build.0 = Debug|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|x64.ActiveCfg = Debug|x64 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|x64.Build.0 = Debug|x64 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|Win32.ActiveCfg = Release|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|Win32.Build.0 = Release|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|x64.ActiveCfg = Release|x64 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|x64.Build.0 = Release|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|Win32.ActiveCfg = Debug|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|Win32.Build.0 = Debug|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|x64.ActiveCfg = Debug|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|x64.Build.0 = Debug|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|Win32.ActiveCfg = Release|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|Win32.Build.0 = Release|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|x64.ActiveCfg = Release|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|x64.Build.0 = Release|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Debug|Win32.ActiveCfg = Debug|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Debug|Win32.Build.0 = Debug|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Debug|x64.ActiveCfg = Debug|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Debug|x64.Build.0 = Debug|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release|Win32.ActiveCfg = Release|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release|Win32.Build.0 = Release|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release|x64.ActiveCfg = Release|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release|x64.Build.0 = Release|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Debug|Win32.ActiveCfg = Debug|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Debug|Win32.Build.0 = Debug|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Debug|x64.ActiveCfg = Debug|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Debug|x64.Build.0 = Debug|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release|Win32.ActiveCfg = Release|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release|Win32.Build.0 = Release|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release|x64.ActiveCfg = Release|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/cs/3rd party/libvorbis/win32/VS2010/vorbis_static.sln b/cs/3rd party/libvorbis/win32/VS2010/vorbis_static.sln new file mode 100644 index 000000000..c290848ec --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2010/vorbis_static.sln @@ -0,0 +1,56 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libvorbisfile", "libvorbisfile\libvorbisfile_static.vcxproj", "{CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libvorbis_static", "libvorbis\libvorbis_static.vcxproj", "{3A214E06-B95E-4D61-A291-1F8DF2EC10FD}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vorbisdec", "vorbisdec\vorbisdec_static.vcxproj", "{5833EEA1-1068-431F-A6E5-316E7DC5D90A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vorbisenc", "vorbisenc\vorbisenc_static.vcxproj", "{E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|Win32.ActiveCfg = Debug|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|Win32.Build.0 = Debug|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|x64.ActiveCfg = Debug|x64 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Debug|x64.Build.0 = Debug|x64 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|Win32.ActiveCfg = Release|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|Win32.Build.0 = Release|Win32 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|x64.ActiveCfg = Release|x64 + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC}.Release|x64.Build.0 = Release|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|Win32.ActiveCfg = Debug|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|Win32.Build.0 = Debug|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|x64.ActiveCfg = Debug|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Debug|x64.Build.0 = Debug|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|Win32.ActiveCfg = Release|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|Win32.Build.0 = Release|Win32 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|x64.ActiveCfg = Release|x64 + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD}.Release|x64.Build.0 = Release|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Debug|Win32.ActiveCfg = Debug|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Debug|Win32.Build.0 = Debug|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Debug|x64.ActiveCfg = Debug|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Debug|x64.Build.0 = Debug|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release|Win32.ActiveCfg = Release|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release|Win32.Build.0 = Release|Win32 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release|x64.ActiveCfg = Release|x64 + {5833EEA1-1068-431F-A6E5-316E7DC5D90A}.Release|x64.Build.0 = Release|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Debug|Win32.ActiveCfg = Debug|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Debug|Win32.Build.0 = Debug|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Debug|x64.ActiveCfg = Debug|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Debug|x64.Build.0 = Debug|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release|Win32.ActiveCfg = Release|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release|Win32.Build.0 = Release|Win32 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release|x64.ActiveCfg = Release|x64 + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/cs/3rd party/libvorbis/win32/VS2010/vorbisdec/vorbisdec_dynamic.vcxproj b/cs/3rd party/libvorbis/win32/VS2010/vorbisdec/vorbisdec_dynamic.vcxproj new file mode 100644 index 000000000..43945ae5f --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2010/vorbisdec/vorbisdec_dynamic.vcxproj @@ -0,0 +1,213 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + vorbisdec + {5833EEA1-1068-431F-A6E5-316E7DC5D90A} + Win32Proj + + + + Application + Unicode + true + + + Application + Unicode + + + Application + Unicode + true + + + Application + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + false + + + + Disabled + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + CompileAsC + Cdecl + + + libogg_static.lib;libvorbis.lib;%(AdditionalDependencies) + $(OutDir)vorbisdec.exe + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + true + $(OutDir)vorbisdec.pdb + Console + MachineX86 + + + + + X64 + + + Disabled + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + ProgramDatabase + CompileAsC + Cdecl + + + libogg_static.lib;libvorbis.lib;%(AdditionalDependencies) + $(OutDir)vorbisdec.exe + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + true + $(OutDir)vorbisdec.pdb + Console + MachineX64 + + + + + Full + AnySuitable + true + Speed + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + + + Level4 + ProgramDatabase + CompileAsC + Cdecl + + + libogg_static.lib;libvorbis.lib;%(AdditionalDependencies) + $(OutDir)vorbisdec.exe + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + false + Console + true + true + MachineX86 + + + + + X64 + + + Full + AnySuitable + true + Speed + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + + + Level4 + ProgramDatabase + CompileAsC + Cdecl + + + libogg_static.lib;libvorbis.lib;%(AdditionalDependencies) + $(OutDir)vorbisdec.exe + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + false + Console + true + true + MachineX64 + + + + + + + + {3a214e06-b95e-4d61-a291-1f8df2ec10fd} + + + + + + diff --git a/cs/3rd party/libvorbis/win32/VS2010/vorbisdec/vorbisdec_static.vcxproj b/cs/3rd party/libvorbis/win32/VS2010/vorbisdec/vorbisdec_static.vcxproj new file mode 100644 index 000000000..471c332c0 --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2010/vorbisdec/vorbisdec_static.vcxproj @@ -0,0 +1,213 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + vorbisdec + {5833EEA1-1068-431F-A6E5-316E7DC5D90A} + Win32Proj + + + + Application + Unicode + true + + + Application + Unicode + + + Application + Unicode + true + + + Application + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + false + + + + Disabled + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + CompileAsC + Cdecl + + + libogg_static.lib;libvorbis_static.lib;%(AdditionalDependencies) + $(OutDir)vorbisdec_static.exe + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + true + $(OutDir)vorbisdec.pdb + Console + MachineX86 + + + + + X64 + + + Disabled + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + ProgramDatabase + CompileAsC + Cdecl + + + libogg_static.lib;libvorbis_static.lib;%(AdditionalDependencies) + $(OutDir)vorbisdec_static.exe + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + true + $(OutDir)vorbisdec.pdb + Console + MachineX64 + + + + + Full + AnySuitable + true + Speed + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + + + Level4 + ProgramDatabase + CompileAsC + Cdecl + + + libogg_static.lib;libvorbis_static.lib;%(AdditionalDependencies) + $(OutDir)vorbisdec_static.exe + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + false + Console + true + true + MachineX86 + + + + + X64 + + + Full + AnySuitable + true + Speed + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + + + Level4 + ProgramDatabase + CompileAsC + Cdecl + + + libogg_static.lib;libvorbis_static.lib;%(AdditionalDependencies) + $(OutDir)vorbisdec_static.exe + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + false + Console + true + true + MachineX64 + + + + + + + + {3a214e06-b95e-4d61-a291-1f8df2ec10fd} + + + + + + \ No newline at end of file diff --git a/cs/3rd party/libvorbis/win32/VS2010/vorbisenc/vorbisenc_dynamic.vcxproj b/cs/3rd party/libvorbis/win32/VS2010/vorbisenc/vorbisenc_dynamic.vcxproj new file mode 100644 index 000000000..68741de58 --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2010/vorbisenc/vorbisenc_dynamic.vcxproj @@ -0,0 +1,217 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + vorbisenc + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C} + Win32Proj + + + + Application + Unicode + true + + + Application + Unicode + + + Application + Unicode + true + + + Application + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + false + + + + Disabled + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + CompileAsC + Cdecl + + + libogg_static.lib;libvorbis.lib;%(AdditionalDependencies) + $(OutDir)vorbisenc.exe + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + true + $(OutDir)vorbisenc.pdb + Console + MachineX86 + + + + + X64 + + + Disabled + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + ProgramDatabase + CompileAsC + Cdecl + + + libogg_static.lib;libvorbis.lib;%(AdditionalDependencies) + $(OutDir)vorbisenc.exe + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + true + $(OutDir)vorbisenc.pdb + Console + MachineX64 + + + + + Full + AnySuitable + true + Speed + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + + + Level4 + ProgramDatabase + CompileAsC + Cdecl + + + libogg_static.lib;libvorbis.lib;%(AdditionalDependencies) + $(OutDir)vorbisenc.exe + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + false + Console + true + true + MachineX86 + + + + + X64 + + + Full + AnySuitable + true + Speed + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + + + Level4 + ProgramDatabase + CompileAsC + Cdecl + + + libogg_static.lib;libvorbis.lib;%(AdditionalDependencies) + $(OutDir)vorbisenc.exe + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + false + Console + true + true + MachineX64 + + + + + + + + {3a214e06-b95e-4d61-a291-1f8df2ec10fd} + + + + + + diff --git a/cs/3rd party/libvorbis/win32/VS2010/vorbisenc/vorbisenc_static.vcxproj b/cs/3rd party/libvorbis/win32/VS2010/vorbisenc/vorbisenc_static.vcxproj new file mode 100644 index 000000000..9e8e1ce00 --- /dev/null +++ b/cs/3rd party/libvorbis/win32/VS2010/vorbisenc/vorbisenc_static.vcxproj @@ -0,0 +1,217 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + vorbisenc + {E48B6A8B-F7FE-4DA8-8248-E64DBAC4F56C} + Win32Proj + + + + Application + Unicode + true + + + Application + Unicode + + + Application + Unicode + true + + + Application + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + true + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + false + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + false + + + + Disabled + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + EditAndContinue + CompileAsC + Cdecl + + + libogg_static.lib;libvorbis_static.lib;%(AdditionalDependencies) + $(OutDir)vorbisenc_static.exe + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + true + $(OutDir)vorbisenc.pdb + Console + MachineX86 + + + + + X64 + + + Disabled + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + EnableFastChecks + MultiThreadedDebugDLL + + + Level4 + ProgramDatabase + CompileAsC + Cdecl + + + libogg_static.lib;libvorbis_static.lib;%(AdditionalDependencies) + $(OutDir)vorbisenc_static.exe + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + true + $(OutDir)vorbisenc.pdb + Console + MachineX64 + + + + + Full + AnySuitable + true + Speed + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + + + Level4 + ProgramDatabase + CompileAsC + Cdecl + + + libogg_static.lib;libvorbis_static.lib;%(AdditionalDependencies) + $(OutDir)vorbisenc_static.exe + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + false + Console + true + true + MachineX86 + + + + + X64 + + + Full + AnySuitable + true + Speed + ..\..\..\include;..\..\..\..\libogg\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + + + Level4 + ProgramDatabase + CompileAsC + Cdecl + + + libogg_static.lib;libvorbis_static.lib;%(AdditionalDependencies) + $(OutDir)vorbisenc_static.exe + ..\..\..\..\libogg\win32\VS2010\$(Platform)\$(Configuration);..\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) + false + Console + true + true + MachineX64 + + + + + + + + {3a214e06-b95e-4d61-a291-1f8df2ec10fd} + + + + + + \ No newline at end of file diff --git a/cs/3rd party/libvorbis/win32/vorbis.def b/cs/3rd party/libvorbis/win32/vorbis.def new file mode 100644 index 000000000..9cca64dbc --- /dev/null +++ b/cs/3rd party/libvorbis/win32/vorbis.def @@ -0,0 +1,59 @@ +; +; $Id$ +; +LIBRARY +EXPORTS +_floor_P +_mapping_P +_residue_P +; +vorbis_info_init +vorbis_info_clear +vorbis_info_blocksize +; +vorbis_comment_init +vorbis_comment_add +vorbis_comment_add_tag +vorbis_comment_query +vorbis_comment_query_count +vorbis_comment_clear +; +vorbis_block_init +vorbis_block_clear +vorbis_dsp_clear +vorbis_granule_time +; +vorbis_analysis_init +vorbis_commentheader_out +vorbis_analysis_headerout +vorbis_analysis_buffer +vorbis_analysis_wrote +vorbis_analysis_blockout +vorbis_analysis +vorbis_bitrate_addblock +vorbis_bitrate_flushpacket +; +vorbis_synthesis_headerin +vorbis_synthesis_init +vorbis_synthesis_restart +vorbis_synthesis +vorbis_synthesis_trackonly +vorbis_synthesis_blockin +vorbis_synthesis_pcmout +vorbis_synthesis_lapout +vorbis_synthesis_read +vorbis_packet_blocksize +vorbis_synthesis_halfrate +vorbis_synthesis_halfrate_p +vorbis_synthesis_idheader +; +vorbis_window +;_analysis_output_always +vorbis_encode_init +vorbis_encode_setup_managed +vorbis_encode_setup_vbr +vorbis_encode_init_vbr +vorbis_encode_setup_init +vorbis_encode_ctl +; +vorbis_version_string diff --git a/cs/3rd party/libvorbis/win32/vorbisenc.def b/cs/3rd party/libvorbis/win32/vorbisenc.def new file mode 100644 index 000000000..4f800f68a --- /dev/null +++ b/cs/3rd party/libvorbis/win32/vorbisenc.def @@ -0,0 +1,13 @@ +; +; $Id$ +; +LIBRARY + +EXPORTS +vorbis_encode_init +vorbis_encode_setup_managed +vorbis_encode_setup_vbr +vorbis_encode_init_vbr +vorbis_encode_setup_init +vorbis_encode_ctl + diff --git a/cs/3rd party/libvorbis/win32/vorbisfile.def b/cs/3rd party/libvorbis/win32/vorbisfile.def new file mode 100644 index 000000000..57b48f3fd --- /dev/null +++ b/cs/3rd party/libvorbis/win32/vorbisfile.def @@ -0,0 +1,42 @@ +; +; vorbisfile.def +; +; last modified: $Id$ +; +LIBRARY +EXPORTS +ov_clear +ov_open +ov_open_callbacks +ov_bitrate +ov_bitrate_instant +ov_streams +ov_seekable +ov_serialnumber +ov_raw_total +ov_pcm_total +ov_time_total +ov_raw_seek +ov_pcm_seek +ov_pcm_seek_page +ov_time_seek +ov_time_seek_page +ov_raw_seek_lap +ov_pcm_seek_lap +ov_pcm_seek_page_lap +ov_time_seek_lap +ov_time_seek_page_lap +ov_raw_tell +ov_pcm_tell +ov_time_tell +ov_info +ov_comment +ov_read +ov_read_float +ov_test +ov_test_callbacks +ov_test_open +ov_crosslap +ov_halfrate +ov_halfrate_p +ov_fopen diff --git a/cs/3rd party/libvorbis_static.vcxproj b/cs/3rd party/libvorbis_static.vcxproj new file mode 100644 index 000000000..2579ffe8e --- /dev/null +++ b/cs/3rd party/libvorbis_static.vcxproj @@ -0,0 +1,215 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Mixed + Win32 + + + Mixed + x64 + + + Release + Win32 + + + Release + x64 + + + + {3A214E06-B95E-4D61-A291-1F8DF2EC10FD} + libvorbis + Win32Proj + 8.1 + + + + StaticLibrary + MultiByte + v141 + + + StaticLibrary + MultiByte + v141 + + + StaticLibrary + MultiByte + v141 + + + StaticLibrary + MultiByte + v141 + + + StaticLibrary + MultiByte + true + v140 + + + StaticLibrary + MultiByte + true + v141 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + libvorbis\include;libogg\include;%(AdditionalIncludeDirectories) + _USRDLL;LIBVORBIS_EXPORTS;%(PreprocessorDefinitions) + NotUsing + StreamingSIMDExtensions2 + + + + + libvorbis\include;libogg\include;%(AdditionalIncludeDirectories) + _USRDLL;LIBVORBIS_EXPORTS;%(PreprocessorDefinitions) + NotUsing + + + + + libvorbis\include;libogg\include;%(AdditionalIncludeDirectories) + _USRDLL;LIBVORBIS_EXPORTS;%(PreprocessorDefinitions) + NotUsing + + + + + libvorbis\include;libogg\include;%(AdditionalIncludeDirectories) + _USRDLL;LIBVORBIS_EXPORTS;%(PreprocessorDefinitions) + NotUsing + + + + + libvorbis\include;libogg\include;%(AdditionalIncludeDirectories) + _USRDLL;LIBVORBIS_EXPORTS;%(PreprocessorDefinitions) + 4244;4100;4267;4189;4305;4127;4706;%(DisableSpecificWarnings) + NotUsing + StreamingSIMDExtensions2 + Speed + + + + + libvorbis\include;libogg\include;%(AdditionalIncludeDirectories) + _USRDLL;LIBVORBIS_EXPORTS;%(PreprocessorDefinitions) + 4244;4100;4267;4189;4305;4127;4706;%(DisableSpecificWarnings) + NotUsing + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cs/3rd party/libvorbisfile_static.vcxproj b/cs/3rd party/libvorbisfile_static.vcxproj new file mode 100644 index 000000000..a956fb033 --- /dev/null +++ b/cs/3rd party/libvorbisfile_static.vcxproj @@ -0,0 +1,156 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Mixed + Win32 + + + Mixed + x64 + + + Release + Win32 + + + Release + x64 + + + + libvorbisfile + {CEBDE98B-A6AA-46E6-BC79-FAAF823DB9EC} + libvorbisfile + Win32Proj + 8.1 + + + + StaticLibrary + MultiByte + v141 + + + StaticLibrary + MultiByte + v141 + + + StaticLibrary + MultiByte + v141 + + + StaticLibrary + MultiByte + v141 + + + StaticLibrary + MultiByte + v140 + true + + + StaticLibrary + MultiByte + v141 + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + libvorbis\include;libogg\include;%(AdditionalIncludeDirectories) + _USRDLL;LIBVORBISFILE_EXPORTS;%(PreprocessorDefinitions) + NotUsing + StreamingSIMDExtensions2 + + + + + libvorbis\include;libogg\include;%(AdditionalIncludeDirectories) + _USRDLL;LIBVORBISFILE_EXPORTS;%(PreprocessorDefinitions) + NotUsing + + + + + libvorbis\include;libogg\include;%(AdditionalIncludeDirectories) + _USRDLL;LIBVORBISFILE_EXPORTS;%(PreprocessorDefinitions) + NotUsing + + + + + libvorbis\include;libogg\include;%(AdditionalIncludeDirectories) + _USRDLL;LIBVORBISFILE_EXPORTS;%(PreprocessorDefinitions) + NotUsing + + + + + libvorbis\include;libogg\include;%(AdditionalIncludeDirectories) + _USRDLL;LIBVORBISFILE_EXPORTS;%(PreprocessorDefinitions) + NotUsing + StreamingSIMDExtensions2 + Speed + + + + + libvorbis\include;libogg\include;%(AdditionalIncludeDirectories) + _USRDLL;LIBVORBISFILE_EXPORTS;%(PreprocessorDefinitions) + NotUsing + + + + + + + + + + + {3a214e06-b95e-4d61-a291-1f8df2ec10fd} + + + + + + \ No newline at end of file diff --git a/cs/sdk/libraries/ogg_static.lib b/cs/sdk/libraries/ogg_static.lib deleted file mode 100644 index 09cfe09d88536b1ab07072a6a6962e2669f5eaed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27042 zcmeHwdwdkt+5b#-NEWh?1r`htWP!-Va0vv$C0uf2i9kXikXV5%5CTL(0?7tJLm;fd zOvbgeDr%{Ut@>&$Emj+$h$aLGmlp|O5sO-&77;3!MSZX zj!WRU&@=zJV|*gV{pXMIG zm+2zqB(?m@<}J!CDAceN=N9G7%hyG%$So?)D=d&f#jc{<9B2c(Whw^1f z!7R)#DPF8Yaov~|u+368Yx#*Jeim~lN>sGmzU13<+4#1vm?}io zseJuNQJ$^@?0Q~)-XghrH6Xu6wULF(kcuuENLHT6s7LG@~tBVX!uBgg4gqr_=7BS-1e(&*(!kL5AZ zvFcbJgu(nwD90s^XM;M&-_>6bclUq)9aWwG9aR@O*|7WHQI*XL{~c9jyWs!tsM=^) zZPr3o4P^V=Hq%GX&Pbj-du86T#j}fxa%Sh}&4)oaaLAw`gNDw2B(ET5=d`6v)&_l#kuV1!K%rwTJ8ZX`ytWMv9Xv3hQvgV z8p^P9+f3md+!J3UCk^S%aXTC(Um@@|+W0ztbqeXf$OL%m}~;6vaJ zD_9=a@m8eUh_5Z;KW!o3S>Ud;fRCfZH4-R)ZGr2qVDFT_zAfY%23&G8e3i&oS_}D( z19!F=zMkN_)Iz@Y?K!R|4w69SCB7&H!+Wh0{jwRp`QUpU z7;^_XcT|o*`Rf2oFAc7#_Lq$32LQ87gA2s>C@@tTTvL4A!S@U>Z!0*m>;m!a0p`!m z@R9!h3QVhx2te*s-Y{T#XmCyCFCHBIfyvY00_Cq57`F!36yLAF=K*H04FSlV%9{jC zhJp*!{yexb2blAnn&-O>OuNo9E)ZWNG87KXm~a`_8XtkmyAhbz6`33z@hF#pov z0`Yl)3F~s_{Ly&YMZw6(!1;>=ZdfyXJwYT0-zYfK9r*SEbD|l(2t0pA!63*aQ2uTM z*RGq43DjQfxDgJ_NFs*#^4DnoZH0T83Wfo3inm6`H#M)$0&a1OzXk?{+_eAh$HT`)cZ>1Cju*rycDS2T35lDY&=F zP6)pQ;@e}#xQl}%5ML(l{nbtgzXakN-jm}d;2;Ua7mOQI6^xAJ0_tyOFOJK_K@y0M zhQ~r+9@pRkPN))1~5A{xIldMz?HN{8v>1klv!iFWGas=YL2bjJZ z9PtfKp5REBIc3I_2NFm3O3lbjnm(hKT^BiZN^)94>V%A5_8@R4bFDdZ{mz=PKi+KD z82ux;j#iq&Lb$eE8?Kc_KKD$`%PA@>E?nrc_nY3|K6RNZZ)x76SSQ$%3YRX+%f~xQ zChv8x6$;|kwf?kEQrpi~2pyL!*>leyQrCBFl|J#_ZQq#tgk9R->-h1i!SfDIj#{wE zGW^*3LqpnZern9lol{3HJK26p{oaO@drv(*;mupq6Mnm;le62_k7w=L_*`a*lsSE0 zY?p`EM4c#jz3rx)_ST0M+2Xse`t_X8RzLdK%gYWe%yyls?)`k$TW5axl;@S7joL8x z*)cVJCF%3CKb?N_wRL|#yI}o;v!Xuu)^Yw%v2)*iuYC35cOD-&cuP$5#W&A)-ty|4 z(EQCCmJa>6@3PAcw==hX{=nqrpHAr(TYoe7YF#h;yB|F}w&Xy+wWGg(`Nf-896Pq% z{O$FuF{2i_|OAw zL%SsZsq=~W=k~t#Tl>icZ(P6C_qDWBXJ47T^_35Q*fMv=eNyl0pKm<#hrv->s-BO{ ze=5N`*nOq##V0P$dGm$j_{A^2xG-wN{g0i0=Bw`So=WFRz7+e!emySk>NjyqwqAa6 z#qz5&(}&(TlY05K^V0i!&waCc*N}tb4zEA%J?LJ)?a#wDtvd3}&e5MewE5EAk zKe=^i>DrS|%^k6K>Vlyg&5u?{`^#o;sVcs(b@C&bZH1|)t$QYqj9u^eY1G8Ts>it5 zV;9yw_+|XMnHh7Ero9x`{l5NvKI?gjdwIab?%DkkQ@h0eEB(aK0V_6*-?ZeRxIV`_ znSOTg?_xkDG+hq>^Zu{hm|C+mW%e7CI<^OQh z9(5*n?D@0rcYE_fXz=21t9SJMgn#|)u@h@w`=ap01%G+?Q19KJH=L;vuDo*SoeOjK zmwCqR+`qxQ-CF(ryZ`gn>aD-JIr?{<&ffgZ|JH2#pT|C5_3OQJV>c~def8xxX1)9K z9*&ZYT{{o0+!A{EN!P%w<#o}^D_+=8HD{1#@=vb5Wu6gVy+3`z*{9OJzd3bM)aRCo zzpOcw)N}Q^$2QJQS~Jzb6p`o)tvPt1QhT9_9(a8K^nlQ*@`&U~oT6U(}U zM=w1QF?{UHLF??UrSe9JXw42mA|bxKKHBN zU+R56{F^fuyYGDM(r-2|_-FC@zSnneI(w`2t!?55r&f6u?H#?g;pEN7|17=#i}@Q@ zzqDiPxTh^!ywAOD-TM3Bw#(o8Yt+!!7sp=y)zXFUzWS!!bSJE`>k%>Jsy?W1YWtHQ9CUectT4dq6c32iaO2 zH=mtpg(bI^5x5TFvZPYv!s{9#g;dmJO2Y}{3QqSPckdRYiPnl5|Aoze!SWkZbNQ|8 zm>Opty*?O+Lr#ZQ#3b|`1PPVMUs`MCIf~5mlEJ{acbh4<)Y=JV<7hSOr=rC$iAt4( zFseJ#EI9DybM;NA~CgIOI&JRe%U4WZn`}1Zk3(Vm!%a zyOd@XNwZmUH9)=7px?}J(^2|kdbdr7%H6wxvpMU?cK4?d&zSwEGz5{xlt>}wXxxFY z$DhV^#>`Am#i)dtQyCJ9mOh?JEl1JJ-whCeplftDWD{AGqG&x+#u$lJL z-?Zssl9d{fI?6iEHPan3`F2@d*6{M=+O-v%e|QTM&{Ut_Q2S2N4e8rcvv2 zMcT5YvWRjoWx1@?hpdokHi?&}2{9*QzKOdj=0}E$vm>n~W@k2~@{_tzFHHeq$zY6g zM=QK#ndm2;1(BT8zx?m?xVw%ozeR!45O=K*_t(<1XddAg2FIKPxPN(Rq?H=bnjR7c zF5B}GUw($b{0uaqX#yU0*P8LrCt$62^ds+!y^aCgUdKT0N&?T92ng}+4=4v*iLf?p zV37L*(gNpdJt{kb#R&E5={7~aZLV|-VnYmt2Kz$MzR(a~Xs9m~;|mRAp-RVaX+4dl zm5$ijYaklI&Li1*l>37jxaBQrQ@@@9BoYgG(s^+sMO8XRGiV$;k74JrF*Ow@_d3R* zWaDwf<4E8tvlGjDT?qDUVkBwSDoc4-^^wXc!AY1zOy}e3O3zbuV33aRIQoepo}_N# z`edXaP81}E#S|DG}w@sm-jmR_u4Rc5h>i!DWi6 zsS{y0eT_Th%fvbXnLt=hv$Om(y|kQCtXPjY>vU@)}t%|{sA#b8WPqQfjYFjLd)fr*BuKK+D8 zZ_7y339lGoKkZPWRpus|mN5^3S^7xi#RNf2FpCKmF~KS(*fPb0aCX;8Nsy-fbLx2F zhp0)cL|91z4GP)r+23Kt6kBn$%qq2;ZmPu`s7$MtdWSq{6F|VkW{JY6T^5t&dEZPG z#j@w>*>ydTxZF;rA|#JrISBc!7J5HNqFODh5mqWP z#VpN;G@A~@r3hsL44yhvl~O&*%P2f0%R2Uy`yW<$1hk{1Qnoou8W(fabS>({s7zZ) zocm_C(s(Is8$A(cE-4GEp4!!u*A4UX=V4ENN|6W3I)+tG3F*eCh0{&+(74*tZ^Qzd z;c<0kZR8OX(@vdK*jdc#j5|_VI2x(VgW=9pKOMcfA5D#jiV&wn+F2L$BuDm> z%v764Z4EJR54^N#g>rdJTORr*oNh>MMY-%UfMxj+%qFkPdmsvSiH*IX$ zc_$lhvg=p_b=Etq)RCCcN{bL;v~j(CAq2P-IzfUIi*5tLA)Nak{ZQa&DZwmFvt-Pa z`a`d<{wE0dwBxf?rU<=fNe$99_n9E~DPdZDa%3{`xWD3Y%MP48HNgH~+8!|@!>VV7 zA$Ay^Zda9Rg}D2gfi|zGEkyI$y4v}$g znz%|r+@+EIxUx`GF7%4}?NQhZo-a{q2Tte*bpCdl7dN)URBFKrihp!D+# z)Xl8~B-;g=N+pXiNiZFk7XZ=3oG!|yqB2sExyUR&FiIccxp3)-Z1^1@GG_SkFik<~ zKJ0~Y?kPi>o(DK6EdnMrG9=r9qOg$#Z1uu%FQh*CxImw-&hq`WQ#SIv$F@-|5zG5( zBp%_0B7jlLv)UwP*yB(ErN4CJ@eZ&Ik$N<8GfcEx6K7l#kn{k~)g5Z9sPWr*Wftgf z?UeFcL7wFD9{{&Iv#}VMBeL3qbw(BIK<25p*tqRD%LD3ZU+AVUGy)Y)s}dX69wVdQ zTnsjGcwI?-Oa7{wy1zWgViIg}{tE|!1cXd}fpg<0BE%HCm=Y;gGJB9{)Yqq*Sc?zmty0y{h~SB~^Z!)L4F-HTxNn78){221qjn_Z~qy0P^zF zbnD9AAeR~K%tFtYzLO0i*9kNUOT|f7te9az&?=&Dq*zR5F;v>Xbej<_$?C=ODcvSn zZithu(u^B|m|+u(snLaVu6y`p7F{8fGAL#tD+hAG(U%aU8?4UQ$p0q7a(&RM(DE?P z1{MsJv+BrDpxd%J#=0f0f;jq~isOEVL;E1t(g)vR53*M$zV$xZXge`Y5Yxc#flLSY*26w*ce|q`vgeQ66I- z@i};(KPYcOD~pq(^_7W>Uzj`3H7GioTCg0Wb;O}q6R+mU&!lz2A$^148v*NXXuWJSB+q2-7}cpDMuu%dhsc6c2t`7OGK(b6HoV5 ztiUQ&%S`WFOuYI!(LC`HI9#acUbsgRY+$CBV|wOb1GAZ7ROW-WherFEV~G}GHZZqF zte)9yV5WBB&vWWKT)v+O3@A5N0sxVs( z%;bBcXSN!cX~ARS)%S7s`v>jtGn4U2(!s#o5wUva4hCi#YE1lmoOv8uK70ZbA%#fT zOEi4i7&FDt5TuH}h0|cAPs?UV3mzfBP`jWMe)Hlh8~tg$j~J59zO+7)BiLD=7QLd? zr`6ez7R|LLzB|q|7D(@{z<{Ba>o15Q31?|(`)L=%>Y2k0%xH+fP+bt;#-D!$HLJ`Q z5kt}y%rtgj{9OpCC!BAkx5mAMWazBMr>dmi%){PQ~yq{LJeV<~|1Iz6Rz#2IhVY z(-UWsA*;9c_cQ-oVeV&O2B=Y<`x%(;XP6kAiRO!FdatYya<3?X`wh%d2Il(>%rvu` z`0)z!n^$k8_?h2Um+aJlkS+qsc3T+?PsVC}YNL?y7nVVe}@A zyA#!viEl+9i1pa)&2s;wt5(!eA%xNQ!C{Ee=WwVYhr<~LmBjk{Z$C?V+n+g)pLwXlJi@>{(!e~zz&wg!)b$v5`7k<)s=5gZ z^C$!JXan;o19Ke1Ou?CC!3+t*hRQrsVU9B}j{#P%jW`4IScb_YT1fxD|Kqx!d6B|A z*1$|wyq(ag$=G8o}Q<%qt*`%{+;|^r-BAqR z4PSD8iO;v)xA8Vw8KT`-tBKKU^;I@wH`ayR2%3)d?>m-J%9iNCvGQ&iyCQ-11^M>Z zM2{Fbl3{6o%>!(I%}v*kAKTBV1GaYu*6Q0E?E41q;%nA*zsr(V&T3}w%-~#cz0n9cHt|`7f;M)bv z6Z9?sa;Nfc0_H6R7pS~F!SP36j<8~HuB-)ol`Z7^HE{1V!$(WKoxq&d-~#3E0x&ls)?UkPv(E#UiU3;EsyuD%(*myw?%z$}wrWZ$v8j{;Mr!8KLh zUx4o!1w&;e2~^%eur|k$#R&=2{;2<^C>RFBDG=X6;8rxlXUFqvTgbN=xUJ3bQG5AQ z3;DhP?qUo0uC9iEtpv(n58wtX*g$+_j*My{p98qeX80(7b6d!_0=V_f z@KOFYw2<#b;I=fwX9nMUE#&(UxWg^r`?Q68r-A#f5ua`gPYd_;Y`ytL-M_J~N3$LO z?)LRiTcTH9^aU50i!|np$FT;7mkt2D0C)lL0^kL}3xF2@`qIz~fENHS0A2vR0C)lL z0)Q{k>ELmgaD?Cp!_foBcpPhRfB|DVjv5@Na9qN14F}#caJO*~fPJOf$eC<0^(uIj z$zCY3^BTTZ-AlgdR=Ss6N7D~kT=Z6p<3_MEbw(<({4Jv58T5ZmP5lPnAmh7yxb$8# zNex&3lIaRkgDJS-z?7I8#N!>%v>p+Tz1ab0;fDE~RgOHYF zO%vJ~q5M^KJ2+*M^US`i(n$E$wIcnbt3F-r%4KcBvB0#Cw47#v8h_vvl`hy$-7_jpkQ$DicYCc;nx%3YUz)m|jC5agIExM{ zjonUTr7s%Z?m(MLd%%~k;;5_rc01iYfV7UCt4tIwguqE|Z@j=s^)I;3gt)&7G3|n) z@oo)nV`Tzd`l#;v;0R{EmwwHjL>!5UlNUXtch$r2-%^CEgx=7HoX5k*PDyEk>AJf% zoC*%jSj;myXk8UscK^gBIOu^BA8N15l2t`NJY@>6<87Ul>uvF z!Zwyfg5bVpUTsN#n45MEx3C++Qb+BY6egR9q+$}eJK;ZZAlwoLN~vjv;XVebmg?2C zYi5>ot=4Oj>aU(~mkFFlsD&Sx#T6Oz4ZOGWWY6TVYD?6^=4qMU8Q5#Ghet-^zAZg} zVWQO8BaHT>@NsF@QoFxl!^2haTx+Lo)R~s745iWY@N05dz{8K*i}sBK;dvSbZxkDs z?&=&?ZR_#2`Tl*!&QF(<+--5rsSB$XdZcTv7oaF|`&*3=86t8=q$MbcN%2ylcim7L z(qLXH)FUkqV~-6aUDbQ`tU4OTNb|uQnMd@HtihfLk(ii^6vxFQY@p+tq@!wRj&6cV zC&1?!p2mB5t{zbsW6}2@b#$V^i9~G&lMrTk_%RPnWe>>%lEbX{7V4a5n9qz=-j6dA zXjz|R!jq_@`V55C{(Lt)4>2Cpix9J4Y7pCqlLT>+S)61MCy~3K>~>8)dgOi0)X4^1Yvla1J@?$fP85$gEObgg06ZXtU60Lc0P2MbnwV^=dp91$$a*a z>vN8so5d>b7sw1r5Z9UIxd35B?R;E%!4MWj-K?W!@>ug(jRk?ZXg!KVoBl|o3Fg-@~YW^Fg`fx9GX zrk_AquG$~@;FIh@wpB~Y5a2;dg|#B!Z>dF0n;BNUSZUQ%@3-7&7HHLrl~%39u~xlUY1K*`wd$kPs^gVbec;%s z&}(yglXVlS>Yp^2WHHr>Ce#Fc+2NIl(U@M#_}e_Kf=Pn7ds+MW8N%3#rfz2+^4j6Mq9vxRKWR?69qK+ntW1N^^!(Seo3Pyzoh9VpCLDS+Msjj z$aS>(RGvPh6H=JAbQ4iJluZl~AA#L8M?#lICVl^!D~L0*LTyAGYI{bckSPs~E3%fh z!WeU*os@{&a#fRPj5)=-69wM=C|ZxzooM0Rd-?iAHcf~_<+exDAPLXDvg5c-2pdVQ zGAX)E3u(!)AyH{JBP@3(306!^h}@M>l_q&(GMO=1_X7{AWEy-%zsA zaQ^jUauDB>7B3l@$UTlr6FXRpf|FykK8@7oOgydkNP|mLE8w)G>XNlb#LB*-2rz?+ zK1uZ7kGDdM{#)!o-lR>ZMFty5FlTSXjJ0$l=0M)01A(NxKYeod*ZxwBLJY~>c#}5G zoGKIFl{e{0aL`v5Z64eP$5mDH^A%>3w;*F1GSz2*b?m#S&4e!Y0JKdrTR zp5$))OKEziycey%uF?DkqJ`Xze`(Xqugb)CH4Qp{19 zW#3V4Yw2xZ4&*7?G;^WCd^et=w3s29E_L%S`t$sM;VG&vIi9`$*g-$@1|`pT<0+~x zN-STl&-63DtT5k=r>Gs8Ajvs44HKh6$o)NIwwK|fGXXdZ*Gk>5k-;JlJ%G@Q? zbKTE;P+`6sPf>L>^ur$>M%P!h@u?D!Jw>(c8N+d-K4|pt9L6wBGk>Kp591p5!Qlqx zVFq8jScaj63elKc9WVRyd_`f7H87J^qaQb74a_4MW(UqBuE8TV`I!Zp9v~wP%w)gl znMWF!M>9+u5kRWa_x@|Xxb`sf|BQW19Jkfdggco zb0Whuo#&|vbE1Jc$-tawU`}S3rt|Dnn3E066AaAB24)AtsOzNLPkxc**G7TD>@YA- zG%!01%qe$ZR(*6+49pK0m{S<@bI1$*PK*D)iU)B2BtT*_zrmmqDY!;ISfTt9L?b^? zC2i%AMtRZyP=tcfNBVy$!nrs%e;NINiO=KG=NsxTU5@rAB@{wkT%+HwNNjYiBq#rx zjhv9r2UepZzXvHxntn9H=VL0v3{m#f6*Sa4A(f@>s{-;6MJkiyLGJ#qM{9MU|os@t*u%kwH5`fR;$#F-}igwS?0Oi8v@$*{r^9ocaoWVX6BqT zbI$DZJkLzOlS^t!mrRTq7Vw(k!_&u%8j~?*Y`Ql*&GHT(nLbj33u2T~SxUwJ^?%P^ zm88`FzMV9wI483>ZRFIcQ?h4FFU-lDxp?uMNy%ARnX0&I@#5m@lG0`6b;YHX9X4T<;At-b!KqYin@vw_2p$oShH~ zxO_#G!KJpmrlO?M6ST6trnaJLg+{8at0^y8ZsytwDJut1b*=}?$&!V$sItCxi3g)% zMTI4og`%@q;Z02kR@H|>tu8NL=3z;Z4x?XO9!y`QvtQ-t|%>DSifjd zxm89IV3e8oy|RqE45q z#$9-BUAgIBjGAVMp^+-9s z1Ig8>8CX@V>yr@{l%jB~tEpd6>gd9wCwkmW7kji+>{U{62ptuBR3tuwn@2$?K2ty9 z^<>s4U&@2xHI<{iUft+0uWGC?Q!_fqo0g%MqwdQ`q-EHBxeuNBUt^U@x=K2A74f6~ zeCo&l{a>$I{C~ab;$rD`|F2h-apC`ZRXs2GpY2tHy454jkkjqC@`9Mzo4(!urKUi)u=iSFBi^TD5Sg zI$Bzcc&jRE%Y}BBodtW=9%fcQJS{CF17pC5k)uY97Tg6f(<7#+%l?|16TeWYy%87| zU{cF!%1i53mTR9<69KHjXyGw2@xY@P$#d-R>)I>zB=F{R(IFgVGF5zbYE4;5U5Sl_ z-$!}^{YU9;ez0FHv{D^#OGsuK;wtajAy!a zrO9&(&X7PjNLDQZ&Qc4H;%3IDWeVODFJ2vRRtMt+?oX6xhJii@?FYDDhzhzL^2HT<#e}3O1^SjQ%`CNWO^ScFX`~jtI zgQW>q9;}Po18`tQ^`jdVQrmL{CMvk~__aApovYB{VwjJ&r2?@Gjv97Jy6 z`DLKK%m&WJ!Aji#>r?R|^Y=IK_zv;!4H0&b!)m`l?IX#jRKkf$4LM1vGhy4Q?jia8 z8T5Zg{4*(4hh4q1BsQ%><;H^je$YHJXyBg86f%743WLkLrv3v(3 z{#{s_aQXW;BEALAXCsx$7^PHub#lo3oew?Vl%Z6QF`6H`VXOc1_Pf+;v4x{CiHH6# zNY7UwvJ7}%!bXn`ua}2`HxTh}!P112gZ=nd7EbawjTuVMHzO(o@oxxDcz#oX_XTh! zj7J{>8?M}L0$vs3JDkik!}BXb+)&{B4E7G#aP^+~dkOJNCXicrer!jV0Ou{(uVBOR zW4r7*QK_e3X~OAmKjQujoaZMgbpSR}bqZMzT7Wk>6J?SG047{JnvS^n7S8SR8@k^A z7I@DhzBZfO!sqV>w96}jlai;@6R;iCkdXQNB0{MLCo6SpzUId%fQ-{Y^=~D@7fey= zP1uiNeJVC2zqf&R5-LOcX_{X+dH)ot)L7ue7os16?Wm@P!ezXRR@#NSJSV8Z1u7jZ8Er^6Xa^@H^RGgSM16nG;L{|{K2aQyy)deH7n zjq_d+fBS~yHwSpvorOG}t#O@xEvUXQf9b^-Ghr`<4VS;ifOiApXD!hD!sQQDL{$Oj zcd+lm`qAP-$;WnVU5uH)rOIxl?A$%L|}VtIuJ(quS@Fh=hMto%_hq zt|H78$gW+H-4d`5gh9W9ic#(2v|CV7T2ob9wWuyIc=nLM%<8&|WsX(f%LSr5k;q#jxJhQ zv7)H7GPQhlxhh>=rc$P~DqO{i(#ra>@<2-NX;Ws5NXKt+ZeI4hQwTt{ft1td*VdJl zELxqqB#<(>x>a5wmTKJCua&i1YIP|&R2?k`(3I7TE2=G9*6IRLCsHgmsHkFLO3COE zWeZcQ%N7PwX3xzT9!NQ3N+6|RZdoAZv=M=ny!=`^rGblkP`i|^m6%lqM^9K% zSGjyqY0)v$7gm>oB`TXt36{73*_k%lUllPPRYvhvf1T}p&5o3IxG-ZSb~k5S`si# z_Q^EeRb0Z!@fybZqNY?HGt^gO5fq&;5fQ~zE6P__)D_pM1cbyP#C?3Ix*(_?#0;vh zSW!139eAA)SZ4*=VI2|H4`HiHmz2~1Cl3B`;8j+!621m717YVoG+FhG$q=;yjLl$Wq2gge3uSH0X+}>(R}WR8|%*DOpj* zp(0E|oj~BXvc=6`=q@@T+6u6q;^~}*&{P^dLe!|Gg(_+T3%CQ zXR&w@pE*&fl)TsyJ#2nhA_=beqLRBYAa_Jqth&#F`0QM%$NOxLTrqybaep3|)8U1or=edWz z{A%L+Ir|U&{nxK<+n2Iy?SWO*myB#)eo9)8X^|5iIQ50G_eO0P)Vo*CfEOmH)SAHd z6aR4I<(*fro7rviopHUoJ@sneF8eQyxc#eX?bhy!j{g0tFU7UL_nOrYZ8>#K#T8x8 z`Rk@V^>4p>)w0Uw*;S8yn6S|I?XE??n|$-x(Py50#_MbQoVIAeJ9A3Yt}obwv9d#K zkK8A_y_I>*i+9`?c)RTG|9n5_ju|ZguN!y3No@afOKIP0G4ax<6Qc;lj>SDbkM$5;QO&!a7cs{VtJ7fI7H@o_;e0fj%{7@0U5Qs;e^rkGm(1?d@zi0TKQZmo ze=k^m|G__1SAO@$z|g(r6F&ZMTd#Ze$3`vr=a#1i{VC$k4|l({?vB4!-B|XQrLPWn z{@q=BnU(TeI@hx3|B%`EM)VT=0(vKO69I(kFXA?ep{Wn-;$~Zr!f8zrE;rZD)u`ey;bM)Y z?e+=_N<}DE);)xD_Xhy$JT5P6Lt&y++f>u8p(Vo74i#r>=R`oEwKE(s&9JR$XH1ZG zNJH(AYbfoMIKKZIi1t^=Q?1DR=9HRQ+XApIzH!1tJrNqS~kOHW8k zPv|J5x7){5ko`0@;Ao}iGx}qao>|t?6VlQXvZQ|ppmYt%>>5VHXLb#Z1qYk*4tCm- z+2Mpkh`O#ZZ(rlQ15J7Rn&ut&ZS+0_sivJx|7w~Coa{J_6T36^UyTL(8tcR1#kLVI zrj2;VwGl76jd<ETH!#1_|#aqepLcDQZ>SDr+y1JO8psbdldo7Xf*`xacUOa7hElM{V| zM<)ayL~sCklxe#?5Ku3=vJ=vkolskwddH@D(M>U(w#@3ZeQ$K^vrPrjO$nX0OpV|E zethh9J1$}S-lW)Pt^RNkxNF%X)hs~mLh6)5Q!{L9IvpLPQ_@hU&p~cH|x8&;H}kr8YE2H0H5y9iMk#ZC{y&Nhg|{ z&}#yF+O;g_kA9O?07re?+s66ctKp_#zLexqIti+Vdo(k4w{i!V>sa4>k8OJg@;V)=K^tH z(9i}4dH|5_@HYXn3!X~$snKx#d@&yRoCh~b;Q<4*vN>J~qTMn>=<0Y?*GY;q-W#51hbKDWAu7^{=1}E30vWpr zHc^_VhDx2Vm4I~VHv!V+djlYE`Hq9%ulPhaQYH;iYAxVsbs^m2LYCuIh-rpJy>(1* zIR-a!(y$!KwMWQu)NczPRYBTiMxk_>5z=Kws7+;-ghH{~YorN>R{0R{CGSKv3a(Z; zr@30azX9Y`ZyNl5bu!#`@|syxNR?9k&9JShG0_Q$p(4=^#C}?kaa*t zBh2a1!yOo(AG!732YudAH2XHfDDt@jgAZw}QG$P`rtS$^@(=GpL6(q_PEY(=p+hK zva8ErKt6>RYk)BZZhPr-qwyr4?QjmO;8k>MOVj>Nx1Uv+51E ziy8*EYsjj`ca~UqtyQ)0K@%U+u&R-3FK_GRoTu3Hu@7q-6KIA_f^Bu2?yCF=z!Aeb zLoL8`wubL|za04XZKu_hVFk^eom)AL@rcE3Qyr zyK5o-j!e-7lfYB}(X*}T0N5NX1eHAkz;B_%HTf9PlmK#np+i7!NUmvKoPR1it;YQ5 zP&NNx!@h{InD|W)^xpo01I$x){Eo3LW?PeGqB2%QoL+Yyt1USHbfIA5!I}lHzD1;2_0#8m--UzFNi~Z89O!d!ZZoM)H`m| zMKM$v8dhVLuAkBz(bk*>i70Nzu7AE6DH*kd9q}8miE0^KJ?gWr*!6%NxKHK5^~*## z^g5{)@y)QUmCY#C$>|z_sz}4KDTeLomQ8V0Ek3<0JGZ!ebu}JBwsG}ol}my#6<$$Z zUWV^7?M{_KX{{5|S|`*dt)o-XT2H!gmS{bRTF;FMh{`$TYRZ@8jx_OjkJ_`0RgXj` zdZQCV70X=YOcx8)q@l|I=>mEmkhg%c;kUQ3)&UMZEn|aihHb5wMh6uWX;@6_V1tUu zs_H*+K~XqeP=s_r5wZ$uaD+9|z4ZeoYMf126E$nVKv}F`-J8R~1#vqrCKBQOaU6AK z^=|wnLz*PKF|TDu-X26^y0())QjCdB361l%Hf2RN=51?O+oI~*k7)j=6mN%##@UVrGgKIKC-i{a%hE^{l9!w&bTYycB_ox^XHdn2yM9oX?2k2&C$I0S^Q3 z_<{ol3vLN$7CY8aYsAD1Ito9=PENzxgB>{|-fB%Tw>7-aVbVYE;KuC12yU9U&Dt-A zY>o4_?SFx3$v#12!F}MzDX5oU=d~D0@3Z)!yF9ot3!LuTelWT*@4o$Sh)i>ln?v<_ z6eUa}jOl4CxCL2g+CUf+CN}Z)gppcj;CWN)#?)>JPVE*+?G{Px#mtFX-;?xDrvAyo z&jFimV^+4cx-ht762)CEXb0LwB|2zVBIHQK%F&v_BZM4(-k!$1J^P=dbj^dgml7d$ zte50I7rEy&hN>gnD3h!v%(tTbQxP18`4(qI1$!Fv1uMVzP?=j<(~|t&+{&R+u!U1_ zU{m78**a791kWPc{=Q#hB?{I~jpb|vXskGY!5*+`l!Wby8MzhNQqmK$fg1x<8oXa1 zE=rvYNKaY*1L#YHC912@F!dzoNe6lZ5U0k8>Jvb^$NUt2-H-Xy34rV!0>-ve3*bhn zbKpj+3*dHAm%@!#*TPMZNq1-Ud%#_+X%ze8ZZg^FE)NQlB!@lJ4+!t6x*~VI)KIv+ zRSMjI%7HsTO@%v9CP9PLIe>?#O>l>*N8z5Nw!TI}q>O#1a)irQWQFp`5SHFcjMLhzyKs^a}hT0ByrrHU& zQ2hb!9Q7{Tx$0}U^V9(7YraYqtxbn}hB^!GnQ9T-VpR`!fw~@UiP{c#q1pv^k$MMi zg?brM{%*xQ=8=_3p{Ya{Pw;IhBt{K_@!7Ap+*?(Va=c=qm0{CPlR5yNnTbBl#G2&sp*jv?)Vt;@UR+f_Mzu}m5 zA=i-BP`tLQg;;ky0c#lTj6TP+Ox*7ay-CHE$t)+Tjc|2~mH|cTNINO{_Ub&u#i})M z<3iTMD-hER+gd#g-jpH@>mj*@u7@lIo+xotn^N}rA?SS!%A|{rkS;z#ZJDFWY7iYL zUq|Tx8lCSS`#Q?Vpq-Oci!WbC3B5_z_6P1(tF-GbGp&Uuq=hGRB;n;@Mf}p<-X|5I zD^d!w%_2=y*>H75>S-t|8KFKk5^f|q-EdEZIO%K_95|K<-Y^~!q&U*BB9Uu9v<_|L zNw2)uc@*3J9YK!sU2MHE|5|T^wB87{NpJnx97FE#J0o*wO^$#7H^C-i_`#ru^b#?Q z*g72qzg+>fPW86@WQ4ZEz!YwQQiPahSS)586Rg?bDoGk@mRv(=_GmWZgH%f~v}y@y z)e>rxYL8(fp1ebE#E(RbSD|U}|1=x%!DH`iE2W9}4W-bd+lCKPDFx9gC8SkK$WrMm zNK^JPM`DnBf|bmDE_{SN%L|Tf&r%Opkwa%ikDV8H!3?wmy#dL+6f`h-$}CNzhqam6 zl;Cb}ayMl^_An1Rt%UPzOu4zO-Aa#;De&6MW9Ar{wZ^F{5z94JNJ^i&u8H%KpNk}V`kfpdW0HxjT!PYQuGvu@r9s0mqu>N+lIOE!G`VKoCH6jn#jjmxHlGD+preT zaj-RnwfnV=dJT_luEfSd>4FNbMcP>SqizZcqLLa5xeVWtDHTRC#Rnz+smR)8;>G&> zGJAavyhMs76iFJoY(HNM2oceOr!$31XG*3coJ==jPi*Z0Rj=P6kffp;vAIB%9~eqW zWGCRj(7c0Rzcst*)xu3(nT}|5{u$DHvT_-{r(OvuwGBfA`!Sl^0ozRg-_@zoB|NMT zi&=Z~pac-#158x^0`wwmqG|{K6#|U{q_+&XNY{9DH6EWLl)#s$W&>IPC`z3Ms7%5t z0O{_!9#FBwt_O6sK$`$@brq$~gll&SCjrt=SM+SCy}XJNBU=!0(!X_(r#1=dUSM{X z4!n!ifqx)e{sXtKiUZI7sx#aHsu$d3#VN!Iikl__Wy55Mng=*VErpw=s^Dg*wQ$F( z2Dsx?6WsCY8n`E`JK;`H55vt=+u&xYzrf8_AHdB~pTf;m{3Lve`X267)gH1HsQz$g zsKIb&stmZZR4&}vYC7CGAv-&Me$Fy&t+NY$tB*A7?9RgPK)a-sJJ4_$Cdc@(za#Tz zAg_jHcjlT7_{Pii;cKg-@ODw{Y+9MJFDj|11PA?Qz14vRE$r-9vp7WQ{?y(k2%zTT zYchW46!cD}x$XqbLgisP{U#RWjf|Xql7lib1K`2ID17>U* zvGSG`p%`^1!q`Y+)o&~)Mm+|IjVV^%3?LLEPtMr5{glO0JKoTc3V)4%7$O3 zJK2I_q`K>{pE+UM9lRHuFnOH*3Rs1ihI)4_Fipf3wz{DGRxnWelj*6C#4Bt)(ZTU0 zsd~O7h2ECYoHO|LZwoaeYrpUP-D@SMj zsw?*CNWTDX5A4lxClV!d*eq`)!YE#AjW2jbKpHkaavc<=@!5MIC98& znlLUMjRh^%Ga~L)?E^lBc|01zw8Hdm^LiihdNCm|k*{u?cda*MqsM#k z8pw-z0Vg?)o2tcwd1i9srZO9jYuq#+aKqDdtrt1+qlZeMjHnpzL%hi0znJ*ka&s3m zdNv>>)$lYEz}rs0hL{|n@fbkTtUKHE8P5VFHtgd7O>8_Au+T$47qHTj?90m#`2o#9 zLITo^l34)EOTotR@(`#l8jb3s4=^Y+;7Qp9;(HUmri-aJ%m6+6i=^B{?T+6#7Zst? zMcm*Q(E^Q|rXzfRr>2Yf%c-LPLcx&n`MuXB3u=7RFBxDwjA@z`J#-i1@cztxyk{j- z+*yIfLQ2uFl_?#n8!oi+@`t>y!nVnBnAN-CS*{y3c2ji`Bg& z*5G|DmItEn3}*eBjo*<${nM(-`ykgT}+7gj2Ge8W}yz@xe%wjjhpxd8=eUH zFD8IF8RpGHEx2X9eBZ{$q-*hH(&B@j>RwFARo!@?25FK01ID{S&I^aEOtKB94fhxFeE-+@T$K!-l^NYadc|Lp@Ys-mFUPF*PHUL zZOnZ=vSID*s_tY&yKm{h!>#fQ2I?erNj6R2_#IvjVvS|V+Ajx9-|$_NbOR_;?kvdj zM{6UFU6?T&&V@F6z$VH&b!h@EggZf?bKr98F;T69dzwJMfV)Vb&2Vc4N&r*6BT?=^ zS3A&mfZi9pY`^^~(b<4rl(0XbCh7?=CziVBj==QOe*e!e@Bc;0Mqw1DitMz{f*Y+W z;U1^XhZ`f)-B@`SFit&ykPhl8xCxT0&hp%?t9)M5O`ZgFS6?GGNhKl09;!dw-twx^ z@oEC#fU1PsUtJG3S=|r!1jW_iK=l&bq3S)jC#g^1rYb*lKU{H&KT4jdWvIn~N2^-6 z#YJ53FPJ6#Qj zJ420tJ6nx~J4a1{J6Dy%ou}&Ho~|x{dxqKs_e^yo+#>Zb+_TiHaEsM$xC_+Ra7)w= zaLZIT=zWno0q$az3b#T{hPzZvgS%YKg}Xv6hg+*^;nt~jaO+hg+?DD zZ;eg38bMva%J}4o57;;qaC%%@zIb{03VeFOog;Q9475L>H7DkL|43#YoE#I04>g!3 z#}3X!tVeGQ+T${>uB$;q)3a<+xnG|$7ktzxvu7}uy(&&^98-3eY#z^Hjx`*H%LNW!%-`Y51@7guI>Rt`94kaeC6$Nq zdSsgpF~+xQx_zB~I88ziZx+DGh z9e63SXLpN(0r~J)-`>2BL5?MUhJDn~TI@}!M0WuPO17bOd}+n;$fIZYh%K)cIWaQTLj97M z`4-KNbwwsMSB*3~)^YoW#wjQ6f*f8>k=EA^ETj#B zJzhPEkc5zB$u`^!+ge!$FTqH|vLx5g4_=R^G=mz!x7Em7*I zR_Slyw^hpNVCd5pauL%E+nO531*wrVR3o{z_BOS>70?VkS{mxYHTG6O(CBWxPHlHG zltk-}kk%a`OLx%#Wi5Y@Yx!(&ch>Tll_y(|8}b9=3l3h$jr?B&pS9F^myQjP%Nt_b zD*##J9qBcEt~vQmBX{5H;~Umune_Ro0sxk4{ye6(f2%wl zC_+WD-|PdhQ{MG+o*^L8d2VneyUfPIq^3spn2lI%GH>z$1QH&(y|E^~Y5Mla#;JHt z0!}S>&`H_rkWJv>xq)8wVSUB#bh&QHYLhxeb*SEabjI4OYgv>$@{E>8o-vq0vwuAk zZb$j(u9Ny1;LeI)G$hG4`#od_zo&W`A-&XlaQnzp1k_mY?5kqo2IO<1e(D6k{bjE_ zSzggQL9yTls!4DMshMyGtHp4KsC95pRE=;`)X(9js+-^rQ@??mre1?PLhXh-GGtHB z{c~1Rv-Ss%+G#;AT$6^aj9iDv*Xw=HsQMtDA~$z4wk*{VagEl$D6l${mt zv7w(cY5F;THRqedkp}e(V{c>=P47FC(4PBpdTh_1r5EH=TO!z#Y))@Y&Rm@CBVRoy zu6s_ z3O`Lp8~lA*TRU30a_OkXD*O3FP)|!yw2}#FB@;T*D8+{FeB~9nG~j&)E7XX^mv3)^ z)vvi+ArR}Z9=qN$RC*FZeKM}`IM>4`0)+@`hGm>>g4PG%{NhfS?0YZq6nxKHNy+$zDG`h61({BWRo z*8@f)Q1O-tLauq|!3kHnK0@Y=6I?4|SH>#W`u=BfcOa~>i(jaec``a<{JvD7#QWYa z&D^8ELb&YI>|S1WW}e##)n>XDQY4mV7&%%bPiuhNaZLQWcpivp%QqkgMqX(XX`Ev6jVsgH=TC{ zH|&B8n=Oq{2~;dD9pSuik>h7>xwFVY*)*w@8i%?T9F8Qlro1pzmLzy zSYpk~AL^v_viQq7Dlv`a`pKmZG{<>D;yk_4j1oCPv0QIs8mBz z=0{7~k5P^>B^4Y;QvGbtrW)W-5HRa=4E(O71C~x&uO(fW_xC$IM4o$IVugysxGgD; ziiWTKDz~&;>J1hc!xD^`1Rry!?>1qSDJk=#CG{%WlvHp$lDbrb$j~vSq@2*WlHOig zc#4+vA9H?li$frQS*9I?%9J!tB>l&GLxS`}(kq0XlP5~bhC@m9tt*T&C1rlJq+D>h z#*|cWJd(OpLtPR;rlcL=_xqMba3L0_=A1MY-`c{XR{DN_orlO%rl{hedWEiq)KMgT z>;Aj$^-|Ht;g+VONXjWR)8la1EaRzMdl1d%O5K|k>v(^S*r*@644azMz zjy9N{OT|^VYfNph7xepdH|tmN-|r~X+9?0$l#+H=n363KvdAU?BU{%L*<2% z)QqC`g)RjlQ&R42`+c|2g{A2%lJxXOXlXKITr}v%@G;QszfXn#Cx` zn34*PM^cw+vO__@lr#~3zmKzfZl5jgKLJ8e(ifhI+$VvKV@k@|jNiw1J8Vhux)yxr zH>~j%g;0MeE+>_2%k0CL-l%?7ut!qnM@!0<;2K-fC%yY(x!Mh zT5eUT<&(C&ynHz?1Jx$DEi=zr8`~@l{bOr`ZCP*}Z7@BTii>U6nA%7}u;0gN9&b4+ zD0&oy&T`NB(AP@2_YkVhbYW?dL>qs+cNdEw$nb;^nj}SS+zg26@n$7$iWlLWcH2W7 zPfcJBwd}7sI0S6jqX7$!BRjdfRDU9}V@%n5BGm7jO&4{(_QOUHF{_^^Ju}!L5WuYS zoRoU!Bt1p;RX-au-AhGZFH82GBKv&^VS2m;N*l9vGe26=KikprYfH*HFF1~*Oke_(pGq^3-__J$~Qc;Id8A^cLv4cfJhj=NUK5 zlC-x-%BIBhct4dkrlib|mXyzjU1LkizFBY_Ny*El;tQ3oG0T+8M!%0w(Rhp1wC>aH z(vp^^&;Ex?LC7rAzCuN<+x7W)k#ttY7pzP{hHtCU9IsfPcLHL1yg5soVzlK_T*a#m z>oY@^SJ^lJ1=n!qS!<({S1xPT&Avx)9BnW?muiBS$|&~$DE+=#xV)<-p=VQnt&Q6* z`3E}(!f?bwpCbqkIoDS5e6 zpW6iTYf74o5WkP#;_@c5^Zv49y_WRT%m@z9hA|~&_v`na4++{^7|9~(4cpegZ;)8v zg}|dpRw%)Ue*m8S%S|ZejfkXRfq3lggRX)@bbD+CoXS4ht+Q zjc4odWOxO~(IIo`Qa$daGFr+YQ2KpWz-3GMdh^Lkv<}aEY8(eF!CMH{&aV!~*ZLQXixsSA-8frpKG$v@vT7^P?r@?x<^QNvU1IaU>-#m+JRkDnnAP zjokf~zs|d$QcHSLub;D{F^nnci3s=ms0v%sAtGt|Ww}=wBo^3gr9MPaQub=>4)h&$ zL@_00ezc^oc=K%RIS7s;DS5e6+}wAK*)E16*zcPPmt`8*l>qsO{N=L^Ke!ZxOi9^| z`+YajWfaU%k@U(tKlxt!O?Q`-`cOqld&9@{czd2Urlib|mh^p#%EGZEWtj?&BPn^g zR3Cb&j56g4&+jXui@xru*^Q@ZN$cL;a2)~-V@gUrddoCLBz++*`YeOQ0{J!;O^TwV zL*Qe2yw^_~Q&Q$fOZt&F&z7X@>jcMsKAhDU8Zl2`{!N+8pf0~9pQdo3tZMFn&ARn-nYkR+HblMR<}G{B+Wry zm>%y!)W(#Q`O%W{To2dSJyItG363KvdAU?Pz|1vfI~{>wzi+xkwo{k9u>4Ui=?NQ; z+v-vfG9?`ezu)&;x{QJuA(GC#VDVz@H{H%w>LWzbLP)^$ZqKrDOi7s^EvZeVv201H zS;286B`=q%TUbdsT>5?dNQQSgUZ(EN*OLDF{pZ=#4P#20fpEW%pY(LGFh+@_75{pF zvO!{j{LqJHlt@ZBnBEh4IuyO|^xp)-ebS z9j=7STQ7fm<%SQm=CcO%Tt!^hn3{(QK=n3UyETm#=$}2V@9t9AP?44TXwiHPw7~Ru z)2242q|A?&bb~j~R=*L8c)@WbB`=qXa=XTql+y{nkMDQ#KF-I#?|zMzbkm0A_qr5> zOi9NH)jDwPU?GhaN$>mW(%n{o@w388eXK~zxuLv+T4*3yxE!1JbN7urbB$B3_ zyZdn~!1%e%l5~e{r@eOl7$M`j*}K*N}lW+UA1!vN_>nkAB+xOJW$KUz|LC*c}f(!K~197j^} za;a8&sSHUu$hu{^aL`ptw4^;=lY(}W^7OqN#Qna<=vo+gB5C&*?mxvKvA`Bf(mY7& zi+B||qo#O2uQsNn%#W6Ijm=t+Y)Kg?IF6*`U` zugzsAxfF!VGR-HxXC8ivNV@F7uUm-gH9YN%<`j{XWx({_UBECJQ&Q$fOS;aRXRAkw zM7-cQl9HE8)!?NvZW`wBt=ConS~bUkN3n4sW$|Ixe-#(wvf1J}OX};&s#dLV-WKo% zaUg2gBQ-e6pFiBs12g+sCX0fQUHSGimt-~4iY#&;K*XU>xH(q(zI z)dr69hOA3weNABo=qoZL#Jm^54AAHLm?8GTG%ll3rjLUFaA#zl&O`9Azs14l%}Rjx zWK%N@eeB$%NyRyt#c3m_PMwlHV|rmuCXY>0)8 zV=~5!O*caWf#GRs85tRYK>FB>^sy4PAZ9wA@?ZAX+??kM@R1AJJWXmD?^U+<&-LX4 zUvi3U8ocLa_BD*UyFJckjKf%9Eu7d3Wa5T!bGK6P;P?^=xh7L(W|}=7W9ndk1H9wA z;^j10?zRNt3l{{ZyBT;35Fde&j)t9!+<0G8SDHK*ZP_x+Pha2+u<$5uW_((v)8-Al z6yOXG#xuqqqH@MJ9ysU1Zh{SWWBaYZ<0zcfom58tg7~dMTrqIogl&P1z%#;7^1cAP z_#~W>1WV({8-m{#z**V@x`YkK??v#q9q~)~a0@0Jzbl}yjlfCjjlF1CKc4x7%3m{h zG$VdpA94%N?`rV72{`GP0u;iAdPa* z%R&5Cur%T1CBMY}_;?I<9c(y$oFCqV_}K%uMzR9~3C^}u-z_5f_S{IS0L zfcWQ!Xny`y`0cfDhMh>@~2QTZPi!t-yN_@v~9@z=Y$+{8a(xe%S4>;qrGI@OC49CAWlO!tpx` zaaRN9bJ%v+#0*#eo(0|j#Q&WeoiO3}O=esgzQu(-3pQN-o&#PL;?udE2osK9Kh z;GBbP(DPv<@U%OW{$2);w-JBm2w@kN-yraN-on{GlDMJyy@Hr&qwv*IM(g~hA$pXB zvrc|PmoMwzwTK@zx^;eqh@NBN+$O)F`LX^zh4|CQw9aoCqE}fsd*wIu_;w%gqQ;^> zfTamn9@&W71)R>~@Yx1zxbnRpcw-R%cUYQm{7Mdtg&I3C{sCHNSBEAK%C; zv2b3=B5r7YEr^*4WuKTs9KBl^sz1F7aYYu+Kjk+rWd61TZ*(r+V}hj#m%nQfcVeEP zsAuIjG(YwSF=*_su))KG;|CS1A1s`4T%4igLg|m?F&*(A2~PO>!lv6kpL}pifc%E$ zcLU<5BYvNS>xVy-{#ak4uprEZoevwXzT5=7rHGH_<|a&Q{00K240bhaIDVA(Qp68p z2Lcn0-%!NmSvb}58(Q95fwuwi$T`Rv`gO&siWMW$i?F<^t0*nbEnir_xM*QT-Kq*K zwyPE{Rl9aYc1u9p#q^~EJ_~6Vr`>{z(weH;szr5y!Lx@1W>(i#EU!2Zm&gQi@JR-~ z?x<0vtIE`o6IP{_Dt}zj?5x}(m*uGywe=;HfjM>cWffI{)ERkm1L|{`f_wsuRK5n#EJGFr{Sl zh_aH@>avA_6l{+S52TziC6H1uw=9ry+K50(UVbf|(m=|JDx8s4g+y`#De&eN7i8zm z38YNvZ|Qta?leR1xfNVl&JT=DO$#6nI)!VXK8qbm8C9jmNG^nED4Ay zpewGfN3VmoB8!*c?ktWRVG`;Dg8o*vxW|X>jpziPDU969GV0R1b!EJ z2naYa6Sh5UC)mEQlVC4|JwzJ;>xXR*+X=QW>?GI=VZi~j9@u8s7TC{V55j&2`vWWy zj_}2DqW3e~C6s9&$aplNe09%Lb>*9UeYP$>&X0aEg69(O*k2%r`Y?A8==;DX%Jm1m z1*(L5yg)tSYB)mPxbw-SfPT3YFj6f*TIg_$Y@JG7ACrFWosV;zxMt#wS zAL&X{SyfX}hdt?vBVD<{la8W68vzyzF~N*NL)9;}>yLCPlKx1Skggm6aFQz>uGQ%kpLb^~0 zwdqKOhV8sQZ~WBwHF?rP;@59yzpXD}w!y%8uI@jRRhyJ6+a44I5dk_b~a|CkBM(+X)n5p4Anj7Ai1+(6XljC z-Ir{Hw%Mi=<;WSk2B#v#C+`aQF{H3psfF8KHNcIQ+dE>fUNTLi)%d#>cBQfcwfI@NaNQhPBNV zh-rq$>`8+AtKh4MNJH7km50P=s_1q}+}~yEGzo^T=l;l11}#+Eu8QVYI)!x;bo|^*`J)_@<(68C>-psby>e zMzq{W6QiC494BYEcTjHw?x@~}+ev1>@iO;KkgE(j%c-ti6rZ^ys&R0;%2fv4)MUWD zRT11ist)e)ay(P$mcb{k&5|M<%LKQK;2Tv)L)q5h_wbfsjT-;0ra^V;ra?$I4MImA z#hrc`N1ovT`slT|SnpsV776YR?E3V$SHR9VkdJF=HoipZ(sZG&gx@aIlK|OgRq9Dp zBtn9_p!o#-z{8+}@53$#=&$9CL zIuuH)mXKC0q5rOGS$L*uIZFKWstum`w60pK4*!I@rBqtCgtTr69jQlODz`RrD92&q zah%!M*K38m5W62(vaUwS*{L@IN|e_Lb*;Suep|JCau|9w#peUfu&hV639hNZi&4@r z4RYljAKG{a%hD=*liT`{QQnHmbAy=)KiW)fReepVJ7PN1eS5^DXj;F7w0;R$`uzZ) zEVz1OZ{Z2%(m4b%PF7p)Oi3R@D2uOnF1|SPlSx?Ka*BKl4iV(t!~L4R zT#ET6&T4Pzv?W>!>Cn7HTy!-4%Y8!e+DE^@FNY$GUk5hjCh*w5@mcX}vYoJtm?%&8$7_-9WN0^+Lq6rB1Yh3Mx0AHw_$CPs!M75 zQdhErz`{yWPhv69f5YpE3%&9{U=Q-)C^Cbj){Tx7TSHPw64kSS^jz{YKsUoC%5j3a zn)1sH4Q+5BR%N^DCIj-z_db!bnvIfg{*J?0-z;xV-ecuv;tq1AOGotxLORI}DDkqF z)J0B3PgGIh-c@yh+f5EU)F-6(lv{XvDZcsKTdoD_qgDbAJ$~|y8;Y3-Yn$N4GBN1r zLefw^a*d0(sSa-}#Y@U7tFbxBHp4WUVJW-WFzGWVnQdt^q+oudkoGFfFJcpt;H!gO zUb|2h&f7r zbQnL~)M2gfA}x(r0?MQ65IMqx?hx-KD=CWz>AH@+Lku3eTkjC9@#VkTBT_c4bV6F` zgpM@gu&3ZLs<>-IcOv$tC}^Sgg6JJsTEbWxOIrzBD%3l4BjESTdEKEe@w3Ml;Ud(e zkCvH{{m3GCF=nfCGVnvpgxYebv$vhtRg>A*S|X&iM5ql~vb)-ltK|XUK|bbY<_qw9 zRYes9PZTF2tQod7^#sqzNy8o`+-Byn>xX&P`XQwCL#Pe-% zb`PvpSs#I>z@=b`>W^@3<)r}f$>&UbLGN%C&O%r-Y-=hEZm^_bN)up1)G*l&*6*Dk z%@oG2X3V`-BO$FuLTymv5vv*bnANNWep^$zMTXK5t4uR&YdQ*^G?Rup3Rlg3q>@^| zS}Tc=RuZ8jDJi&eNe>ps{X9P3iEGT3y}yF^#(eIEuYbN7JdJ6I`$%UVA}C*?`UI}6 zL%p4q3BMngmQZ7%^m!IynqkesIk;B~K4+CQOpjdS51$C&@nYFgKf&Q}&O8K=Njxr< z;hd~FDtq_CDWg_5A+2sgM^bl)wMfWQ*N1`^`6bG0@mjCnz;Ej{9Z={2cQRs{VO!H> z@Ct-9OoLnx*JUFwn9m;>rk^vSUsk@CTHlzb)@jq7`;*z@7W$t1snx)pFobvN8jii1+T zoNAsRPkB4bB)^MnA9t6V*ONlFTW+7Rbhu||o8Wev9(2M#X;{~K;7kVR!@d31sIYQPg8!N3h&-v%M( zNcAmv_DdSpH*!6^zGWBxbQO*@FnoohzI25nq$?buBaaxeq=+9sD}Ie!367f)bZ^B+ zQcY7McOPtMiLeTVjZ2FgAy;VlWcxGpL~j}}n_*jBVhL%*5<0SCJ-0eUhnpai z7oIX%(j=;U`0ZAzC&;W|!E0ISwHdZGjRg;`q@l*h^>B@47yo1`qX=4MgtW>C9a&`@ zitL+kIK9D)r@c&lc4SI3)4iLGVNd0xKE_zR+&n{noDTX_CR{%*2WL~|d-_q*WP>$Y zikN1>fn%8?O;<=mjgo7Kr7aYCY>k;RXay3|3MAA91s-uxOFrhJb|L(Befx2X+TihE zqQy7dqV|~8!z^p{5Yp-)WT}UffFHFaNZyghS)ts`8e(P8?xQV8!5(O>N!tI{mjwq0 z@J=RPFMW(%JSKWp3rmLddRbBB)SXbviW$H=PO+bklPi-ts7AmY<+k-s>OR2n>Ls`d z@&uu?Ismwf`W9}Yb+0N1`95ka+~egbMqjz3JRtYC_Y2vI`JLL4CV|2IB5Bx)&&KcJ zlR#PD9%0deQ_%TJFb&SatyxrAwd&XwBAvm(T!>J?x~3D-HJwn5x*VA2NZ2nd=t#A{ zZHtp5*8OLYTu|Nr|I-5HCu#$0p?Y0wd~#x^cY!k0TI*IgzZ zXLauTy9d?c-QP6qjleQnf{%F?;&ziw$e32IU-n$u$qrhSyxx8sE@o!6I0J4+#c4z* zsDjmktKtOdD7)YoMRtXurhiuUQ7&A!dm`YRM6=-eK>7^ZaDt_7`<=JuJihd~Zf$f^W@JNid(Z5|-nqC79JHhnvXK;e zbNgiAG{YWEqaY16I12V~4HoNt{i9h&+RH{}Su2N-Rt}-ID1tAcG-XF_iri_v#Fog;Qwj#6Fj6GQ9s98eVApf9zt3@ zgxa8=*QBW=>K)sSn~!}p#Rm)F@JR31y)VZOES zgtYL4+93Q9+Yb4dbz>j=KTX|e?UDB3I?68okxF95wUP*FB@uEjyFBgr>eBY#oi*)> zrT@6U@6c^SDd~^-I$s%=U3LSnHePn=e(g+6Tjsxa*(DE#GpjN*Qudj>IJHtY4~g?5 z%$;yj&{IWL;xQ z8iQcJkDmkbNWjhy9FL-1J5 zq-$a5OEZ06=J73$AoFX>kHeVIPPyP>?s(v$Hm0P^kCv3L(z?c!RB$|!x>S5z;u=%Z zjtIt;Iw(dSqj=r$otO)-OutR~<{6iQkSQs*O#QxQy0A3*(#-q6JK+@VH{Ayu^~)SA$~e4`vmIPM1#HSbHK_+GA3W;s z>uz}1L*$X21CZahovwwXugF|o`e%0dLB>{MykaRYLoCzdv6b4GrOfcu`wHmduOVsW6kVp5{&LI@9wJZeWoz;F#`=oP2Oqor9WNDqUt2*q zAQWZFyf8f;LaL1^Df6Qx<$FJ_u_a|45*$ZT@^Y!3c1Zx4Wts%P-^ULkcvNZinsK*i zNgqG+(_{~kM^bjAe%~li+09a4e>tGwg1>vI=!*d!4X?lSN8AF4>G60}ZCbw^kU7+{ z+r7G`vSp`~g5$_e?k?368r^bD*?S_)E#>%z-(_goZ!ceYsfWlTdoQ6fMNAG}Eh$Uv zhfU9e6*IPS=wH@&h&+<^5vm*MT1fi(%hg-^dWTAh9b-w_TO@rFVa%OAWR?h~q|A?& z^f^X3#+H<|N^m@qx>P$H3Ib-C9uI%08RL|mFL~ADk(5J*_sTPU{pD@1-TN$4@S0OB zN%i%Y%*#Yr9)GKiDJk=#CFLVb*VvL$vx4JDN?tD2%Pt8ZQ_=wZe%~y*m`mUFV)LiE zOn={RpEoIwr2T~IR-u9e6OcAMsOuf`wcm74vm^}w%NOwmqL>~J=GCV4i)#Zw(z3s5 z;p-n;_DFaGuJuJsc3Uv!O@wEH);Q63^snGO=F=jd8U z1Eoy6&wJoDFBN^iup}KQl75E}rpJSqwJ{}Sezc_T*wON9OUm>F$B~r0T&ll%sSHWk z`TKqSke3L|FrWR+tJPZ4S8g6naSUUY=@5kbee4fxNe7FhL-IQFsYH;u!;*BcNO~N6 zOpixGYhy~v{Afwvx1;6PmXxz#!Eq!dFPG{+UMfS<6A|P04FWdj($9W-H97)%7Waz} znkSf&vLp5TUZD$1bD~K4`Ld2PwBK|e5$?ocJM9J^)6<7l6VH^C`O%WH>|J9@Dmad$ zZyv7romT;P<_BR<4sAKA1!Gwi;5V) zF)qFl97j^}a;c8@QW=t_0nhJSMrN2DPb<9zDkAcZwdL&Q3}Z?<9N~W7eRM61G?Dbv z;;VcHi3PrIrJklJ=>+(go<4eLoH zwJ{}Sezc?`ym>atRB#+g$;+kUYST4lnT|oQ-$&j&ZvNyM?GEZPO&@>rsV)T}Q_`_Q z^&VWiF^>`GXX{Smav;d`up}L$Sf)H6f$8yxd)EvC4o61GkEfIwqGh*NNt((oW$uv( zjw3sXJbB!rGn-BUZiSMd9ZW5u8J6th z6lGtBw3yy2S#~^sd8H}as^rHbJ43YWMTmEeDZAh}vXi?@wZ=?hq^dApa2zPXm{Co9T+Ir75v^wj}2b}4W$ zG$_fBM|Os2*)Q-)Vb%FKi^^RAk-JM}&sPx$W0pHBp5J$^gvY5#z0Uvg zkL;6#>RGt9>=Om*z3NXl2`i6NW63^IWWNFInclN`CK4}iEkuCi$0IvKwCvnTb&Xx_ zlwEL~awm6}>TWNUQSO<*^ZTeJ{Hl+;O#8Ez{ojB3D?2X3nB|^@aPM3zQ)GYi^^^M; zBo=622AZi@?)M-sOiy3QKoqlQ%YUY!ryH6=YosLXMB zvPjyo_v1g<`0lTL?dfEZbeAP5FWAt=l$80=lCtbwW4BX3f&|ASsY|uhOJzu!4@$pp zsIc^_YevQ#)U~&?_slokbO@P}vN-&{Tj??iCSN4o{#A0U_M7gjR+;9Dr0*gxOiy3^ zK|E7Z=0{8Vq&Lq-nF@|0DS5e6+q_hUq*QFEG7Ti(6STT9C7mWzx6y^AnJSXjUmok} zV|Cp7mZVcf(vOiB);L~DqKzpj^P?qw#+zqDQo(T~B`=q%*-NFLTgm*G$+hh=(65kR z-i#P@7$Rz713h<@HCs5wl_UOVmi@`}uzF@X})(6eD zS3YkZZlpqF*DoIg+PM1jK-zdW^Sq-L^Zx)6?*gCz diff --git a/cs/sdk/libraries/theora_static.lib b/cs/sdk/libraries/theora_static.lib deleted file mode 100644 index 5420ea5a9bab6c8c35720f5066b539168d254776..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 197376 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 D;?);^ diff --git a/cs/sdk/libraries/theora_static_d.lib b/cs/sdk/libraries/theora_static_d.lib deleted file mode 100644 index 1063a7bf90cc920169cd4a12a4f4b404cfead957..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 490714 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

    ?K+`glT#+uma%3N6GPc7)J?M9zEQb{z>R4;o>N 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 diff --git a/cs/sdk/libraries/vorbis_static.lib b/cs/sdk/libraries/vorbis_static.lib deleted file mode 100644 index a6de8ba9a71901ca8c9aeca93d9ee5dfbb2ea09e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 254096 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

    4hCh)lB3?9o|pumCU3Z$)9p!PNeR_s;4HeZ1? zrxh@{tU&);3S54uK+~5BNZuRSCbIN*s&i-=XwYVquaJqD&9rD9 zKJaf|zVW&>Rk*6nW1IRa1Xfo;T}Oqv^;Ou~ScSu;e4lPB6%JXdu-Q(9SpfJ+2v?z!l+$8W&`DH5mBQnu89dgStHJ`c3UB(W;50;q z%n>RqAEUyB2`YS=qC)kVeDCjE9w%MM_XjUkp~*@W4A!df{{OJ{9$--{U%M{|Vj`)i z2q>Vam-uv6%ckch5 z^PK0l&u_ZAy1Kf$s(X5Ht#{Q{1upGWV8vbq(#zQ|_%PRTOo8R66!1RB>5FWGy{dr8 z4X*E&0$uNM*@tYOeX78y=WLIC#lFYy*cSUyfxBN6F#DmvkQxQ1*HNOPt`d*yE1|Bb zgrN@G8=EN6tr?@QL}x=KTD4}or77Fz+OqAiJ!>pGvM#3!+xslp2iKbYb8T4rW2c0U zBl{goY&!&(?a4YI7e3C7eUjbTAJ{{Q!v5@2JV1#sU$(vaD`7f_{eAP&D&c4wj z*=Kl^5&>hBupFmEo$+i3EmmSq3D+}838N`o_f)p$PFKQVCfglnv5j*M+jvXaPCAcm zunV}|3%N~;*xtH?ZNf{HP-FYBd9%Gy4aki(PWSj0OB{WWRJJ`Pbm3etqiQDJ++Rt+zUtkT?MedhN+?SWxetbm< zy{l}CW%ga;b5`=TTvwv)4fgeB)>ZL%-Q=;n#lG9jyxU56-{EV!tHfp|^d6s&ZPM!* zp9gGzWu`tG6i!z^J}u`!#cvY4?ur59T&w|DLs9%o9fTL5YdX9me7#+s2vW zOw&(nM`xBW&zP>C*)Gp)V%{*8U)a{otYGdj25kTKVa73gnKw+EZ+x#Zh0JE=E~ELK zuYn0?#xt9l>r4$}_Je&9m;|PTS;w4VUNVi?MsCiyGDDbrW(KpKImX;(J~EoW_`YXs znZ8U2lfsN-rZdZ!ZOjqoGV_3W%lu**)$o1Am@$@&jB#bWn88dWlgMN+17m|8IMKtxf-b+VyKVua>{<`2V--qsZwVF|JXMS;s4S z40tANcYK~_Yf(^bJEy#@-G@4XcJ^u$>>fN^Z?|dr6}v<;75k~tE$mOsw6brqv!A{9 ziJ|tPj|%Nug-*ABbat8j3cH>5!)Kqe_kVlG-mKS0d&QBu4zHpcJ4B9b<#5iRlLIX6 z9JU;AacF(o$Dzb8+~NJ86o=63N{0v4V;!1wnC#%RXtqP#;6)Boy;eJHE8OC6?c-jD zkIRlaXiq=y(5C!`gGHxD4h|PzJ4idfIT*gGdy~ zZ11?ptE*$d_3nvT-jw?)b>|~bVc=$oS zW0!j)9N*p?T5A}w!qt7*E-*4#1o?mDpn{mFG?E6)HnZYAN z*@thfW#jbQ$gYWYvODqSvPBC!%Ua#EkolT)ll4mMA*()MFY_>zWU=fzBzx9Nb}Xp3 zO!KO{tl=O}S;f5pGOKhyS%BssS&wx=veW)yG6RiBnaTbb*=>2e%*QoJrqoN5g+I@f zeLs;a^Vletbv!p*R{!Kk*}>zZWCKr)ksZA-PS*J5c$r=G1ex8BiLxe5rpS(Uo+caU zK0|geewIvQ@*G*aU8S?1`*?A?%+z9+tbNHInfjZ3vfTmYGWUvuvQ3spWbYOolQq;oDf>R zoPQ$|qu$Gw$v(**e)=N&w(Yy@QO+;f<%KGeN!>cqz(h4E_lmkS#z{j`tg9ytF=`-n zEomq{s%a#R%g~aVJ=c~>B6X$Lw;D^bz@}1KrJgixP;+U)jTX|h(3VpALjy@lG?LzY zY$cV9FlNn%sWf^)8|kj4nPhgTo#Zp9gB17LT#6spN%CvkMKUk%Dm@Cdl!|MtB!k7> zq^Z4ar1vj+NMeSalmZ87!gEJy${a~jxRd1f9a57GJ*8by&Qc#ESE>9;Z^?K{A1Stf zUul+>hqU3Wr?hd3moz)TTZ(PvD;YobllE^6kX+@1q%Hjdr3Oa9lH02gDdAw4ls!9K zicg7@T>3^!b=${E>(t^T=|Q}-`Ea77y)sGiE=iH{Gt#8ukPK;LpDZb?M~>9SEKfS6 zS0Dw}Q%L8(E2ZXNhfB5}M@W6&jg$twDU{q_kCJ-49xXL}Ge&y!cC57O!#FAIOOaIn z=Xhypoe5I61|`yF-HB4WmXoC7Hj}0MU8YD~?59dYU8YGhy{Ajt!)8b)l4eS06tkqm zlV(e67tN8zZk;Rn9xs&|-9s{Fj^8S2 zOy4G@?%yt*dA36`XueAt=)7ARow`R_Qnpvxbbg<-N%eqK*1cRB9#bI=n0rvtJ$Fc| zP(LDt%Z^I#(vC@KYmQ3~9-fe#jZaC_0#8eqW}cDME}xa!G&wI>dtZ>Ord*U-U%Vv! zXnI9D5pY!+J@=YqeWy}7ZFWNnNT`y|Z@wwnf4?P7cDW;6op@K$ym3#mYX3lTPJbx5 zRy>kyb)QJhhCG!XY&iFq5Oxm{N_)|U#gLE`>P1lsEGWHs=^|oju@n;CcYe16FPb7 zVqVv}V$r?2!f>XB(Ck-FWT?~^KHKYy6^RW*YTJfl%Z-L2erh8zyRW8@)U?FFy;|Z) zrnY!xsUs4qbwubgU2$wkW3k+*iTGaGL>!&bRMhj;6Z>_WiR!b>L`g|=vCN}|u+h{P z_NVp5rU@;@B2NRMp<^iSo;MU$(~QI?|5n1fWovQ&W@}M@k+E1BZ6daHG8M8nrowJ} z8?myWt(fR+CZ08HCw5|jwi5wSu z;n>1Kq*OZy!~KrJajHz5j*-MAnGjx$NzfA#i}pd}Om`B85_*b}&b`DoLuV2E!C7RT zaS`e(T!qGn-l8DLO+?%F5eFN)i>WW&#nlsiMalAhVrQX;2nhESL(yNnXyqjy{qPb4 zZVnI@d%eZ*c|O8b?knV>e!|?zU%0jj5LeX)iW^S`3hz^cgyV+6V&=3!5uFnxR)hqL zAmlpToq8+e5_cqv7KF`Ur7hR-|Y-B1&A2j}|KaF=8QN#l}uUMfc`$ zqGO$SG5J-zh^tBvTaPD-)a}DW+0rD@b6T?S8<`?1Q&Yv+@HAoTlP+|eGsIwywV%WLqqS|+cSWr1b zj1QS9*4>{e>J6PG=DeIGBGPBG56)~+s+=PlYRnZIC(IQSo0f_tb4$f*(|ICo)jZL~ zdcJ72Yrb&pxj-yCu|UXt7K-{+3x!rx8T%=fiQQR?M5M}M;XHn^2-I65RxDT|I(J+u z9&cGHDruQeIk`-P`7akA?=BY=i7Uk6FDt~aQ7c7K<5fa$!7A~#(`uoxHxV27w(LL|X5S;>MMYA}4y2@cg(*3>v*z%x<ebssQT}$}thGaQTew3Evfe4S9NH;d0(OZ;&vuD=1-pfV z&K^;=c#jaadxh@Fy+S{9pYVUTPaGe!U!)iw5dAkE5aF)nV)c!3(IKTm+^Bm{94tL3 z?phxb-Hsm;yF(9)?2m`V& z&HOKkFK;dh?UKu4aK|g6^2il2A>yh?uemBF&ATS4wPj zsuFcxRf&BQZi;oCZ;A6KZ;1}^x5efLcSOpnJ0imUt{C_1uDD-xPb7D`&;DcgMcc#& zqOaCNv26WAVKd;7`1tmbsGjy%G_`#qk}98wpLtKkfmYAN*79fKR%A8Db$Bk0t$r@X z^?xDc?_P+dGhd1t$5&#)omawR)N6r`Z$$LjH)3D9}8_#JWZ}RMm(Hy;NxWEEU@JLWN%SRHdG?RB7D{RkH3?htAHbL!(~SAzx=T zlFeaWtC63pI*ln+rweb@$)-Q@@^Q#7x45&x*R@9@zzv@xl zfcg}=u0EYpZ$N{C8_FGUf(vj&<|LHok?4=Irx#?1AnJzhg)1|k*jj3W?V_I3S z39SfkLi_hLp_k2?QumamH1%XtYS2!PW-0YZ+|Z-%HqGe5q-M0gx)~jEZBBQ~np3kM z%_)3f3p%p71vzQ!)1^3lQXJ7IC)1W>Aa6;HuD2w;9tLDH#efoD8qgkhLu#|!kjm;9 zQI9Yqy1&PWmg~2o5t*$h<6(f%uA0(An>M62tqnQ8Z9`+d+S2oNZ7EjMjK0R3(P9=pMVPlE`?2k){o{7j$+bPX zE^SZQY8|LNq5~Np>_9V2&B=6xIUTucP70@vGNQK`$R$kX9c{a#>|bQyN;)#{?@%I%7q@ zEUanCWNQk0XHC|A-KgdEZq!1*J9WM|P&Q0qaJ(LE^ncn>n_Y)f}a zY-#5kTUz03M{Bm*(UF$+^s&I6WOwaprn3XpTj4+@4IQatk|R}JaHPdOWTcoQqm-XA z$_bZf#u15*brhsCQ4q^->2?6Sk?bK-GXZTI1(H7l1@?EMep{T#SHCAE%X?DU{hsv1 ztrzuL*Ne6^aVCcxXS#IDnF^g<$ZeGind-QbPNpk0sdA-GJ$uu@6}@SWmK(iEccY*i zZdB#ehmu$Hp_bb2bS=Z3R#myv(smA%y=L>$MBJ-!#OZ~}9D}ZKX1<z3ARSlvm39QY%8boPM!E|eNFaL(8^H}Wb-D1E(S%?sAG}j-aU#;7DiE{ zM$uG1JDT(#M3c-bhEn&$(C!Yg)NFbz6{-v+wP8bP*7c#Rn~kH7o8ze5IG*NDh^LaT z@iaLmftFoLpwmu?q_IAcd<=)t#&N^Q^wTg}8ks~67n0~6CDYus$rNLdLN4P{$mUZD z*+r#Nzl*7q>Xb&S)~C^XqjVZjoKE|{rjr<&LFcY!u%BcmnQzTxzq~9uJ|&B`sASWI zJ2Ad&*9`bdN@tnH=OQ$98Pu?BWPyK2>Q8T1P!}3 zf*$FNq?kS<>DBO&GkIXu4E7nkp}krbk+1=v(hG)M7aMC+-?U@$be^S?95ID{3sYT`-nXu8pOm zy5p#A-*Hq_IF3H=9Y=|u#?dp&B1(=cq92QkXv)nZvS>b@E_sb7Wzl%DIW(T${1{JL zZHsAmN-_DZE+)%|#nhzr1o}CUeHy2*j`|e)H`Xnok0>FHyb?0rTEarh5{fmSNHZfQ z(wTV^N%Pu7@@YJY7WSJ&A4g9j@A65s?b{?W?J=3AB~K>p)stz`!^zarcnYl=JcW8r zpF(%fPN6Xkrjm`zRC=bEO3QXlrMM5gZ8?oJ;-}G_rPJuZooTefU^>n8pH9V-r_;Do z(`kan44U0@2CXibL5FtCpa<_}P$P?(r!FS%bBpO-qa~ExX9?+zUP9X|mQdKQC8Q-=N(Zx-l6>n@5^tB1y2Ua& zAHR$iuUJO;50}wk)8!;Wms5w*<y4~tS2p(^&E3*J^3G4Pbxpx^Eoz9 zY|aL1yL|&ac)x*GS#P9_mPzLDOWZ=#Dan`ryeP5gbmi6)wCrV*i=DR&t_71YyzJq3b*g@aB?WE|`opgD_PI7y-lMZy*MY4ol zw0G4m>iKjRoov6G21W0t=Sz0ei2J+A$aD|w4ckLu3-(aGTYG4$;a-Xg+)FLz?4^s> z_R^&0`)Gha>-DGaqdOP((YnU_NjYFY`A^zUmS^{qmev7!-R}Th8GnEdoH#)1>X*|( zw{n^>rko}nDW?+k3Yz3xLDNT8(1MBzTBCB1_TnI2P#mP{eFsV7=Rs;O9iqPZhbVRT zA)5d75S_L^Ouw=Zlg*C9l=SH^t?6-uUSu30>#av9_x%w%-0dheO*=|4n~u`nH%F=ZBu8 zK`T$v{U;|WrNb#wjb$I#<)^6Y<5P63-D!%7K27S&PSeVVr>Vc$8TQdWLra&OA>RjQ zsBYV{v^(M~r7b>7UGJZzYSVMHCj1;FEjmXw_c*4O$$2_H&x^w^fKLAaG9>% zzD$=|U!e=3SLot`D|F@d6{>1|mF|aLr56jX(wEy;sh;sQ(hs{vofcjr+_^>rjVn3+ zLM0V1tfWRLsSj?^wYImZRn%>YS$dl`KD<&GBbcY<<-=&E$cj>|MyX5fXE=}ohkE&zuk?YEPwCL$QsxiM$p>g+V|El|B zQhlEaJ8|5F_y^>%<^gSa{(ua-Jfu;H59!s~hZOkoAsy@bh-{J`(USF#sOjrRG}`hp zeNKK%@f#o0?Kh9f*ZK*aOnpK@RW>uJfnG;&&Xi= zGn(`18MU;lra9TwWU#ZE=6$IqV~6LoIQKcV-~F6ce|t`rvKO>1{{_kRzMz9YUXZ(Z zNf+cVY4HA+bpO{&O28}nsC>o#&abGU>T8%X{-xKesvcY?b>HD5OjDJssr`}Uz%@4HD z;{#cge4xE&K2Trnk5t+JBgIVmNFUC9q!GHGNXPpV&71OxI$r!l+nanQXW!3sZrW!G zy8M}*=zXDd|1b1w#uplQ^$Rs^@s;Ke{7UU-f29qTU&+4ZH!2_ejrz>}M(1vPqX5J2 zbTjBXh0puW--F*NzSR$U74m~p7yO|2w|`Kk@lW~~_LH*8czyRLWtje=x8c7iY4I<5 ze*YK6w5_4Lku?;!w1zG{tf6H*`{KQBDlqhAKjd^3OrEBK6I)bJ=dubMKd2y0PZg_d zRB_i&70okM;W0xMBetnx+Z9zj`=|<|=5^5Dwho2|)WPPgI=DZx4w~$!gPzywAmwu% z%x|HFQ+8_jJWvg7bJWm(wi?HpQp2K3HJtpShIjhvXz8F13|2>Ut~!e5sAJtOb)3Jh zj`v^Hp=VGRHjZ`S7g!hRd37;mZe6U~T^A>B)WxH3bx~uW0euZ6@hA68xpQA4zl8bUL; zA!_m);$3M&JlN9^m#P|~;(J3retJT44*Ji~f%-Nb?7Xal z_zyZT)YHYu?z+hF)rDEQF3wKXMb>6r7+usw#amrOHEs+I>&93%pfQ|N8spBS#>m~k zzS`#+W5uh+khGiNY}Y0T^K61wiA|6{p$Y1(ZGy?CnxMt=CYax_DNH&w#bWoSXcN~I z3&%Bu;mW3%ajYq{o-{?Fh8{k*)5B0#Jyb^Nq4y{~Y+j-V!$W!~ysw96s?FeG+6?QR znn7zwGsG*|w|hY|81HX}%v;TH@<%hYGHQ-tvgX(u*c|oqn!{&KbIjSMlZ&~|Bsa}ljDaRhIdwc_}8t+4x6DpV1l#TU$f(QfsV!+ZwLA#<*o+j5JSU)J-(T^zp_pU1f|l$BfbK zu`#x*o4~%U3AXn%LAN0$SgkOD$$S$`+hYQ?8zxBkVuBmZP0_Q5DVF(~LLb5rbZ&<0xOZ7{fZ8!V1$gQp|gp!1?ONI1|2D{i&Hz3*+HZ_pO~?Aszg zpeVZSi$uTeLdY7WA?$f*P42tD_l8+{~~j+6NvlWkGw4 z+1noeH`>GWOM5(P)`4TEcR-4F2UsL`z_SS*P`0`Q{El~k`r{7RtY(fNQ*)@o97}`E z;hblVJG0D@v(23Q)Eo=mn4`0HM{Muh5t4gHl*e=gMs>uVMIB*tpd(h@>Gz6*XhcY$em7xYqeL0D-Q{x0o;iC4N{;kzzar_&WXyL82V_pYdj z>52n|U9r2YD>m)xie)#tV*2N<7_Mi5SZfRP>(8-~6D&|~oCWSKwZPU23yivL0q^e? zFwnQeZ5vB0^tMEBk|mlITjJyjOXMH6g!w&7T=;2;ECVaFu(QHeUn`D1V}<(@tdPFS z3MxmfP;}o4+BH^~XlRW__SP8XXN@l@)`%;y#?@8Uprh6tJH#4wYOE1v*bUq5x}l+8 zHw311!}1B;@N#80SRLtxv=VgPA3CvhdFR_8q0UPL4+2H3V8$4~&17|IIU}N7ND2eHTn2|jo zThIfIcK5)wE36H8+XE3=wlM9;F+yEzF?EP7TncRQc9t#XZm|W<+2T&ME%G(&(4>tW zmI*u947S7m3_Cbaw!`5ycIbJ`4!iE#q3bU@%xh_ndOhqhY=Aw^CD^0OSbL0K%sPU7 z_AtM0kMs}r*sbG$AM7sR(A$B1PaUwlzyVihIY4!b1I*7lpzkvW#Hu@DxUnOqJ33;C ze{HN%M{F&2#P;Qm*izw$H8&lx@UtT(HjyExs|=xiWZ(eIFjUC!ezuI`*vK&bEXOc< zCPN!_3HMt|nC~FL&rd?#WC@##Bm^y$@M}NkUzcF_LBeTmfsl>@Pn`vlLj~UE2qaAt zc(P6)=s3qcx-ZcEr@-tMgs;{FKM$5}#t?oCC%Bgqrfg&V!Z||IYJvy9-iNmaHrfMK zK7h(Fz;rAi76E>HfS4;l`fDJ+ffJN%ogf!Z$QtN`_*5qZ7CUiVe4(F@h@dm%{68OPc?!_vtaQwBTZRhlzgCpcsFGG{#A?+lAd zXQaM$#)gJ2c-qzlM#2UC0$h-h?1DMtT(EPI3oh<b6mZxnv&4PzZQZ13O(Hzzk-8svt+R5#o#a>Jm-ZaBBw4NjNbu=cqdnyU9fhEX3} zu<3&io_&xT-3LeHeb8uTA9$|sgQBB-aNu?yy!q4zMmp~3)xjN+aEEfBJ7y%iWBFKj zY+C4!9XptF?%4dq9V=_xd7S&A(2`@JyY)q%u)h3$>5I=3`{LO0zL>JVFZ{3eh2E>a zI9smL1Z!=oP*QTP`{3wIAC#{3LBc`aSIK&l zmp<5~=8M#pzG!FZi;FJ4>^tcT!xUfa80`zsQeWKO=!>C8eetr&7m06u@mRwTgN^)f z%-RnYZhn{&?1z`BejFFp57X!Q;m#&Mv_0mB$eVtc_tp>RH2m??&>!ur{o&TzACW=+ z$W8Ib_|g8DG1nh+Huz)qVSh}$?vK&0{E?;>fI$5KNL>S<-zxyG0s^ohut94uc9^pMrN>}wb03T~A%jtxIv8U{4@Uf)!RWJYFia~3ugorjA z!>mUTI=cs9Y;X{6CI_KQVGy!r24VLq*3Rq=g5`ORarPhxC7*(@r9m(*8wKN)WiaYE z2SYc2H8gR-FenH{i%G%IS{#g@TZ8fRSTIiC2*#S1!6;M-K|s?Gv}qrLXZ9gj)h`55 zp&T16H3Y{BLy$5v1Wi_jV8fme^gbJcYj;Bs{yqec>xLp)KNPn+g~D5eV!u}?%pyWD zIwKT!$AqHCoKTEf6N)qYLZN#;6rT5a`$H(UX@udfei-U@4uhEpgYXK&fbcMcq=zAT zG;4Kcg&}-Z7y|Z$!SzfSEbfG%$=fizt}_Hj^@dHfuC{+ z`>hYb%Ed$AzI6y59brw+wIOKuYzU@(8-nJV;h5ek9E~i)A$JPLQ}1wiMuuZuMmRLa zu+C>zI999-$Ln3;usRiv#GBz*{4yLDeud+^P6S$;MnLKo0YB#mMEgY`H97*>SU3 zf@l~`h{mtdXk1?t&0`zQy54B?sfvc?^Jtv>7LAb&V_;(tgS#DLFvcMU?cHNgF(?N9 zLu2qDI|hkkWAJKb3=)>d;QqE4_#TPD{>w3F`!EJ0-^ZY;PAn{%#G=5I<9}PlqOMac zoV;R@6&j1>!(ws1AQm5rW6`8E7M)hdLhOo#`|(%|xW+t=MZb?+UVSJmn+}D3o1yq_ zHI)Az8j6kmhhk(1dx<0tgu~8hRbc#bGhd3zR;_%Wx4*pSb*pU_oy%BMUpA?5Z^W&hgHV*xE$D#Om91dTN z!E5rYpVV!*jX^t_pfuFn$L=Q$DY z>kPwLoncsFGz@7She5I(1{LRF{A>?HcJMHCiW`P&nZuwQISi(ghGAdnF!-$;hDTe6 zA+=%{KA+)oH-@o4_b|l1ABL+n!{DTugr)jPP-~ZjAnPP-5J~vyo&?u`B#ezn!r`PO z{K!i}*Re?moR-A;t0XL1lZ1Ucl5puz5+0mO!mFwzynn*HPr}QZB;0SrF$r5FV|UwR zEU-+5T$T)fw`6qmO~&WYWE_Z3#>lK>U?gvsBxBW_WCScr#?Ot(ShzPCvg66Pcqti? zcarhCIvJUtlJQA31!-C-c%q+zL1rm9WSIhUSqh4Jr{IBi3hYBtFm5Poz0!H!6lDqq zj!(gq87VkYmcnsZQ_y-x3VIz(LHL;z8bztpM zG0G~H|9>GB-n~;{>79!D!KtW}%>%|IEVLLVzAEu;Y-Mmx`S&_EoxPTfvJ)zdUQewT*l zKUjCBk&Y+2>9}Q(j9`!1j?#3_lc&RQY&tGY zPRE$J>9ASK$F57q@Ez$euHd+jC)441IUP4|r6cA^I-b8tN5Z#sJXXs+)!gOuzM26ikzLny1)!{ zT$2Hptr-Z~mx08i8OS-80cB+dM%?3dHOG~FpMm%v85mqQ6TP%E(Y{3{G)yva&pZ>` zty$ORm_LWRT-p<6u$C(hXGqLz{Ce&225LQ16+jX;0zhxF{rg-jwj#+qM zorN}zSqScxg{ghBaL9+}y9&%g^T;eXByhR(ETrUTVN_ujrWa>n!8F#-m2#ZRC0SUq zCJUuovM_N^7UYMr5PK>M9+$GvwJHk@92nvI*$*@zyNjb|Czh%4ZE5el>UZ>emY zo|+AZxvaZelnsqlTxKKB6SN~6Ee>$GqpZz4lZ~3o*>Jg;jZqJ>aiBVzcXjZaL`EKL=+1IcOQ2g9ec~ z_z;(as+1h;&(6U-MGmq?vtDmP4q8piLG_#*j=`A2f0wcTZ+#BlZOy@|Jvj(I$n!Rw zV7=eD90Xm>!H=6cnEN1yW8>!F*qa;-`kaG@KXZ_%o{KjPbCKLQ7u79t5#Bl%m&{n- z*Ett!t#i@DJ{K93iwiEf=+rM4O7C2pADD|)p}B~T%H>$Fd|V303C+$$h@3Tlg}JCG z%EgOGxoA2w7q;^_cIe_ zvOG-fnFqM#;h9GsCi>*TYET}|hU6hOG7mq8=3!D&9zREUSdq(hDD$vk6tBnUVdW&& z8qUb$|08ET;zHITF3ZD()p@Yl$a=+XeE!{e=v|(NxkvI)eKHTW=ULBqB@YL0GK9mje`S(#ib~eq&IsJS*XqAt5ZSwJ}Lq0UR z=A&V^d^EDlM}3Jki9K1L=$embee-e6D<2hp`B*tPAH|{hNQlgb+t7R%56j2<)O;My z%E#1vjsQG7AEu-8@vtZ#OD5(cbXq=|&(6omdHKj&#IaMC=i~h9d}M9NhyK=l?AVzP zpM89eihRhA=0p2bK1$EA2J&(~R#)bu>#cmOy~oEr&d0*)d^CNXk5TWr&7WC6`6C~P zRCvCQx&;{Bfa9!c6~M7c0VX%+v;oiMVO)UxwgouUp#b%|6rhh)0mj%A@ZX*V_$(Em zQ_lhfx)xxpJL?=h3vkuD0AKwJpdZNE$It?JMid|-hBcA#tba@@z{Ioy%*-l4X&!4R z6}%qF+haI?d;vyIE+4;u>sie8Ei1saRR!3*j`fzC3J|)j0G7K7@N;hg zj+OKLhldN`d%OU8r#U|CxdN12;@Gg)3h?bl0oL5+_T4W)-Nyx3_pAUuFFB6v8`f}s zD1gNmKK^?FLTU>5H@X~34UQe#kad(=au_z2V}YI=t@Y(7HDsNnu^bcHu-3A@oPS@) zakq;c{jB8J(p?UHJ2~n4YNKRJr}%ehbFJa3yELkG#RE=Z2o zp&W-cLXP-oIhG9N;}Yc1Oy)SWX`GiS$BY~~_T|fQUm=J3NIA?#vyO9|oWHYJmpM_6 z(NkC-I$e&Xv*g$~m-V9arldx5-hwQ;wWHazyTz zqi+RkNe|1> zyyrZx%PXG4<*gj2-t#e^dxO8Iurn3SgToriira+&*3as={psp8dH@y|u<*R^BfC7<&I7V+E*Av28 z&@cr`!?|sdJfBRAg6FJJU|l@V)0U`!d9nf#sS3mSW!$131nq`=T(){mAbuy7LVUZ?PNPUA8&6#W0A3aHHGn8EWD&|kp1(=r9x zFIJ$_QtprC%t}80Y6aS@RiO2H1)6Q->)x!u&n*g`2Tp;TI}|vvOMxwWxV`)M8V~Tb zS190ii0Ah_!fiOl=Q+;W+mi}RIjunKS=QE`=RUj08r@6W4_8$=H( zdRqa{yIkhJ0w*7EUq4cSCo09qrwXjDRv`2R_tz_)yY4mj%Ujm%zE_~)17G7O1+>2? zu=%S3e&1P3`-9K- zHfB9s6V~$Su@3%~^}siDMsk=D5aPS(9kNT02W6dRwz5up4VxZCESVgX0<7a-3m%jt%UlK&CDNGNOy8@lk!4J-v6h>8#|*CI`;F;v zoi(q_TgLwe-@}Yy72lW4Ek@krc+|{yX7DXO2h;R6YloSWjM*KI>CIeYEbnr^GPjuS z_xN1QEynu35~G=GOveXGAIdh1q|BPdXGn1LiOp9u6Co`9+VvL@%PM#@cZZP^U_&bQ1#++jsz2yF9MlySu zPmJX&j)%^aF_nzYYaSaWpV`DbW(?o(eZ`Dqwlhx|gSXrkM$W8fZZq2NxDS~`W-fD_ z`N*_+&&Mox6T;*(vzhJ8CFTvI`IVm&#)S!E@|YRS2IeI5 zfceQZ|Hl2sxG_VR9A*-;oY~J@W}Y*u-+7FfE=(_GAd|=pXQneNnY|3_4*9nOj|Wr# z2VXzal>y_;L@?>hC}sw;jM>f{Wv(!fm=BEFPkv`Gri>*+j0ZEAiDfdFk<28flv&Aa zV=9<4%ys4=^M?7(X#C=Nvl%0%J!8$t7+1!N8O%g5iA*M=V8$|&nc2)DW)-uE*~L^a zCz$h0C3A;)%)DeiFyEOvHQWb`Hq(qTWK5Y3Ojo8GW6uc2nd!rLGCs^eCYTw*L^E+r z5|hScF?o!F8Oe-c#xoO{Da;IJHdD$hWEL~an3c>LW<9f!*}`mRb~1aIeM~uXkU7j8 zWlk`sm@~{d<^pq(xy)Q;Dw*p{6?2oh&D>$`G547V%p>M8^MrZIJY%Yv=gbS{CG(1T z&D3h_-~PorUcYBP{KZFJfBK8hysqWTUwq|tE#LmdcTWG!4^IEhPfq`vU%dVQMh)lx zpYVUH+5i9dIFhs#HBzVe~ z;&YwP7Cuw2cvh#dLbaqzN$o|cee8Ut#9igObN#~Sx|Myt6qf52K2yCu=;?K5y~;i> zt`B-~-I?>>Tp#r2y0d0wpAXjueaO5Z`&@f+c`I(dS&91O;+pF!g-2B@J+}NPe5x+{ zd_8!}kAfF`S`*n@d4tYpOQbE`%ipgF3k?Z6)R9m6XLPLoN!2za@2>&UP%)_;a1|q_ zo{B|GTw-+XCNIBgR8(Tsd>n&)UHS#*#H9=kPEU&rPK=AlN=}Q2OYdrJ!T)NvgR|q3 zqLQ;MBL5s$`{@*!JS@c`E~>6(m`V-Tqo(2%6CIvmVP#c&+CMoKQEAbU8CkziSDUM* z+NJi;|F&2}MMq@Dn)%jd)?w6CfA`}5C=;F${#TCL?=oe4pVsHpvbJrC|Lh3M;x=-! z_Br@n=6AMwZ4UmOQ+uBeH~x2yer*mv2>*3do7x<{>Hp;XuDOSGx8c0`ubgf@Y=`qj z{VT`1oBeP;@?SZ&HoX0JjzvavPR8$T6_wg{sj1eET5Z2neVKgYzn-VR`$%2IgnQ(# z{^?zNU|mK{wRSLTkE&hNf9L(XW)03&Q>`8Q+TLuv%enb~m3HEs+J*0k-+NV50{&$1 z=l?uc?KA)1&!zGETthhjcaPXxJ9PV#vaxco{gdiuWn=#*Wo^~XMkOrl&y5uJ=k^JU zjn4S5yzrEi#N5C3aBfUuMrL|+luAQOJ8P4FFV@_xJ?!ne+1UI$*Tlry%F5Q(*2JWn ztxfkodxkXh;4Xc7+r@b$_kuY$w08OTO<22K+r1zD?!VfM+NGiH-yQw?My$=6%$U^n z;lCCq72RI{?(EuKu3XnfF88r^+<9rhnCK1|^6!DG&95CcFCO=>+Og-Qwh2zU|7(4x zI6scd*wl_TFSP^upXy8DGQ!??myL6+pqLj zncDhlm;Y2>442FL-_-Z}f&4$LZz7jl@IUIabaCz7)8E6-!@ZYd8&BT=XCJ>dCjTwd z%fqFAPfu6hHou2+0FThl{k~@I|GV!!zG=I63l8}GRT$=*5uOnj8Riq67#*G-9h{z< zlrc0qJuclMIU?R(rKxW1^Hh&toefp$YX12&^^A*5OHNOY$uKeZ>1g7Wk`Xs7E-x-A z*2I~=Ir&RCO-04~ueW4zZ>Qp+>cxGA7W*3w3@GBa48IJGNDg&h*$lyENoM2PigW%{T-0B`s6V$tx2U&O zv6o&^f1Bcg`b7cu#coE$0Y*i=rD88les^)9F2$OYi~5@t`>U&6RJ-UC@VnCPHHC-k z7il=i)fKIadz-11tCbJdxo;^Bah>em~x|k3t=lX0=uSe$&=d`7>_1zsGH8u@ev7pK;SK zQT#P#!F&n6>cwh40|x#zW`EXy#;oB#V|J+6vy1oNyK0Avhl+nn)ee=*NRwif?k{CW zYKO`^UiF`f{@0<>{b#5S6(#8xC7BfW(=F<6RqU%*6kt>A%p-4K+|Q_}zf|n28CH~J zR%B5W&?PjadwI~IR(w&lKMnO%Eco+J_t|plPxpEMlgj=lHS(VnCsb;`uWFY%Dtf;= zh~GE0KL`2eW8n+EfZ`M$Nxpsis2A&c`;@r+Kis_wd{o8RKfcR3gaua4s;gae)m2vw z?rI}RYiPD5$OfVY3=nQL5RjmN5mMNA-9&MTvP@2jZ|%?OtF?W5d9C(Wu-aDCwh7^4 zpk9EgyCQh$jSx^2lmLPJzTcU%ml&e&ufBah|KI=QvpF+!o_S{GnP;APX6Bh0zq4GD z!z}Z=7TG6R9Onib50N}PJGQ~yCdN7P+hbk!h9TR!pjg3m_otK03cq8r1y4HF4UxR5 zB82br35U>|rH_h^Dn~9{svI-YE;wwIi4>ayq!MAXoej6jvnck)3X8#nj=LR=?GZip zQcqj{_QrPO`|IPYOTjAnEo}f!_by;c`S|eP!cgiJ%Lysr$XtBLLVPa5@1Iq|GD2sb z#AW*zDq*Xw6f&>uevf^KW@pdG-fqpTKUQT*XmxMsXMCV9A96(MQ6U$kylI##`-GJA z37Ot2B)flQn!S}3P1bLAo>||To!rU}4p%U{>gr{`9G?zlDy9G)fdc3OgjM{fY&60UH zSIw=#%T~4IrkiT#!n<_--0I%Gg^L$v>53}S(uKA2aMfwwl&T_2fn~|!nmf|ph<1LY zN=96^@Xq<^59#bxEtp$#7z|#&g|zT`e-x0Kld59V(O#SnZXfJP`@2#=}7eRDYoUcWVZ!| zJqAWv3OIv|h=-`99=EhNLbk0j77XF|6ua_@FFy%f$;sf<0B@X%sU-8&fSYN-lAlke z2XiuG9$;?Eg6mJuTn?BAvfxgJ?_4y_f45*#dFc<|Iy8@VHW57i<&Ry*4#4c-Tniqy zy8iH8iNcI$f$;Q)uMG1jlK}HrK*3Q`_J{9jz_eO${o(r)K5PZdLzgLh>H0lMeY686 zX~Fe}Zz1US7YjyV>_2~HSJ-To`0?ov-wZI;jez;X*AyIOQGeyV1`5fysg&U958o@O zk7~e-9IfC!uRi`4V191F^@r~vbX#iyGk%)F_j&bkJz#FO;QGUN5fIb?<`JqQc-XG` zEAM*1Y`5V0!PS!py298|7Ow5Ao58n*HEXaa889sD^ zwxxjitp)da^xFcMx4r-$HH5zc=4{APKBP;3`MU@(U(14H{(21w{|n>9iO_AXv?aU7 zf2nceE$HcPjC{FKA~}WBqjteoywhkeKB#|fG~e+4@y%yujXtRVM*5+-Qt!t2WcmyE zX3PH+L$6M~bCCH{KmD;befcpe$8kLR~Wi)|VpS|2`qLUf4Nj5Tir_SU@xEP1AP z9i}k>&%xP=0pg|jG94pRPhD=T#~!(`;Y_jBoZcfw#24zA0*&pp*B!LRZh4!paxlNp z+aq7eMjUyXlbjtKQtni9wt0w>8^0ZC^d!E?{KXxc!~Q(FUSI_$F^n=+ya-ogkJ0=r z-mw-32DENY5S!J0HSIhELyTPUk+J6B!?D($!zUWsfrN#$H7v#8IS&J>py)8xykuv& zLeJYP{TSm8KptF)GQSsz_>!_`ZOAvvk8j&6UX87{oBvJ(2^o&*;3P&dc%ht$_GC-4 zCpoh#c_KNpyKa~1Y$W8agmxsh-(L40F=S7V)%ZPjvD;|89);yNmE#(!PwXvn5b(G}};Fwlm=#B#At1lIgs6k{VdWHaKNE{Hl5! ztKWfNJs04Gc>DZQrivPW-ZT>Klj-7U{`S~$9aHjon0s&;P1Iat8@pTg4~T8F$7}q4 zZNKRqjDMAncf;#S>TAv5%S4&bS0}x1CiT_YwuFDJ_EGX|Z5O_N`Ct&yZ?F4b$YtRu zq*%Y$48Cc4S2HtaaIjf1)n-;a)Q#-AQNx7+WZNuQ%Vh-4ziWu*Pvmegoty=4;^O34 zrdwv%jxcSnLSwQ7rdz(WUE0S;(`T=1Wty=g1B|A0{4LJLtN-E7aj+k3mE*{_Ooe$vMTpJ#LZ2P?MAxp z#5HyAs!Q@9s#pByvzhM0KH% z(&0wfxbEaE;&Ua(btm3~dsm|FF_tSs1rI3UHw$Fp?Z_W~KHv}9jm8l8R%~1TJ_>%% z9Rsh4Z8>pO?5N#X@fOMTogT4U1E+vt#I{shGn!VgxFlQ_+vI8cwf)FE`30=;ZqoaZ z2>u{m^H4VelJBA(wbv1*C9P1vkg*s_*pr59$qW_=s(qv-k?%Zv-NQ^@GE0HQom#u; z{eh{k1^o-P_CN$o;(mzhD_Sd3I7<}8@9frINBj@$b$eAy^|zrQHY$u9fDNz>mhJ5l zxY=&zOhI)nm`Z_C?QWPV_JZJS6LeE(%dT8Py02Ov>lq-Wc9h=~PF9>GkGcm{v1+psa`ED~bSbK*+ zlCJg|zc+CSW5VULGD;kw#3kBsWVF!ERFKiSA4;)fLed*67NHx>--#SYkbbq%JPCgA zajqG>6_QRI0e=<3A8GxEZU&zKh8l>I0u(ufFAHRTfepN4Mjo>n%^!dfaRRjViCOcQ z%?v(C+JKO`i0C#$V7;5+yIs-24?3{aLA;}ZU2uiPqyBq9w!kj4;Mee%$}cJm$>kv< z1$cYJvl0vt#qjzNe7iaG__og2CY}5blAzp$_&f&)g30kZI!wPKF|j+g*^wOddk)bO z!$>gvJoveGw~ip&kL%WUB@8(8lH)1YiW9?tg!%J92I>I>`4bcPC7jeRS3cYBR`l-W z$r8$?;)F8*XnZ{vFMs0NZe{=<84$?HHaIFX z68mqUgwH{FU*n%+CqUR=k@!nWwr^laJEBymkUSuhXn=$Q9x4b3)c7PB9jt)DRokQf zf{c7GgnSQ4Nx6V>sM=`UeY~gV(^iQ4b0F+uQGY~7%v>{K^q8RrR2ABX>>R*qWquzd zy;LHNrqN(TGkCS)AvX$^t9<|tl!6VVWW881%^HpBf)_B6?0#W^)i3z*0e!<0XveOE zz7{VZe~DAT1~v$2_8O{vd#$h*(zfz>P?UA!mR%bh9%yx*T?s2$)X;oe()+x2jCG6{ z1O{_tU%|na-wpOO1htP zQ)!Y4Sw(h#h8!(Og(d%QPoL?g@{pbWe@nS7LVyHbF!lm)o1>R3{xNDgMJ&}bE-<~% zgM?&Zmqjttc^#RWeYty;95p~bnO<;*>15yTGsA1UDGLMWb0K#kaEFpP2`ybL4dUZs z?Gt>XF18?DG+VN&8`{7|)aSRMBcVRePoAfpNZ7TPlV@pfAj=VZ-P1}lnA5fpf*G^0 z(BbRTuD_;TU1`@0Osy%n+taSM)2;()*E5(sR&ZO>F0wwSmppjswlk&n!D&5e9}6&Q zslo704VR{aCQUP3T7_tk^ULt<7A7mMv3EO4^wfS*L?`}3MIB1&6}A=I5BcWgbHA~2O*uqP_^z(hc((=4JFkd>*1)zol;Yy zj5zNs4MjV@zb82`jLQls-YqgL2dvk!d(@JX;#AAJ-=m_iyP*7szLG}L>WI33j z2dQ8Nzt3c}PgsI?t=N(hM&ksk*{X)b-ov{_Mf@{>rW%=*!#1P&LMo4{$U0;+Vm}C6 zW^_%rSs>9O_hq6B+4vxE0)>yp_Uo}ttn7kL3iAqt`L$2+cLE|>ML{=E7E=Uc;VY10 ztt0yxixvtwU|MDJ0L1GUR&!V!Dmydw>-sEDszvYp%4jtme|=+dhDS7QUBu4q@J`QQyV^EQ+En z+e@wZB*l0})9*>)U;6LCE4wSKNez*Jrv|!BqU>pw-1#(>m$lstaXyUz1cMk5c_04| z1A*&}#(Csam3cY7suGDn5<iz_Llw$CeBH16Yt3XY_8;18<<@H-E${|>kjV9e-%rl{ypuu<` zBfiN76Y*C|c7SH8+C?a<{_)ihMt0*@9{502y4Pr4j|vY!VPK`Fs~VLFM8%y$Wpyig z5!*Zf4Ja%QYsXU+dtA>{_}@OSraAi4jwZv;b!#6d(0L^*QSF#E!PuyBopfPL=zW?1 ziR!fgN_y8R_RG1t#hF1?jKH_2&UMuN zF~cs!Y?@)Cu~P8}m5mTs#shE1NF^i46_-#(6#N2pS!PC_pl~QPYxyb%H;_l&El?=FYVBlb^3=9!MMkqQ9Qj(NH7DJ@f6qw5Z#PJ!0 zV}VFQTm}-`_9LJe0UQ?vAv`UKOL z6`)G>tnA8JrP_Y<)^gIP3^f%JxAfKtWRTPgq|1gvg`5(6##W= z#o>UJ2CM2|fSMe8w_1QJb%RQR#IPU1QA`I*IRG#WoiC>h$0$LZ5FZDQ9^M_>*uye( zIwS@TmoR*U?e6ik@CIfOrY6&x>sir##dm5X!=dy7G*C=se2k$4o38#`0u!QE!-eO+ z8p@jO4UPs^_Y*5|DSod#S@SAbi&+a+L8`yCRF94S_0(ZVE;c)wcr z76Qvr;~%r#fLKm-d8*8>=1Q_NFKe*wD9aO2o%;0Dc7xHq2j3OnrJtjkAa*v3_Qw`>l0=E$`NJ$(!fEjb9V=EidO&@ zhH~n{`o%Gw04SF`*^d9Y@XY~GIoe7d`V>s#8%;jeFHj({V$mdd5nYkPyu)FZJ?ube zp?Ph$GSp@RHA5zo*FGdZ(8DWToD2v{SGgHH4@ndt7i9p+OKCvRK$u=)LKi?oP-+t; zbQL6L@4>KMh88DhG01|WG91GAUjgkS5ZwUc%K{>20*EhQIzS-00mPRCLMtgmvN|DU zi%FEwT>y81D>?fR<1nB&wo%%f&pL!`7aNV&uo<%}EAt17jv3}klp5_y>h{iN6t6s+ zV$P=#l8cZKXsBSGPPObZw6Zc#!r7eBuSpB*dtxvbidywV_zxV1l_O*2dh%R2Wqx&J zkji;6!i)8yW65))>)AX9BwK;ig(M?*hf$?WK4>(vAGc5=m55o^%vz*rmdA|#5WIDQ zVhcevS^c@p4`wh%P-wOzIWL&&W$hS1Im@*G@-4W#Bg1JHD>+Frvf>(0T5(byT)8rA0bD`2%FsK2*-`Bf{vr{NBZV$OjLP?%UjMrThC)}Y)1DY}C^=JcPh#95Fp|-D6Iq56daQA!j3I`*=ve*jkU)|v zBEMluRICcEIx>U5LeWAgfHIQ+3zX=lv_1?17RvElCa26=IY$B^JweuqZPqahk3}`v z021T7F*1ifh_oT0Y9OJ`frQ$XfTz~ZnXX?QOLtM28V6%QFzrgDRl(-h$m`Z{mR~nY ziPR+3OAL-Mutzc7+ChsSG)f+~ctuX(qcD+ZrMaxT^@9OQ(XTbHbD$7zHJAdsa2~TZ zS<;0Tmly*>MHj|*thkbWRt=RLu&ScukRo&4wv24`79FhjTe&kqE;YMs=dO?N@47*a zqJzoG-(lBB?3XgbD86jVFZ%C6v5MX_%n$L-Z*SZV)+#rew~xUSj*yArsoLY~@(X&g0R>nimXj|~c1WA7`^d44L>Rv%Pm<>4wo@_c- z#uZf|H5eQ~J2DHN0Xb^{NNrw>j(;nqfIO>0@X;E8YlpEzhQN|OL_pSq zu{wfGC!op&j_@LCxpq9&e~QIj@teEE;_mp(-Qx0iKrGhdH)DM5inUS7*1ZFq2+tTLN3fx$*O;nt;0z1@l!>2}aLHfx_8Nuhy=$vnRy3lf2Cm z8jZzDa{J{NC%;|Je0caRB90r)#jI}3GRE3^ATw*Nn(s8glex%&%upGo^@FErFQZ&i zwE?%?Ln2|B7oXw^3I)zhbI5Jk*z`7`2Kh*Jac&!YNo=C~<`tjfH}W z_#NHwluJ)}d=zpT<*MH9&OugONnN8cp#}&MxuCh9gG9x)qssg<4D(TTJX;PY^LIk^ z;6PG*g6SqenKh@LkWvO}O_{%%<2TcJn%03e$}$l6NZ=zifUJlsp-IZ39O%ow>^& z1_a&-95(MfzU@P{Ky+NF%NZycb(si&7j(M7o)J)CPMZHzjiFRCw50YCYYsY3s=ACO zj%7|-Wl7G4{!%hxBD@k~%g3;ouu={rla;?$qsx^D#rh)@)P#Sfwguso**->vwg_l# zmxbd0o#@(eZI@&%qwxr9S<#O~Ba0bk1Nfh8hJxl<%dlz23O;3qUI3@u1DF73Gn^~c ztX?e`DC)1|>fe}dwXRObjqIP2_SE8gEhaO-)QR&^t+kjz#-tr8wbBepX4PJWloQuEn15m__RHyuEZ-A;Sf*?0@m8=?#D|i5Rj=UIy#X#7k)XmrLYxL zmN)R)Xoz_h-h-?iAFxrBGw*IOMsIAP&5Vy*Te%wM1pT>-)nPRM2b^Zva!OVgitCv| z!xJ$?Y*s)UhNIQWIJn64Jn)zE4wF)SEfXUi8sYY3zehu8u7Z=oc4u~x)X7N+9q(I3wASk zX2k=DN7I||^6qjo{6Kd(vE&d7bgWEl&izZfD6d@{G#Yn---*K>S%lbr?DsgTN5{w3 zcZ*M2_YMdgrUjNYTQtFGj;Gx7ikXMvGrEO0C+-n5yW=x-F+4s4eC(p`1p~BqkTox{ z6>X_^2R=0Q?*_IBXKoxI%0TV<*|TVe^;49cwd%HQOuMK|(Za)RJDzqGfk;6ahJQ91 z)M9xD_E)EnZERo1k1H}hX-5^DHeDPMTZ}a?g9AM1JKB}7#?UkYKrjsS&&<+^kA16I z@H@0TmsvBV2P>dhKZWr_()(SAVjYX|l8w2Fc`h_m?_dys3$1RmlF<16gM|Ks1^qn&fcCAUC7pc_B8TE`e}CYPk6Fb&GggmUFQJ zwpCZh+E0wZ$i-N3DgwYYSicjmq#Ci&^c$9pnqC(B1hw6gfxM5Cfs*=4Yoh1vmZbN0 zm~aZO)Zu)WmUvPF{GWl4r8F9E$>xn>)B8FKKzq{ymcm3{oxj5zFE$4T$S|Sbfno(o z8}d6GoL{VKn`G9{gN}&Rw!bTJ?Q0_v+Mqk|PMKsC!ObQZqDfX*yoy<>sT9Ck`?UP+ zY8ZzhyXhPa3FCUhU<$qBcc<}i4dWybX|53#fZj~pnvs5}9r99g3b zuqE1Q-YEZhpTP$wD6AcRyTw{nZk6^JFbX-_^!}dkTIa3=tI7=Cjb&x(R`e8?*eNYeQu zekA<5${%z3&*aba-mPubc7QSbc8MQ@b}Bj`_9!reVg3-bA&^@4FD8l2;4^HaNYV`+ zhgr!}@H(aU6E&!$np_ru%%O(nUX2EeuYS-I#7bAs0MyO^q?xq$suj+TJF_Z= zD#U9@pbW=jz>tWss5!u0VOG)53cX#MJu}Iayo%D!V@W%YqEKuvWnQA4)<)>m`LE1D z-L@Tyq^0B96Bne(nS)uf+?1;8r22b9x5Y%5YlCPUki}A|dD$S0m2xrPlbe8H6c7aA z&f}36tvDD%3Q!f$g}N#|B!wtS>w*b}oc}Dq*I=S7m(!_b5*&^KD*#OrD$Hu)^+@F$T`(rxn@9D79QI!hr>u@Q!s&v?W=`e#mo5bRWOTk?MiKfD4r(Ji! zrM||~E=03&#|&Y0n?ouf#c)&lRjS>{HB>;}G1lyc>Tv@0fU?YBjv!dYMSjLR*Jv8f zv1sru1b9HrTC?C0bS$R#dKh|}UbxvMvj^o86>K6$Q%xCdRwlaXSc{L!RCyfRoEx$x z2S0r!Y@leA1QV{6sJ#s^WYpeCwgTFf_=_b1(aLCvjcC$TD`nT_ML3Nv{fSm>E54h- z$51ZWHqa(N!EYB#|5Rd3{eLJyCe^ESC>aaLjQl@bLK+d1sNj0o#-fZy;}uFE2hmb$ zv6P-`n1@M!FpM?-Qw=vdE}Dya%^(#hA471cjtujd!8>Su%GqB6*02rF+C*fUSIP7)q26rXg5!E%c>S)9?!{ss$O>o&47xS2$>HxJy8vWe23+VAl;>~zuk)PQi-Z1 zaW!pe2Lt^2?!@5a7Wj9sPqs@Wl>jfNu+VL4-!UxV)-!nKnvX6 z6kwKp?hK#_L(`XumyKYTL}Oryh2Kimw{Rl$jqGML{?KY%FvP`t(%l#hcu*M&@D3pf zPVM{&Q#<0-zJr0iU^onrYjyKBuA;ict7gI77!~AFIvP!9;WP4(ZiQZYGHs8tJ=ONS zPofw;(6csM!L7D*u3SiOe53I#%OovOR#KOw(TS`b`=JCwVg5uVN|RR-DB}~v^`PV;iyS1b(HK-LS33&L&M<$X`qI>JW&x|(l%gj@ z?OE=N37WxtC9(_6;4;&@OxsOa$km|$$E?98P4^>7cFCcH9rOt$ZLpDr3OGkGNO3o2 z>`>#f&B{u`T3@=77`i~)iorx1@~3^+iyO|;-sBYhf2dJjW!wEQj6DTe&awR>?K+%x z4Tp)W`g&8^6;Hd~OuKS0NK|l-rd_{FyV!uZTNv|v(52L5P6^!9r6Mq|y?x5m>B_to z)5lHt0GpBBw4_x_S;iW*$_9(tC^X52o^5o@uok*7lew*@NG$=OndIS9E?UtXY!;-Y zt$70Y@_QOTMYz*w_MsJLEni#H?U(})?;vsknmgwuZP6Loga4G-t#`EuKCGdA#e>gT zF73qUxTUoZ%x~MRWS9cxZ@l#rQA29s1&E>;O`xK!6_Ws(n;BY%+*Zhea4i<{(5Zzu zDS^5KbcF_nfC`T8fc7#Ku_O=`2Wv}Dbu@DV z#GL6s`laR!zPOSX&WvP`PZzP{iyzB+C-mr@@RlLi3BX#oOYshx4XI^LW)EDfNoq1S zT(tE8FmWIxD6a2{S9K{@cf5+dRZyHAr$rUMadkTAidSLv&N5!!iVs9kP_(=L>om7f z31hzysZ=gb1ZZtg!6a4#v|OAG6y-XW0I~juKFD6z0d>S_kr1t^44^(r9p)5oPFd5` z(IDNxLF6|s=b2~$+L5q52bcu#^4A2u`A3>WmhD(ZEieo zs1*-N7exAH4DuL_Pf@ZePR884u>#T~#m!g<$I{{J?37V0a^WzSvB;{dA=J)x4Ca6| zS6QqVaPkt~Jk+>z1Zp2{?3wwxb_|=X838}6>Mv6modI&N65flC2i{Qz)|KF5m~y~| z4KBp5K`|B}zvWosAE12*UZ*ChRsq#)G`GK$19J_qg)_B31&ni236l&z%nJ7;P`Am- zC+K#wo)gs%r~Dpp0T|ko@IMSTkN`3OTN5jJl>_nO#30T+N-+(UsaQ^K5my-ygtT39(_xq+z>2zGfMsY` z|66LJ7JFl4f{;ptbeu)zpzJZ44GI`YC?)nNxFk21LCU=ZuA)4ZtEwX)xy{fgAcGC; zU9N4lgbznhu$bit3UO(9rfj014O<2rz*2zVpk=;tVnD-991tR?81F*7!{)@}+d5zz zf-Vv(jcWg3*pV1}2moQoT3E=!Ja%R`yrfU8lgfOBoph3cVM(Xq^0Njq4X=9vnJF-x zidaYu+Bx&(<76H-^~{!}P zGA*>rq&O%rn!g9(0bQv^90?ppsUtwN8gxP4;VZX%X4!WgaB?F9g?bq}L^SpE_7cRO zgQ2W*1mro)-6}DUE^R4I=l@0w8dsK&KpeFF-5toc6A1ixW81J?zLZ-`63VnP2n#qc z1AKE*azUEE`IM0XVsRuH#-R_$5?rhfR$vXRqVNitWo!5*-JE8<)&Hg@ziB(_H=O~z zf=pjy00%+^(nUKMN+gaeIIg9^qYvXLI73+4ON^zfSlPtM&@dK&GjQy(LuxPyAR5NW zot*&U7lmx7gy9qwKxiAsfN)x4^?`3-UU@BhN6TPtEZx#t(WMOJ%h@(Nq? ziHajURwbzxe?MrC4vE!i!bU|AtHN}C*D5tg!BAS$V$PVMBwJ89L*nH?ncu6-myjDt z3+9$4dm-v0g?fSoA+LvZSp*N99$HuuPFYy;%;B@^{s6o_SXhEDW5)&{q1zF_<$gEZ z=#!44K_h|NvuZEM3XZj%06++3tYP|y?*@<2q!K-qG^xa~7bzYq90AbX9n@M;`QWW$ z)}`d91>h&fR@@a%Z0*Hc#YWR#NGg;KF_~J_l%mXuWXjU}<>g3K>qM?OQ;rcYTpZuJ zrAygYb|SlEqjG!;;~S?wIDVrrt$=kUs|}09n`vB03t5i60a9Tx)tKai1@^{L>k9<*o zSBfV>FCbT8G;^9-%S}pH$3sZ!yHnu%0yFeDKq|!XKomN-JdK2fk!ecqMWt7eAHvFd zQrS)NOEr&{_|T3f0j$+%26dZIVA?-?l^v8y6Bd)?3MfC)mhx%XQtnE?(8ZEA$CM?d zRM3s)HnOs8=p=G34ZG1~S5x+6_<*0BP|KxxnJctz%qw$VUSyOJdGF!B({w$=836}3B^~W*0C9O$|b|rCC zNp!ze^m4XT^j(-8N4JH}%*)PkF`&nLYrllt=seU`8Btr5RuX;h5xry0@)}7O}d(CsM_| z6Ju%+V@6Sv96cB&Pxe7TE(%FC7t7Yo=RvVm9I*gj^0Xs?q|#xf@{3j3<~EQz@Q&GF znZ9v`5;`c%-QemRVojWa-Y|(WLqk(pkwj0AfsH1vxMUOj_AG+muFQwRtGY?>N?5$n zsl)jkoX^9#N>&5vAW@AS)UqD_KLd^Ww6;^JsRdc5cbc%btl@enr`#*By>c(!+)hRP zG60EU)uI{2aT8^$IQU{!Q%-Zw)CerfjkoqrRU`*N3#@>>gPMOUPma+MP>$0lQY?TE zIQAy3{?*t~mr!|TQesr9VKTlX0Gb*{2yUe)Dh>otF_{OS7OV!F zHQWM#;uQOvvybCLDS`^I4vJ}R)yuMLsg>q?94di4PKeD?PHBhbWG}Z<4VMkUq8Ug3 z++qfLar!C@a-sRKKSk0RO|h8sxYQP6D9 z;=|Ljim~@wF^NQ0n9(?$^U`pPFZ_W&PxlsjX2`s1#<>l z4ONI#tzxmBE9wK)Jf!19iHzojs(n)}n}H^#npP#oE{ZmO)lyv-3(6zH$|v3_v(Suw9sa=Km~^l*MwhvnrgF#dA`13HHlK z-&JxY6H+%lK9>j6lwt{L5bF-rIl>G|lB(K7@L-MGieQ(eD)42Cgz!;6dzSsKs?J(C zt?FbQ@|R-^IkGKPc|_$oGW;vjAmAFfIf?C_0*lkDV63_h^=6xjia<2fe}`I$#NlGo zXi^HJ2lsR=0OBPI@jq7_Hr9LuGgT}%`Ow(CG*@lK@d?I?zacu8Mpw{YC)T4y#zBdK z{b$8f-IF7y!uBPPHlT%*%Yh~YE8+@&0RswTK=CB8C3V8NhgwDB+rZMXg{UMJoYr$9 za)wzEla{1;X80)>kz$-Px$|^09Fy(>nUoAwhlYa{gR*$B4XyxmKk&1w!`s5%NEu`;7B3pw2Gx)E-hQX*Nqd)k-mlJmBq^`4(i8_Bi<^TXpPULfp?!!t#n$7-2Uxuc>WdH#cg{Z|BI!In+a%9=e8|@iz^~>g22X; zOR*vj!`B?iX4k=uv(77ULC}C0&Uo~SYjjw@qFiRd@@bRAHIDRAgjKWK&IL40WfiVm zxcC62d@AsNkd5}#4lxYcWW*z;>61-;70|mTi)oJ35%JF1@}zpEtuS4z5C9XI9Ont+ zhlBYA8-zsYQd!b(U8I-Cuk6{eNMGcOkJo#4ptit;@$n9D?sa;(>3-U}r69J!SvC9m zHmI|{$&jBU_yl0A;L zw>7qs!rm-+Z%Z41wp@;?tXRfVaB|DQf4-a2!1o`nH3^xy^QZ8QU)-63;=-FcL|?+lV4isC$1f9-2cNH3$T;}8B9?)vgpcRsWJ10J zA6X<5vJyUWZYJb0`1q)h?4z-nFU`)wvB~mlHm_a7S^+~;FTF9ckXGZ&yALt555Shq z!_K&TZvD;Q%nXY^s{$oH+~<>ZY&Pp&OUF`RsfMw^ibWU|_Gc@EH0gaW5XNYqIhMWe zy+G^%G&||S(&&*t{?sbhjVKsOhCrJ`l`HFjXr6!A`@naHEJrrQhDaEmmdNL#pM7Og znqqUSZyYH@hxEZb6yd!wz!wBAI$7zHT%W*PkbBp zx3pw1??VWmbNgUE523v=pW6qsPr`)ppL8Dlk3q*WnBkO z>yy?65{7*t(F{7LwmXxS+roT-jr8H;vqI?Zoz{g2>7CXEGA&vkjE>YUEFOKu=+TrR zH{4WQJgRt-BRa*Ued{2L4N_~0T9>6aemPu-j*d#I`#mn^+)E-%Soe^qq@uEEIi zTDNK}yrs6PYMylmhlHDlYps?7xBPPB()sgo@5RU~uFSsSB7N^gKliYW8kv``;OF4p zi%V?p;U2b2(Uz97e(;>^-isi6x9sO6_g*}J?>tN|`zb!jJ!}*R9iM^g?|gVWddySV zYvLgno$UPjR}g+SU^*-~qL%owI&cKBcd}i?e_2nltGLho7zDZOzW_&}^R+&3xNjq? zi(^vkXhs2!cWLnHuN>52rvRoY3$8!9{4c=#JPYn*bh!fwtp&^oN_0GIjQ!#JCSWF5 zaQ)?P72;0^%zG9b`?r(PnRMx~VBnOGyocl@bkU$)oK6h`Pk-s2i;SNGm?G*6c!^_RaMz!=na@bp*SDfl)VFf|t3=jHDnz^wiPeAU4Bhy}xR`Sh2+6M!4W27sr( z{IPTMSTGV0|N6ssCE&(?0lo;d(@B8YNWBLSl~ai?>sn8S@5k?(P)jbQ7K7*W_@DqV z;Vih5@d3|#o(P!7sk?juzFz=lT^8KQ@bPn-1tSsSUw?FY8*ux+03X$*PydVfTmbel z0-jX8{omfpF$ssV-}LK8U%2K=-OI6H?$Y_yH!N9l^Ow7t1G6nU?iFs2oMIWQwAi7 zR_q_`;=stJ+`EtL^7?xu4<@7j({Kx-@w>2p$UT2@V&ch}tig_Qs`EQ5G06@y!@#C; zgbgDqtmCJnzAZ6gf+8IPWZvbQI3OlIFYvYg{S07FVU-Ax!q81aHv^-)YBoN$aePRv zHb+kJkPC8buq}l4hj>y-0Y-I z$HjCLC@oqq>ghSphAinY(}lOS>x_$fkmbhqI|d}*9k{Q%r>7i6O&1CiI&D0(peAe>-8pVorgDiz5w{mT&XT7JvA^WiYD z%#VAdSNMMl56B72-WE=+T8AUNg_-eZUmWh(9(!ZU-5s4@!6aK<4h}Q$bUFcpo%So-+V;519Al4l zonIfo6mHoHx7fCAZ_yid=ZKHs!w%Ru!eT9ih`!r7sPWS}jftod(K@%wXp$%XA-DNE z8(SL6#8FZ4816UZkwOh;iz~$kJN9cWynpd;_Msb#wnRTb=^te|UzA0%MfAq)k%93+ zG;D3NV=d=L_!xbjGk2I~6zi{FzJX+wmy%9a^aF|T3D-_qpDx1p5%}fU=G)bLkka6& zWUy*9UagAf68r|GuS?xIPM^LrN115v;pgl+7w3YNePm*vxK#&}s;1!r)4IUKoEWCt zgGp{r<4!pPEVebAY2J=w3B-rEB*s|tI!)3KqWO4=Ub%a4(HnOU0UK0S&j>svvkS5}& z%5Oot!VQ=cT^VNgf!Tdu%>x|sFje3_(uA?*EiCmmcx^kwICbW|1Z^}J_Q~|J1Lr`M`MJYbv-4LyUn_9c0V|66b@?w z<&0*@v{=ftMNW}<`~`M*MNt?r4DGc&wN5239BQ~>H7=MxeC*-FU?S#LjPvcpPVZEH zz3Ke&Uei2G?w&z@7y4=}l|V-2YMYbZ<(Sb2`E08ZGuKq3U`Z-*M_~qEHLmzIZouIi2rtIx0?Q>r#mU9;lZ=zwD-M7pv~wMm zY2IKzyQ+=)PcD9{<*$W{PiiLon{Zo`?6C&api5Qow3Iw?%x)ttg1IGGGN@!1n}zBs z3zZ}VspQ0c#%g+A(Sg^{Vy<3!c(rocBeY9c=xs>F7ZiSsXj~RD78eiwAL798T2Z*E+mEnz z`;Pqet?xN5>cJJr`K{Pe{#xt%dTWQCzoqqEeffI^p8S`@Hd8l=1*=o}uW9Ye-_OUR zwdZdW>$mN}DOmZf7fr>ZZO>odMmTEo+0P_+ka`%sHkZyEVz3w>Tt(Z?ZaJJN+H!XL z;bfpyMm*1o1=g0&H2fcAn=1BkS#z4GbEFA(0v#{<(eb+MzD^f7MSPU40ll0&N^p<8 z?f|}Vy=AsT81Z3ZI@x~8WVJRGFX=Y*$CyGK`yE>}e>X&>>`TPd?#At6L%ifrU6mLI z{`l;Qj>RQvdB@@s<*~R#c`PoWCsozRG42yK=f8_pCh@mfZH+r|bSknCSRXGr5TE4$ zNnS$TpoV1i9AWjm=V<+hBY$(cdQdZ>3-`U`W6L1x29<>BX-yqv*WS8k0IFs4MXVoI z=e74RdhWF~7-FhJ;C_hNp1A%!sxHXIcs=^=Bo!OBe;dFO-ci@-@d?g`k!eF} za7HY&(q`%_8_p23kPl#aM9lWCvc*cA_Lcfs>~yZvqi>>7N_~G2FjLcywRFe22FAzv z>j!Nf=ch1!&VhfU#`zmGgo=rN*{$sO3rHKEb->C-57d%T^-f%}9&f<$Ht!*ZnCLb2 zQN|w}qbBCoYw?M>#veRIv;D?*f5VT{+(LgIEpxAAj@QI`u|>6A@CTZnY`g3ET?Yrf zr|0A1t`u_s*gB2|tdZZ!b5|5|0Dc>+ZER@66a9g$GM`$@^7qLoJN}Xn6*peuK>b}w z!=8!WRZc@BcKk(5^qJ%BL*I()4>QnfATlZo1DqdpZK*Q@g~}u2J8(&4`sa?6HzAT`~Dy!k2VQ;Aw8teXjx(r(HO8 zU(wN}Lo<*afP~}`#{yl;kM`V+mBN9~^R>K3dH%>3noH7Z`G0Zbx20RYNTBUoW!#z; z%&peVDXQJKY3)|aU%my?Wj(F$8{(y*Z(2eC#g$?p|0NVR?p`VC56Mb8K>9bWM8)K{ zWTevsP(pPqH^DUvKew#`|8w!nvCV@fLfM>Sy9KUF>8giI!STv7rPuF=OU3AdOLb2J zA>7s1v1!*9xRj2A?m@S4-HTWo?G zM+rTH?gnEU4EP~@Ncrmi6FKuEzg}p5zM`YBzT1pr-7J$IQ;#X5RDB(&obYKIi;kvZ zM)yk79%mbs9ix`su7w^m#Xs|xH(|(s1rVN#YCqV13gQeIUQ=f$5`a_6ajzsQ zO`DvIFjlQby4+nk)~qnQR>NxP+d98s4A6xy@Si2UktzJtt=!kq-KE^u#&{zrj$sQxwjKy! zu_Lfeo)iaksasys2@kxhGM%A;ca4Qx=5yd(-(;{X!oa(}4*N%Q?D5!o7e)~qiniA0 z0#&+91Mh-;BnB3G(bi~Z=P7Vw`%vou+>+X=p`tNBqP8FQ`!zHl9FxGgfj}3`d)&Oq z(PbTPgt~!_7i4wa;Q*K`7P{YNd{>S+a39WW95UUwAGH;PDC9O+sj)RwimSPW#zi&e z3UE{&a1>0MGMOR?lM7B*4h4H6LldYql6l~rLpW1}8Vz<1fHgl8MQrQ*L$DkQswHq< zE&`)ZAs0bq{Nrh}qpi&WPNgVvf{|>fS?3+jhg+#?vD=-t$WT%22408ISGGZWkxE)> zx(_ksvnU-!6yrQW#3@x;p8h~Ojy3Hkr*;@=iHvjkjSFj-AfFRGHrq|w7ftKcEWDv| zS!Vifo{IagGjZYiQ|~9+L_xMzyT<~!b_f335{5H;q|irq3p!&fjSf@JommQhZ*C2!sja7P69!n%y zl<#el)Gp&-su%A8;MK8L*Dgs>NaD$&Jh`-Y4*MFtoGM{B9YN0g*#nOv0T4?*N$Y)T znm(OY2w%OaaT-E;r*&$dS|%53_OkD%*219`NpLUS7$I^W?}wHAIy|0y)l2K z59Z+#hGTu^*;%{;?RKA0(sdt)Bn2eUG0sRksUVIS4RdQKnA%ETpGW}edrGjVEmuGDd{ z<Yrs_KQyB5>gG z;jcF}&PQl(YV>FH!cLg@)^^SPAcgsc`6XRE0Mvx*1~*oAIz8Z!F;jAyb&>~s&1@V zG8eU9RST09crB}!`6)ve`9`?3P^qb&e|v4pgNRFLyCP#0^n(92Wqmpcv<#w&Pu2Xz^OjU2 zwHp>jmd?L*{?cV|XUCI3)$@FU0tzpMjJ1Le+C4 zbF<>kfqMtw@~M8{q4Y1d<+WtDAcp(!8#ov?KKStgv-Z1Q{#C$?&VoDH`uh^ZzZx*l zWx@5g{=ObC+q2+KhHn_~y=}q3DWCrE?FHP?FTlq>Sf?tL_4J4DOu$`i!ICZ~%U?Ib z^8gbZst^*qKYXhJ^CJtcKYXS5@FZY9rijNw@c!`4fqGR-6$?*)_};;XI{`D3$`Bs1 zgT$Am`=-KwVZqSPN7{L1X&DS-5A`(QS}oZA(tQxh+*ZI;S!y}qPL?h;s)ZH|obu_< z?&%i5)o0;5S$)g}hWi1t$AV+e*B|}50pnDo#D3{F0tn6o%xEe?csRP~uN-$-FcJ{| zWI0Yk=ezsB6&HWDU4DXe?+0Ae>fk=F9IFBIBMYv-`uG+QJPDXRRDAHH>*FN#`!Qe! zP}Q;EPDW=N@HqkFq~d~yy1S&yXY7ThA^cLn++)FgUO65F%ug-2{>t$;eE1b$zUKpC zJfDZ}KYcda@9^W(A3o-<)rZs4&W8gJ;rip3^8s^37Tn3`LVQJldBB4Ey!`zPFu(Z% zd}Dy`kA%4ZKRkB)`pe%Cz?_u@ce4CdBSU_`tfcycCtYtR;e($8=C>9c(>)nJp8wkd zm~rUa_wsTl=VMVIOt%X+5Whzi1-mwuOuHM^;W#D##S6f>cdLUp{x) z{K}>Cm*ssq%P3XYf8Bo_sDt?BNP(R%UF;D!6wQ%Bn1ikyIk|e1boua~w9SFin~IwY zmx@bVDsCQJDsBN>OYzH*Gt;+7R|x+(RL-##{g0J zQ#tm?Vft``Uew@;?!z(s_SRBk>HsuEnz=Qt$iY4i9P!{AD*-!kcW%-9x-TG)`;pA*{Gg zU*wsj>;$kdxX6PEd~4xcjCU@|felN!_4PW}B8LTuYb`f~MlEqR+-g?2#Zb|jza8|t zQcmGxHDTKxEcPAM8ZKU>SrHc57uhW|r!N}VdQ?j<&igx^i*ySL^R_~xISeL6Ut`&} z0MjSfS?z)a2rROSmN=siU<%%am9}%2Z{{`!*mDh9rO#2-0sTFwE zMBb>ySRQpX%r&RE(FVMWG_@GK$Ua>pRGba8-2mm)2TsJpT5W@4C@1SFe^=5Q!_zjZvNrA=sbg@2_jl-hg zB74u9C~cms$e<|I#ns;UxnhblK1~ z{~~=dcP-=RM`$kh!eY&X23g~9pZZfs+8pb~suWKn^9y_a{>Bz#MGV2H8Md^>{lZPX$out6E$ zab-<0kJAW9))4ow9H#yQtn3Q!3vpf06awq}FGtluS;&?pAdRLYDR zrP#9V2-qQrrtXt$#O?6m-`fz$OQTmTUy@N^Cl}j8qrO~0D_~v$;YxUgTn#f;k*#D% zrI2fq1C3RFB*XQ^BYL#VtN^uoBtUvOQ^$81l3vgx#?+GL1O;p@YL3q=YCg|J&6kiI zaN>9&L{agL70)0ry`cHGj-M)T$D{H+pyNUL);gN_UN5V4eV{egrAMzdBfTXn^1Px5tJOPW%~07IV9%x(lro8my=6LSX7AoO8{(`fz!A^@>|MVi%>ERjcV&+4w*jw2tw5;!Vem9ccjVp(t?Xx;vl6!5nd zK<3g;Gu`S8jB%{@4aLu8M`m@(%IQFn4AfGc&V|B7#Y|ZKLu3YU#p1+g$v>B({N8 z-&6{>GWz>#S8QKclsKm#TZORa3k(v|oiOzSXN7pP9_(o#dTG^wBTq_jnxd4!lO{ti zDU^~KlG~4)pkQxR=YIQ}z)Qj5Lrs=8gxDv*c4>+-2}Er|9>+sZi>KH)tRIw%Y zo`x%V5x=O;eelWXYfy9i>>;TG022=KtU=E6wfJo$wAg6=CfS}A)Uf;& zQ=ugE06tfgxB|QaFpLO6h&F(xSP{UmAVeGD!jEiAd^cQg7AUfJ0U#`#IB@q0oQm@v z1OP6)*qtPUj;W*hwug+Fv_nTr$ZjgV4W{bE8QZXC|qa1 zEx!d!WwF%3CqexJG3epL$H|;7+`AG)TgwG1=too0Ue&3Dc@RV%vVs(+co#FLc>DM^ znsZSODOzw)D3cW$M=-L?M?GqT1qio;Brkp zPhu$UjiFddy)n2t_H#blQ^}t^vi^CIm2fv2?*PLU9k0)Y^5c8~yxwnSIEXzSeT$61 z19$A&MzA+TuLo3w*gZgAVQU3lWs7ac!Bj@mzq8zu#aGKNG>gGcML@CQ)G>zm4FDB{ zo^ArCNeHDr0EEIufjH72!xV@^Hp{ziR-c`p{p?hqCuJEU8BIK17zRnB%?H2BCfFx` zr%2RN)fkgyrA; zjMf_JEW_g!{!(Vh`GnBdneKIRKTpv|4HrSDCq82hx?(dp3IhpG{QwP@?n>jXSE7IC zm`_~mDjK8LpCKN^$+}S8Eo*z|?DnyKYSWnnqu-|n(fDbm?F~XEdF3D!0`@^FKSf6k z^HXFNl=cgo){4DS%rZM282bK}UvQ`zHigMt|I%NKkI%E=?RXz&*by}F0kFA19C<=K z+P~9QcdE$2^bKOV?PV(pvHzU~)Z{7KbqXy&Pe)xTk6P2C_}tdnjn8*XNA; zP?UY3?QALDX5p)4>K}xV$3}r-7fk;1B!{KgtNwtfcgH8Z8?XCwyyUNDIIo8XmX*A1 z>0vRN@=K{K-p>CNqmEgLhD*eRw@sy7#izb4O5TQ%dTL*V{*2YT9|lKEb;j;=*fy7N z>I1^{MpiIPVn>zy6}th{UZ?z?c>SJOeYdUd+xeeDrD&KUjh}Vq;HQ4ZLt;QAu5wLM zY6W`USXYm+!b5BmoMIBjYxfH0GjX>eka}nk_USM|Hr6_Kv<0^KvHCwF7hS|=G`~ok z*pvqA`3d{bD;Jgg)i60}Lrr6I$=if#h{D1i+t+5fq;TKykHD;inDDN!iwS$gnZkW4 zZ0Ln^m6-ajR57f_a?mmVw>E`2gnV&J|M+Ool>*mNQwn^G*HU@<}~YJ?Nc~ z|41e1#>$6;Epel?(Z>bSsNaL^68Y2v_Nh?M?X3L?e~wS+BE_0`<}PNhkY!NKXxboq zZ|o6}OfrV1&_>gv2&CEZOIBwdMtQ37bK4f;zmi9Pf@_`($( zE7qqEJ0m?K4&jM=SIOMy+{(ANvAyd0$eFXzcHO{2{frIF*+CDuvuzCC3-HUaQ3l?C zpM;YJ&hUUkQF(Z7!jD5-Cm7u=iv3d_o*Gy$xK|CwWKP?59Or*Q@x<;=3NYl1Y78%g z4F=w%v=eUz-Vm?A#U9F!y`gZSMu|+@77GmkC#*sWjXjZDvB}}M9-VB?I*x8|q#3$T zT#?l8!)f*B!56(xhc|qmp7uMW-;wq^r5|L*tP}&IFUZD>92IS>A1=Njh9~uy8M;5g ziP@r!0O*w2Y|ZFO z9RbxVbt}Yy5QhwLSRqb?IAsX5OBn8=G|v{jTz_USeBg$nm+@sUVm1M}1Gvm@Po$}{5h}(hxiy8!1Lge0TH}2cTM1R9bHc-^=eYS{(Q9QY; zHF}_N`)nNSmnvtubV(r{!v^jAmbR}04fP9E&@piFkz*LV>+xf&qm@0>4gbSa0_&%W zJxnRQ?YP(olY6aYI`(Mi@0fq2$`Mv-G@phZ2Z{6G{g8MKTawTy z*^9vl9{*$CfF5xw{GP}_Ic4D znP=wEXqrtq3Z)87<~r~nfXa~JJVYpzjd1cJyNTJeRHw%FiL>F+opV~1mnyNq`P*?y zGKFPg#RJ!4IH;N#q|2S*xzJ@69lNf8^7e1YkHh{D^VAMRBfZXJu8xBwCq14&>S+sza2 z-vyCMfyqlQ#4^hpse&6#JdhdbQ*((PkR%LJM;lYd%>GeBM#$ZtLd* zl?TPs*8$vZDXxtbF?Xa00eNB))X;nR3A+WLhF*+_R3SrCrBZP^#ayxW#^khWR%)LVAz3VkVfL3vBHW`hU889v>+C2}rv_Ryj`}6q1qWs+k?m<4g`BI}V;Pjb zkPjlQgilEpuEk?u1<9g>_x*7Hv&U@8C2}T`e*SfP5JWnSl%wx4n{)8#jMV4!8(O!m z7(aGdU|l?1M)u*C2^k3=9~F{qXT#W<-G~1moXx)Sdhi%seAqeh(Sc22o~Z)l|K2vG zl;pi_O8XvA$$HW3OYom5TzSRx-(=F7j}SgNGOcVoShmI9m~&*mkzERhgc(Kzcn;lg z*@X&o))o!6XOur1^I*XC#@yf0mt14x^KA3Ho)qSJOX?O!WayVU`jX=U+RI(O<%P>L z)TonqZCN`G?y*8xv%M*Q3cmC%MSuGXN|9J@JzaX=dADX#f6l_p12YwmwOJv2sgP~GLb7+P&?F+W zW2N_AnB7(^!YDi(wX26|!5%rXq$breRLJM;k{}QCE@|HbJWrP}oO(xLZExT4_gJQ+ zG6Td@PRZ~8M=}mb`g5LS*yWinV2{Tv5rH$d4hco$MugB+1nIF0+ zN!3GYWY;q7JbI_q-*KI^6=XZVx&4RFWYQXMVfM(hvdcbPVx|=0^Ucd{{4L9=o=H|L z!XQ6c6jQq!$W46A|NPlGnOJkJScFlSxT{A!KH|x;&ZDH%?3@Q9r00@rz)&J|3Q3_H-DT(jbX~S}vJ z)(~;qEV^o-sYYFG+C&W`N-$V9KN|uD4L^ZU0|}BKXn+WbMNJS`K$gj3+EPVITdHVz zE!x!bDk@+?kUy!0pXv+*h`!Wy9fR%DkT}$@YM;vQxWI#>ycTv-%g_N=d-7m%Q_Pa z%`Z#LYxq6{-%m(^=0_kxgp?*PSl^k*dV@c2Nt)W_gBa`2zvA1J$))n!6n;5WGJAI5 zvl#QM7}PDl4Jn(p$h7FifYjW2Aj8*GYWihNTHG`LfKK!VJ~ z0oI?Q1wDOcH=m(cU!a73bRrybh5~obDV$skH-c|K;P2gvGedJhpGkrxU|?aO$iNU` z1JU|D>U{UzLc+C4*AM9So0sc?b7Nx%Bqm;e{q?c2gDrM`^AfJ4AI;484SIw*Z}0A# zmuhy0;G>&wUN}oL=Sn7Pci+53<09|2g#ZuUi}}sVm)&E03*HQ!f5!tKWPi0i#<%0s zx!L!8bNh@rEs79(lsNU0JB2ynix8g&ayXYeg*i=)5R)iQmm`$_+ehiMOALFaK!`ZL zxd%dXT5i_F&!qyNH*tUs7aygwfkO{Yro@yIsT^bJ2lJ3QyakDeCZsYa$z-r{Ms&%U z+$CqOkwbl?oP}L@9uCRjgL@%Att*>8^Y+4A#Uwiq(d_#i=*eP`Uv13iw}7)|Q=A|= z-zh|9Cnfq^o17#+U^6!;th|Q%1>rtMHb*e^?LfE;x_Qi4&v+X3y1+I zUkRS4g7|up_Z)b31o3qzFBbClg6I7pzMkZL2A=cEPyh$*=tsv*YEW%d|maUydz!sATMZb04(C8p0_&j_0%sv0pGccSgPlK6py?01>pH9 z2Xq{%Ku`Usy3@3akZigU-y1l-G#4vKd773Z6Jd%_3qCL8)_et=* zVDR=-@9ns-4LtF`>{M^3eiR43q2RgwSCTIrNl*GMHh8{BKOguWF?f5@Zy=WV9|OsVkzf+X7-^*J0HlwFFm;)ZK!Pis0pWuQYJWKu{e@PzmSHx8}e8p$MN4-nC@O2+AW#F4{@WQNa z=V9r{Uk08%2A>tD-Naurcv`q7~ z+*4mHZwPpD48ES^4Z?+S;PG={#bLEaH}?KFcwRR6dXkq38Lt^ULLh#6>X#S%Sy8S4 zc=RNXDYfB6s$!Uzc zo#c7ouw~$T%~U0(4g|?=uN_{tP~Py3ZtoFVo;P{r6>8 zjYeSAXv~UpexLDGR*lN$eB}kBoUPcl28;#rfdZfiCQKlSV{1CymF;)oLNBhnAVeHVxf46;3)OjXE<2u_t4oCs$3))uz%mvtv(|{ra zw43q3{3QU}mwkr)gP@&jfVIFnz-&v#;{l-g>upbEC*t*s&U_^(KHazAWf(6Rejyu#c?(cpj{aId)Q) zCxG?9GXTfWt-wxT9{^pxiE&iK(GbW#8?Y_t_X2=^5B3Y~<@r*8eXJUwy|l0M*g{*^ z0`xuYrT=-4-2%{F4LJVw*sC}o>xigL zZ7c_9H`Dn*aQg4JZSa0E+2K;JVV5!c-Y%8T0j(Ka}@Hs00t|Tm-OArb_|(+N_&2byy8h zkF~%$fbq5g*aXn`-RSX6jGdHejR}mIFG3l3h;o4T(niJ=k`tEb2HD@^QTYC_?>Ot9+mopq;dTF2J}ZssXco zSAwR^Y-ie93v2?|wv9mZSF`sE?|m_-!v(|{;CZx>mw+@ENCaX5UUM4Y`4E71(r)^L zX#v1?r|qh>dP2m+|XxB3@k;;_%ZVtTc%H$&zM>V&{n3j zmHvIk0R6lTpzoT$8GD6nvt3Mk*d}a`Dz0l;XSyU|$#uWCPQHT!ZF0XJY5>;9I9>zLR$?u{SYg|40NA!$f!)CCz_I^Z`-aSasW21C)PZmZ!PJYok*2;00PU~?HXs^s0199}yOSo!L)*zuK7ukRFWI1JGtW)rgC>|y z6amFRDX<8r25Nv60Bttod;@5<_pvkEYsD@6(xq>%N8TEM{xp5cbJoMujI&zM>`Si# zU*KP}zJFIL?w8bS8^At5UFjp*uo|FU?5k#fGRF`4lr*n%tfjqc0hXtnoxtnBS^D>z zu-Cdjuusb};&`O-MENxu}P#)WL5AYvoSK(i_ z-Bw^D5Zrbva8A8xTPZLWmBX!9?$je1ZYwpAt&1K5CAzz!%tv~kXS<~ae{?E;bk`h(|j#yRO+AUg>8pb6Gf z49o>+|02M&ed{w)*8M4@(YXQd78elcB4&d0sbLKw{JOexna9r6A901<= z`s3}(#AZ*tqFsaSqa9|v(w{4U8Y2xJH|Y!7x)Ct#WsK3^w72=&VQ+|iY#-Xj`$Hu# zA6NpIF+`gEhvO`5Wel->S&sJ7PR115l|E|(4g$yibGC|mbRBf41*k9WW4lcQ@`0kD zlr;0p0NTF@VEZlu*v16QGtac2GS>q11KXRnv%c*>Bk&daR*x~MLGB)a^*jsE_iF&^ zMcb%<4v+%4jWhviGBCtICQ@E20>%Ob0BtV@XuIhL`d~h=1Yp|}rv0>eJz&N+ZQlg! z2H5T=zg)ZbICohMS&TW;HtL%Q*nwyRkw^DT~f^5g)to4y!gr1?m*0s4Tc3G(t9 zeJ~B6A8Ee{`e7lk6kz+W1=!|a;oc$c`FkK^E3na!_XJYf%vfU`96y<7_A&CY&TRmF zy$_(j-}-X??kT>$u6!}h?Sx*`bpx;-V1J=)jG<*lN_r(=+PMxic^Oxp;_g*48ezF%H;9YXG(zZ3~Vc#!NLpTWLRSr7sAUqs^VikN=RZUHT#0fw9L}r0&as zxj+Fh%|Jd3xLrmx=SA+~LT zOx8ueoBfRA4E3a4Lx5}`8E_e?8)>3}Or*3q2Vg$=na48BD+VZsaZm{`Cg=~Q^x+C% zHLw<-9<+Hk!2aCycNAleQ( z#>h`V%5up7`I*uuEXVT#fbxl4U=cvOR|2N3)bamlXXo)Lq)j`xyPe zc4jP-XB)5w;8@c9<$c{*hi~${NBbBxX6Y4;k?jB|o@)B+oUZ29|ZvUD2Mi!1N0eVfN{SXpzZ5{O#tnD z6=?c;?CjERw2gIE1Js3jx`0?9+DKE7Qs>}n%rkk&$1=<_(;=V}4A4K!XG$N?)};XL zWWU$|Fpl;B9JjuvHWhP6#t6rTI)HtM_Ht}lYv4(w&j9rGPT&CWHTn9R96Kpn=*rmG z25baq%Nl@j#BrnsSP3wXcCQC$E5{Mq`ZfCc>$Fwq)d>CAZd(D`RtwMu+A<$l1XKpm z%Rv7UVB0dT%s#|6r++B#$k)?{zN)R=+Q&XX`&IzOz%(EiC;;+-Y~$QaY5QD&cC(FX z_i6(itJVVa*(P8oz_|W5*e~i~Kc>&wr)d}ClI=nLssY+SxPU|;6Bq)R`OGT-QjB~z zQi6UUFEI_E{fu?q8#s<^1Q;)@UjvSP{q22L_9dh41i%HDcIAMkebk-Tna}IAm1zvX zGSPq&hy~2+EJu460*rCCFMVp-yBqXA;2`kUH()cziJbu3lYXYZ%{FC>1&=4kzW(~Z zYJWRZdC?c?KiWoH7^f=%`nd+6uh#*LWAe}s^mP;P_P5_wG45@Hu8bA4?W#dDmgWLW z0QR93z#4$<$}y9+ZUchVFI`Gyv=l5WpzAids{G@HPs|HvBFs|6PwFXREx8a;)=#g)?t>S*lIAK5JJ??3M z{e-bZECCo(97|RLj9*@-4`?&}!LpRm^zE}%wB1hVwh5rV)SLEH0;L8>F9OPdxd3e@ zIBwEr+RL)*0mgA1um?B@9RJVSEMknYM!l#Xb!A&|EXf6i00jVTn+7m12S^4ofoxzb zkPnmt%YkZO8L%2)dov~&*R;D4_&1Fy?7t$eSTF0RebkBi(S|sH_PGJtNE-;+!)tbc z`$cU?qX8$72(S!oCvPRN6j%+c1sKnpfb9TnWg8#+_q4GXLwBM++DgB3Tw!}sug78RgM+3s|HvBuq{oj1kG#D0xtmM{SMj5ej)T`n=z*50%Zn@kuuh3 z>necl$#$ll+W<4x-uia7C-2$fxq$kv18B=MfPHT)z`m4gfVR#D76EM2Cjk0{ZA;MZ zEdcG_4X}+502*-QKV!d$P3p8BSOL(cY#m6r{A7_7(v(z%qd4X)njk zjR41!tpLZAJ-|KywtgLb>TF~Pzq0NPz)FDak_^x;7mx@HG0vIB0_NU(?!TwKHY1<> zEJy#80@VQTH;ieHS!)5t2W&qZ-M(%fF@|#dpq;$WGv0#xSkr$-udmBa%Rc&@ppEMR z^S-qWH2c&6;5%lku#J6i4NwLw1UQbY062!!0&H9IFrGPXybgRv>V_P2qrTl;ulSOm~c zwk5|E_BYzP0bmSrEcp(!DRmTc7~a=50c3Y_0`e4CERpMM_(lP6L(!O91+TyaZ#KzS#+A-=6ptwz1t9Z;U&(4dapHWC9Qk zWCL!1_A-q#kYnVHMM~S*#^ybe_eJ>Y+tB|^9h6q+#CBW{ECm>k=KYQB()8`p*VOxL z(-8X>!Jc0NY)i%=+n2V#{oSwQzTNhjF(d95jJFj4+mW$IFcvoe zyvJ<^8owL%n0A?|W#1y$Pz^i^u+K4N+tPOS(HFks_OY*30<@9$Y_mOS>k|Ol)AY%A zDHZLv9{RHn(mtldG$0qqHb6T6yJe#oLpA8lI2>!(VcJuG^C3Voz%j+ZcdG49Lhqdb z=Pe0<6Noct+8b@;*^v@B|E}04;*z#;>{th^0NB?$;k#l_XFa>MZz=5SgwEx@E9aJd z>tWMspc*Ix*x$GokH3@lU9qJ*JuUke-pmo}7N?Ae%eZ>P%G%3E zBsN5kXf2Bx5my^AVt#A;aQA|L4R?nh9X|i|y~EvWwhgacvvK&Ef~SVh-}&h9T7Bj4 z=EV;VSGFw~UUXsAaL3vi!yB(C93H!5)bQBNnZp}jOd0OD`|9CE&6f{%v_=nCeiJpk z?v04yYi{^FyLtP+vgc-?AjT zuCOY*?!=62cS&LP{Dx84bsuGBD<7m}EB|$Mw%c(h-f!5*_o9ZqeO2#aQ(yZ$Yt`s?vsUdm znx(|<%UU(^<*cb0&u2~j->0&a{KvAU7Cn+R)mD@Bw;LYFntG}#YgNU}tf|Kfv;Owe z(OFaP@MQgM(%`JWegB#)rR<8VH}CG3^C>k(R=eKIc(=Ma<6?bZM)7AaXY6|W`HYRrpU!Cg=VKZE ze?F2i)?1Tt@-Gi$+;?DJ#?!-QW$b^dD8tb>)IXgb9=$gG&(2lp+n=gQ z-=IH`e%Yn>r|ho`_q0mYkOMTm>1Hn{NJb3F3w(?_CeaJG>=x3_E^}`w2SVz zKP}z{|#uUk8G?&?)TuekabLsyPkim_(?(COPR-}K>-luggh&)rn= z=AD}kOkTWc*zSimH55O&sp{^!O;2X(o1B;Z@21zT?X$V4_6M6w)2`k8K!4BX>t|2g z9Jg@p=7%!W&F3Ed&E{7UpWeKA+}6#Pmuj1@TGqPx&D+k|a`@p3whTLQ`IdVoByIWq z+nHPbvTXd8fvIC3k5z%)N*`=kb5A^2||;2%X4zx)>;dI^gE@L_L7&2-ro*OkX5?NS?k zeS9Nqz7dhW5q94Qhi`<_HzL|MBE~l&)(5T*{=>gYLjr#I&pJz?1DJ;+OeXjzpoP$} z5W27Y;_=Vlhx4R5_0tdkROmydA%k228L>FyVam7+G!(OBEW-Jhm2s7j0e8Kxw)t=)+PCyZrk;LEo6vr=`J-*;+#8{$pYo-(>$WJZpUgQ&wMF^D^z?RZg3aP-_odnN zUfP66lc$$2EmBXnX%p-gkIk26*V7}l2@WeO(wFAY)9u;>r$P;Rk z;0ZNJWQCd}vO-M~S!ZujqAkzN$0T)J&p$4ylY0J1Nww})>Io}{|x>+mnB`!_eu@96mOPyWSBeI9Ki z`<8c`Eq=SN;@A#P6XosjG_wVLo<=qAm^!jCe7Bm{?Emkk(;XczrQm{pxT5o)S5f?F zr@d|YlCJ8j{Y->uT1CuZ4H4OLq4vW9XwAq;tB6G2IXv~Jb)ZaDly<(n@B>`v1>Ot0 z;q`u!53!>~WE)~_J+an@8Qdc34erPuxb;iCTW#L$Ht%}~;Y5V6I#E;en*15I=X0T> z`hkDrCZr!e{ygnfKTtpW@Nxf(&7gf%?MB{*kE=Uh;=jV;FLo(gqDW+gJ(9FFeyh*Z zcF5DFjdW@rN0S)sWbcXAJq`_x5aJV_2AI++LYdCFS2&JLT3WlhUC7rbw0}cYg!!{N zWEK6sp&HU`{;bo66}E4xj!1vj=SCfo-&7rTe^$Fuhy9zX!{N{R%&5chP1WJ_XMJka z;ryoRi1xl4$$Q4>H}nZ@Q4bzy@8}RcZ#xKezhCwfp~jQ(H&J zi@XQ;*Shel_?N`;(yLOycJ(zuEZEM%3wH3=+Y(lxtDfcso+dX;^?Huk)RD)%b&eaI z7-@W-X5UCHs#^WDqeJ&Z?(iH#5#{j2O@{nCV&zDF$a751+oM(-lU9%N*`7I^w@vy^ zX6f%7*`?R%?fNe5O}$k=exzRi{IK3svFUJ(OUlrzPDefGIX!<5<5r*1c4#7gPm2*N zQWLG9|4ZMczi&8J_^GL`+v1J-j7HVd20yVyCTfM@!v)Xks%2%sWTj zjvG_buGIRfa5%+V)!etTH||LedU1Q0Z{%@bMbk7o*qBQ4CbdVk{{r#gv;9IHX-8`= z-Zig}T6JI}7Csa#~Ygtx8VaS(T`I4(PU}erKw-`q!Kf_*aO;xMQp5a!gc2|SqA#3p2h{9HcVP%f2xD` zjh0ycIHY*1n)*ihCm>gyc))OSO*j5+@@zA`WIDL*j1K+)v3<1al$v+yEFIj|t%E-> z9V~=ZoH|PfyW!v=m{aIBRrMVA+Zv4+iwE&WcmC#_mb`|u>w=v9u5fl$3Ibg9G{M)5 zUKz6SjR;p=hHK9)F!6v|aa^t1gZZ2>!ag5~&~J$}!n+55%MtbLy#2o6ZO^I2b&S9$ z)%LJztKETre-rDCEmx#^?3JDJqSPS|t3#esZC;;kFtqb}TEo2cwgsQCZ%0*66Z5h? z2%xHCs`Ev7QB7W$w97ZL)jtl;F6}{6si;MNKoLCi1ZG#|ckziQ=zJ<4cY@Au<+D!E zc`hGxg3dj9x-sKS?q+Vef{iC*4!BE6sVz5jJc zI}v6{!|?0n4eGc)$re@p7H%Pk5^q~ypXXRq_0~^#y2t-`BRY8Dq+8X0Ol;u4Wmpb4 zl}qtkA*i3=cMcGtOu#S4+6bixzkLO@5Wo0G!jZS!qW%aaD=*Wcimj{VR-V_QeAd-Rth{v= zbpRBfW+RmE;YK-CP#1xkBB)D1@!8g?B!emvc|QduOJrJnITl|&C_a!ol}A8vwZW-8 zYEgSY$yhrDN=9}#)_^7o$qrCI6VyeZ#tSM1)L23N4AdAwO$C)Js8Ud}#Lq#E6nX2c zt4~{3p9dwSMB#YPO>s<;eN0faS)Nn!l9+Z^44wTeoAE+#G^=<3wN$cwOFnDK( ztH(h}d2OJiJp4nQhP-n@NqI@2q`YC))sfcKnV_V+{640bc?#jq7GWr35&wMh6Yr@!!3Rl^F2z3e2+5U%&+5l(Xb0Y zMmnGLn)GYlW;*|)riXxa?NGBMn%;l7ktBhBo{7ZOhm_L-OiCmZw z>RfDaVeApdT>SP{yeC~_^2VvhndK&Z2N|#&h?aOj`PevZ{;tj_LEhA|&1b!8u|bS1-6 z$%i%mrRdr!rgF)RWh)d#oWJo{+0d5n-&p%sMVZ$d*OQVS8w&fgF+GPt zhYMT@d|-rAyj#QI8z-(g;eTmX@Ra6Ev&W_!S3*-=6WX&=bI@sOjw{=A8J=X|sAw1; zeW<`iW1>^raF(Lm{B%LpAP^Y&6m@6(YucN>99PQ0a$GHNrKEmV)n7KfI?kchW5S1$ z1uwK~nXZ(|w;;)RSo5}xhj@2Xbvyzmsble>sO8%cKDe0uh~NH$k3Ug&s*O>9-kVfM zHXuc=NrEATK@s)m9mvea=@8XDmu^B6Il>!KcNhV9T>sGULw)BQJUZ@@d7xlhl)svG z6u5?wGswahVxPkb$VGnNM)k_d|2oM&X~$ErdBUg z0E-~Q`Q`Kyrn}3J2=&q`qJ&m2Q!D5)ZzY5})Jf4{V_hk@;;wIY_!q@>be!(+*}LBix08)&bzk;in!IAV=;x?C`Jd|vlL~2vkYN3qY)}+8Zlh%a&_&P zkdTSs%w%9@qA#cJKeEf1y2B5M$ZR#si5?q+=#BB^)U+cjv+{w%nXUwSLW)+iW7OQ} zQHcAv(PKvWvt8zLih4B_y2I|vitPBicbn6fWl!qx+e9zV?fAQTv)yNl^6tP(9h_H{2rn;6s#^VP1C+(Hm(KhY$S-TBP+s37ukS>{tD|k&?f}CsFgRc(1lZX(v+QbaBpD9tlo3@Og}!@OE1Wd( zR_``fLlT7i8i-JMi*gHUB!1-#VH_wqe<%PY@5+-wJp?$F2k`q#AVT5bB1`Zcgq)-N z0hGK`KM6{fcmb3w@i$Pi#8FVP#6LjE692NU#=r(SZ@J2%5-n;iC^_SJ5|kUIB9vNC zQp&TSB(@9iU{1*Feb!m2;Hy z96YZAdMkWI8@ae6YSHg;st$83uFI3XeO!42x;A>WI?RbzuGUF(;KX}>q*8vvn508V zAF0D4ReQMV955PX@M;AE!Rgq_6Eb@g@)|_mXPK4z)$x&J+Ge}ed%s;Nzm$dTsy&fh zMoD|+Np-wka*63wQr)Bv|1_~syd#c*qA&%=)8dzJ$HIg~>tXVQf=7VhQWnWa7EFsq)rEOTrM!U4nhNrHZGKPv8+oLj3YA&F?FGk zn3Z8*wyTZtyS<;-K*mK?*FuoL^4AV5W=4zq&agJkxm+&KoukJrZ|QYd3x6dw#}ymp z-w56SUwe;yHInaQA+L82Y*jM?qHI0!45z#J9-HI1F`0jN1o^CsXT|l z1>*ri`XUhkYe0(tP%~`${8n65&(n%sG2=0J+J#9>ByI_|sO3ArmN%}Yw{b(lY%xZ+ zy`bLdRLeIj`dC+-e^?mSpRZRN{W+U$HG>CK{0P>@Xk$0pxGq<3gYI&EaxU|6bFys| zw)~xi<(&#`7^~H5G0z`uKCJN_Xr_8o?Ecf<(^$^lLSXI^`^Md>e$Un z{FswK)eI#9ei&O2Z_TKwh{QmgyG2U%X5jg!8MG99@C36m@5LbcYlRi2>hoSq9i$G6@y9r-eq5v8;v5|Fm-}N8ica137fZ&y zy;)k1`3v6CqzUoJ96 zC@U?BTZV9=#G#M#=%v_2cypXE!n+*d9T^hdp|KruCc|9yL>hZ3TTYG9f8oO|)+3eh)zsP4hlQ`A)(396lW#)DVhF+HzV z$D6&8wYa9%V_{ewxj~Z<-9d=LHcCb5Rh5S>b{xrNs-{a4~ z3*w#rVR)r?z@LS+V7zs4AksbC)E!Lf)CMM-)Oscx)vZi6kY|U_vlbVTtieSjt8o#@ zN?vU6c~&47Neyz5R5KT0zFz3^S^VDmqSyd6EP`O@2UbZWdz!i!-~D=)M%1LVkdUwWIGw-Z-1EOt*k zPM>*>LxL~;6xO&k&q+89{gOEjHE*5fX~L_}m|m)9n~<+{Yd@h5bkTN6C77~aD5LEA5*u|ekk~+N zkRA})tTnWuD!qD81urgxwAqS%I8Y|nMiG`a$ZgeLp}}i9>qJj&)$tOFn)FihRtrr) ztQ1~ZL1&)BSkfo9Q*k=w46OxaMz(o9n#1ea13tK;8J2WvC@2Hx1T_)LNDm33NuS6@ z$&VCnIO+8qa0r8T^6f2bs1b@*>v)4v=kU&`4buyHF#r(Wma0*UfBQL}pz}_p=0!&N z_d=P47Mo z7qf%p~SASe+Jg4zHxd6k0Ac8FSBg5grlv*X2AFJmUrSpTU5qX%2c zhx?kZ4g@%a$xduI%BxlLFaV%KR~s{$D?2)PM_%&r!SH?I`!w4?l+$ewXs#P{n^&{- z*KG?lTOT#AQMWBbpVlyL*K4l;e>-vlJxkkzrJq+w9@BOscQ?rcVwI0!j>y+44s;u{ zS_wu*sI$R~(GG3tt;6_Kt18kym6k*;og^$opT(QZ8d{;KjY4BwP4z@VSByAOe(orQ zNi6Si#(Q8dEUb|mLTJts&GnEl>R}q?`W20GVH<#D)WUDZC`UI&3H7D!QPqZh2+yi4 z*@SQx2Z-JD+^(J-=j5C?FH$eS^2{zHBz9H4%$MkxWa8Om`Arz}rN~DZ#xZ-_d>(uJ zRx>(0h>jz|ZFb(rM1b4XS zG5s}Lv@XI$vqkDQbR0$u8bz;1FYG>Uj_l@0dgL9BD~93kBRG&5QzNDv_hJZe>M=EZ zit&0j*i3^lPQnZNF5XA-YQ68+yq=A?!{EMx$SFePw1n%P0|m`lKI9=H5!8CO!X>@O17wB z7Imvd@!4z)5TX1Lzj9II7nlUdyl4cfq<&;k*IU#R7WIrp)mv0NW<0X&P>Xuqq7rS^ zRg3zoMePD5mr$l+NR?EDMg0ntl$?qc1bKCYMNI=GuU1>s@2#tR$tO!}x2_(w@}BE$ zmaUC6sS_3zgLM}v8H*Eqa8?!hz9=rWm1__&^CHw%Updxd@#K#M85dS8Vw3iHPvedL z5_s2tS7bbwGac%C>TB^W@!-O4Rb)6-J4QdQ1}eByY1!?(ZEknyla8x7ajnJ`2z6-L zxDkc5a?-Bm3^1=~*{AeL$b7gxz?z_Cw|VP7Pu;6eI#szwC`84eWa{fxSF0!DKk(ar z75`a$OZe-2(-M=S%XMIcF7|{&1-&4yz2cvuKx5T;{vp4>yN}&Tb=XrcmOvvLxXAfE zAVMj#sAU$#MI3qcb&CR_U@J+;gX|XMnGdpVB>0ls*Bc z54CGWZTf^$l`lb^)HkZGRbNGeV!A)Fo#`p{H9B=SX3p48Wy3`1lom^ep1=gi(Oz)^ z2CCUM^%wJD9m2k|3M`E3hzTZB{>p3(E$E8bh&F>g%#e)ua~uJZ@Bw)rp}o^kSM6&{|C zd)wl$Td1=4#veg7EQr)$ms%ZLYq(8cv>+EP&UM50!nDl(?fR|l6@LjlT3><^a=_vs z_#)s`!cag`T&I>p686e_PudwBSScusQwJHZEo6)s%Nv*ns>5uW+oocxJYHRlY@2tH z;h-J11$@@zWB;(Y%J>5)l?&`q&OPb>WSeq`|@BM9UlqfstNMqyxTG z$K$$Yy9hB6-pKBan8yTr>ZfXY!SC8D|Ajj(ZgArx zb4Ou&at*Zy1nR{s}fS7zNtVpbbezb|-;6!O9fC|0B97yFwtu`GrAg+X^l`rR_2)+N zu@)8c&DmI}RqWl-9^X*^UN0=4AuHJ!D!}YO!CXiy^=CWuxwT%tv`nkO6bdh-Akh1H7)qiM+bV7Y5u?S* zxu13=3{tclSCN!+wee=}YLR^*f8`u07NyX1#v~Ghb^fWA{=v+=&Osdcm`8p|sSJ!*{ievXPMC>@6x&;LPXx23Wj3qp=AD!VnAZ>Vfr7mk;faF~NbA6{3U z!OeUjXS{qBZuVBXO2b6aiHcA;M}yYFgME4iPWQ8qJvp^ zRbwva+lWO6->UP+>F{oKhz+BBvrb4Q`BU`(R##l4Vij zLDA$0Wg@5yK}`WACx3T?@`}7gp!NugTgoNhhoGdqPb{hrCbm+Z1C->u2$YofV^C7w zAW%}?jTRp#%2M8Xi`ooI%4@Lrc7c-enm|c;?|_o>S}nfPa8urFi}He!@_e8&ghda6 zlJXt}<*fka6=fdby2S+aj<#D_L^u`wB zar&Ej7+?)Ty|dhH7vEZOIc^V;C;^4^H@kB9%asoA>99!^ zq5FL+BC-AVGQD5RkMuC@a-^4{T4N1g-ZLV|&|;I9_5OMb6%j{1E) zmzp0LqiRV9F++(zsP4Vu)sOdG@y2<3H(m<1_y+6=sf$`&e=DwDvD19qfLG)bsb>E* zMPm4g#C_4G_us)&rC|_$>_CKghb^C>vT-h-5I~4&9@B7wZoIYd>sjx-WGIzDY6v)+t%8se+NbMEcRb;96c5mN+~$3E4Y8}N}X zbMC#MvshdcLXD3T`SvxmYFVC@cNW`#Cro3%?)er)v)BW8plgfcB!16q_SG=EJdc$~ z3p;CZwE0LqOt>#I*qHnJo>_A^jn;KGh`#Je^J+t5Q**wdfZXdZ1H==!|94&tbqXUwn*}(h0s=eg&S&h(RmST=iC2*GkZ)G#=hz6BVm7sp+AM01*KUZxx z^jsnVC7>9pcEGAczE#9_s_nMa1vCmaIjDD3wTBBpxP9ZzFW#Cv8eFjLW56jk6-jC% z&KV9)Oz{QeqXG_ z@o^Z>D6*Ny+0CoVnqBI`$Pem=S1B*KHqz_N=9=s zOar%ahi%+=xpNhM7sXsCraB)`tDN!9-($@{9a{fsFP{@1v*4MU+XPVds5-JW{8ht( zFnpASms2BKE0=f9KB?v#h%5y#tpJzuAx~8w;&+sFu z6C*2E`Ab?2Q~5k3jViHBnH6k`_gEYDSj$xqvC^Y15W#`_hq{3JCmq7RP>dN^6XO$~ zb6y1di@L-6ym;#xwTOYYxNhD};#t{_r*yeRCsx&3qR``9E$5mMfHj^0Sf-QrC2J!# zJ{m{w#{Q&IS8Q0t-_QreW(X zvz8n1IDpq|RnMWt)HmXB^9kRNmZM0l9P~w?AY9?~9kz$4M#ae%|6#4gkLxbHDL6xf zycbq+&+C;e2;>Xe4l}mv*K0ooV@xND0vmd zhH`La$0!xPcY2=}H^4D!^tkc3eWmQc2LoWk9k4G4Sx+op7%iyhZ7{wOK45I}PFWt< z2(>`m5A))@Ll$DNSO}&ZjN4&6jau{sCVl93yknk=bt}4DO?L41tPbgmMoxj#3;f9s z`JE3#YLS}fQt>2g@5^^InXY`)HkJeCqF->RI&6EHs^KgJW+DoPpmd^{i}kE5Zgz<= zZW!px?(ztACHuUpz&5+8)&GwTAMYMqQ0YoJPR$lQvWNmF#-TFqc+c6PKr-+1PF2CZ zlqd7fSF1&Zhi!kuDeH|#oaP$`38u9xP08& z6TuVbPacepGd6xF%uP@maj5`%C%Af)=_-nUBmSs3bK%SmcCLp_!_~}|NR%pu!=~X% zLaHYr%KsBcPKDZ)+-DYx=n@YMG3GY&zIsGRM)|eDY(osTsKs=t!5YY{MW)|2P#qGf za;m-qQ*~%j7QaJ$_mA1Q+9+q}Th+aou#a_>UGds^dyUyTqP)|5Jyv%6zF%gyaiSD-xL zoc4{y`X+K9BU!y9ypbI+d}r!@#8nPMHmW*@3pjkkgO0D}@wX2PQ60$bpG(^my-% zP~HW_M?|Nx6dhFZ{Q{Kadl;1D+X_lb_MYTTHAb(L`*maVv_$y?i+!_W)P8s^VC~pN zx1?SQcJ9(%Cv1yU!%$jms>MzNJRme0BOsz@NOte@BP*0dxF!aD7SJ zCI7mF_I-TXJAhpN@+CIygD&}T$d5$1xE`)y!eqlYIv=po;KEVW_c9QmFK&Nu625_H zs2WUF)mG{m|1n0I3{-u za(F}t$)x_kALHm{dS2Ak8@Zu%MRchP^BC~N;+Hjye)rj*1nPPUIXogoUBOo1O?)TG zkzFMB5j?T@rR0@4{~R5Vya_ox`gD=ZmBLV+`*e}aAuBx0{99=Qo>cA*NZw7cIP8!d z9^wrSwxN>kT_kh34oI##IuI{NsXdRs%LGGuXUQDyLnVK|i)41z@UZEIj4hkDV*X}I zZZ>iqT_pDvrC8SFb##%;-Vh%4Q#j@4ptjbZ|BnDSmo0dlFD1_obh!(V8y?0u=h1uI z-|)qYj9s}&fVt#BLyHpWrtSRhj0br_OL0{=;IX|&qK^kkeQuN@PiQIb zHwZ-C+PuOQfl~akjR$!`OI?bbKwba(S-(MnQdb(K$P-#BHl)<`Ymy%bl;XP~9IS0}c|uEZ zRuhPy=EZM)8YnfwC`F#oQrCu*in!}gSfJF;j8f!bj7=?{RXPwfk66l)vq3Q@Nkm>~ zZ2YK8Y;fii9`-bTQHk=wMf-mhh>bgpx(0NS%o;-_59lH}N$@-evGm$MF8S-$faH4& z$w`omcn-SjC5uv#_~milvOVB1#3%C9dzH&tSoGJN!d^TKe8RDWK0rL-Js$ zPta@`oe=tP36v~pFJ;^xD7DQfbwd{`*zW^YBwWP_o!L|PJuwgRgjz8KIiX&?p^Fta z3Z8+Oq`E*oHzZjL=yTMNd}9|Yekw}YV8uD0-s$@mrX)BK$0?)KPf;pVpP{%Os?Sfm z=;IbV+{?f=yY}Ttm^GP_BaCKrOUXfAO%tUCf{~S9I{1e{r7ko|rFAKlE=uuDKgYq0 zzDwT;)OCeXDqWTeitr3k%8YQ=*i%7c-5{eBd0=}`smzd4JAZR}a-aooF-nmqw3J7b zGA=8>8S}%S5%P8;n>?X@=HLr{yo(hh1FiPFpMZ*G7imPT3p!N(ZMR}ZvV~tU& zpo@m0k66#SQ(C586VUK!qZD~UBLO$dPLWU`T4g&*6i&ORY*u+;>8x3IR+K4)Svj}d zGI~Ja)Y-FU6sH#szj<6CGH%MtRSM^nm&`7iRaic4cFCM+(`Ji1Kv!-xfR$5*$hjM}#r_L@Z zF&Pc|?&*cMV`&h|iAy*QoXwa%vv5kqY^?qj&X_#cBqx`bm&~k~TwY>k%qc0aC=;s5 z94a@vWOAu{N>Xx4A`bIBnI}PqnV&RuYEW)~ANe5{On%A{f{jvUe$vz_o#jZMluR!T z@Jt;v;JV~N*LNu^C4x_snTp1n9Vk?C{lJpsfs;EGN=_UwsCdfM>rG{X_&X~i9Fja> zpvX7*k`t3kf*Aw(14Dcj$iHrIcl>6a$!DIMshOXgJZLaogmYo!3^Q0nI=QfH_N?2` z*cCIUm(QFvdj{ALWQ>RD$gzYBuskJ<>X6Fg{I^h(K+oG4?)EIw`W93$Mx8VKd<2TVxMXZL_Br z&!8-5GP`8Pth-Cl?_}U0M{u#bN(Qs@%ClKhr=sH&PM%p@IAi);Q=O!#NlB9j!-0v{ zU6(ZQ`T>FbLCJ$Amkcm|ZZq?z3`h|MN|}>ql(C~0mrR*_k5V{gRz+E92}XxGb4p9* z1WYlb!bnX~>}^x04jvR}k20+N;}t;#h9gs0*{ta^5edc9%Vt5e80M71*|REOg>gbx z+*L7oX8H7cF+xZcX23PnP`r~UybS}?orPxTb;B<1l17N$Wt^Dqgi~iDY$?3QD*=mw zBSq?hv3V+*s<>iG`Se*c1DwV3y^HayTzg&Oz}TQ;z<_}%*QE>^n4BDx2@XQ=|tDHEJnQ{Haic*BT1drhNC_GO9oW{L{=i=z&Fy|Vau82d$ue%eU zTXCcZ-Chh;`%^1<&A_&-?I&=G31VINXjzcV|Ab^y|Xs?!rfT zmv!OmUfz{m_`1p?%hlcS1QWEgdGR#?MYq{c*=tKx{K5P z5O6PeR`eC(L_h7ReK#3AlC$Tyssmr6!P}ExvN07u2%gKGQW|IGJ=t+Rc(M$>p5*O> zfL!oIW9;K$`uW;SPgYu9&e)vc={H58m!z=dL*!ObM!R^&CYQrOW z-nYWX;q&>{`qRC}t89OBb7*eI8-DvGV$(IYRK#|?f!zd&YKz*29e9a*KbL>0QSNb( zbeBI_i=92kDG(bhT-aR@4KXqJH>r~9Qd@ofeD_59M%m|;%RP|z8>Sj|CU8#*xEy}_ zpHZ6=TRX%XIr({e(4VOX3-+`)Y+}Cx{>CEyl1PVMu%k^sjjtODcC@oF7@WOQx8pB$ z@Ztnso6uglO>B2)c*Ofw@9?elZQr332$NU)%*HMH*jJ z6hg2`wpaWednvGK(mz7}b>IE}@Q*nC5~FJWKfV77OZo`ad9d>&27f7U*W!-yOVl^G zFLUwh<>!j+)%)K%?;y61t8eW8bn!m?seW!Z+K;_hf5#WOKIi+sg7>i%JS?@f@+GM= z_HDSRFTY~a^BrF71MiQ@eh5T}KhMaQUJ>Gt3i6d*g!sE^9AqPuJMqgGPEPTs-1+J< zLU{(ilH!&ON%65vY^B{Z{i%7dnwUk zxZrpy|2UsJQgcV^?r5zjQdcy$Lw7s0SZsc>VH;S3o*%96*4~0y`1_e|r&eUs-7#7b zHkP`u)3siY#vh7!6MsMk-+j69#jaC#+ckHL_yED?((|!r)uk0fR6eC`)$?P>jql$t`H8g6ovi04!>Tt;k@!2n zCdp6v+$ma7wC*0F6~&N-)ACd34fhZ|e+Z=`BS!YM`V%ziav%YS5dVChq!w6t)fTl0 zlnZc*Ej^O@&~_bHgcVK-f{!2Lgbtdk6`}G64`ztQs zFYJiY-9=hatnMymJGx^vcaff7#8Wo{qu8v~Oj&zu*V<7s-=FIij*rob3K*yEd_6y3 zIKDv7$NzLYgSIGFMCe%EohuquoVv&A`D0~2#fV`<4n8i*cXX-@^*b3fMcE>Za&&jL z=0?2WG)HsW_57Tm$jgt^tSGU=R0Us!A^wXp@fnzc&%fN6B3LuKsW`f8y*3#%TSd@h zqk;L(B|`i?(qut##Y*N)0VVTlK*^B8Vz5DNx30blN|w;Ayf>}90T>MA)l^VY9>2Jh z)Xmn_`#{M$mRQu27T*Sok6+zMdE2e4ji4B;PUQ`Yy70Y*pHA|YioiaE+~8vXPVg@j zs_*YT?azF!IsR3D&eE7kdRjZ%K8$@1B>LQhb~b$&Mua+Tgbgj)hpic{^}$Fq!p1NH z=PCB^v^Mr|(CFb4@K+PsI6mPPgmO-l8{v>)Fv7u-PL>4sNsb--0}B`@A~o#rpKy}# zfPMb>!x1RyV#!#Rj6}+kE|#?GX~!^XrXA-92~yD~9AiYJ9p@jUK)GantM_=UHX_k` z0{>p4J9P&|;JlS0PW?aj-aam>D*pq&_J|&V5 zn39$$Y)=DfBjtD6^iEH-}c_c{08 znGvXV_xFAM{`noacRu&r&-t9^b3XT+&-r{vBHr%n4RJy-ERyAwP6FJlV&PQ8Tc@h0 z%-`*8H-8t%ef3b{yDX)Dw~);HI~EiA4-PV*m@p9LKsSacCZl*ATJg$|zoM9okk+V> zQN;u+dWTs|C^U@h)0205nwnj(ml-xOBot%Ys!Jin?kJX0r<;ch z-6{I~%AG4f9g12i{|WhD-*#IA=M2`iQ(1s}j)0!Vo!!HUOHuf_VaC->Ia|!+qXBDe zqvpGcq3URBO`XO>QcduOKIjY{4OP1O1GLk}_(xlyJREw%VF>_*Nk)DgF0vBRmIQyH z$Cp3gml=U-g>W_1ddgB=j2<^>`~MJ(C)3M(ovQmRDH;as7G*s2F-*rOR$z;FwO(}fbQFd zM<*UrjLtObHGMgTm4Uy&ln%HJoWppiibT&qZ6ZwH#TQprh(_7si z+V5abm8aIN4P33Cj4MV|nS|al{Pr6V05S6Mdra~?@=LG?FM25a7O<*jDk62_Tx5M~ zHw=W%q`>42N?>peP!x3(irot-=5a3_W_zZjv-x$y@M(_K_azF}#sQ|z;eHoPc#aF& zgHXul38*cUlOUgGSVGw?!K>1Uk_25uK$&3`UP+R8&N3kcZrHh!67J+0R@{D7NczfDxC4N#%Ht=#CuEdssz$*TlPHi85hXiq)g#= zO`+N#`UBWP^#cvoBe!j0=FRo$4`^v1!CYR|;;VOsl)!Z40@?&1pzm^jBoZCUJ`Ar= z&ilc99H2!8OOd$7U_Op&9SY_*%be1qS$G_iI7shdD(=8gBufK>I6&!rT;d=P$EZ&U zlY?HUfbb08R*BMPzk`RNP)QV=j}-#zIEcMJFz!;E;9DQcZbJ!%Cbl38p+izxQQ)Rl z_i+?w=q#j_bB%?13IQI+$ImmK12)+pTLR7@(6K9Y;ovwIvKSZ%wMT8xGj68lRAG3a*jhdA zXb&7a5{KVLwj%TXVk>7lR;qI$HjxKSq9!Z0(%ish@ zXht)8#`r^_>_frvhYud1-*j}R=HPg|Ifh^d>jfT~AfDidH^($QYiM)}djrOX@#qZ# z4~@13PvQ**5J3;aN-GkBb{-txrr{wJp5TW!Z4&QXdrdC8NwL*k+)_0HN~cR4!QQ?j z2rhIZk7q_;*copnk(u{_>FYqnyCbZB>PnPXDK4i%jUcl9^E{ty|Nq&k2C>957eo#B ze|M@uHR8~L$W?ew_hu76;d=oZv17|jxhhCpvL|$A#f4cVa;=?j!g5guLZt=zydxJ5 z7>YR2p}LDuR=$KgQSvA}w4p;RRnV6>(V@sWgyXvPtsDLt4#h76I^sx5l&{fUG#zd+ zge6^~rGYuK(h(;*6jK`x6)jD^h(X|pBV%7Bp5;yY+-vx_fb;WmhdqHCEu~==0A)7uTaF7_`!?PBbeQs983>D1 zr>BQB!|6HaPwyTMhXN=ZaiVLv4}8L*4!(c)OW{y0GLW!i5}gY!mPMDUy+eKV6*&4w z*Y%Sg{xD3La(r}sWiBGhhx2MQ<-Q##bNS9}(mz!Gn)O!5BjgITw4srDtI4lW{MAr26!@{|ksZs8axT4#0oCw7bbkTA@i?vY1iEas8 zkd01H{|@Q7K;V#9V(#o!8yAQ3UZqjK0O^UQd|?O57j&TP5;)w$;AsBsAj{e?<+U1R zm!OQ-%I`HFMfm&)PoKq6gpDj~VEbpE1SOVhNJhJA(%(}_X?AvGywesTwt&i+1%u^`9o5T z=lR3trX{CRZi4v_Q=PwX=`u(QoaTF7*$rh&7eYoU%70-QBou^?CeEQ1gpf;;mUTK{~0~bFaU7_EN|^3HxYh%sC6dJ z?Ac0EUF2*=L>I0S;8baNY@S{1<=q9G-$mecwkOGP=rIikpm1H$qasf#5~gFkozdgj zs(rv2!)XzYvsqX4b^|A*;dMptE4=s&ID0fk=;!E71WPc7Yyn(X^f>k`0*+t9H9lamRjIcvO&OIg{!OdP2kiM z;kruSq+fx@;+@(7FS}D&kkSr#kOhg5b7zviLjleO-gFNCaGd>_kEre7U$I9#0ei%M zTlM)p`Tx}(@$4l_u;-if-|Z8Nd~|Z-^co`?j7vZ)O1U3s1H=O=F{1jX2ng#qmYVk} z`b~YA$AF;L_XlWz#wwDfeIVW|4V;MCSY*F&0it7bp(9cDGMsKP}nbu9L{k>0*cZ*NU^ zkCx&>^)4z-(PG9@jZ4jeK{OaC!!qevNK?g`ng)V;)86LFQ)<7WiCV%MOu&OOFt>=% zyCEvg<=rAPfLvE6@=!l?``luwb_Gf-YOivOmTaWaMLn3H2GtU`S-hV?gI0-B?GC(_ zi>%1_%dI*=bxd8kRZpBr3?32{GKLL~--015|WI#t!G*@2yHQ)Ko_O*vV9VuBG#IO6febpZPqM^k>X@>iRJy1{Ydd;c^ zl7tA^3`7zsdtqOD9ac!nyM?LN+3yC&sIV_pUx~&8>4o$emg@LGr6rYH=sWn5Z6fDFsd$fC(CCL@ zlPS>m9jA_uorpEzLZq!|BJ{5mPLdhRBbMq!5y!#o25j`Lw5i=DX^J1=SKJb?We0NC zICZ~XNVHnq7@0U2?h@O7zU?V)O$Y*pw}N6K4CXzjrL%A7yy|O1xvC{(Q6Z%uE$_er z)}w0PqfJ4Wm}y@Q3t4&0Z6L?Aw>2`W8f?&V`hsUkMX}JODs(<$ox9)(@1u|xU~3YZ z*m5dkq%kpgmTZ^k-PJSv1>2!%j{^jhS&l)aLuGxVeeKKCrX=cPZ)+f~hD0Wz!EEuD z92OCeliC}xV#U^@Rr2KP5rdPb;<;-7k}0zzANjMXh=Q zLjjCv!u*SU?LK(JY*t{bE%8H`f>DdN__k>V5&XqZu+0aM!Q#!*s!&nO%1=cXEx!K% zOrODu5!CJ1YjPX1wzR66c1)ez?RX@1WM$|`$JL@^zl77G7HM>Ri=Tj@8^+ujtyX)@ zOr#C=#E?lCr}Q9O&@oo9IbgX9Iio3ozp2h{kd@KFoinu;E>3vXM?O+^#6E&zR-sHau;STNE< z|E6zyhHuMC7pfb|v#7qB8yxI6MMovunBSn{d+hJbTzG@*lyxP}yTbyEF z#fcr};M9U8Yg1F5%FR?$xl+9_e|BeCbbueN2J!DlP1$H zlC6Z34cgEY+UVP!U!<0W9rLks@u-ICy+O#mSeEmYx8~aSKa&l z*X9qQ(Nf)3-+Up&D2rgT(n@dYBBnM z9k=^REfG_Q>~7LBsK0D&^yB8}M`BsJA~X+%U|mCgTc~gPJ~5yCGf0!Q z-rU0ZvI1%!kNcpITpNd~OF1?dyw8bbZ*$@sw0`)5zu^9(PT#KfurVaH;C?mliS=q+ zx|rrXNzRAh z^?JBl?RS5{&XHFaaK46=DuHpEZT{k2{(`sA=GF7cO|b9cFL^?X49$Bm#=oM8a#F&? z>#L4aD*CIVW6MqYOf}wxZfPK3AJTW5k#qaHey2%R@A@%R7Cen10w67{ zy^nDiQ)=Q)KHu*zI7BV5_p6pP*rkN-yWal1M$Do9;yMh;YTP|Wquv4|mCp1+VRLd9 zRROYB)ph7nYVi|AQ*>>-d;FGkOsBp&SlAVM+RSWm$5bfaEJhn>Wcxrn(1#|B|06K| zvjYd5y(a4OY*ZWGp3P4Ztr?HvKv}gtqWP5^tH_Fu@k7;eAB;qT=tgv;X8f+7sGh?( zCKeS2RM9#$W*n_}dx9@rZ$$QWCbX@U^|=@nSc-YaF|DX0U?4Z&vNNxam07)56ay@o zVRCs6<_4i~vltV~X8!JB36?yU-nTLp3E<8OnCy%-N=1yOvGN?%xkfFy-+_^?{C2T!OlRxEoitlW;ZcweAB+*Pl-x}$crO>)#x-rta^&BzS~-og~s@=D>9 z_9CacR^mAWj1yKyfdF;ad7Dw-E#(Tvl@!&s8BM=vN@4rNSTRbp`SP}iQ39+BK7cSt z^pd5!nPZ|UZQ-GhcT(loC>vv2JNB1HpJA$SF2WCkkjP?h;yHK&t^s zyrY1)tqSfK1uyyJ^8radc>o}OW5y_MK$6OAKv%=hsZ;|RE1-J;agoWXkQI|uwgHk< z-UKA6bVIk4Z>@mj+unfkMI8MANxXDGdBRTxB;%zL8wr^(0ZNE!KP0^+fF!-&0FqQ_ zXhFW+V7z_Mc>AL9_GRO3t?~AN@%9tr?H9(|1k{hDd<7sGZweq8?-)QMMQM})$`Q~? zK-mI%36MuX+W=(==v(7$KeRRZHVu#rQDXT08BnGO(GTB45?TUC*5z^oT4z8H8xR*t z**=^~6Ck&Mz5z5sKnr{5RBi#3F8nqClIi=i0eucgt`K}@K)tNGUq1ta^?I$2UIdgT z=zR)kxPX2DguNl8Wo}PJ;b)jr>3fDQvg$UVdjQE40ENyYY*#qMOGDTUOclf8qtJ5ukl!qBwg{di8FN4bRV$A}v=2IrwY#pJjxj7QQ z?6`c~j?)GQ@EK=cx1QAS=~8l>Gv(eR`0RuJT`(SCy9-*tRtq6I@I2jwTHckC1v&<1 zh}@g14-&2FRp4S)7EW!S=u`_1CBNsloU0a4o*r!5hHWtPiDfSc7-BWSKdB9x^t~^% zK|lYIZeYjXkW(@YQ!TN;{+9P1#Dt}R2UejiRc8lQinWl{VwD4f8pgmt${KvkTE%c^ z-x-5W2{FK(mNf!E;<3U2&6py*cZV2~TUZG8b9|CJ%WWgXckSOxw6SeYCSVeOW^?6ZVDbGO*vt>2b zB7d;>D-UD-wXa=-VhW76sKLa8v>&#kt^S|gKqXLU)5J!>NI`TrG_nPsm*+F-A0Lu- zQKVsvel(2H6S7aAgl4oHy(k1Zx|U%5(X;8@gR+nGg}m;(8r* zAzWOqNMi6rNO%fj=Ym#_B_zyf{X)vxWXjqiiOpz}DWl!gPeRjqG$RKRS)Hd$NEi#}jfTrP!Q4XQ$a?LnKc@TXePe9ZzETLutqA4Tkmx_EzDAR!MFrYOC zbjpBC=x#Cu72n8sgMi3=IR8UMw2So}m$@J!T=xH&B3f>-M!SxRXt|r#JsJs5$fR&6 z3M@-TZej6_+2q2VL+tlsZhJ^Vco1_ae=Ukjh!8*l6dyGgEs(%CqeUIMQVtudg+F=q z?yWMe(uIp|yiW6t5phKd1z`$5jdEA2V7UWuCa}{Me4h}`1-S@1s)A+yB|j(t_(bOd z6a8s%b)_7Zi@c1>v+SO-a9sK(I+er9xXNWjxHB%gTf|-7qGQJg@oBMlC62`rlGLi2 z`hw9xQm9O2-bnn?{gOD=xYCKsWq4xW$r~JVgY-mf5BG*oSp4bX-i5W{P`_mmIO52B zJtdxbbCFKOwlLS`qT5DCu`aHZn@!vlCXfDp_p!^urTQFv=p06=Zj&D3E@OYk@L}w9 zA9e8gx`PitIXd`U*1;#OgAezlqUmrdj`msA!RMh4K2LY>+0w!1jVPbU`id4; zld;RPfcSwHia61=d=`AdwHz(lbVLh997*X^RP2nShaQEZm*Lq_K9MQxE8+rgBix_H z3`8^1krOq5IMFHOm=;c9v{>mVEfjGiI7ugHq-Q~tPvq!#wxG-{eCF_`=flviJ zdpapBN5~&Vhdvt(AIAPTo}gPuZo!w9-LeGwvF1RT2=tqWy{VcALRIsrLPQEjNtqx$ z*b<2SD5W=EcO8M!o0md;Qbg#=8=~Js+=@z(1R+CNl9a(pNuED+_;5oeD>*eKX?EIN z>R<^AQt6R~g^QrNY2m!eveH7}K}(6QW`wX*6JuyBkqFUxVuZSwA*E$E%)N0Q<(fK% z()661rnUrlr)yaW>q9yHjnu!QMFj;eWlN#Hg&LgZQ>~A#mIdNf^jkdphS}Fqag>HH zaG0(R8f)MetX*<7MlI>r7f~GCtU&Tqn|EYk;ugG`wtTf;mlEjFutKAO{fPvX$%( z(qg;t{sqjRw_%%~j-9wGX`)pcjzGjsNE1a&SM=v}M3I4w5%fBf0^_9l_-XV+yq(Z{ z7I?M4K#%F({VVCc0lbfXfgYKk!@rW=g~-g6%n%&Y(OG`!pRVB$kFKlyjsV`+U!eCH zhRn&p8O{QSBYJ1`#wp`v4TpGi*^cZEQd`8U|CM;VewNB~T>zO(c(-QRYIx1**c z;+^UYuaors3wUR89){~GeQe78fHNQhudDWVIdC!~@H%VHGeB<)a30g}I3#tI-zE(Q zD8h9mh4{&@#QVH6yiUsH2=Gp6xLuWtf_`KM=VT^F1NU?7DpA9cm|D9!t({V9a5C^N zIagwlg%{;=8eTEteGNEg#YsF0U3FD{=ZJM3iN`z3@86Y@91AJQrtRnM9`)ZyNiJHp zHO#%RRyCuk%d*^E}VS*JpdWZ=K~i@BV8%lk%r|h8&pe z$t)=Hbo)br=d8U~dCZ6NJWGN(o>Tvu=^42o-9uF!uht}a#vV=dOc{2G=Yi`k_Uv7L zzNc<^tmm=?eLWwg_x3#at<{tHklAxdNn6&JGfrexCjTRAMe|2lZ`}TF7PTT=mb*FY zeeW|_pa1^RtRauypLO55)md-7drMZ|nb&4*dwopS8s5JKyw`xg72&ob{8rG}3VK^XcPr>`MLb&(-&VxC z74dIHI<_J`Tam7`31*CPM5D2G~< zM=i>w7Uffma;imn)uP;LQGT^3$6AzUEy}ePZKO- zQ;T}4MSazx-fB^QwW!Bh)MqW~wHEbTi+Zj_eb=Ji@fo}V7X(f$n>^(?FL)+B{H$lu zIe+#1<vOo!b6@HN`LRU@TrZSm>+-Z zdAwwUXT;n0c?Mo}ucu+pde6$acY8ii)_FWnul3|lS3OmI*LZH;zuNQOV|RImR^I8! zDy;E5Idqlhyf~j{qU{dP8RnH9qyrb-iZLjYF#zzpX*8Zk;~BpSem7y#S&@flPCoeE zl#AzFJmXiv@1{|B9))N8D)`+r63-*?j9&%6n{x1+gJ=9I_}!F^=WIOVSHbTlkq$gF zEohsYup6=>3(wpY!SAL_JZIt=zY2agq5Z7Lz%$zsem8+hS>eVrnHBtQ!fwxs5qQS0 zg5OQp=~w;o)P6?65)S#Q7f zR_2tnm6_`u12UaE-p=^L2P-qq_;5hRn!0z~Pc6H{{hLSP-9xs#JL1N(d?P-XKXAku zFYifjecqRTNz$P7elP7!%bmC??ZzJlrOo*Jd&4K5Ts8ce*Do2q@9+DD4ct&O?2~&E zhOOHCe(Gz(?@YCqUYdI2s~@EFKX7Ntu*)ywTBhQ+srstEB(>xPDD)yZF)J>7)_v^u%uGu6w5=KD8T)mz=c1A!p4snT;rV>>V9(lvmwHlf zy2Mj!8|dlz{KcN4P|PGLOGG`#iu=dV1@^Vi01Aw0hs>v?7?$v?7WG~4LfF6D=ljxJ z|0T{An*!Qu@e%diKj)#jdfIlL*++Kq2I_!4<`;>={-M`yRH>NukJU4^VY%2<2tBXSZBfend>Z7pFxR* z6?;i0_s8~i+$brzX1cH>eGZZ>J{UxcC%@0R5Hp?Ny0~Zn8Ox^Jcy zSqu2*o}e)hJfW;@~>k5Pl_G{Mw@Ux8wO(A zyzam#YhacMC$j?+90BLUKvdLr9CC(?TGRC7zIqqVUE?Hm)AS%tO*c))x$Bmu>CKf* zpzYqj+$pyQLYDi4DcGi&AGTJ11Hs`+SWX^}#(`affbHAkDDXh;3)p>xndCNXXGleF zfhq0SsXUN}{}$g*mZscvM-w(c_RF{OZeM#3QWUVH2gbKy^AFMq0c{8IBXxh`K24-4 z_?FPQVhYwbl^hSg*_hYdl-C@5t1&yFDerjj?cg?eWBcPRzCVQb*)ICO)tGmvDesVc ze~9lJvtyA05;%kqd>28Bi9@i;dm%$DW*~ZkEpTv?ar0GADWTA_{u}y`s{B<-ph%jgSu4NtEpC$=QNANqD8dtM2JORs_aRNN<9%(@2fJ0fV3t?@1 z5CFJCo>@CSy(y_QH=9qKph?@LZ60t!<`D*wtVp5I|0Z#hK{Q63uPG7`_hV!-xw}I~ zKSq?Ggzz{L(<&}0Q4^WG@$i%O<3pC36?kaiN)2}eVsJ^jq5MTP2{#>gaUuhyY>UcH zTzr!y{=iJwHpQEox~emz8Z*ckG-O_jD7_IL>Mq|W7orkKvc9!@PzpT}l|_FYE}1(y zVO)aedBTs}!fXNM;oR^aVh*TL<2IaVisUc;yw=JG@dw4bKs6| zo0{D2uWD-+em_|#>e%A-P&>&ip-7|7is>vc))B}MgZ8f+vVW@T3xl+I&}Xit>{EXnOP-`UrFf(X@j&=tcPD}7b17KzeSax5^uy~*-JQ_10wS3mmx04%w4IBd#0ENAvc=qbUF3soFYaoAXJ_+UL=g*}}eJ%I!@XHi&CdL)8Y zJ}m_-YIZl}9rIqmNRF6b5Bv>`+#Gc&;r?cD_rZo+zi0{`gpee&m-|C&@DpYdYE5<@ zgq3pp+AA;{`KsCymft1^L#S&piTT&Qss#fgL?3>#prD}*s=BTIYfL#9pG<*~jzHXN ztP4(G+0;q`-D23r_kC?@$__%~O;a|N-85xGQCdr7llx$mqsj6SOFC{N`Hq9$bQ>D_jd+St28_Jd_Si!^-P-hy6B-W8-Bb7e zh&I3;1iSPU@)1o&gZ*WvJ+?-_JtQ9?UHQ)5Q@$T9{<7nc;@N5WJzK5NAm*I~5u3mm zYry+bi+U2GAO6bbK*}a0O7T}7Q}HnQ_bs6@5bSpZvzvWigQKHZLuf{9Xbf~w9t+KI zhQ{F4@z4xMXpAkG-2#8K+uRMyM==KPU2XoV!|IQTkj8w45={Gfpo3-a zuWDAS4hJmjL(sl+4CCRKP@RescNX7b7_XlJS;%9Rhas8|Ndn09FyTT;s&_7e2fS-q zAm|X7{6dR*0;*U<`VU8@|FF*PPzer_jtn66rQk!41?M z4#|ZILPU2Qbt7X+S5L_N>Cx!XfibE=ZQu{1KUh^fqOxcp^sxl0s)SYw-%`CnX`s-$LfQvPG8{PQ_bg z0dM7&NmJYRb1=#~u6ax>Y~SzOoT}kIEH6nK(DM~{0;S?U={*W9NaFSRY86Gh zA#NM8ydcm*7g9!MrxjR7I7a9!ju0N#A6$qy8<$f^OGt<;hJ*?XsGnJyDRnA5f5;CQ zr!oW(Sp=st&Va53v`F|-epEt~A6*8&80B_Ag9NnJfSv$UAws-qKpcq{Y- z8d098Qmb(Mu?8xX9DVRA1#z}N+0h1!S{tJvBZk=zk{I&ISmK00AbKo zGoHh<0~8!MDCxpiy$8Q3{0)wa*Q|dxO@>i+of*qVa`KTJYCViUof%W#0Ht`O#X){d z&5Nb(Kd>7qxS+lb;|e?1JiLB``ke^uuKWU@!D$LGT@`UqtSUS)U16evLO`ff3|@{L zD@S9+v*7G8L+zF<3bBFX3gDz=5rBB;EJSawZvsmblt&aLr-O3>@&r+*nMpuq612?l zsAVu-@HZNhi998Q^Au;^6SQqufg}YBT*0!aql92q_43IEFO>~m$|@6jbfDy<^v82L z=c70TTVB9OSO-B%D4Ror4^3-J&oEbf<*tM%oPF&mOuZV%-v?>99aoGHFP2;{7d}P{ zKkg++u6LpVy$nd=H2{)$9~o~yF`z6o9LctgHK54`bTgn^fE%MwLyBZ*?*t?nTAt99 zlzBo^vav515I-)Y-(EnHS#1I&8ApCxNXGGBfMg167~f}$*v;FvK z7nh;uf^OLT--(WKzct!L?zCc*fPe+}TIs$RIf}E6=IBXLa)BfKoVahqW7uZ^eAc5x z!af{>DLx3a<4KIIM5Fm@n$U|4X`xvQT>BHV#C+48aUU)2>Xd&YJ+b3)I%P;nokqE52g{z%}FICtB z&?xunK$)#OI?cU0P-Z!Fm1b3=d}asA>}k=I&+I^%{nBjWo-pGWaPv5P=j&zj2aR%9 zy1iK1bSF}##fQsqv-A|>P_$4H$F8sjw?`+;L8H-2evcN4IMJcF4HphIY3o1sheHV# z0q==aW6J*)ro2<5e4(TqA>!#0q4e^>1Dsx8A8Dan!Y^{{y$C+x@`<+k{-qX* zIMJngaa5>5-^@K0j_U_46mg!8!5lSC7zI`jQt#YQPBM#CN(VGUr$86&MI7h1qcRu!ya9l&RP=gSc1oJc> zpu(rLbktR|=iW%p9gaAWl(|%8HgQLtEpprQukQ#`o~Y5e#Grg#6y?Z#B?vltoknZM ztk6Ocr<<}0Po<+LPAHf+a;Ra&Q9c`wFz`63XlUNF!e}4kY1D*C27J0$Tv*ajlVXE; z?S+Pj-uxw%uyR)+?5#z4LI$zo#-)%S95?&A%Ce zKX3T_vLVCMhoz(&8rvW1KLv^Epks*dc z!c>OROIMiWj3gA1a!q1UCnR$|*RVb~zU*d5KbB6My=1|%2upHv=EBC}>>){W(}$)E z9SSviT2zac%!RaMDOgyfQAnR^rtS3i%P380*e}!tU2h?}NJ)yWBJj%LLprxjmkgo9 z2&dbo8=9P+B)ut-*h4uAiNqrq@;DyTbtaKG*d*T>_bwz7r=5l;BoZU~KEq#tp8qNF zI0(U!H|$E{WweGP5OM2FVu<6<*baEvol3S%>dp9C=)t%c&6_^k+dlt z`AX)0Cuy@}?tdp~BNk8{ldyp5oEpdg+l{3Mu3&apJe4a+fofAtyV_`9^+zD8d04fy zChiQ3d&NriA}z*#CeP%3ZQ_BdR*N_a*`|K)%>#boPAtFGH)9i=>Q4eGcTvAL6o6cX z1BB2;Z-RR8k;j5pQHT3TXsxH7_K{Es52exANy8~E9CWO7RKel{R={j)cpS{~0=}Sw zJ#m-|Zw}Ub|B3V!v^K?^ve%UJ7+|FnC(fG`uIT%#uowFTs!x40PEMy3oP@^wAbztCHD2Z7b8I73)mMJt{vOH4+0+lAL*BAyeUs%R(%*y$96~SF#VUxV8IO-y1)TtmrL^G+5tgJJ}R>619T$kGwW(aJSf; zXuO=Ii26DB23J6?=jH?VW4)ue`7lM4H#Q$2Ie{Y25Jj%-cSmhNeA)R1#82FS_)%;? z$gLjl@j%&OZHWbIkl6Ko2b;d4(v#~>{w4g994EPHr;=zuTx&TSmpm*lp>hlY{3?l2 zRvVB_<6yL50&lT3${h{iM889Oj%C+#n0J`#%vcaYuhUc_RN2suvC-99*&CKdD%E$S z4vwSO%T1ZFfeE(6AFwH=?aZJ(XnQgvE&dV*Hnyg>_@}i|hkl&dAFEDp^G~y==lZ8{ zb3*RbR5l{(P}7e6nRC#eeh658pZKO4m*$Vf!W0(qDo;Y;LP4y*0LzTENONE$GzHm= zg>+e3tR%HwJ?NbQO6;JhuF-Am;ON~MHO#8{V=Cc4h<%6F#E(NGp;ke3ckC~qyC0#g z1(@wQ5*i6Z6SP_}(#r0Rjw05jp@YWZ{;6sZ^hyQd9uVFB2{NPT_jmY?T7tbe(i{Pu z%6|gWmuIttoOh^s&QRQHs&A0VUps+P7iGt^8s|hND|H(nGMTXEH6IrI0MY%_j>RhT zFUdbHS~zDWCh7k#7nmX@CbTuMwwyXSU0(duh3mtttL6~PckFz9>}{>;Dw9H%on zvdDDA0UI3=iZvhpa9#1%M~{a?UB)1A#EA~YZV(PdoN%a-@=<(P$@ux1C7nx4(LCKl z<{~2R%(2zKG`m5pC!FbqhzaNY_b!<=Sua zX?UG|L26aBxt65;*Th;B`eW1e_xgc%9Kp z0KJpI>CeS^IL6x*y@9|~@{ygS!m}b^e+J;kwF4 z8}Mw}(py*Y+EE|p0B0aKKj40@K1_(b4-){_6}|iMu0L>|)$qu=cU3M&f%D@p(0c*t z>yGV{mo8$gQn7qj^!|7;@Nm&}mA*lER}Y*oBJesZXHG*WG#t{S%XVPpuaow23V1y+ zN7L!?{=57wtQno8l9@PV!7c&#raYS&Av4Tn(1{# zmo~~|eQl~d0<)s*DI6Un4|N$J>Ew*haVUaXe@U&}Dk-gwfpnQh>nLcE2I)y!WD2B{ zwAgp$aS^B=Ho?5TKga6Nv2kn^Dc~N%RRR2VfRv7(9XAF5L< z{usQA^zuT)>0KZ7q+0^hP3zad>Y{1YdzIg-Q>@T*4PBWa1!Z5(l~{P1sA;wz59)r) z8W9Urn9&mJyV_FJ8q;c?$^i1Jy2@{Sqpc=l^)8*Y)3TDOyrzNkNIb3>{UHLtgm|-n7aEmGIwKI_Gz@m$>Y}=^r zQ+FipUt?Wu<5~=YwWvS(cDAn>1Nk~8@VohsG1mFeE{bK`<5)^Hh(Ypn2T>;o)ZLZe zsk^9c?nw$XnNL1}wU|j#KNadTP}YKFm6C=u(7GI#Q%Ld*1{9+_f;+R~gp$G{8VP{a z1Q;>Lx~6NTP?{d!zhLAAK16{F2aea*!B+~s1*ys?p>8mq!jJNjWFK#q!Rk+ z4fqwpxHz@M;dlrxS%{MXu|b%WGsV1_1XvVekzR^B^V;C2pfHWBCTbVx*p5WHR-_KYrh!*6A;fo#ii%D-ks#+sHMjg-N(#6czW00(uqq zA^|nyUWm)7{0sL90vdoyl3}S7cf9Z`H2m-=td{Z@rpz7uEx<*a(4}!T2P%7PUXBX7 zrlH)W8KDv8OnOxG*nFGxw@QD!_m8nK0g3>nDsKVW!oCg(T7c^mpt|c7q(#~HX*vA* z3NPWI?%MaMZ+n`5lEt^&YVuwLBLXIGf3?5wN2}NA-sg4bHhDNxx0)&(ayJ5nyZLsJ zF4zHSpdgi;w-XI$m;vP&&^QB{YCv-gsM3J`$AF#(#A1>hf#`^MViD3!!zDZIq~fXN zF4=I@RwT8i-M;n{yp;n=V1fy1x;aMR1q`CA%@yZCU&)w_vPM$3saaz#@N4`@ZC_z%ZoWfUa$+F2Sbf`9P#`BG8c3 zwFG%5W3ZAb@n<{@BH$YSj3F-WX_2gob1~u|MY8>_HZwu!py0B;K*HQNSiMgQq9#Ku zpVe`e-dHT9C0d1)mat0D7qluNE1r)lMySk{)x?66(0b$TLx$fT13F+a5UD4Xq=r#W2-JgZctq7JB?=tszwybYXDTIh=VPh>c+$I zJW4FBxNV)sW34U^-0mvJfFMUx3=Fzremi3Jo8&mtkMKx2K&h}{1)~$1wSj*Akv6r5 zIK&O*?$F#`b$NQewJJf)wz)^ys$AwHqBO1E2ak3aSi1QuIr5ytLeja+)0;aPKiQzu z0LkW_186QTrw~P!Z^L8EMkB-~1NsP%9O~KJWr#S`fP``Y$>D##;YSUF^6is=X-wV=Q`sisWamT*Br2~ zia`wOC>S3DS6x^Xz_}4QPy}-06*`S^024uy>*k;QW5t=|ySD{F zEL;XqQC#rknv+@6fv^BDbRghk8Jfj0FyzKtDy?E7FP+{nsTh{sG&^`WibC!|d5xuQ z-)c6@yx|3h`LFOXUG56ofwLG0>I7@KOE-=()rLt$8wtm7lG5M_&M=NQezMvFCRS*^ ztmK-CCXBhm*P|NRQ3mg~t9eD`YF*1-$XLlTV`2*ycZpPrCKS zH(j|kaa%b~4omgz$hbfkEx(I}jdEA9{=H_a`3gEO`gm zQj4o;*Er!)*?+q0Gkiq<;a7MUeMp^v0Sw|FT8DvX%ywIPX>9eNz_Tv26O^%L5k*Yo z_L=|^!~XZW#a$ZfJyaf}cR|c^nwd%!9W4ffo7UIJ?!~9y=%^kY_=5|>qBeBG=%YjL zrF~V)2If=+SBYj|Uv&v$QB~wv!R)?=^DLP=i~B|g^xIE$g8Y{zty`14E&WDk^-z$9 z%!Fz#cj&#mm+B)8%}f9$@UsLdry%9@zOPQOfmAs2l9a7_I7l&E-*SgOc$n4u1S!pY z2`mXt!7j zh+%kGRYjRdDi<0MxiUG&^T36CTW&zN0+Mt59}GWoDiV(({}TGZfIc&z9}NhRD`ao! z^!dCRFb6bez!I+;+rbgXq5u>$h{;W~*NQVXSIY_4*)Ro@wRNhT8k@{h9mN7?+N@a)_=YUv?nLUGLPCn2)hV>blaX`^?K`ZY7-9QG`mweo1VG^s(j6B}GxAYcg^M|j1rr(v z)3FN{Oi`Cuk`K6#PTdK%l=<^l#1F3Q!>8qV!c3obgexEs8QX#HPYlZP(-tdF2h_Z5 zcSGcQ2o8rjC9|j%4vH&oqCYQNn!!fOY^1;BqSO<1TyC*MKCIHb63j8O=vhp$v=k8(}~tfFzac0deebDt7|n80b`} zzg*IzjS~rF1Cmt60Fsm^8-CRW^cWyX1*8;i(~)8AuAD8tI#j^uyI`{vZ|w3ORAr_t zwSSD2N_1um4DEb$leIz0^)_4tT+V_FPj_5=J`9o%V4$VD7e77zLs?6)FE&>rB!060 z&+I@j=g}_m7!h-0Hu0;1?ldb4L#3}-aUs`{8;w|iKqwY0Doi-D7%3wucZa{(#9cMw z%w0A-6vk$Fy6%E9At!IbxiH>F#>HBQj;nizxHvwWp>SHpFw!5w{(_z|wivn|MqFC9 z;CFglR`^B7)zu+f&X#n4E!zA+IIe8rN1=q%DO2nrnsQf%a32RI8n2>$eeudL2otd%|(}?4ZhK_cXd#g<1E|6$&zz09GEm}cWS>ps2eQ_i){i>mht0T zCcn8{PmLnB%ovb3660k)3Mc49h~(JeYc@^BopFA?tm;@e_FWB6ZZJ)tF&gu}V zFMQ3W`M5KNGlv}?9uB21MfMe;@LEYElIEiG#r_eUuf84fb+*9KcY7W?b}Ba<*Km#U z*&?pU{&h|V${ml>lBU^|iaW`?Q+HuRiH+AN_Y;)yTDey9Asn3xjx*7@=+_|^=L#H( zAyKraaexH_uTJm=4LDa}`=MK@zcPI8?%?xy2cOprAH8Mn?%=a8$|thK&O^M>x#)Ow zx4*z?z@0rm$MnPZ;aq&IQSPs}(3T=8$916GzeD+)FL2m)SU%p0-C1GET&ttwq2OrB z7r-|<&0QS|=6W65#GkGzx+qMUYAxt^D46XZo8g*|0-xwwcHwPwTpbVLf;4bkCXUNk z)f)8h)^J=I8s&>5QK({ z0_PvNbM#zoO&S?a;hkDs+A-k>5uAY?D93l8j0TOob1|V8pdVIWcuSb_0~+N)$b0kw zWMmbgSdVneD(?S8&nJYNv{1x}t_#kI(RDGXLwYV1I709WP|AcdjNwR}a7Q%Cmx}bz z>tC8r$5OovZ=>V7v_o8p0_T3*V{i>^d7>a3*V(dR;dqiutHCQZ9~l<{C|OZHk$q<{ z-bTls*dg}I1rB*bjzo?Byy8SS_9Bh)K%B858;0=8GA z@t9>5OBdd7T?dOYc#U(o^G<(DKjRDv7}&*SH&nn{O@v_;-E;Olo}U&6dl!pS(fSjQ z_rh372Pz0qS~2@N#p5X*m0g-NWPD!1gsVr7n~?2^&mHfH&&kOKh3NCuKqnJDn`gmg zR24T?E?H8xv;*;*a8CTz&V6aa=7z9g7(M-S7nRKh9Z8l(d5q9xTed7E?IVKX%yW#IFL}PA!uQiRp3DTT=8Na4!tkE5qUtpgiY`W zt2M$Hk7ndW8s-senWfSgkZw#!BdK|6*#x<0f5x@U$ZACVx@93fWw+i?u>c8KR=NO9 zq6}?Fuef1(qp!{xHR0+}*%DQ&I^ALsTaZ>t8YyAOh@}%wjPTNvs5OX@6S7B67*jZI zbne(}F5G%juyX53HI{BYsaJVY^~GDgy+lUQW!9w0Bn?%IRpzSn#!9pdJ?V39ttdm; z=#RqoQdHZAEulrXhRY->u)x-8SEqoQEDN{1>z2;Gp>k1KX~n|DY|rc`*`25=&`)Ze zab^0@f9o99kYPiHq`K&Mu4AY;*YOm_h=)0zz;$*G>##oaN)+%m4xN4B+M;m$xOeb7 zD#D3#9jBecinAat;JwV*6^^8{aSrQ>Im_gRmGG78?HXwOtWc8bB0n|x!iB3Hv}l)x zjzer$a=DiRN4HBuyw2p-UGN_Tyt%)E-eTZXMc{Qtj~_vIX*d9d>neR4fcNAt(BlO5 z?60J^6L=r~0zGc{egd2~`6UKN=CZ5w4a7W`%DE1%tMVfg=K;>`+Ltm}ov!Hp8k;5J zLyETu*A=~UfHz3P?J9kPk-jA0%;Z-S9Gh%c^qv9E77ec}dZQ42hlWFXbY0Qw3I6(A z^4M@)(JR8c0l=xy@Ho8-dJ*g}!=oE1t2G=x({-jff_Q5?!;4^E8J5+$9(a#xxLu`h zF<$%`IQ`fV;mFQ)mETFgnXBP-Mek08U##Jf9$i=TP6E%&??kw+=r!ZTnZWs$Uu$qi z`E`=tp7>fjmtSmfUD2b0@BzT_@cRpn%Uhk*2iwt28V>R3vMHy3TD=kP*3R%cN#9D~ z-J{`lmA>&v--Ez8!p&|t@_}8IUk?}R4HsQk^!Uktkqfs7*A=}q7lcJ{(RD@dSv0_j zF1+U#65P-Aw<6%o*6_Nb_dlRWbc8;C!Otbw#fXFOCAIkbFGc&(T{8oQE_# zo!-BD{)6Y6PuzZQ`+s%5S(;J&?@oYZ{q1ma&wEZLt1p;RGF)e*3^=cE%C&!rOZnr6 zgHo=3c1TL0J2Pd;U00m+%CMUbr#yAl$&}S=O{sO?_e_oX`mEI7+#Z)&_tc=&;kOS- z{m7h|I&0ijsqWcRQeU1hFSTvpveY%Vu1vl2Gk>Z#bZ=_SyoXXJu6rsqdG_CaoM6_o{!`(*M18*t5eP8n&|JsbQ&?KR;~eb6bWTKDld{ z$-IBqwMRc2cEPLP40}A=H2mmOJ%^vzc-HXU7sd_0AaBs{%)Ud0U$7x#_>KGXhd=&V z@$m0=&mHdn-O}ODUcPep)_eWKD}473|A+OV;adkkHGIse=Z4>U>z3g^ZQeC}%=Qn4 z-~04u!&{eqGraCRQ`&viJ=0DtJ}WKeoBnBYoP*M)e4LaPEXhc__rd(MZ=NVlOTKGv z+6{$E)AsdPnRb1-Kkbfb_oiKT;K8(>ZBM2xc>TFF_sA`2msamed$i_*v{2b+Y0ZPb zNjuV_q>rA`Grjkyv(k&U_fOyS*}(MWe@RMzd{9RE>(}O|Pnutx?#rEAl8$kUn(4XX#&kej@$+ca;&{ zujn}-}TAt*1LaZ;G%(O1bq%>VxPnbUecnfcAOXER%` zcs0{JeP`z4g7-6Lp8IL$-ZzeCUX!L|-5juHB`@xiwf@j~S(luM&${AIS7zPS*PZo- zdrVfr6_c}ux6aO5^~WVycMn{Vwd~f_S)We5C#!My@3T$?pU7H#_p@33TVKiAaKX;3 zWc&MB{XYC8D|6NHtQ}`5o~310&wV5NcoJVc&+|@QyyyAKD?KkXju7UH&ObiM^W&!3 zo*%DW;=zgwuAgz3RJeKti3mU(L1PpvAh&>QfVgfRqc{MO4~S8mfaK~^ETG>DKWrCU zYTm2pH}z%iLrdK>rO-WXX%};lkmw+1#~~MkxVX!KpCDs^5RgHG`~Cke4W_LJLe=c9 z=mBxxy+!G@8B3 zyJ_UHhwjT#D(vc%Y>0CjB4KK8aZYOAAt9D_IkMqU3lzvp)tmHm_0~=a2q|lu4`NY2 zAWe(n<9$ez3yFlSs900wDv`{ZY-GQ@TQ~{G6pH`5ir%n;5m5_}nU`ru-VKbJ?;v^_ zS8-NgG=$?SdLigr=a{q@mDVm6j!1R1r+Suo?S>U72zNb& zSgTUh6N$$ITWZE3HRc^GPkG9a0w$`x&?pmXmWSf~$}d>HAQX!{#Y6cJlmaOr6zhFN zN{~7l*ax@{>r}=V(1Ql_lmWeBKpz{>1*j_-mI}2c#6p!2&=h_oqT7I(juoGO?0alo zPNXYV&4*CTl&K4@1x9i^4iBLO(6r)w@3c#?YqY==wYj|eB>$rL1g()lV&0#pR3`;+ ztYvb1f@sfB#4p|=qe&1Rav%4bs=BGik>><)k_wHjQRr?%fhRCoY{2$)?*WQzaAeIS zJ+s!1a0a5=B>(6Y5pj=(@cnckR-CDy>_m(>T#18P_O)!hNJN}FC)OTF=EL|pt(D<4 zzFA6|u}m%xa7^-xhATXvQVoYUDn*}S@2y@G$P-<1J)(7hs#EP_UL{-GanN&C z4GV19#Foa&(weo9&GPr~PDhwnEo<&=RbzRw6-k7gl6SA3KnoJ*&SQKD-iL^xr!#Eq5qvSd?RPN5P)LQmjX zLN6H58wNxvIQe$A0WCG4mkfxu;=|)N7bd{#qYd|V;780FQixNvqMusTZfeg&t6JZ{ zmwkDILm1(P;od`8dCUdkZ0jyi(oYqrTjDd|tv35#bHH1@i$&qDu@bhUpkXFrH(Gvt zwKFirqB_if``rpq)AW;l?c33f1CW1{1^6(rbvKJtlhE{!Tb00;0kwcTyx%NfO3EqS zl>|XbvE+c3z`)fP1p+J-b@HlB_~NfPxxbo2Ky0)H;hE|zHF;i->*)dnhHH}Jj^ zcrIN+bZw0wd%sAOe{u~Gk(4jgyEu;e(C%B!H>bA8*Dz^2Yi!7Z=zSMUcm*Dho+IHY zgwK$0Helb5pJ<-wWq^Si8>p?^$u{~5OB_wjg}&`T^NyW#w5Oh$b~V64<-mt#=u~?G zawQ)~{tj~E@6{szO7&QEReTzt?kob3VSjL_ihD=(8Ez1*vZx{TIH1@n8=tFV)KkFX zu<8)Q>Ko$FUIIdK`fytO8!6!APh)LuGhrr)GXX!|UUL(==ryIY(BfBaXQOBUT9o7R zmu%q60kQqW2mz=Z0iA~+*#hGF0(qSn#RUj^x`1dmAX7jIfHDMxo5HoLeEfD(dWt4Y zb_b{N2DT##^&?L5HlFQtuKbKXi473)e;|2V;Zc zb~Y?1GD~JVN*x~Es(WrGh{oSQnST32_260t)bp9^y+ycU#Afq&0V#);=RVf^%WOP| zcgQ9j2*6#9OC$qx4DuGM2B&iLOng_Ze?V{|G^R*x3MiWb7Pw{eJPM(>(Zjxy3E~3 zqa?0C+{0qvR#54aLYuA6zlYlLoZifIc%Ic6EuDX+U_XaEXvrXjW{ZB~1maRUw+FlZqP9 z4bgWKe}tM)^?33(iQlL@6W@N|`%^gUh)N6;wtLM~7Xal3Xt~HzoNUL(19>L)+nwmI zjL9GOY}G*K7Do@v``vqy!@XwY2swluK7ZU@9It@y{Z!8zL*0o>rcZXGnRsUUlEA)q zdMX;np;6EolZunSf_N>!e4K2?nPmVN*loC+xZ*g-;~I?1fh!i53s(ZJB>y>HaQMt! zzI$?fzWwflh!kaz9kAR3&ukFQO{@o$W*oi1OLVz$>~iBmCfNtk>16K%W(s;*3c6kj z$fT@1rS-jW)jeJ&cr?cSwzs@u0SITK)YC$i1pE{RYo>us3&v6>tV!Kg8E?W!YJYZ{ z37n^CGBi)rqrmOYzJX`H8Vs)b=*0kHC5{U?jtHCtyn<}J3149&){n>ZT zh!*m`($k42i2K^)QyiXLkOJmYZv0?|iZ^49gm;2}bga6w)cj@%MTEywIy|Z2F%-NU zfc^|f8-M_D;TZc!;1RA6ZEH4QwhB%LgCX_JY8=dxtpB{bnwxN#Ahbcehv^4x0mIx^ z$RDRHC#J4gWZQ*dC;|19RGkJA8NNCjTWMjNImvvB#XQYs&ZoXzo}>B_?~?>JLoqa| zu%s8o=cT|H8X$0(%(P+=P#U&f*7FzM$Z}#JqAihC#fk!qn`+$(TGOV2wII|B7qSk?K`0Y4L!P5X@A|gjc5Vjwgk``0T903+BR? zrc_;wkzyww6ttFv2GGbwi_Di^JTC#M332i-p@GNe7vnibDFsw6pap=g6VOJ(?=iy< zFW?SwzK4^FbjbjmfhUW0FnK;;wmY6Qz~G?Q1yIn#|&2g(5y5aJFKb{n^(^>qO$VOHq^Rel$Jw z@BPSU2I9&FK97(>J?#U*JH>Eup%^YIhoTNraK(n|gLme090~D7ce}a<_^9!x#=-NT z@XWEVx)q)n8!$g5p*v*T1LUQcGK}jPunTD0h_;?#eEB-jYhCWwkq@W$j7u@50yQ2c zz|c@I8aebK5S5+6nofyiL()*+v_3}CX)D{c8c(V2QA_YBzwz7c55a7$X+SFoIxt$r znPA#4Xn!_{=M3{ccDs6u<7^O%j9hkQFbHbzGK z+Wr_3L!!_?D~`t0Xu>jxstrC;h*JCbP*V_Qf-BNPcd`&We;KE4d*FL~T7zT~$QVHx z5ITCK;C~#4P~ra`r>soCwdnCthpHsGB&TEk!6-3)+VNNL~|(Q==O&j+ABY(W=SH}JbCxz3HI zyontAR5aQ+F+!rQkrzj`Lw$2|8cHazMX>KD{{q8%S;7Zu&Qakf|AHDk@c%UTHtudlU)C;_b2h}x`(wXJQzXr+Zpgh>A1@64QiAz5qd=YD?wft;N)=b2|_ zo_T-fd7gp)*&z3EM;>hs$kNFW?nRC~3MDN0RtoAde#52M3(RCDHV5b6XGTp8l#Cw_ z&SPF)m3<-dytn)MXbH@8lX3M9(BOL|zIPAi0+2RK)HY6I5Ho*iRsrigqQi@!FB3%b z%*I3sOu!h~6$tk<{tB(i3#=RO0ajHs48Ai^SXQ1Fn>c?}bW-2+=+}cYk)TqsVN(}} zu{uIWh&=C!oXE5um-Im6%ty2WYopw1vO{wL^}i zBS};E__L%50DSI^KS2bb_lvJT$t{xD{4BRit$W1ApUL-!e#!ly_|ISP2i1hNkc%N-MD`Ac%OUY24IhT49~4P zVbYJ)!QUI?FWNDP87xpV00l|5KcILB^hweo>pA#iPYU7>_jCtytDqT^8`?L$?T>?I zL^t|LM6HvA$p_yGs8C)oL$tTOGbq#@-E7_fh*?U%3IxD>5#VC;+5CpVpejodIhg_S zd68-^2Hqem!}|JWez8_;&bKzoqBfYwKmlpc`a$DN)Hq6eW}zZ<1ND-v%^OL`+q!`# z0HaLcs$5y9>Z2iukE|H3N_RFM>gEXNeTwZKA7nz4H|C@3RDmvFng#e7BNeu$h|rFN zz3$ED!mK<7xqP8o2Bgf(#36m~vTf zSaP~Z|JGOWc`vVx&9o}bL>t@9ssJ~vrHvbO&J`^$aKkPcx~+0dXRFI^5lx10Jq1*L z@z9+lLd&1I4{iCq+>P237{2?&>7jjCP)g8epC)MN#I|E#z&4qo!`+#V!?GeaO5$Sx z$`YlU*|=tI&X<|Q#R4GvY2m~5Lx92qQ)b<#fmWWDmyHd`VgB79nveVW2)M!6XCTj@ zTou=(fa3Js@;t|>cCG*y;?HaRJ?{GgNW(eUYkUz^#c|MUtcOp9eJ}326S+p|@O2w} z&G5-Jguw&vsR%KR%j8Jfh%b`QXljN<0&;>$A#EaNEjS&9fEq@?w<(gM*`Z1qHzkV*s(01HodEFnC z4$s(7@A_y0o>?1S-hd!XOI&nvg!0v1zhHhlmdN}WjdWFkn1k>00XIl*;x@w1@tq4C zIlec-BU&ZLOOEn2Xpu5(YB5x6(fV9sB8HjZM!>bciuW9`ffkcy)9c=t0ZL%p-49*! zp_;+N@fP(1m2$Cx1DALiJ0{h7$Y;7z^O@Q{&g{OZ?PEu`|H(%mdE|;?hcFK9Z988>w|W+CDa0{!Aha`&|W{S>G z+imBGy~kqVwx%JWSD=+Gc6NKCxO#ebUub9dP>eICV<)=Q4iq$CnT0y1R{r*u;5XTL zx;@BmV8crrI?OMy!Y%icXu$^NG#~!FjvmGJ;#RyhgI(x9WtHmMPUu66Z!lYtRzIGw zAJ`{$@@xg%9~^C|1CyvZB%{^Gdf$O#w_zMVFtByL*YGj&R$pc7qDwX+;$ko*chHE( zM?Tk0x7EQhhY_ZLr!PT*;a5+JFQX>FutTk73+~=LV)OP5fDjLD-+>>fk75iHFFpq_ zW8a_i_JrTW_R5dRE+2md_$$I+G5$*NSBbyL_^ZNSz`gO;M6e_L_vWJLtf6gx7{raK z_(E%6)6kC6jl6pl3{T7+x#HPh2C$wI>rK4*t;UTrxggw0M(!(luR;ycXEaYh^?IX? z&(?D=fbF=eMPGQu#+i*nINa}QJkpIKd_7;_Z{IuESvy_?YkmmV$QVHzUnE|PC>r!fZi<8ZF$>oMOiZjt?Y1EhjvAyBRgNH=ToNj76#ocl|P@T;EnDa>z zTC!kTIiezlxA~@)7n~%3?uj%_u~qDnywUKkh8&d4Bc70Go_&D*&HdP6#YhLXF zii*8dw0=Y_`86_PPIepcaxeaH#|tK{E8v4!p}4O#?xUrgd*s*4(eagUKYa6K*hFN* zEwOOntgzf14|@o{E%NJk;fqS&58&G@ecRy^(uarfpLqKceg_$)a$>aLmkbuU(Jc@U zb1vcJSRl%ap_wbD`^BAd#)vkX%QI$U^etf9z-$<_XU7O^XSMD?QACtAL^9dK$YG%e z5?o7^fo(9%n83vclj+JT9FF{wzy<~>r_rfM*mx4@aF|iKM;mc(IR`Zrt>zJ?&pxF< z>lV3U^UrqxSbY8G8}Rc>KpFe~gz0V%AhX%X>kGujpUV!*Zssi}yEa5t4twub-56*V zF4Bj^^V>imy9;8szKSg50HJ{!b;wtGp%24Xel+JF?6n}DH=6%5e8|6~!|{SJBm1~S z%|q;T$uJR|U1sSuI(sFO>DD|EV9H@9z+pdm4>^rLK!^uyK(0)&$ih(NK)A=fIg^tE z=!}7>SdyyH?wq)M=X4V4J}w~D;*k{VK7-~Tx=*vGf1X!kNg-#{XCv&RB7c*Z&qYBI zrqxedP3pNcS3IQV(%)@6b|PstNgn7{IcvTVenY&8dGl=$q)3hl=2MuWu5&?!&7=0mPyB%`{X)rPK?%nGFpxP4{C%ai7(5EI|f)0X`VbUuoIJQ5XHo-#rYdf_67RfVe>9KPcW% zYt--?4I{-b)cE_b8h`)Jb~Xd1s9uf_z8x5RIiuEN1B^LGGL-L^G(#xHUStW)D_gYV z4z?Z>_pw!reWBkbozwi%8O?tH3&~h<56?^9%jj}(R5D_74#tY#kH5ShD?S{5IgBgS z38M~H8lDdyX*w%b`U@OUW`vK}Q1gD#+xT7*Q^iS>582|yBahlu=WPEDknpg>Yp{i= zqmdz?j`ER`$`^?HisC**FevNEF~&6VUh>+&VHO_0&iG?0>Nd^*+d8@@&16 z6NYvOl#(TAUci;C1Hvx}^*4eg+&S>_yM!@tJ?K~LZz_auV{{NPL!mNBp&RWNm;-pS zgm-`Cg_o5NFY>gJzk`ebV$sc)PxVMuvE+6yRk1Fefr0=anbvS$<9{X6T80ohWuPEg zsnChgRLtqj5e%0YaGS-AS6-qp*DhPJiVSGFA+i+7m^m<{Voqm{z!oSQ*fa#q5u_>_ zyZT{HXKH}LL_+|5$19DC6V%`kM@Lfwit=}>06YV18%grqhSGu5uBWtSD0@Y6H#m#ONHb?8X+|V z8~-a(Lq_2S)1;96+%f1*ex#}JFpb~vpzF7e@kEnsidRH0$@(k%wTIzTq5VmJ&HPFe7fW6N2(5^ zq)D+j4kcneG{n3z5o@R}4q+4~%6upnIHf(Gi{R99^*4`jo`m7iI>((azE!X=QLdoI z{CNxukQGJutM8ngo4`CuV?N)I6iey_7XUUj&*=;c90U$h;IaK{aOkZO8soJ`85T(H z-GP3X)0q)qi)8;O|4Yx_1mpOh-XK+ojgv#RyK!GO731FVV3GlNt*{ZBne% z%LBO>qa#dezX&2Em16yk4~&#BJd9z^EAIHOq}F@C#yrvpoYF5Y?T2|}zj5O-33E1{ zbZ7tP)0o(Zuy*yTwe_{Aa=6R-Va`TqYMw9ahnd2ljtsIrIU*fB|8evJomJz9+H*ND zV?jC@cUEKkA*_rAc-)3#1H+Gk!^!=U^f6X)+qeRusrgA~YT)~TB;sM?|NG-aerRTy zPMI1=#>{n2D&}-%1h|jo47C18Q*Ht?XEnMj4d$8dV;y415RAs-#$puxv4lZd9F50~ z#rV7>H3amrQbRC4Z%hioJ>Lb;^Fb~^=u=w4RSe1C3}q*t&Kv=^2^>kjxy5=m0ZjwH zbTmi67KnL3hp18{Qw)VaB`sxGAbGaJL;@JDYnj$XAJ$Juq%~S&9wpOC#*6}=f_ao| zbtQ;_J1SSLS~IE^*P5?dQ-5Q_%Eh?zbUc=T#p6efA8&tLxoFkmy5i!(;zHbuH+kB$ z8KaUE;aR<2!L zx2V3hZp|7-w`s=|6yCaZ(yw*vrO^as!yyigGS{tHy(%edx|U@{#w`&@8whneOsBJK zPuxzcs(){9Nec^;K=j&g~P3KZ(~W}RI~Amg;Sl4h2gfwF}&iV zIXk)lhPds!Vn7DVfm>z3=MGQwHA%D8Fn_($+qhpbZQH5f0-WMxO+N(}dAp1sAG3^$ z@Z{FbizTP+qcVUBn-KR+j{C?!RA29o`<{a@K|chKV5e84e_T5IVZx2kqclPZsHlyBOviZ%xv5L3rG~z{|_GHC& zcD<7{vf5{ zbY6x-c+gAXK`+EaaqfYG3qK?W{g51_gttH3hBp^v&nNWZ{yZ@7y~2BsWj;tLMoKcf z+?yxylmi#&@rcmd(qTS`_dcs}ldJZ6@u&Ii?2}m2qvof@eb>Xsg>aTphbNclSyFD4 zEh5Xf70+zxYr%7*^xcQ2YCmo8DSU6leSd~e;X4eU!q)?z!k3B4R`^`-DSQ{gcQGJv z6!=6ZhnM2Kyeo?D?Va!i_yeuo8O47+^li=@;~|`X4Sr$qAL>oNg)kbAvv3=kDXN^y z&E=V}yj<>Ox5kBoPWFU$Hl9NKsquwK=rZNNuEsK4H^H+93c9$U#If2drn+WNkAB&l zrFy5lpa$uN3oG8m->!sohj4jq#IM>8Q ze;02RXU~`wHNRbDj}9KBSiit=Ay3u9bIr!z5jk{0Cz`kw@NCgXg{0=QV?d6B?Jjc@ z2B6ryO}*mm@LpU7he)x~O}*g>Cdz_a0T~&v9`w)Jn17Qz6OwlX!j7}LAW)45(~-jo z`18tJK2+GFcrTV=d+{7EeRvq0w(%dea0UksIcxCZu6ewotsa6#qS-rJUxml?**#yy zq2wh0{t6FneG)}?PLKJ6v#UfF1PQjdsyP0;?v_FYap9zZKGnXyU6epRV3P|+BL0-4 z>i9V|FL*i~`M3ywUgKIkE2Iw(DLchqQ?hE+y!N?{J#w#FM10EqKR)(ACRER`^TS`Z zH9D^U!Qe<*!tskEBY-Ds@2tOHh)SoA?i}@l*a5vcXOFjCDx-wUv{Xib*^hC_Joob~HHiL}Ncgbr$HNGo}BJ{X~?n6vs}c1jq|Q(Rr%^T6BROJHW*(>dd%n4<#l z4Cql~NjyZ-CyDJye5t8B`=!nms3U_L1UCIezt3NqNWETT9vV;m9v#9T&@gHHFbp9H z_U_sjPh#TA)X)#;U&5ru;<_!tQoJ>GtThpf%pW?!q{iaxnMmtuanGfRSifQvIKrgH z8jg@eS`S}3wlfjSX3!HRH5S)=iL`P6@Q$VsGSiy)`)oR@EF2&z?0MxIGUukgmi}`91GbW zdNX%bCeq5$nAKqk)3_#{7V}J3lM(`MM&fMEkmX9s57*|Y`AK)|!7UK+fAxlfcN6*f zvQA4Kd*HLtn38&O+0z|_d=)Vi|0Oq-L1qVj8oMi38ltRCVt3_gc(-S#@QUE{M^wC^WgF|lgSRxTbMs;$)bWK_B+0h zs=Kj(W*w!o!}CTL*45#E{9QAq@E+%e>C7eb+iZ)R`qQWJk8Z))GPzhbXNl%MQ#e<- zD6Qr!*+47SuCA?LRlBHR%`J7t)uVF9j#lg=`HXX$@{2WrMU$d+rlNgWjby| z58#|EI9xh>=i}SyfVo=3#qlLgD~!*oDA6!{ryGbXMYxKA;07q~B*0y-VbkUBOQ_pA z!2C+?))buvs$ZsC%b6p|4U|77x2PXnaX)St@qM`;Tz@VX@vZ6y*B>9@ZvBjK>pvsh zU7rDt<+!&W9LkY2!2!fL3l)DK;C{k}2p4Y$1Jv6u0rQfEOIL4?1IKSQj6{e>x^^ls z!+wjiEL=K#3-RrTfXU)43P-qf_&k6KB*C#C{i|HKX;=uJJN!pyR?hgsyz0_P^VY$1 z@4U5Z7R`gn|JH7m3gD*)hN@&)za{B?Tk8DVP0D|uMR`)idC!YJ|7>B zl5iAdhEDgjrZy@t`&S!40IS*TD0ddaC$`pOVaMBrhFj15fC0rOm?qD#`a657XHz!X z+VnHLDaL|T9*mZIW-GC0?2T~=5hOX4W+OJU0WmeGc_$}h{uWUK<@-CMt~;sZM*&Kj zeF?a4Sn*bQW5=eu;o&;L+O!$ZXmdXHx_%CaqP8b$J`9ghMfOnN>$GuXw(hqo zdQq-GGc`P^@EE|}HT)uj-eP)2*Wco0n0I%tsOXKA-rd_ZICf#flpz4zx%a`x{E<6&%^%N_ZQrr+5yuO|Fb_xExQnKb^_|(M9 zd5JDV-yV4p{A8mzp$^m6x88CE_nSe@G8;+2xsu0v6@1|F;2Dy>)t8MgZQEXqV`ttC zp}M*K%*MOo8or-XE#|{=$YI<@559nDl^u*KYZj3mj$p6V^jb&R`$Tb&53%VXJf-Y= zq$ks=>+L8zN}4q~tg@qGiZim~q*d0nzpSfkSy60OPZ!gLb}Q6`Zy(%I*2A}0Sx?v8 zB8E+9$P(8USyOuQc0~G2_vRnrt0?Og`=XOvVt#LEpEaxNY4$q$-g=sSfxdU5vwNTE z1tmiBdugF#2L(l=Mc=?@!bmx5q|F1{8!}|D zXnNPt(>3`*Q#8Hh=!yAkxOcj)eIHscQhF4IHdJuewTEHTqu~)zc33pM26BZvnl2Et zdeMtRZ>kQBp4{a+hf2R4vAGZyMgFU+(IV7^gRv5440qj5@x~mYg*`I119JSW7y-y* zRXq!Q)b_4l+x`Rl$+?W}Xz+BkurtTLx{=SeZf{qM^yzo~b(@5dU%D2zRK~VRm_4z1 zEtL_OU`FIArt8+dc>ZgRLp$UL1cK}_!tOvAO44)`o$?*` z=GRzL4M!updfWb*3Gw7;(Jxq57}tRaH00g0fFHDpl{poP3H5_SriHiDCBi#M?acol zLH`xn8{^UJ!c9k;DnS@f1;ul8f-0e7(uUi=m|57$d#UT@cf^!;MMeyStaEB|H+UU8 z!CQ@FWJC%_G-fG74j6|-LswV%yEwE^MhhCu$dva7#j?8UdhD=4w=*m=vNPDy#>oqs z5RrCI%kf_Ltyu@HDeqbhUGB}1PjD_!_I|W(ckKds62P%|3jVzEM(@e+f&Y)$i2N_F zVZm1^!@dDune_bwzKPOzJ_b}ZmeYor8p}t)r{=kF@Nv4zGM2{SR>tA#;VY6~sjI3u z^RL6Fat%aDiex4*E-_y@Pq?HRvBxOT}mb zgJw8U+O!=pwqd0J&c5^5$D&JAcwx*(9E^Oxb;Syp+se$_A1%uYZ~6fsn=cYuzKdT= zzBzU{c2rGQ>nI+{$TdLtfIIp&K%{B9jQcs`=<~M1EqtNINpqGZ{ds+bUu>R}_W?#D z9?Vcp@39xfM5pjR3Dq|t4N^K@njW2+J-rGmlE9$+VVIS*#@7(8bD*2?yr<=b!=O$0 zi;YhMh?ZB>5ybWkmD!HcZB8U?)Ssa<@7<<7Gq;)BGwaWWc>+}`@3!Wl@lU_(I?{mC~l5M^eJ}f8#Vu8%Ac+vgXOGwabZ6P7WL?|t`LUk~ATjUQ8$Idp)vdE<< z;}R4)C>`Q;y!%9^`iuhm#6cFU?UPK{c%h!#b6lE+UUa+{{!~bKc1?7B*q2zzW=~7ISlFiDlVXU#-Kz z`S|4~pqQVLlN5aIDL5SWL(f=3Vh1=zkB6zl08xn2s*d%6vkT z64!b{X>p2Ew6j(Ah+X)>{OuFb?*bs|YKasY4I?mr%gMX(Z>ngCLbn4dE)bq!oFz+B zgD|-^vT?ms2O@#hx^N+UboS9N*NOk`QAvC|wMe4G z53l-FBG$W%0!Nrs8V*NDDh>Nn!fE>zkcO4B5{^%6Fb zpLIEhQIU$KkfFvmI>Mxug1h@f`x#v~=Z}e4G}TE*nABL@6erS3J-YGhScFN9b%u;( z_pfIw_ctZdN*tb?8jC}JB8RP!@6SlYD%EKbCN(WCY!b0%|Kk}nHJcjqbS%Q8#v%hC z5v#gu>6?jI^*R<|6eg;AD;GEg4@ZjxeH4tH`hz+aVN}>7sd$n&e?Eza(;gvzFz7t& z|7~C?fP_$=!PMz!roeV6R}yECERNJx=j(UKNrs3c<8h7Pi)WTrCek{fF`p~bO2&*1 zb_(Wm`(gG=n1y%}&CaJg(6Ti`g2T8uTx9mmua1W7_x8J6Oesk zB=5TFFJ7!gpL25yM~_-^wcVWRI%4e(Z;}+%RFDZzB z#|c;>=kVEZd5M!O6)$&mN+}a?H>Qcds4&T)xGH_fbmN#Q;WQbRtXgyH!Zp09Po`$0 z#Cz&Zdnp82i<|KlEd`9E2qVh-{8C_UUbyDVfJmm}+NH~u#0A4|uDki>RX8RadiAJL zdFoa&buRYL&dJ7&9+j&gc}{kYaX!w;sxhq0k?nBcbFyA8Gm_l^QrTRmWOLDwq_i6a5 z0h4?i+d%jh0|#$oOLpn<*9kb@ct)3we#7yh8!#Vp0RYEpPKR$i768+@2!Kn6??QZ= z3z&6DaOv>f37D@X!3|X2MM&r&!1Qs60LP{+@g>bh3||bm^RXak;q(s2YEGB#hk)tR zaOuiXhxkLVFj&dO0UY7d;adloyOZDsD#yc!|24o|%_RZcr{OCE%(Y2y#P{!9ha6o^i$@-F5*;}Q=vi5Jh#mEuNpKn7B zfbe;rE=s$oap7=ES4uf#g~6(KZ+sBtaBuk*Y1WhJzV~bNGzSd##=GGY<(}n%c*S{_ z2keTg@hvyOTaIJ%FVC>Sh&dPbY3fhsV^HL!J{Uz=X}TY~s(Y9^H^3Y+sFeU4kKP8fT!~1#C@ydzLvP}G59#(d5ve{ zVOUb@Fz%8RmZNcB0PRPGeKGEZ`<;=Wki_ouk;Xxzu;vP$C;_&9KT zjna4+UJcI1bea0JjFXQRc9llsy|ckQWJGatx$nrM)g9&1eh|rzG|&!z;+JnIOV2$V>hz2JVRg00i!twQSsOl8K^pU>u>pSkopLAT)8RvnvoYW z6tf3Re6(bot(807TYkr^K#JT9{YF{(iQmehM49gdE?Q1&J~P~GHhIvHt(>Q6A`6D> zb~kndDZ(3nb?5=&(J859kUd)!0_oANY5jFbwRts|qe)pu@P&3}K>#T~eHs!48w&#n zY}|AYMWP+%(@4Nzsz`1}cPP?q8qFh5jrbaKVMo-!`|Z12fE}6?(c|cP;fLwcIb?~l}awXr5oXFz%3E=y|vsvgE6QN=wR|9T=G=0#ZQ~Q zAQSbf*{E=v>}b7_PfS#!w{e!(4Gwv<+UeL6#epxZ8ScS29WCPOfy1saGpva{^prYH zYhthRIjv0Paaj{#4Ac|Z>4|h_H2elK@IF+t7tHXH60zeqlv&p-asf;7-Vv7f8J-H@ zEccVf4`Yr)adDDZ|;9$*`o7waxPpS(Xc6Wj*w)$TqEIy~^jbE>|9xwanykG>Y&c^G`lA6%Y0`U8E52 zc-EHr9 z+75Y!?G|k?NO#cL_6KL)&bHq>NA?+gMqV4ti@(zL2ea*vnYXv?9kb>4Zn(VNq7xbx z#D>%QyjL81TK+)6Psg6TPO-D|VAOSbUfal7aE@2=cD56a3;JYtC0-x^p{VOqy!MKq zSe0F6w-<~vjn{~20pV|H-G7@;tapkdZ71EzEUK~{7CO<5b1T35xzcm{67f*Iu;U9& z3q;BL2(80ED?Y}<_^dzjNk;P-5bH<|ZG5lWM0)jdXcE5-y%9N{(Hust_{6nd9E92T zc|pUe^LW%XI&6yb_8f~v=k^_oU9$I*H$xvgj_7FX-(-^V6lWr`X6A-pSbutaLXbK( z^O3nk>Uubu+sE|`x$5X+bjQij*xZS~jG-q`q#%TDZ zMxIm_aVBVmGG}1{0@Gm&+BwS-Q1uAzaOg56k4GImYVi^%d3m=%#Kd_ljDwz@XufLq zyR>x4VMRp!TGu0AaZ$}ttKn!znZ%B@X<1Kbmxc4%GLNmKGew%m!`y6+a&J6@q{SJy z)j*VZU_cKkav~c}vvnO-nYXbc@72OHtXW=bRm zp1O1DOwR3znP*T!p!l%rf3Z1-#oYH1*j3DHSj1dd4}-r4(jj8*QR(OPE)6fByrSuF z_*hd=OzDl9!^IR=)NEl&uK$jiBXD}(MbUxqF|jMa%$fqr z#WgrD%-a#IdsiPVV>U{>T#CYs$Dh|26Zg%APgRZ7_?cCMa)zC=o97f_f6+V%$76nu zA{a6f%}Oo;vd{{|FwvD?;V>A2kHPLQ+9d;+}Y%+mxKixcj!4022BG- z^WSa6r(l)zK11wvKek&|&)qN&3xS{GgWY#+L{9sH-@wy|Wyt*vQi=JWaDc2WDQW&+ zyrT|EpTM<0C=p8I-dqYo>k{c+)(#r|Gj|C96t!=Q`?$`Tgug6Rp1^hRxu|! z*n^xEA0nx?HdYK*^;_u5i77-KO|JwsqZi~3UJMFnu5CcI2lFrn>4kLiUnvM*A z=;MDx2Gt0-hGXsBj{o*7V1$}g1S3hV4r($;EODg7cX8E=QlK5sk za{Ao~%nYSd2dcHTH`cAKS0Ra#CXQH7O`V+K)YQ`*sB-1T)Q9-@U7bjMmrjZYs;Ly? zM4pPd{~;$g4~~q*8prUz9vGFtykCc&2F$6tg52t)VoqnMk1G%|S#R(B)?J3KW5f81 z#;lG{`Ql)~q+==QJSic`ErA_6HT86c`nY%@ns52XpgG$JZQZjG#;FuLy&vXux@Tn6 zIspB(>Lu4CFpt(rQ1?ugf-{10GOZ*wE*C(cJie28yJOcwI}&)V*Rjarp?R&*W5=Oh zXlPExQX#p}2ucYVi_zdXa3x^I7T}K8)DZLtvVM|aFa+#P4Z(tg9D+DZejx_dN0URw zjzb7%Kn0UrJ7)qewRXI6>6k1S!qEceqwoX@j(Mq=&+3QS zCt*1H6U}>l-}ylTb5vtiN43d$KBpgMbujy5#IW_h)=H%XX{ksVi>j4=sK?dcwz_Uq ztu*L#%fc0F6IylJjFi?gOG02r6E~r6Z--OiBr(xu#n%-p7^YQoc$n zOZa@_vidc3Qpe5ER+Va5uDZoI8?9e+TkXn*n{TXx*(W>kg^Ll%eo=aN$#`wUO#Q=d zSzEhsF%KbA4;=>pRB!`*km`B^e7HqMxq8&-Ty4xr9v;R|8ONxzMEhxLsC#?APidkWk@r;Kc*&z=I8?zH7Kz`d(s*?tE) zZMhZUe+5k4V0hp-^rXXg8(^pzN0$!Y5`4Q4FdrwurNigI?0E+M=+fb1M?W7hcWSs# z%isNg`O!bYw+i@v1{m5oqT@0oUH+y6W}${lmp=-Kei<;=b2fzI^p+0aUjTDV!==MV z`egvgO+*CuY5Cg*n4f64boj_0|2bgZkV{!5Ka?(ix8PK86aMJZ;oFICTLCkJ^Bvr$ z)yERR+@j&q;X4K#8vt`FnQ3rbI?DVdO?M2ZBF}dK^A=|fI5z8n;2fwAALfzs*iqnE zed)^E0GL({mo9%dBL2M^hWO~x;rkolAb22MI(%2+>oC9+Xt+x^cQB$qw-gtN-##z=OdbUAp|uz_$_&BLVS9SKe;`?uY*bAG7t?XT;YDxZnR1 zd;tee;Xfn3VV9vD;Eyg{d9gM!MgpcL2`*iEZvf2dB)EU)w0SaGXha#B_}mk9{ctkPjPc7P8@j@+jmdiM^;I( zwRW<#wzM#}e)24(thl@qrh;C_Eme0c#aT*6g=rM|cSTMPZg56ROsgWh`?Td=Lg1rS z`h-hNe!`_ry|8V^>1O1lyRmbA?E+ee$wp!v8?uarcycsRBLF8Zx=bxe&T%V#BvC03 zBO)DxBY%N#e7Jmab5W$Z6t-^8XO#N$mOG(=H?>mK%tUG#Q>$RAOiV4coL2eF*;e!9 zzI_O`%1b-SD+zx+LCZ@WZI0j6T2m|4A;!7*z|N*_0pl+?rTmfFh#;3#5cG&!XXfn> zAE_UyDI>DP0<($=mbhbcXpME9DX9QWfg=rnoG&V>!tFS8nl@R?E_LjlK0_T>Srw)D z0%B!UOtxyPtlCPeb|x5q(x}))NHR+@hXT@vhcqh1-weYc$9-;QzKyeTH38 zielp2Z)p7Lc-&xDUsMg&V069H>t)-J zs*Lm7xi?|LUdc^R+04f~dyrT1x>VSg@UDFD7@VN#GK@@_^-JMbd}nBy@cL6P%tiTI zKWZ4JuFsi|bES5%r4npHH)_EKu?~i z*7H`W_#H4XXq912%jw%EJryo^&{C}m528T_emS z;f@amdJ=(IIMJ6$xtY{Z@DIU`>O9!+ais0IH4S+&<<}AXs=H(SJJ_h%hBeLU-ssLi zx67)EPV=h10?~>Y(TadwN1n)Y0g}AoCUE1I=SbC3XQbH&of?LBptItu(Oen5KQLIn z%YIJ%3RE?1m)%b|;pA1y_IVJGKEatY@d(H}UvM&7?gO*V)A(yq?q8k{RaUE_0GwM` z#wz#oL-T^@mLL$p&tngt9A4yE#!#dZgwZhEMrm%EAvIU3qMM}Z&2%xXz(JPZLFSQg zNHK@WX6KXp_`El)us8mqqf8FwhwcENUF0=5#9f{P{aR#WfFf6;@UpPcZ?ot;7TY4r z>Oh)4ePgFMLsucni*$oI9hhp61XFiWfJT@5c{PZj(ooYutIUJjQ+QR6-B-(K2re6! z70H{2R0n3uv&tahLNZO{38t_4GMrm1$55~jXaZuE6IT`@Vh+#rLF7u4v}@cCwed0} zl8xjf!K|`eoLz{ih>9AvDsn}Q7g8xKxyP!=k2HG{HC^@OJ5Y!X?Lw(h6eP;afPWBV zsl{K>YGj#_#81i*YTodjzCU)vgA%#at|xEac`vAo4`Kf$#;%x>{z5q z>_cqqed+P%4}@Rd_}aJ^cMj(5kR3WP>SGhGPqdzj`^eu>XIAIOeQV(x4G6FC9(nt$75Vi$AHJ|(lJ~fIz6Zc&YLR|&8EaMsYxL8wTJeT?Sk3V&PeGdF; zN|Z`IxKDGoeLx7Qpn7MmJh!;My+*9nqwUhi5d|Yjd68-ov#V@rl3i6bYCw)W?_W^c zQBur=I!a3MgofMo?QZ-sJ+HLkS0sG}c&buNfG;e=CgJ%7>BB?bP08O(U4laRsV+Vl zRy}c@H}A!RwpHs6%AB!wp%%K--<_HFf%wW&-b1+nR1{e#%UNoG!Ndh_6{IMrm+yow zwS2=_GCcVNe{O+-bM-M>py~ZW+O+eECqXtTDQ!sLy6WK?9^B~nZX7k0E z;(Sz0Gq(YwZD|!(9Z?MJOJ?Icxc-_DWlqxhW{AIV($1PCvk!Z%SK_9$q=@CE$uE_O zml_#?M}CPp8_H#K+sW3iz#lF<#q%QkWl2R*<+~p5wzFXj%D1GbWzAf-wgfP_|xvND0{-j}hX#$al zU265Iq%9Ue(xQ2(sL<5FTGJF2phibUF=84dtqKECIx1vui-%$8?WmAzKgdW#z0Por zr*TZwtjvSRkf-ntvpHL(gmD-`QNny$j`ctYp(lt+@w^FR_#I~B+pqvxVm4o>CP9FD z?-WzL&=Q9*q2=NUYPiH~{4=@{j-;+{H<2+_%9Zd1@TbbV6F$03eIzv*etnYes-FGi z2E3|?bAeae@lXfp`s6&cAXoH8P84^P`$;u@+Kp8QTbwojsC&zI5NyrwMQ+Qz%@^6j z_*5@T=RG&HTTH&E*K*y({K8i5pE2o#&`HaBmIr2NnM0`JPt66jria?1uDfv4@?9JB zcbPLzeL*5WpD2OYd#>=`720jhyQddc5j5gI3fPN)Fev6+Ot=%E;eHgka&KOYL)d8D z`^ugwR(i%v{CTA%Q{}VpUM<76VpI%)f8X%lx!uTz8-f_SWQ^v%2@9zPU zpj)KbZwOema5W54bS#1K&tfg(fI>k~OiY4V+)8viN2jy{YSnl_JolCkAks&cHG#4g~?u@myLnW7EypSZ+N3aUoEU!ASS01yipYp5G7T-!pg%!qnhW-JdxOItSB zBAm|$yGN2v%}!DDozPw>j#TtO{K7|VMN{B9=Q7OE8DZpQ^X*zF;II}7Kzv7AxZKn1 zezHkY(Eh;kLZ+_av`~328ep?3HRTCxh|5qcMcQ%jO~)T3Eb(N^^BND}smRSqS&{on zG%W=OgTs_D2nZOrn3RplCBSuiHrMT0p%Xsg0$%`b)l zT5DE;C@HndiXtV&8DdgFq`K6wrsRt1B5PJY5)!UWIHC7hQ-ZMyv+DwB3Zh|T#RGGEP3~UPIVpInVMsZ7V01k2P)h6hg>)z7De9|nd7dUd| zjonj%SOF^2>d_-VRPFEw!YMy{Td=- z-*a&vSFQ8p*KfebsaH)0WOCA%X^fM5I_{w59vP+=Fzc;b3dz-B;O`8^eW|UlHVlGr zP%W0C|HDnPm|;ezX6!pIUhXIkAfB&&S!7ifTa~5Oy&C{v z-MbObydAae_%Uwe11>`s)TcCBwKf9IPs~-4-`7^L8v~=K!u2v=_s- z7=K>;sr3SXZF#X}@bj9=V$@q@>#G>c>w}Xym@nWUQi>}p@q;VGSuB{X;wHsOwgAUE zG^65nQSO@^`Ar|E9Z$HU9&>Ecx2f6I)FAI82jiz4`>Wzv;@~BR!XH}AIrSbk*-j%o zv7lj4_`0I{)2-$LtGUQ}W&^ThJwtkk>k2GfYd*0Ed?F|;xHnF~&XTQNTp_;1t)WK% zD} zCM<^Uh7mQ3A->a`TR#-AMHmnR-A+7<@D>2V$%VI>93|abmZ3eUX(-YhL~ee81`}z{ zhHna*6Y}K~6P+Ops(Lk#i3b9p=t@!VJ@}aiHb4%pk9R$d5l&u4J(IiC0t|&g_hzmR zID%tPpBY`}j7~A5^S;>=dI4d<&TG7;)%taNKHfM#}0I~v*XN%$3* zOzOI}ho5>H@0Vj3$OwP}T!1~(9sP-kj3SdLQFiD}WU?28DnLju)D^<69B-Af5U#JH zbpFtrSWM$L3Z0eGU}enAB&x2Vk%MN8lD?1)?!rbKVN9{NVc(%jCV(Lhd;SpCR3L1GaWn|h=3KMB9sb=}ceg|n-Y6rR)5 zxK&aZsfS;3N2hRa2D9Kapz?aCGdlCWUNjo^&0uIBvdG)g3t)!?nGSV!4?!x~a@8Ak z`IzmPc@B!yH3ZZvjurPt4pIN5>sqooikVt(!%K(WL!$*5d>F+-=s;}0)7={%Mgvx> zGOQd)(Rsmn;ymGh1{H%j{^_XqZqgsg%gI930V_ashF*z!@52X4?pI0f$+*ECRqfvV zUy9_}!02b2p0~Xxgc<-PS>Hey#A`PE#V{noXPk8+>HiH^JO0n4n{KxYHe#`+u|)g!n_K-Ke=W zv{%lqUWbM8(Ztz7!;wSW)5R;t#ikxa2H4`o>B9RoXwNkhMieQxUkUmbxHta?XrG{Y zfugy*_&tR5Q6N9s51$UQ>M-!cN+rEPwttV_*`JNxg2k6@9@z}P-ZWp*Q;i}VH?rj@ zQh+87N-H`CF@~^xBv@i6RHQn$^izGN=5U%_*^7608fEja~wPHZ@0)4{wMJv zH|lK#kqpP1AYBhfg3`v>(P~#H1~0Rc8)>K316KZ8=OK#SQX{%!pSb;~wXPSXs1!wm ztpag-ueHt;U$E9ekH=Pc*bfY{Q6c4G44t`6KHORzilG_ghV}}tFHytD%w!6Gu2U1u z=7&G#Wf!@}Vh~>Mykv54City=*3{ev7t3RTNm}mhEH>THhpAYpcXMwLml%iMC5{V|1Up^)4od z*;!1;71!pAS1##9lJ1Qk5`JnCzMxD6LYmeSEyNZ#h4WkJ9jM1 z-M$`V4Y7&ix_p)u2>E$_{os!B0J=5|4uJ(3!CGoM-gq|SHNK5eTKTd}+xPuJw(mJ7 z4oM~4zPJys1`n#aShdX*t%M)zMrrxUhibr#+FTr-;B5+Xndbs0>k4&y#s$^0#cfV8 z*C&eZiWYrG%yn5s5v<-xgu=OsKkkpjC-+;W5>N+#*Mrm0C$ONjajrz)dW_OU)(L%)84JZ zCstz$#-e)PiG3&Y_7qO>aZ$#x553jL?QGLfd$Ss7FKozlw>}QEDBm>BHXiqu2k}a# zUr`JC`$@AASBpTf-Ztqs%^CIng833Y7$>x#fZ!8zObq4LTqqWRx#5guSm(s%IK>=S z4CBCDGd9Pi)q`OEZVw15CBMUOG@TnYM@P-OgfnJ7V7VTM`Ltfp8;$RSG9EMlucEEY z*XE^IN{i!{H+U~^@SzK0n_3nG3G!Zna*Ml_@_{S@nv#3V9_DXXs9mmuqUHsiA8+GE zkoL)}GGNV6{Poy@=;Q~E zMoaI5Ci5d=naf%#_k>iA$`;E^YiX~z+*;ZbIp~QT^1#?)!+sQ%vtu^uD!=vB#xtYl zeW4R5qwp74KF)maVb&U`q{~@SO($_&7o@W%qs*64<~{TV3Kwp3x4xWQ;-BLsbj0zI z<0Ix7Rh^w!B*^li$x^R@M|ddV7vtp%etP+WpH@DU3)$r0>PcTd)*=MnuTxdCd1b${ zp;+SO(2E&Uyg*cdt>Tqvj1^{r^*75Y=KH{{jCvo0WmC&5dt3!sm1Qm~1GoHy%6tnP znD@A056GTF<~_PRdfjljD_swNd{>H{sJKV=mzhD_8n#rFZZ)G-eXXxHIneP!ZE9PB zr9%7Vh^B@Yc;rD2f9>wbk@DXa##dq!i-=CU|2tv)&2|#;-((?HPzvIx@<LahF56@X_zQ}~K_h)r`IH7Q4!WYJf$ zAX0^D(}~qD0VH$rLMQKMw(~Plp+$Y#sn6CS{7FrV4J$RRbb|JEGA>RU<}}=xNQV>gfdS*>W)#8d-O}wmgyg0}8331nv34GZW=brK$_T zscEGXz2~7Mc`2FUZyiab^(&3{G*Ff84Ccvo2!B*b5A+N9OFV@6q06+ZDPBA0^$WSY zU&zFMA>=o92sPxVnu5B zOHAm!+By7|j&(M2sJ!H(*-m+%kB8VWUHwAH$WYFP`6MMInW~%xQmJ~jZ0pG-C1co; zaihk0);d3?7dy|VD^h}a%(Rj*pW6@fIsGu7Ct-L}%MAY9we0l-<{XXryndMd{V<=` z5A*pFhRc4|&d|C;O_Q9sOtPsMyuKg^d% z7%rpezV_i&n0D+u|A!8}q#x!WU{f()(hu`U2}7Y6;%oSI)SbZmw8lKLALdK@VIC6wQ^?6xJ+Ty=axRM|X;CIr+*vtWL?2 z)`m&RldU0h%i^`QYnLuu1BDfx%{6svmo09ntF4l{FSzoYKCLv8qUnEc-4_2O z6={efez|z)3OVD?4ji`Oi%O${bl9n|0pS1w#}+uCJob>?g&P`cqY z?K;QF2K4Np)wMURSasvV75c(19dR*kpVB3l$!h;8XyderBT+=P3#7lN7&uJMLn_vI z5pHZ)vV^KYwX0D@>reuHqx;gj6{{JpbFpIeB0?-)wg`p*lfss)S#@*m;)V4zS2&;! zP&}bq*Q}~fw1IfAY+$Pz`k5CT*a9Ic57t?4Ubv3+xe)c7VyAE*(}mjNq0aK!+g8>u zMN?V}tBGhfYZ8S?d{LFvFM`bIvXx9ybq!p5vv}35wKws$v3}627u_ri)$aq0E<#_b zU+@ahokU2%O&g1&#|^0clpjcOw)Rtg?zpk)1GS%q%e%?!Vd2NmJ&9|$gK zy}-C!>wWtaxO7?qKLy-#8kVE&Kw4Lv8&AD^Egil;0oOnN3BFzU-iN;zxTJwQ1Ah|V z0Cb6PGn3>bT?Wt=5rF%ahD}$FZvxK`0do!703E9^T{)%$W}$|&@%^i|`le#d)_L}f z2Lq>(t=GE$DemIL$s>=tH=c>Y7M9?S zYZpA^@l9}wq2R8;5<(}<9`KG|Uatfz@dv;ygx8DTKnLw^;P4wd3BLV~w{UX!R(&vA zUAu%Etd$Tc?ymN^p8$s&cUJ?Iy106Q3pZB#_LrFdQY4Rxh6F-K(m{0IM##7b7DQiJ$BeXM=xasUm=D8EF8C1n$ z!qUi&s`_CO2!LiusRf&x%+5;3`k>?DmtqM;C{8iB!b_Km;$mJ`fM4@K#cEYYk&Y@9 zJs&~}s6$j3&iexhNL1Xpq|>>ImbsuuuDo%aM@y3*c1=gX1qYcL*rfAt4bwzF`HYYo zb$kS|iXmc}&;8gmPqzbl1`t=lsi+<1WtbFULUo)D?w)^tOAcBkPF-Yk%VDyozh&hj z42eg^Q*=8U$z`L4N&#O=RxRF7Z@3_`9&%2@z`3Tav&i#B?bhsUn~z=8E-E15fe`nW zZ6HnLcE3^Y6swT0gWZ|pplTAxz5lKMDPZ~)uo>yt6>dZ0E^4lB-S6J=ZB;y9wDdt& zw;R+XGcsEXABO+Y+ytSg(Cdyj!kx`)z`A8i5=IryE)`)8D~gz)$o}BEXX`C4oQHY0bKkrQr^B_H=#*|H6XMFr(XvPo<Bo$f$50 zdWhl38Ow|up;7o9vR`#nPlh}+>$3;(@o2-xy_Gp0GauL9lK9Uw(I0-5oL+Sz#^McCx+b^~}=Xr~Tnc0fG{ zN=UGtdMPkf$)0$os6bC_3mwk5)lBNLrv`8=Q-kjp;8TO|V)(FI#!27B=-1o?W*JTJ zsj!#gJ`=OOihCM-D(?Jv*phhI{qU){e~kOaU<;|jqH*6N@LeL)eKsC;Ar>_XZXA3U z%df@pFucNDRm>-sK%5FPw21UY@TzqXrBOm{F#~ob2r@CbJ6{-^~3NGFU!&mb4P8??9MLJZQbUf|=`zmR{$}fql9A5H2 zx>YSO2~LI>9bwR@;KecYsl(*|_sKm@Pe$0n-EIZvZ^2vv!MpEr?C7+;b>Qx|nbu7XtJb%z38cz~^ToMmQ z4?AB&`_Tte3esZVAhydg@3<-f{WpZr@wh{!b()Px;ebn}m^yH{2r=xfF>RY9 zv03z83!@gr?f-MvBHY5-(Qb>j&P(Ldw8h0wM#7^;MFfDGXOYGk5a9BW* z%z=an70F<$U(>L1(J5heUT}#-N@fyZH{MoX2QxF84`3&;WJSZ;rP728cmy`f44j8r z&Az#sW>1nh0&y!T>G%ZW#^xpX1m_vAzg=3g1nqUctg3j`s08(n_~qW z8{|OyaON+hVF*Vz&|TVuyLuqFq(;rS>^^ybE77p&@;4tJrU2#vZWtfe|`+hdw)N;f$s!=upeB1d<6O4XM}s?Gs6APXM~eC)27gG;Qa0U zjQI9`1~}61)qZgO>Bke4H$DR#+walO07sCI27*hPJ^>=tQ%?e}K=Y~M{bPXkJQ*s-%p z@hS$#Rcv~TCBA&~9etHR#id7!KN3Na-h zI)}{)*86eAB*Zpn1+l;OKs3<%JFvhMWHJb$4*LUzq=`u4qR5M5fif%&GXKVHHnUmw2-myUyx3DKsaJB%X~wE@GAT zUzTw>eAO~67tbo`D zEaPE3v6hC93(x}T>%?=6^!)+P(b9Ju&#R?x2znE@Mp*`zZmJnw2A^t1G^NOVXBpGr zyHxr{E+H%1)sBaBBbNk>-k<#K)hRay#v|aJKa4$>zr}fZR}}O8tK%#A9%${(;QNki z4pi&C!Yc^By==+CWh?3y2kKV^R;{jE8Q}UOu(;vo)qy1lH*PgXuB{!p_^O+Y$Tf%! zZR1=r4#+jY4&7IU7avveebQ2X(yQhWL?BYfv5|}8ELnQHU#c;bD4l%3eF=a6?iMjV zv@MdT@c6&mBHn8!5&unIwK)))xNooSre~jwgUL-E-w1=PUDBMw`OcB?eLT4^dtlvr zXh5iP>D0)?Euy_KAPtqXL-Or_I80@~kQ?G5Or4G`Tsh)NmbhRpQa2c8zs(GnXpRhS z_K0oZ8!p)cA^VrK-5M-ovAlGtH(cJK0?`VHGdUL9NP?=VH(UxGi!iEO-_jvy_NSDK z({O6J`fp;{zZ@A{VRBWOea8P{*uaZ)Kh(d8t>$w&gg>cyRvSyZq+Vn0MRxuSv6S3CmScFN9#Wg}A*29;M#n5e+Ypae$nABM8orzdIO@GJeYRB5H zV-Y4b)|n}>Eci$6>^Ru3>0rVrZ=DU;4-aSX z1XVYEFZ8k<2UC!aMHtX0X%tm*Vq^dlC?}yfF`shfW}G9F$RXq+RyWi` zy5!b{w}CUFIXjD1tXf-Vj2~ZHQe2yxS5-Bwq+~)>W%2l6N%@lTW5)+4OenUKTa=e8 zxkL7Q3KxjnA{)zf6Ry2(+LWnP8q1gzEVv~!ckJl=#fwKT8MUx*2{=18TWQq7ys>q0 zevTau7SBRnn3AuPv%~Y2EDI8_zCNC5bA*mVY|o^rxjODoHk{`b(PbK)rx8SnEF-Y z$8gOwehe2)cw*HwehimQHa!$x!q|95O`TSL?SzujiN&|30Ik)DYYLAmFRQA!wq)W2 ZN#V7%tgXf4^KZ7}*v+q2)wwbB{{!QzRiyv` diff --git a/cs/sdk/libraries/vorbis_static_d.lib b/cs/sdk/libraries/vorbis_static_d.lib deleted file mode 100644 index 7dab59dd1615f93d075ab00adb13b57a2b34b89f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 513356 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

  • mEM(3`+dY0CPVxGLr| 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 BMC-j%%px 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 diff --git a/cs/sdk/libraries/vorbisenc_static.lib b/cs/sdk/libraries/vorbisenc_static.lib deleted file mode 100644 index 8e919f68f56a01bfec583f2e94d4cdd2bf81493f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1392776 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%0ADiG{yGdP1jDP-Nrq=38;;iRx6HTRDll9=Y*@Z^ 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 ZGVkl1i~s1b{nd<@jw5dQymoNn{~w8|PZ0nB diff --git a/cs/sdk/libraries/vorbisenc_static_d.lib b/cs/sdk/libraries/vorbisenc_static_d.lib deleted file mode 100644 index 56bb2e42a338a9986c5dfa63aa1178254d5a7a88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1859560 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

    IMF}THs)YBi9N{mzZo-sFc|+aPa@9lq!bf`> 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%0D;(GBo_%$BwDig5eWFmss z^oL_<65=9~ajDY)%>Fb0M|PwjQksgKu4!minFgQ9>FDa1fpd2=zy@ccs6`gaS7+fl zWy9`BHkNzkpzlde9=X`PHy87|=Ap@gJXki!hk8~%Hl5E$Z>s`48CigNcM4EyU5H(S z3lVU<5OF$E)D4m%Xo?j5&+}_T85~??FfEXQmdh~uvJ5u02HeHUL zTjdD4B*)V?a*V0Z`(--?q9qD!@2!9=N`Wnz3Jfb!;L}(IjAkpKx19IOjS8&ar9i=9 z1p-d-K6_Dt;n(?h`mO@U9`d+Pc;A1az}naR|91+E`JljnPYS%}ecXokaa%s7Df50l zgHt2kzvDU0=X8wIeNJyVedSceN&NPUBxvT@d>g7^*Z9aDyN?f<{e*Wj>@#y7+dtoG z=#c&?*umgSsYAr2RSs<@oOe)ZrX)G-+f3plvy?QM{__ccDZ} zsa!JL|ENT3_DxC7&9{=hBWeo+4YY;JmMw)9+f0S4yKMw#M;BqQy{}-sGD66lmMR1( zD})Zx`OoJ|MiyI4Rs7bXk~j?5 zx^|7Vy>gp)o6lS?ZHiw>4d_-Il688qvj9?WyleGm^dSKvv%^DWkqMb!cl#L4pH4 z>c{BRKu1zp?o2sXTuHBCPrBcu7abbrO≧(L9|#q=@QE*ceLZH6y7@Vhp)g#FM6F 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 DesBeN

    =Fe9)m0b9&UqVT{Cy*u7gM1YA1WMX}pY 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 z zgrW`Sxo0|dyV@8-9Nr7Q8{jjSB{prYV6-^eOvTD^cdwt^8tVTyuX%S*uwN)+>&CfY z{p9(_FUwL4aGd+>Zyu~A)}Cw1HR1YIw;1kc@~|8N!}ytpu`!qfI+sU@VGg}>&79`O zvIIk{(#61rfv5ZbH?zk%Z#JPT{ zB{)lLF6;kq?!AXRJJrlVdsl)JL>n~o39oau*lFuLxNcfpZCxAaFd_I0qOTpCy>Tv46A0=ZqzHGB7+3jAJa~$)jsUTe;uI zCtx4^Y|;5@@!L52`j}^nZ@b#PLLBR3KK85esj?3P_5YjO^E~gTq4_;pOMZU9dGNUY ze=}zV`?=jW?vp$=_r2#!yWjP}PL7uP@O$I6RTGE2#^UsR#>U}iBYZqR9EU!(JC5`E z5DPJXb&g{UwDwaz+WT|W>|crxW-$}n$!l}_UGr;cFI26W{h6leSz-v=e8%!)_ih~xo&^fxj)yl zjrH80>rd)ElpI+Xg?{gTl|f;#Fu{qh-6>lo9l!3;X9wXGYlVpFbwa9d?)0Mke}Y(d{5Aqj-wv( z#?{StQN17f+(zW0I$0K5A`t)#9PWLhp)`?Z+_BgPSpPtn<_} zruFmS;VVwobC}pp*<>v1Q}#>x#L0TjZ_YONxAh)&w(0fLmTlU4?$34YY*W*o>)K^K z)lXmU&-IM4v@V`F`PsImSlLb-+Qd<3yIt!oZhl^hrBAEPmG-4rJv;ryKQC^^5lck_IQ-@JKOFwT?|(S_=%0N!{Of=G;qcAR zemLCtw|9qIe|{(ATGX#c+bhxcO4z&-wy%WGE8+VJ=h}Hbzwx=$;^$1x%@@}n-Ztmt z@WTIoe|X^^ewA}}tZ*K4jxm>#!#p#`B;$4?zQ$C$PLSv!9Gvw(xIVt!(04C~}fT^#d5w|L^B z_3vrzS}gOXpFW;@{<+N@&{@C`&vDM-IX^9?`HI7{yyRSRoql8vOUy7GhNFA&j{3tp z!_n`B{>?k_-S#10xibtu`C#)i$h)_P;qLL~XO2IKpErKxTG(6*+iT$y`VT|jyG9=1 z5}S3!I_F&GtmS>d`+&kbgLi`GFMGo^NAA8qqWa+H&iMQfTY$B?@k{rIcmC)E?6Jc4 zhw~lf{9QZ$-=6Oh=kGH4{&Id6&i9J*vt7Q^oS1yaIAh>@&dK9S2;+G%1n&Q82xI$e zA>{klLm21Z2w@C=GlVh!tq}IomqHl--wt7{Uk)MPuY@rEzY_v4e>a5j{k;&z_V+_5 zFKyHVzVJc7$O87hLVk}zB21L}{Sk-Q8?4HyYo3f*PQ}IET;vDrw?cL;oIS)Pr#z32 z1&uHUILDUQ*dyemFLnB~MPtuc$P>Xvq0f2D>jVsK$%$up%eKxBcIH7HOyfH@tu1z7 zV%y@9D}CmeZ8NTza6^vRlLx+ejW~Y#GEdaS)*ijjJg(n`TVLw%giv~Q=Y`xT#?STE z#&KYi>pV{t;$v?tcta?*_iVJ+X5%saCpdX5+1I$n!j96jiRMq$?~h+A<&5 z<~HiAYbB}=ifcH>fYXfUvu)tFZSEWK9t4PrarHslhMjfyRBi(gq0sNXM(5)G1=~2{ zVrLyJa45OW7~&XbW4ZaW*OvPaS$F@!wRwW?I-o7jM{7qPl6~WGU2JpC+xakt{y5pD zFKtU=I2YLFxfExvjk(G~T#N0-05jv6e{So=6-O;Ty4RNb4_WtYYv;1ZeQsl%lqK^q zH|O#Lo-yQcX$;pBe((qX6tUYj?D8B@mv?k7wzqSxoiQ?=`R6w5bDUm`+;&lQ=UT2D z2hX;VC&jir4#(?wHkO+|9Un39#TL6ZhIY|486(?aOEDMlsT0F9G^(fO+_*Vs+r-KF z;ZG6IF_;JKlpbEMO}}0Y+QeIf)*rJBv~w?t&!rT8zCf8;7h`<7=hWa3o49DC^=;=(U-CsL`Z6A59}N7! z8N-nGHaH3hx-ZUqwj3kZ z$85wyKMB7-BEQ?(_X1S!g?ZK)*+m6Z(|R0w}UV4c8rn2o}nFE&kZoz@yfmD1u)hn7a#ojw+!a57R!Ho;J*jS zT3dDY!SB=f`y=u`aBaJedRiNG&&D=w)V8;py`+u0wei_~mwoJOb+&E$+UG}MYm7Fw z&-Q0+U#qi?_14DcC-ojme#|%dvkp0fc>l5Ac{g!J@Lpg)avxr?hi`ozh4iQkk>#t>82aUVi*4uC`EGt* ztnxqqdMOSs4~KqEE&cH43y+G6I97+@zx{tcJn!$?2#i{s3^yi0t4MD@Y{WyB}{Kjn9R?dD_uy&Hc1Lo*Jv?@;d--Z$F$WbFQ2 z&d+-Kh~b?CU+SJ|{)_^Rh=cB7f!F3ShQ%C?VVIv-V31pzk9jeVb6E0{^U*(R@-j}F zhxxQvU}g+|4n$tNV)byqBQNj}^H7@)+VP?B15a&T9I>1?v{)G@kB_^U<3o$(&&6mX zFLBH%kIOu46HhEOZN$ajyuigL=OdOFK8uxkGZ)8} zm%L>RbHm1;4dSn~xrm_#OAK-86N~)7P>a{g5r5A_vBbwu-&}8TjGg_(AWuYpG~Bhg zj!oTS7nF6;jM_YgY2qYqhM zue18S8xPJ`&RY0o4tKrl@%IUj^Y?C$Gv^9t4`-5Rj=v|ue>Z_0W8~bkwqlYqb=t`jTYSicHtn(F=OT!C zk^?^2gKd0lxQ~O2jl6m0i-|qB#?Bm>2e{@-c!F%VBoG`QqROmgRQ2)2ma zh(asvmUT^n?sH|!8_#HU{yuoQ4?*G6sLXapbZ!PSOmvB=9Dv#mDtF$V}- zAoz$)9qwNb*`?&qb@*j|$8h9~ag3EEHeZ20B#7IsftS<0cG zN5}YC!tojbmfW$I+<&--bHACohaW2ECkGPb|d?=r?Xbk2oW3={*!Krv7Z6a$Zgfm_@c*LTKYxb<@HJ50^Wdl+}JuWv7l zoBQKSEAEfp4Yki2ANs+-mHQCB-nF=sdcUNfXZxbsEnpy1Wr@v_JKqu;az>`g5}Whg z4^M6l!@wfv;ykH)JUIty z^UFEdr=GJR&YTTcJsaE1mES|%{;q2Ar)=~S&*wZY>t}6FZaoR}O@53~u9!#0!CK>Y zm$M%Do>k_W?_*_6@m=PuC%%uB!uPXMXmkDK^#Ha!s#`vY)&8z@*Fx)~FIvvg`(R}M z^I{lZ9VtC1b7L_Nebo;DqB6#VzG{7$Hzb!sU}XN=ImjH6hdH!)n3GuMu67J+arDc2 z4ntqoFY^Dh_ja+C9oc=~ZpHxw!HGFDiapVItR732#+<~WlROykL*H(;0s_ecX%L7I z8_{(l2yz|_HXjJs25s;**$QHSfd{e!Xo9AE z84FVEC^2JO@hGEcvVP~BU(f#*Ywxqq?c2@%r~(&P)vC4r>!WJduKUsV^x8#W%*Ec; zVJQw{!=|le;;hBcMs6+OhhQw(&(+ji(x-iW!#Pi&HBEcDIA<|FIGLue7rkEea?$cx zTRKOjTlDp!4~{t3z$It)1<&rjcQ0#2OvK@NSlv6H&Ca>`ne9t>b52gv7fyK>gFDxD z>YFnc9nV+JSYq;w&AxNUh$;8AeRQyGb;o})fz?@ceBPScBv-)ChVtt%MB%bIiE;)~d6#DN?g zh?pVtTf)}3;jOM`x%|AkJ-=eMF&v_cE&7R-{ft-KoX>vhro7irUHd&fWX>mdpS3or zW53mLy!PC|7rC!FUrKG$d^XreU)ssG`}u{_efN9z5WeuqekES^A#s35USQ#a#`DM+ zUH5lyznZtTGbep9R!6R`wbUl@)s?q41v`t|>RPw++E5Fq#WjBM<@oXaq>a3119mob zZr_evGm8qrUU$$M@|aHri)Q^ufnh&yP07qOIfa*xbH3O>Y#vRP<~S zcYw>#5%2VpU9GvIH;Qgw1&12B=XeG#714MO-0SQ+a>SoapXj}|6K-w4aym^f9Ai7z zut67pG<1x z9JzXfKb*D5bscNCyoR1>4?Aa_ANCwZ{9_Hr9vFLI?18g;U^@BQJJa;u+eO!^|IC{E zBX`>~KW}{XQ}0i&e(M<9xyBukyCU~;?72sv&z+FFCGQySldKPodpTotA@9uCL)by+ zqwCii`q3A<`10O@jbCHP*V?#u@WuB6jYWK8@?Ipqv9>hc@P8PS`l7AIGVyzOgZf z9ya)K4A%~hzBc$uf9Xfv){i#KyB=`A*P8mRA9b*W)P+NQE!x^B(}wxfW!%~rqjRl| zU-PP$T$_vuePf@dH|yDXrReiTPZhm;v#JhVt$xu{*J`flm7+JVStr(nJ=%NT*pKd4 z{MwA=i4wfF6JCPf_{QlpefgN@WU09qSRZ__zQjOG*y4+L@PiNX1fN`K)P=^}+;iDJ z6YklTySL!lz*CPnmuLtSRJ^m`cCDPO`sr-w0TkG$uqV~@y0%D^S#7*%~{NOO&`JzUGzS-8*?tB!yM-z94yXo&TsrM4+jHI ztLrdm*MNEJo;j#P?Wu!tgON2Qeu#XqXC6#*ux8*eryOoy9qJ}N96WXKX-sfQee0K4 z))rj!(Up)v?g{q~GBD7`{ycTx+*x+E#qQLX8qPKAOCED=jn16y!!9Rx_P|nom~(yS z@^zn}_qeq+`^Oqm>$#@R<5aT*HTb4~+On1x5u%1x5u%1sP#WEA3~~;DgV^gZR6AU)_Ch`d07B)B3cd zV?G0Ct}%x$_B20F2=31%Y9l0CXyoVt>^SSBM)2G}Yy&I~Z92@4r;4aC1 z2tVHExRZLnM9+InbwAX=0B@hpzB{9LGJHczZH(Q&7w(YuWBi9yg?cp@y2j^}uT3d6_zuY*C!OyNG4x6@eZRLkx zv^K5nnmFzTLtDB2<*k3}!QSb$wHVm1#n8Xp^*9uRd=9}de|c+b9hTy-Mi+t6^Pe&B z979VjG3d9oT$777a&6>m;xI-rZ4I{KZa*H4O$+S-=+<{ig-j{5jn z?pwVVPp9d{#qYE7zVW^1J(&9!=RFwIiAEgA(N&+gU9;raVh6VGv()unB0ofzIMP@4 z#gn5er5=5CNuXJmrthYxae}x*{{_~c2sjkFCXEH zIt{rG;;M&7dlKO4I0!No<7zVTG|PE%h$ zX`_DY#~8J3ZJfX3q&mK{53$kS*!2TGG4=dtW9+SsaZJAg=pgV4QOn~xQSv9#~B^n)+YfsZ#f zZ64T}hjyPRnRxnf>>kzzKb&*eFo&M|e#r)VY$SE%JwNzTUw^C#x^Ut!2e~%iQ*+e9 zc<1oJKnHz^?Lqtxn%xTHqIqbDd?))6b zjybuui8p84$}butV=ykbe)Z?L<=V>=16fjQ>$qnt4m!-MJIB>;vDWw(Q(L*1$<>|X z6>7CdgPgyf@tnQ9Yq)1XoX?)SJky+2)CL>QXNWO+oXzx82Q1#X)Y$VHUHaf5 z$0s_h3mD9K&Vz*<9pX{PGgD0DU2W5sxrv1xGIZ5vEEctSzUYvq zKXKspiJchH;T;H1-}v|nIrQM`sgs1y7(c-#Gy|5N-T8o#k^cSWcZMnCw@2> z%&UVOEPXS^PF=Y3#O3}XPGeB#JaymPSqckV8l1fd%{6L9{Ny{=tSfqtTeCh(xiiOJ zfacm7ojKcwT|R2~u&>~Ve^g*pU{qjKU{qjKAS=M#n!DY&A7)h!>#w;RbGPPeBfg%R zYwDo)xHZ0h+xIny^?}bdbsonW&ededM+HU&Mg>L%Mg>L%?tcX?`i}iL-fh<25B+(? z+$wv=d>m_d$k!=L^%-~Ux!pD7qXMG>qXMG>qXMG>qXMG>qXMG>qXMG>qXMG>qXMG> zqXMG>qXMG>qXMG>qXMG>qXMG>qXMG>qXMG>qXMG>qXMG>qXMG>qXMG>qXMG>qXMG> zqXMG>qXMG>qXMG>qXMG>qXMG>qXMG>qXMG>qXMG>qXMG>qXMG>qXMG>qXMG>qXMG> zqXMG>qXMG>qXMG>cUghA%Kl3G*)(ACnRpO?5ACbF4?5lIJ$cIKDEm1!HT|K+9J<)k z_#1)97}MwP-SN327u~>?@Bv+P6W`C>xfec+9q!-syXZXbhmVVndEku-j0%hjj0%hj zj0$`d6*%F(xVbY<)5#U?b9r~+9B&rEchla zxN&4GCBCyK+#ANnoXt7;l8$RZt=oEQzoaAfl8$roo-bwM`I)8Wl>Eaw$0rZMdJ`i# zQa55`4ati&B_H+!&m?Qjv&)|1Gg;YB?dP&1bN{#>+V!xW*25b1YS-FoBiB~`QDf*| zUgfyc*5;zEpOJe9pgL{ssDrsDPYlmfaas)QdN@lM)?c2!>9@AT(8ggr_X@)p;QIId zqwnNv<5BVE-eRGZXC3eIB2JxcLd5bS%rx6Eo zeW4GbpX526d9=Ff$j_^re(8%RPu%n9iqrBQZmZ)sb(PKW)U|(zuKTRD5i5DC<9M20 zKAEQDqRU17JALUK;ftE?yW8W_<}<-Q`qECg-On$a?z`W!hwz0@_ABwS7l{Kr{D8H6 zR<_R$V|3l$V9f0U>@%m-wKj6=Y(1@m@iA6c-rAJPtWK-zIdP~>)`GJ{T)45rT^Bii ze8;6t+NmqY#+KNL@3{zvvZW1v#MOp)S{q~3Hf_*#KK=O4KEy_Q@QuelV=(d6YpIV7 zdieg1&F!1h^hVK3Mb8#-2jJPed{q6SXRp>=(Hlj#uYy5++;cnwmx^dS2kv$D9e(g{ zvmWTZwi9k`zj8WFFC1e#*RVkse>8NF`95IpLp(RqMabGSsF!cK+%)|W*Y3xSyV~sk zei1QaPhH84`r(UOgGVjNpZe3ND`Rxgb3g6lV&iY0uJhUuo3g=2E!OOT>4TrYHNE=9 zThsB?Thrz5zBQeE?VV|Q@9m;%)qkdB*K6*2>0B?}>-Xe*`D-t{KfU^`#q;HEo=aeO;6W%s6OD-5G?eGlfGPi zWNBj`xpC2l=3+}5V{TR^u!IF79?lCd(Z{5+=xBAweF?!6?Cm-WC z2QZySS3LBLJ62q>b^Qs~tG{WIfXceQnWkjff9jW59;~dFsBo zv+Qh(ZSEN6!MN9$Cw^$ItL%Mg>L%Mg=aa0&DJv-ussBEo*cxD&_|bXU)Bi+ChAMG}oM8(wVb; z*yU?#$R49MOZ)I~uHnPJ2S)s(0;2+>0;2+>0*_J!{Qlw6_XgM8pV#O-N_ERz*4z)* z-2JTKxMOE^ztdk+Lv`SzjS7qkj0%hjj0%hjj0%hjj0%hjj0%hjj0%hjj0%hjj0%hj zj0%hjj0%hjj0%hjj0%hjj0%hjj0%hjj0%hjj0%hjj0%hjj0%hjj0%hjj0%hjj0%hj zj0%hjj0%hjj0%hjj0%hjj0%hjj0%hjj0%hjj0%hjj0%hjj0%hjj0%hjj0%hjj0%hj zj0%hjj0%hjj0#*}1>P#GEA3~~fX`>*LHtd*ukJp0cB}W~X?+^fF`t1m*O)^Wdzzmo z#MsXa;0;2+>0*`G4PPi{_ z?u^rPa)tX`-W|Dn+4#HA5VD`zT^6^xPoHvs^ln(wA8Obzk3FW`Rj}o*LgP;A{SrOo z&Q?_jJUT_jJVkFwXJGgRtJjN3EzaF|ual!(JmF_5+{2%D&_CSJ_ibpUaLO zG`IGyi}mQ$&ND!a)~2<+R~YU)`Mx+@f9eHgy9f;Z%X@V&26!(HZRI@->M2eSLmRpE zm$$Y(3~RF%gS`j!ni%rAIPMq5oPX=E6o>g;1cvJ%Z~d={LtFXXU}!7XKj#UwrfDnh zV>}w4%f5YQZ_iw6!(y-se>== z=XmSO7}RH+I?n4)K25Km6dkp-E%VKLi+30GIeTw<@pPJAT>L&O?=0+y0St2DUCB9% zFX}`i4&>;nj}7`sp3msF??d&}ksqonj$E9UgDa^kU!&XVI2IE=hu70p)^ci$EOG6( zx{jSs?w(dho;voOYxy+2d@@bPMVE{Ecly#f!WX%-#_XHim+lX+@n>_-vyZ;C6K?HZ zINf)@XRqN4pWuUyU*Z4{KVad5#yQJ)?S8d(=Aqi^((*`}p-?6!UbDG{Lda3ByBJKb@dzX)@U-azNnk#yv==N3oQX}`= zzGn|#Hhe=oFR$%{mp1$>r_=PpG0)0e!v@zd?6ml+V11%n&UoQ=Z%Nhlnp*=v1SiUAN>5S>D4dZ znvSpDnl69$t?A@z?@ZHsZx>yw{xc=JUUSz==X&X0zbEI*Uwh&G>D6y7o-gNp{ycwt zrg%mm-y@v!p4FU%`r)ilmuH>++&f{;2D>?%CmVcpjfr?NCfD&}jZNl(KEB8S(&iJ@ zcMcy*F|{_>`7RLy4y7OZ_>s(6p8Ced`|aalgATsr#G(&vkm2KdcAW9=E5asyn1}CB z{a}Z_*u+O)o_6TA#5|bBC60EjK4W#X(cajm>CJl9UMc!~(Njh5-mF!Eu2#S3scSV? z^h(j2*Q^g~&mQG{ajA&*L=pR){pdR5*JhmPy|xo>Y;Szybeg`r`23*`rh5(_)QuR3 z3BUOAU55{H1fQDI*z+{zd>4ZQfh(u)UY+CkPFrjwZG4{Qcn?Ec`JAnCF!U?e7OvhB z2SaKxmh5s4d!K{!zZ8Q$!Lcu2i(w4f5rcg()Y-?eYh!71+K1u1cFCQaZ+F*+3(qkm3qBCw#e1*VXg5GhPHAs zlN$p%_LG;m+N1IPRL)+`4bFGYT!=H5^OkoXgpTJf`xkxc!I_ONM6J-{Y^KloiY|3! zp8E&-%wrEv9sHt$zH`jm#~(3@!yGuNgFk$j2lL3#Q6C(9sKY$6#8C%-)PZ~;{fUbV zENb(7(IJgmS$kqgOmZMk-_IF8y7;yB#zf2#FyFcf2sIU8HPUlgTuc@KW88w<~K4(ihbGAc1DljTADljTADljTA zDsWL1SaY}W-on=mbIm*ClFpp%!!Gykx0Jj0Yrc+}YuNj>)|}3xDqmYe>a%ozew=Ig zsP2uC*Qmg#z^K5ez^K5(Sb>YYV{^Y*x@SI&^;r}1n)~6JyWg67_?mbgMxBeS;l6wL z!&sjY^Qge6z^K5ez^K5ez^K5ez^K5ez^K5ez^K5ez^K5ez^K5ez^K5ez^K5ez^K5e zz^K5ez^K5ez^K5ez^K5ez^K5ez^K5ez^K5ez^K5ez^K5ez^K5ez^K5ez^K5ez^K5e zz^K5ez^K5ez^K5ez^K5ez^K5ez^K5ez^K5ez^K5ez^K5ez^K5ez^K5ez^K5ez(-zz zw<>}w?Pt>v6`uhF@wczPy8GbSt=^NT^+`C#d3V-8*HX?)HNV?XbPztzTP3te;r zpT9>4;RCwpc0YXhnNh^=-}JlaJnn~&i;j8VjS7qkj0%hjj0%hjd=wQp;l8-JGfvaV z6+b7ENVxNHH?nyTL-td<%i{L_`1C3FNAHH}C&z|)Ffiq=g01&C?xc*FLvPJp4-9Cj ztbG@xQg}O&pNxB=6P9IoHDY!tEWLB^~GV(X00w9sSFDIL^s?I?CirpQ-a< zo#T@SVZB)c>Pg+mm9-*P_8R%HANXum)|$_0Wl!<>t?Va0yOqXgvC@#af7&&7&E#!e zt6wUKKh@74c)V(1@E&9beHBQfY_YiqZ!4#d#Lu?8b!=wYN^`qp2b_Vjxg z=9O65!^O~6u3hpThW6>7{R{P452F{y5{B{PGi{9lTk=@KFt!%M{N-yg^sQa`2ZLvM zsbPP&7<0bOff)A1VT@v7o4K6Dcr-qjef!Sdp1I`j`N|o~d6H+Wedg@52i@1Kq5V0X z)CWKJbM6EC=!mJzeXnh+<2?GQV_zIN>+86OBbK&nbf)R`lcJ-xw&iN`j^jN?ea_yS zUOb(q7ms=O%{AVa))fq5L7(#$U(|_4thtV^75b3pv)tU^%%ksI%X_+OaeKbSZ*kY^ zYA<)M$P-r`xjORHRW`>{*Z%$1ou-#hrs=roa#8#)xTAKDP3dqys< z+?ejx#&?gnaIrHc{Gdzo9hWv~XH03cwLFWR_{ISTKU>Drv+=!|HoiNFK^uJ-fBSys z?hhG1`sP3%{Wi7|ZJOBf^wIj!MxE9M`PSz4&1rh0=%u1(i?{>u>|H*pe$lg6Yp&>x zqT5%Am345>@eEulqVXJfmb0g*34U$Hg5GO8;nwymr_=PpF}8CJ8+7qULl+rih`kT- z{74reYtNuwzU6Y$^haE~A2;r5v;X@=z5K|RIz#Rk>S|w3E$9=QvO~H1_fWgF`u7@t zZ5$7}Uas}MiuHc1#r^Pcuj+HZaeL47{f=SyJO9}^YBy^4umfz|S1zn%@nE``{ul%mMCm17FI4Idg$yODtlE zGl!wQd9W6(?HY_0=R6qZ;a=Bo%a?Lt4*Sf9abnEbW7Fo5G0oY{$<5^Q5Lhp3BpCB{5+)YEx5w&-B54gU0l3|#L*$iY>|_ac75 zXAT`~jGHlf=r9lAk8{zO&=u3O0iVPMPd#J82N=wY1vYZtSN?3Tx~m%RFG&A#b0H7r z!EVoVb%@Q};KT!t^I)KZ%$Utleb$ItiG!{=rVdycBXenkPiqb)_09TcT3V-8&~Xngh$ zV>rZT0zntu{EQ*~CLw=w8M^3pKYZlpF7bEh?#17tvp#G7HuXir`#XC8`kuP8aB*h@8?kB$NL)Xzz91)zz0=oR(WVxVrKs-FB`WCvH2}j@RhA_Ni;X#aq&KPL3^ov64F{K6>=0>E)AY zIxf0g)W6f0&Jp_5k~L=ESI_@!cb?v9$Q=5u5L+ zv`IT-N*nBG;>ufHY{1W^uDoZ1T{hpH>dM78hdCR3rA^wUjeX{m#D^10uQ9i5bNl8r zy;1a1(X&O|0eJQQI4 zGS{#{7k@N#k@eX6|W&f~Y8yQuMWeD&6J`MYmTCtrJK zn%;Z6=vwukDcSX!yS`>$S9qJ|*~EIEx%a&KC*Pl5{np}sc2DAuHFG_{1dkf9-&sQ% zHDv7iyH9;57)zch*y@Kha$jhJu7s|%#s*ztl2{+{;rK8nakY_uENsxnuC)TJmUbTho$Zu&p5=G)18wOM~gG3+mma5HyGfy_T~fc z`R&Ovmb4cmYu>ZJs5n~RIW~ql|H_wg5l`JYUZtz{Xng;UGnjMGcaWU-D(|3=7jfQl zCVO6UzEDSXIisl+daVxUIrHGa@rAv9dA6xLdibR89Na$mV&NA#IN+s@F~RkP5BuOS z2Nv%b&lY0>3z_*5llwrN#A1%xcqgsy>h|qj1B32r!$(wc)Zh_a*pb$#z`6=tndzJP@dg9tTh=*FMa-X(z@}=vKVg8%N+r1XQ%{zF!6Gjal>L+>x zKPqtd71+HOAKQ0hyc6sF_?W&M$9wVYgEa02XX`OWqXLgv1$OVn-q(shcWt`y>1Q7C zdPM%mM`yoYd@S;R#FuxZH!3hHFe)%AFe>nPR^W++w8vb(IHN9y*QIZ9_fmdmV47a7 zpI;pp9d+mnZ`bdV+^nB@6>n)enx_A%Tp!3O7i|NE$H&ll~(Yqec#*7@=r?biB# zs`YM(wSIN1^+U4!+qLF-o?GizYmK2VbciI!T0bO9z4?8x?K)4j-aT@ik7})38f*Qq ztTS=EJ}JKw%6{PYGyT2c{M}K0 zpEZ9^_7gS!o}z!L==T@>fuc_q@$b{Vx9C$vf3WD&MSrO1`-(0XeWvIS7kz)x4;1~8 zq8}{!p(5H`eEuFPaZ1P}WovWb_kI1HUw&Vge5AR&N~IegHMEY#!;h&`Fa{&bICy#GKsPZGC$WCF z^q_2DV2_>{#4;BT{>VKW82FU5mzxtlAZkVK84DQd_qaKUMNPo5VNdJXD!XV5Vxe~I z1M?xLL*fwQpFQFjbI%KTx5Rs=NA2_CUhr9APq;5wgI+uD^O9JHJTKp>nB3=y;j;pF zf6C3P_q-&A`aOQpd!1OUZFM)zSbF}IWgPDH@w{x$TIjVe=Gf@U$60R7O^(00nY-&{^TC&UDSIM@AI^`|G$?$IK)q!V1SpH$UGBsuiNJt zQm5Q(e0x93cQ(0^m%ioX@(+uQ!#xF7w#-Red5d8##3hk~M4gO3Ik{j<4EV<9-Q)t6 zwZo?bHs>PP<{&o$eMLA7tVi)d}sx+`P#=E|di`DWd|*5BlZ;2cJFN(*IR5o;P%8`F?bd z`*kFDV*Sf|am?i+zP9on#=cxQE0W0T&|FT-Ch6C9m^}ZSWqFp6lf?SaSesuho{nH%Rb?{W3z7nuu~#=#orvr6B4#9S_{4FnE#`9B*1`yUlqFLRJzbS{~X&!P1+ zKc1Uh6Z))+xtNbJww##BrUgL5eD z>6;Jx)m#!c`{aNRbmxe9&w$^leoN#?PXBB1Bx5lieSs&jKinJS^D7Gk_IrCMbL;iV z(R|3MCHKry9Ly0%4__HR_F=4r{_ZEZ_a-^-NAG0Z$E9_402fp%IrJwh)ysxx<->YqWes9OT+W8z`WG-O&oXTA*)}@U<$KI><-7Pcr zwr?)@%GTb;(r?>m@4L^yOLDC^)8_6`$iZyaJIDH%+vmu0f8;*5PYj$vZTvYF$2+B* z=h?l%bL)NPJe<79C-a-@n-l(%jO9H3(}p;H_PkfnDHlX zb7}KglZ($Q>&P?CezZPv_NVu;TqpbP9WaOwoIE!edwzh=K55Bk(wxX8>Cjw^BcC&T zOXOtya-O-Y2N=X<&CMxe&HZm*JL`$BB=5)M#LqwVFYm=+4XtD5RS>H%%%kPx1D^3G z-@I#i@*V!KHRBp@Sdmd1pa(opxQ8aB9F647J zxv(C@+FLVg<(i?F``kWj$6jBGgSq#LdVZAc%Vi(F^E?wRQTr)Xyv1JQ!a@EeD;3t))46 zZpqiIOD_(5+Po9F?&cux<>LA#&wM=NlT%0Yv6lLVTgyZ5V+DJsWlrofbCCCPA*Pnd z%X~5i`}=aix6jTY_pv*PROepg;+d4(y8$`7AN37qUyu)U$bBqxpeE znmbJ9;(Jl^IJ5o||3_*41?(mzG>B^7)ko0?TIyyq3s`b;}ysZ|%@+@oa_U4K^!InFFa5h^5B*p}f3C(o z61T1W9Dcc~v;FtJv!w$4P~+dM-hJbl-nA>mp=dYWiorR%j}pc?OR&o9m#?YD+S44v zf1$=b`uUP4{g*ZV*`oinp`Wht9Q}ti$9rmycz!smpx7@p+BWZGYdL2)zQCQP8|=BG z`mgB5482#d{2uqM{_%>oR;YP`F=Q#^^&;8O`L_G^fLwR^o+sCjF5d(5Yt(NX&EKo`&3!cM+az${a9>VK z^XJd^`zuQR{WSuwVeKl%yUum5Y?`G5J}*v?PSZuy`1xmkXB+W!84|BjmR@B5)Xk=Tuzhc-!8ap!c~ zyZh4ka>1>oZT^4jN}qq@%C=5_|4KnlH~x!vjt=4V{@vK!;lKUAZ0x6_zqjQ-`}eo} z3%{}DKl*>{=Ks-d{-5mT|JiQ-Tf6yh@8Nftr{uX1}ZhR-NZ61GT zH~z+*xXf>}-aql{yZL``WxG#)bEo&gmCeS#RKRP9#a~*WoFmvfbt*rb_QB5oKi$Ri z+dKJmw4Fbc|K6S5lXv(w?~iTw`A>X&C;y&v@@dz;6aQB5&6&7=&+fVV=Xd_TYd8KE zcH{5FNx5yDJrMWa-q)&>m46emhWK8r4a}oon5O66QS#Apb0#kO-t)=X-0YJx{oGQ1 zuMio1KO=8R2R;07o=cpc*kT8_uN)it{7j2Je_H|~M)i?1uMK@DeI-7=u|>bd0b5`C z)t0fo)IlG4wYQ3{WL-DX`k!}h;(2~2-0D4fS||B2YcSUm&wU9F>yclBXW#XM6Fd24 z-*r`wdGr{oix20OJBKcW&$LBGU6H}56*|b(L++S)#;q^rq4b-+5?@_#(ib}7qod#I z-jj9mIbyA8#R31T32IN=2%V+=4$+{EbBtP5cc-5)3%i{W)AK?)}J!uSywUE z`T$Qq`Va%(JUbA0#>%sWE_%!%=Vukjz)KmrjJ4sls0@9GzcGU>eIQ3>zGC3Vc#)xp zj2Ohj4nNK_R>oR`DK2)|#|Fw+l%Z=MpI}-8t;mf% zN<5i&4=-h6if_#LNgQ*dF6cn`oQnk?=7b)kFKi%XV)Hkm$R&Lc2YPKR$kK;3&<7kD z*yf~91-RA02W?AIvdE&K`1|(1nbdSkzO75A4trhdz2d57;2jxz-1B;GruX_WD3>%;*}I zGHgWS8 z#m@BwSAF+^wLp(P+*tGh4n%C&x9h>2wFg5V%EUvDK0YAv=t_eb=_WX&M%ViM;Z z5hhW&u7^`T53=pr+=#I=u(dMU#WV!f@uIE<-FyB@79^VNqK>5KKy z7CAclFh}gsVGN-s=|{{QlLNNm88f=#!5L$xEPWsc0}h_LaL8Ke7tZ=3r>{Kqz{6HO z$LP>k*FJiXSaW{WM~}XQt$lco^~u@9-a5~k6OXwXqy8MDgA9MYHSg8lb#otpk(564 z)AQlnoDcBvm3fHmTId%nWQ^S>$f&7ub$wQuHwN*HlQFig3AX85JLTvrOAKXjbi_~x ze41nM(1TMK?6gfE%$u7&v=z(v;pCjY86(eH8J|AILyx{BmiprJ&O|05r>_s}jR7C@ z^?_cShxX#(7jn$J&qrb-hs3iU88;X-@vz4RUElrk5^eNaAIuxScC8OEm5HxUI5G$< zXlc#Khq%!1qM(bv{^#X#;nefJPDbQ#mfZ~8zNKl)^>y?SuvVlW1aMjs6HFPdy#xoCj-- zj=tfoy?bblPW>L`$uwOqI{S4&$&PC7h*)@^_r6ZBrZv53`eVJG-^sRLFFbczyXu&= zm}_8pZ$OV);}cBq$Pp~+LnFuD`dbTYz`lm~+J|QaOngDc3nrwl&%}9b@PQq5+lS9H z1=-fx@O<*MA%1e-wDF?{zA;sI)0S+E30v@Oz51vNK13rfThGQbCGpdS9IU_it^?ed zmTbV5v`Ky9V?N`ikB)ls65VOoAlJ4R%N^xAo!d93>5Zb7ik>a{;AH!}@qB$y^z7A| zD|(~o_El=ezFG6!v5xF>o9oZ>^4d;#X~VyAI!!MuK7ZJt%kx3w8DtFSx%8P~Y+v4! zIR_^fs3)76bEkLClGeD%(9@ZdY3q3ppVMvS*doJsJGXC4U9daEpP1*dxd>Y^20whgABLJuH@@qg zY5I+~r|EAN{rRFlRrEVIr|GlM)#?}hscSV?^f!xsqdr6ayPn}WKF_<4=icUh;fWHw zzY|`9AOGXiY5I%DJTFU)`tn>52hSB}4CfKCah~9d=M_I-aSz~3;_iS??gRMq?!fPQ z(vbP?0}pJ^eSOOD-Rl#V#5{Q7C}#{YpBP|zA5J-T$d!SK3=HSQbZy|`$;EI^|BT5~ zeB+cWPflMv`jCDcgDD0axnp%4!`rx89sG$Y7B-2ETpYM#Y|(=&7hlYbg*o#xHpkf0 z7fb)*!o}2wbE%6=xp-nKR|mQ4ZEWf|P7M0UwKoTKl_#e9Z4Ah@(}#IDP7bD6X=@DX z5`%rYezcQ=iH>o@o$KMWva|ySTXUeVEV=zTKRqAl_T*qeIhXz3ynf~AYa`dL<<7&6 zDP{CCe{{e|U%6gst1of2MPEWEeXG-QvCwS^-Hb8u=(j$^QjQMxjP)y?GUWSk)j>~6 zA8nkD)pe{-mfz0_5nag=(sPu{H4q=>I^zh3lu(aS~0MVE{E-(xDB zqtY$rbEDj*1R#)Qvdsi+}U5esKH~hc%{8eAtmAeZLPw zpLug*Os(DPU_s1NPxax(L7$u;>xC={Ik@UEhhOBz=NMe|$j@^DF12`!!K5zOi)-BE z116mHAb+qKqYI&HjMUK>;OI-NBYotoCIeofwlFgm1_-u@=O~JmZuhH%ImzWIo81WqpyGr}pYukF?Fc z&sECU+t8d3bn%luT3HXTmF4pW7Uv#*(PIwcyhN@n^^6@G^q`b+PGXy}qAMO)=rdNv zSXqmQPRbnPC)c{Ii?M^tdN59zap)J^o~&nUZpPi#k1>?<#*Gi>tsi@_jSnB#t4|*t zV-y3qzQD^okn1CJPd#y{CvyEER|Y0yb3mTh+4`jv)Pan=9qwhL^*~+lZ8f47qIz|U9zV<^#U!TkoANW}p z;zt+RJ|Fs04?AP!YY*hP=3t_e>&v*65hvvOVkfQ``a<5W2e!T1BlG#t2YB?sqfX!{ zL(X`u5A@P6V=&s7sf&5T8AG`q+PWT@Z`K7nbeT6NWYk|D%tOf1hxzG)IMqv8`d}VA zWRP*e88bIE-|OIhmv?gRc{bhy5VDK-J$rD(WbZ-T#k@nZS0H6@WpMT;oH{|yAy+1r zXFodhA^eGxGVFWAer$apOCQdQ4;QN^(?1+6;#OZ7WA*5_ddiGXd&UyD^w}$r^>H3q z`cOY*>WZI!)rYe;^`VV2*4tW(V_jH}R+ja1F8%gotOr4JAAc!h4E1cSeXfUk=1mS_n@{>c29Xc8+8YDd`Vj{m@ZsV+ zCl)@$W)6JD#)Zt>dbY@vs|N=Ma((ro4)UI@Sm=wR9vn}@jt6=*PK?Ic4}{E`2zU%=*zs?%3KRvzFSaha5e1!BAK3`X)a1 z$a}W>5Q}(-A36Hq<{V?NAm!*`2cPcK{gJz(KWpK8k-UGor*g*9*n5o8gODe=rp#fR z?{92#@1nyyYe@%e?ZlQ__d|792QajEO?o(~gC2IdN0~ z^o`Z^%Q=0tI*!HF7Vh3yqw}DwcYe*8&oOIb4YJQ3Bu{c=p8d->`{-B?X$J%=%+2?^qao0H3oeV^Y(WdUO&pZ zZp8IJo*SQ?v(M#=r_=P}G0*E#%%LF#}HX73qD zUG$dl)Lqia=Y#$sy1n=kkNg?K_vxw!H*UCiVDzY`J7+VeyB4>nhivWd%@7xLVBOd^ zxi4LNV%%a@r<%_t`{+v>iFPlX)~-LsZmu1&PxHLN4zgb6&9epJlRR=wtvT~P%RGar zt3JA5nj3o9rBCtHVIDot1#}Y+eRa`;_}(A-a$)}wGy8^ffaio~ zk^RYYd#Q-$lEyR1ICC8RQIE%M59Ar}QS_&$|MsovxxaF2`ohoMnlAs?t?BstZcRsT zy)#YUu6N?MuT}q!owObg!4qb)I9MZPtr3V9k5ccXz38n(uechxd0f&V=dL z{`C9xLD`G%$GbguII}#j$ie%Z?HwVm(z zUc%M>Zuq{u=CFOIwD#?|XU`g;*Xr)8lUVngv@v`a}w~MJpHMgw#v}MhB<8=qoXhJ#7Maq+B25)BNp~a;vhpu zef=1VHsWBXPR=P4$2jCEPhD}5(Z{bo)N|ZoIInHmTNCHR1*^qr@zupP2|aaNxnuFg zaLjybOB|B+>S@Qk{nVka4{e-JKjODIjMYz`w)W-dX{QXH*o>V^+*ZfAo^Edry>0v8 zqYEw^;*3NN9y$=doRh1^e&YN`4;$ve!@s!bfI*yzr!E{qC-I0AKhBHC7`gdk zqYRFoF%XBjh!2Or5FdT<$j6+FS#C|>tl^Ir9oq1PU+OFoBSZ}Rjv~JYnYoyswWK!a zK*%y*b;%LDIX!I9#U4ENCA!4MTw>Bkjvnzr*dc@3SjkI0>kY?7T{trJ%%7N{#7B>s zqsttz(np3}`f!dl6C2K0Y}VJg^R6TD;hUO3VD|P2u~{c<7@Mp6j68_VT2dSO=z`6h z*l_h+BlLZ4#l+4U@*I#S99wkNvwq0I<8FtZ>yvuenGd>c$V~9GmbLyOD9d}3YrZ)7=2~ND$q}NAAEv$$Av|Xd)o@jB>mN{#b{e3#r(s=Nb zzOuiBqrW8`{19KY`}Xhf*r%?SxtVLm+LM_R+&xHNQr5EtTYs)ePv#ulGeW<}@PYhp zd?X%Nu7kdNew7&moaYL8i>I#K=g`=Z`%Lz1dop8#i<@{p=VHV4dpEVpeD!NA>A$y@ z`K+J|^<>V8M{V?*vLzqjqKjS6hj?(;O&NB`AZjm;vYuW~W_`5dos%-w1KHgAreExO zK8zLKt~q|ehwgUG@eLWjWBe*xS`X`pKI`F{n3LRmh`sfJto0!t_^ppt*7_iB>?QD# zVW)3%Yi;M^L!UW_y0a!NJ~Hu{Q-97!+M}C3z=D*)8KXyy!6YB#kTpWC-!|VRANtX6 z5AQsAxKE7VIKO|FY>ItdTC1>Jw4^xPP&n7mK3p2JMQlJwU;#~KAZknm*;oFtWV;lj=5Jq&ePu5QcqFUNmt>$qo&Oj~)0sy!M%$H;S^tQd11`)>7I z%CnL_``a^}J;oSa`{?*ABKH}}K0fj}ac^K}AAS4oW!8i~>p{QOL52-FuAea*x0sCW zw>aX1!yaMW>VOaF3-0grwzXx3cN|3SXWyeQo?i67dmv}Xy9=>H)Hg{zxH|IGqp$AL zyGxrjI_J?fwq7o|pXeW=Yb?oIJjbbH-?^4MpS;y^oI3WMYx#rvd%CQ zjfeB|Y4YnP&+zkbpSQGCHl5@92gG&g=hIx&`O=;g>x;>{mmXsn|x-{&b`N8 z#m4gm9r5JMr@qeuHe#yVa%|P-`O${B)I~??Jv-WDZ0fi8KBJkpv8&tq*k_Y=>iS$} zOyH`k9vs~qrw#hrSf|vt-{v5$ad1A^m$x?J8;g2y?WgHKdVB4^5i8wm#7;h}5ziy< z*t~PP7hP{+uo(x>-)lSJ#`eb7PcQP{ixHD&h35qE_6WUwI^+VS?wpOfy?N${K^-}| zz1VuXJw0(+-s-mVIZoY__xgwG_Aq)faC`Ee>_NSUk^}2W%M4ID{M`2K;Jk{Zp@Jiyee-ZS*I0`c{U% zX8`tTiyw1ITV#y&$C#KiA9d0m8^`#>9y@qzo7l#x3@%~c#+>!kr?%#*Uu~^#+8Qf7 z{b37PUu{yKzCN(UuXglXe`%{PxEOFTtOpz&lld_LCpcR(qHpU1&@HFqwtFY|e#_O5%o@0gSFUCMLevyoWZC#Lqv zSzpFWn2DRV`})S##@FJRa}Uq>)=iG?J}hHH*S>gi@#Jj`y)jtg zF%OpZE$`VQ(|(T6Vb0;T@-{~1iA`=_JL7QN<6lACg zmh*1*>!7tZL+|i9kDA@znw@7)`@JEaiFUnwPtI{{py~I#`b*Pq{%5~5{rCUYFHK+k z*e^{l|K(fL^xN;$cNgmWc~4xc{xc=JUUNTEIzLjnKT=pPpSRw;g}04s^< z-!A^=i~lFZ|NY{Bx%eM1{`ZR0o~)pMrfgm+qQQvII9pE6%rB93r8e4Qx5l=`#oqO^ z-idVxrgv{J#lqhq7{*6T;E9zuhvIqX#tyP(`Z|PLb7N@vp;+LFaft2EU4BN^)`!{; z`eD$`OiI5y3dr&Gi6)+uRg>3hwt;5SNkse zSk2M+_r1I_dhascQTz_N&3_|}{-2BY%5>wC@AFP0*SYq|n)m}n{7jiE^7j_;*|nc4 z;(KU+un7FRW^ZEpL&b^l`-+I+auGRwrii%ya1r@^e-Y2z4-}E>A1NY^A1q=$f2fFc z`D_t2_@hO0n_kX2`_x!(FM1Fs)h!lUgi1zfBZDi;{*nuhG$G+S>AxCb1 ziK9pS5PJ3nZ(LTd3B+}$qi`pD={(|>)+bH#q0Yg@f-tmrUiUqb9}_hH-5J;J_#(6x`g zIw?n{4nA@}^87*Q*vHmBcJz5}>BFH`2N`=db%^H>U+9Vt4tR6Ekn4;1s@;=+pPg&P z8I$Y88bjoneQESxXea^g1@-qk)|%pv#e1xp!v5M%V=y!VyKkzt=c&}TklLxx^Y zmi536J^Vq8A^fn`_(@;6UfM99evs>fKKNj!Oh4=u>LKDOys zz4Sr-AZ^gmZ>~8y$iWkbF_d`J85wxaQ+MRp5fj85nCV0P#8a=8Ax|IXk?|Xg>j8#7 zGLO03kQ*y@;Bmi9AIQls^Dq`;1_N8<%D_-&Ow6}FkkNWRumcZ#@vzqia$`Z)J~@DA z9?a=iJZ#a!hB`AwkA^KW=8!SQp1xz|u-8s}Wa$H2WX7UjWOF|BRVteputBCzlnx>_pmJ?4D0c>2s( zh*>nXrqkvwf^E*mo@95A92Az z23MAN>MJuxwNs`K<>FhX^nnaLZJ1L=UtM$(4@~q@ zmp*dN1GqMv1qf_q~A(LZ%)*T3g47 zp$x9Q7>ptJf$=d0gSub`X(OKTV6O}=rutx+2Qmpcy5^xR^YkGx(g%LQ6Gxr&VGPL9 zM_U(tp<^GN)I)B4#6u?OR~xvwB^EMqj88qr=z=9zAI>}8IsIb89QxX8)9PT0jCr_Y z?C7VDcFoauJ#tOxn;$rke&LM4bq!Q%_7e>znrU(I=PI7MVWqgD&>Q0=EXv>j$|q^z<{`r~4y!PVb9+ zFOsvE?>}TTXqT#CA@;q{F(oc5^uD zhy!jbW6r$;@9E?`{pkVuJ51Eqdjso1omqc!VExIJ^(IFevG>-$t+)BI?;$YV4|BTi zd%tGVhV^Z2(8Y((4PVRQr>AQy>dKdF#D^OfcG%E}$2|dl>Y&HiXB-=-waNI?9y?p^ zE%ADs+>K2eFeP(N+w_yMAXg7u$KW%ju|{po_|Oh+Oxl!a6C*g-)0lI;H-g>&%!Ogv z(|3#yTIy~k{QvgN?a!F`nKC~^=5O;{hK{OV#Ls;B881K6y?vFMu|Dh{o(J~cr6L;7 zfoGLx6ZNuLWAt9z3AeUiIi02#j@3Tsr$QU!v7|Q;VY&ysL zgjo4`Hf@{V)2Fo>$Hu;yX#Tg=+t!di_4_Evnmnw0y7B4yy_`=!lXbP^tOLZpcz!3` z=)L}l_ovrC@n>1Tx#r$sZP-&h3*d16gUR!OJ^LO^_B@Seo-sB_y>}!SEn$l(l0y0$j0e{2tpwZ$0Y_3L~uYUSErG#~#i zcKbc|dPMI0yI9U8o^j6@o*$mqB-Vj54WjRwXCIkk@O*!X!yJ@nLE4BpC-V&R>`UCV zA;ughu6^@JtcKe$-V$<^ttk9P3ZXN$*} zxY5;48@T#%{HtdyJ&t~onEFW@^;~m#>L^o}IWXaEJm{d$oPF)Yfu|1hVu6>o^dd3`qj6PhMIjQSdyyW!N)1I+5;wJCuJ1<7!GACX;-^R{-tIN2> z@7cB3X(Ohx94lMGRL8uu*JnFMKW%DQ?P7l~nx9?sH8o#fbI&Iha^U^RyOgg7HeXj1 z=W7DLHudZwX1*@)YkU7rMTs`Q2hHz7W5>TQqixwwpYpXN_;U?E-hqh+KlnsOO?Z!@ z1BUN>IC5ga#yQ`)-U*neZ!T$%oOQ#AD3aCpYtR?=nx{8m10)K|ZI0E;>;5(O0e?@ggNSK_0?JiOXHStp)B)`~Tv@hmYWH^?|MzqUrk ziJbV^SM=G3KJVHnbN$rECj07H59XC+pMC6JcAhck&XSLeProT!;{!iw!#e`M*fK{v z$e>n+o^jIWyhN`jBR+FOS3G3uV{gpJ^y|EKc`m1nwZ>2SvM$CBR!?Re`UN*-`svwP zKjSnv#>%kIvAN-cIf%R<_9F3S%=o|_eQfDxt&C59aD6D#2k+Iy#wWVws~++;K5WG` zUS#@5<~_xjjV1ArY2W%lE}pUAQyG1H&@OV#vj)bDthXLnKjMONA6WCbnmP|Y`S$je zKC(VNSi!~NsJLahs z_7HMpt>2yuAL=vDSRcssfjn!4E@aGNV5`hH(+7R;?aqTk!*Jwe#KC3T-;5~ zLm6Y^Lk1>#*s?a61A49(y68b->CfMvWenL|2QZN*o_ZPp3BOi6)5He_=5Ae}5Pkoq&F^lIIP9AAX&WxFB z*Bo8*VqUzgJ?o90xu{d3JMrm*xpohsrwl!@(gq(id@xTeG{)08ejdu*?;?Ib+pouX zzp!S|+WVvWaQAFa*280;L!5Egu*Z8c@tBA3)5@s*oDcB9#TGk#rcD2Eu<)TjW!fuO zPg~@3GUedXhuD+WEM?${shwkeAUBSbi4O-~d%3cuTIKt>SF4`iR)+u979C`e`Jm_e zBV(Lcjx%3mj3IrrF@uFnd;0o8rd)1)@a?=ljFq`1S=w6X#AlxKKnyr~$mV>cJ^JZG z9CYZzTYTimp#1s}e~{~uYtpMJekJ@Emoj7N*;@Bp5B1Eu#bXSn`1+(??p^Sl*N1q> z%?Y0P_Kg|clrc`6Ru5g*x2LB*oVufn4TKDiJZ+sb7RT78USiu%AIQK!1_rj;i|H6W zF?urR;NXd=ysZHk&WWc_bj=NJP1I)$;X@f*xp*0Ki-$fk<=Q6)A53JDevK8bUg8;x zc5wCRqsti1yIovl64?529)0YQ_k1ApUPB+f9E+n5Yt>s1eHky~lx2MAfDM;gA8AV; zd$@M=mCxa+>%94x2lmb-9=?#H*ZM^+i6;h}Jdle4XAJf9+8orCgXfxn#aKU#^^@52 z9iwlaaN`pno<8VgII6Y6PnXm!qGPET^D_=(b0GA4cFfF>*?SFJ$3Y%+&Ov9*>_Isl%QwI!lP96Lx2hZn$zRwS~$Qh#x=b57KIjIhM%CnE&k}v)C zaP)-^eRPPS#n&%$56b6mx{f{@#163rN$9a&xyH`B&hkTad(Z0}?jgEjBsad6r;hzr z$1(HvTh96>JqWrF>gOG?kJu-yDenpP9A^tP0k1+Ru_B zR`v?}hkcXpCD)TWu`g`af&KNRop57!AAmhYx=^^ z-I^}{*sbaK`)*A~Z@n{3-+sI3TJ@hP+4Y*cUOLxH_j=h}=Q(Emd5$;(*1Q)v19a;exZ70+Bz==^Wr0eSVKrTHqL1e*H#%mv4dL^=kzBIF=su& zLRUNWkkJPh4tClaLu-ewwqjw6zGQ63)sd&I^TeAq>G{+iZp`$}PoJqrA0PT@$NDiQ zxfqVqUW}f<)Jxlx+jm|(<;m$wuKzT>SLe%{MXwZnzUZl6JLszR`^whPQD|)5q z&7$|NfrC%##X4W;xpVT~X?=3k;<-~UH~Z3Oin|Z>Cl2D`8K)N9F^KhvB67Y|#Cb>C z{(i-F4m)hX@gC*Am%AT(9D8kvsoncv^z2f$gt5jREPc2B(@(GO^Kv&B*otG#dU2}* zPn(p}U&6>7TDu&lUaz0JbN%z$C0-8$S?cWT_b~R^wDT=SJHKY!VjP+WJ`!V%&z_Ec z?*=O|dOp_3^uI=TPNzyzjlTu*^`h5{UM@N=x?FU^zZuy4yMgLoDcMoY6}?>adePU5 zJ~-lByPI>_^RQs<{4N~l=4UuGt8LjAPV3}6=B%1)-mi#-+7K5Ue4c4)z#L~3ILJ6V z(Lu(%oU*-f$@K(Q)2BeK3d2Sk%Y1Cu3ee`Y<1GAl?O8EAz=(nNKSN3w`I!CuRCc zTVu#t^S3S$&~rVFA3J3D zQO3IxN*~OjE1vPOZp!qFUgGJumEq&OYmR^X!XbQ`uQL7RdJrR&xuK^_O!dIBj}J(E zh;k-W5HuF`FIwQ{<)XP|@d#*WgY1{e`PallY&6tTV@f_m^Y~x1< zqE^HRfd}CiAKEeX6?1kb^O+Etz#X>`Ep(NeLvf|_rsY(oc+k> ze$_g`8j}xK^Ii9@IKJ?4@ylBc&M(V>Umo!@FJE&j2R-Le4za`>>YtqA>nW^5Jnm|A z4kteT-8>y(aKSmsfme(%d}86NZ}q{Jhjze9N9+}HLA{Bu3{VUBuVj=2wD>)%n1 z`Z#kGbCe?=t-e`rT=K+0>sNJ$KiB(Wi?3$6#1MTaeDw&fHJ|f^kBi^=#2G6GZJeGt zoQoAFU;Ul2YYs7d`6u_9!&uV3I+tVR>%98nDW698NrO!I9$V`1p&Xdxt5e_lk1FAwGUOzHn;5Q9b3~U8nkt8zUWSujHyP^-5g6 z^23#P)|WkV%^ds$PvX414E_8dGd| zIxOA&Mcm3gv2fwp%}31SzADB&Cj43lUQ&P6)P3r@F=Ex`9?GsCX=79H!*(3Sz=#Q3 zP4AEU;QjxOxbE!z_P=Xj+Ro4Ux?Z|2=_B8Ei|-@Ub<_Xvh#2<^_Y{YD%=<@ssC!1| z9}N0~vE~m{UytrdAE;XH^1lCmf7gq|zG#;h@A55gyZBxBcir3VSM0vW_px2Ra+hy-TyOQ-8rgS8*IWCf zdGD~(QGGAo&%XV>&u6gh$sc@r+y1~4uB&qg&i46ruRnRjz>6pIx@cc^4bbr9Ds0yZ z9iG07f5u$JUrm?A%o}6OCMqKbO|$#E0D zu+8H-bxllhcy9VPClBTN+g|_l{w>y}*Plw=le&M=zU%5f#h%wrb5yVUkMGD_hwc}| z9_xC6HO`mRukPi>T{Gp-J2qeO*134&U1MzVxQxqhOg%Wn88;W$?l09>y!*+$U2b}m zL(kNzS8Ay@YQjD1;VZAWde@xQEZ*-3;VibA%@4-+kou3We(;O&{3*UMT3&cKwK^{* zEsvaP&^I{0UxZUH@#8Rdo4%c%3-@E$ay3Ua;BKzY*>qBWovVc$VfbOf%Mr))ueNy= zV||EoS`XCMxE%b>mg{LCA_c$~)BD@J~P`0U+$D1Rp~*Qq_+I@wD^->0oNiQ0+r z?A8@#`kjZ7BaZ1mXN$9sTW^|7ewfCyozHsC@gMQ5T$f>B)wdrHWu2^zwQ}!s=$~_Q zBlR`gJk>**e?81!&GsRg{(N)J_G3MvN!Li+(>Lw*@$}i_q?+fNO?&1LKRKoy-;vMU z;&DG!4_xzHeX#lP!V~w#o;A(My%TokFveFc@)UpMGhUu@G#@;~vtahB`OIE5pVfy8 zzHzmX=_}8St%ljFBVT;Y117%dYi{-@&dHmtrlTBu^2A5WF?}%Qh!4&hwQg}c7eDjC zwVu@v$0tud&q^|L7=w+k`m9^NS>NO<@9LA|wreiGyfm5f%~!s;9`$F=4UV5L&TzQ0 z+8d=X}HIGyj}JxLK>d&ox(9v1^X_%HbS#)~vqC*SS2n zs~?8wl^O{?BCi~H!&M7^xVW8rKb$$l*^hkgSFIDQG5K&c-*xYb;|m`bzr5Ap{IVSQ zdr6p29lBMaN^_N&C?ME7o4LUc*PjQCl2IgFKquVdDn z&$t@o>A*jI>fUbg`xD;%p7s6r_VTCqOi%P~h;==V-XD9<_k6K02-`a!xy)zG-lX-3 zgr9pBpJ&T_zH~mH2lDYxAD*QBSk7`-kE0yDx2}2dPhazh&pgUWx%u)>Up4X(y@-qLJ|MnvYe6PodYrc98<@~m%n+mJ~SLoJaNI1;^_GJ zi=%soDW>;|a>OA%emcHzYQRxF<=kge01^g6^AdIZhhu_>+!_#$pII(^`NtRpK~srR*PfC z^5KLjPaNh1OIJ%{&f7yc_+k0z=j;8^yQ23?&l2yF?!~@;bU$~v*E)wI{8OwcF(!82 z%f)ujzAmQc$c!t8KH3wPVT_-{G=_&9@vN9~)9YCKV8z5whuQA_p5wGn^h#g!vOaZ< z+e7x@+(Y$t?R_!V!L|ln``20bVqBMGuK!v~*z_7xZ1bJ_LQMA;aVz)4!i8rypV`ZD zRLfC}d(4WPykhFFnz~P2H%6@5+(X&*BW-L7e%Owq7#J~OtLgo5cYn{({kLnVb9%eQ z_Ys~4H~o7K&k}L2<$jK}o2P5qdE;HzuEp%>VZQOmY)N^w)M@K!l z=>3JyT#2#Izi?gP-}(u6zvsC3qxE;6aZl?W=Dxw!%hoJxdfuDZ?jd64y}o;EyzX;} z9N9-P@xzE;?@{WA9~LIQu&XwgVyX#d;Wmvi5Pp>iaItjDti8)vQWiiI8 zCB5RWiz%*a?z;8Bi%rLKU42>I*X20EHIM7mH8I8Ey!$=Ji*@yG+4VrzukPi>?fArC$3^3x@qF>eC0-u!@bMbQ(_U6%xp4BA<2HSp z?{RFoh`jZOU0wN&k=_^BYH@yqF*fmX#4-KnY`o1qyEUx_Iryv-UwyhwF0r_9wl`*N zvxaH!@Q3pIb90@nvmPhbzddziw|44pudv03&ksBC6EpqcS5D{laqCT!iO178e3+SQ z#ls!tDz@=8*W}Mu-+nxlb+R_r%00wk@A1*39-1qgsD~W+)ZBRcdiv}={ux_OCN~_J zJ~+NK+ny(K=5POBCx@7sqrCXaRgU;)-qy(2yawZO&*P7eKOf#=JZIR|ZVayH7k*OA zROKDc~gHT!~7jjNA;#)>0z9^%N6ubOFGL_PV(;VTwzbDKHBt-f{5%Mph-7=FEyhg1{0p2CtN-{dPtJt~Jh zvsZK7U`e$!k9=Wi(ox>x^lIjqHRCcD7|%EFbjE#?$j>haEOEf)o3+FjPF@`FT9QliF&H0aV#OG0!+Gn=SN-gx>l}XOa1OWn_|N5N zOkS9JU_Q?ZJc-Hg9S53ysOFNfm=HL@6AKO^(8`TsB?%bN|4Qbw& zt$Fnw)gsqX?CiZbdCJ)wkNEPdXRG%xG>dK>|FcS`#PBI1^j!C zvp4p&z8vj`)l|-7eEUI+ zYx^cK-3w+f<4wn(?iqC582yrGy@$n@uD7jApV!UzTrI`W;(VqS*Li)cH|j7Rj@>b1 z;KZo8`Bu-2*|rz%?>Tl~?fP&J?LNBdu=$;n?H11y&x4!(o}(JC^E`pU-+o#(p4GRW zo8#&`ciy%7LebmPzxW;Je&=!@dzELT{v3VpWIwn!b#xE39MTYMTP?up@pq2*xH^IlktIJha{*Zoip@y0oM z*F84*C;lj=du(%4hZs5UUTP-t2zGBzfW*ki1;pq>B-@lyC2z#r2oSxUqIqbx&_PLlN z{$jfq%z7G2+n-Zr49w)8xM@#Jyy=OX_HAO~Oi#XZc3AoxX7v}d`Y$`b34c7#SIh^~ z?_avd&3j1qA@?cw689|qvwz%+i1Wss+ryrlwCg5p_op!8S_8a|^Yy&Lg9EmEuXw(2 z*~Zn6E1&o{+$)W%wVL3FbK{=#_jbAIVXkV7AD24R$~SA3%XwNou;yH?)r2#y`bj4^ z@DsK;W4Pid-gt4w!itrrdSK#Gk1?W7SQ=;R2z#5po!-mt$IkaCb=9Bd;50hBw$Rso!|Lz!84>CmzPR@##N@$8DeL8=EE*pT9c7T&JERo^r)I>&zF1R^NU+ zly$N;*2*>Outt0|Q5&hR?5^!2pZXiO56Se|dwesteok&UGJSA-X|_E~TEpqPP7Yi% zhj@aIHeQaI*Y(Cf*DK$|c^2}=hqG%{d@((z^rn10M`w;=j`(I?yyB1e;s_)6b$X@t zwO9Dpym*g%Ggcg#^Jv~jzVI;hMLqoa%wy&-PV|pf6YROXFpbN>&Np+Y4~H>0^JQ0y zI{1%bVe7kh7udPxY(a>Z@U`+Y0C{9^f! zV$0E7>p}GwKXdFxwICeoBsm^s2$zg!Mn zbA7|%V;gtStB>FHp*N)Z*Y(w#eC6jm%8SET{oKtf*IZr1n&Yo$eDSgC8(%TBdA8=& z$3OQ_v3%m?u#Ws{jj!J4Gw$GzPdvYv>VwCp7To#a#8zkP13Pn;NBy|Uv766u@r%b- zkNBM9YkcO2SFZOT&(F`#kKP}9&-Z+Bzac$qyboJP!smS6zZ+|BF zG_Iq(e3$iV_T{Ko_2jZz)Hq|+1K)a^4M&DENrzL`C2O&w);Wz;d4&p5KkJ9k1jr6d987HK3rkxnd7;v`C6ZxYN;OQ zdjO zn9e8m$QORiQLXK>*#j}e-0R)*pZyxc}g6v_=WI+YY0q2-Gr5Z|hkoL^3{x&OtnrQEA=kmoJzM_btrwY? zHAk531^WA!t&Mr>i@j?>4J$V!J2N@(|dGKZ+?%4l$kA`+B2} zczw2>pQnpS&zR!i*?k{y_xqRczc;()h<%=Hw|Jho??24nzw|t5zpvW;WA&})*TEFi zwfjQR+hf1&9orM1u>TI`_q~1F-uL~xJignn+i@L|glo=)65k7CO;^N4|;_wCt}@>Nr@ zViNb{MC@8?vDH`3V$%A#<}0RLG$M>;a zzIm7L-sMLgSEu<}W7m*t-}U~YT^ujorR&=MYfbdBqdH;VecySCf9gk`-nKvXg!s!2 zyj}OMEjiSoF0uNeCbh~TH-32?`rt4oj^M-9eL;>X=6fV!#oZ=W-PL{_4)v@xh;J=! zT6_7^#nW@{m*p)seVy3mP|T_)2kcGq$2IFO-;oY~q|2M0@$k-%;-+uLO#8a=;bv@k z(=*>Wd&b9k4tvhOa-73m=6|jn-Fq&}an;y^;E>}c{fCz~>3nzX$9tdJws-CF)?MDR z%M-giw#&1Bmbm-w?PI&VWtX?^@~&Opd(VCCx!jk#AMP~IJX75pKk@!e{X)Iz>HW_6 zg!|pOqvs`EO|<*59Omp=a(%ZCoX>ImJwLj)!ivWW?_L=Xjkj^!#d`+efHAHXTzuhR z*~aw{7yia^z!)QHH5N}b^6S~XU2b~Fp++2}JoXA(j^-pcEK!5;YJq`meskQMsu zjPd5iCUV3<=Rao~*F$@kZ4b7Oi*O-OcqTtid~2@BpDp)(Je1#ao$F+s z^*EXP>Bw&F^wxNN7axB5CmzOmxMC-M+Q#k4)|)0Prg8W%=jxfU)1I-_buL%=X!Y&K zLs=(lW361X4ttM}p8K%A>aBXnk*_%#w+{)Qb92czWBJMCZf_s?;%Oh->+$n--948a z_;AUEA1AxI_`1gUS6uV#x{ptMzUss?KikFa*+lATIgC#}=Qxd*H=lF1T=A7x4DsEn zwbpCWd}inw7Z^}n=yISP*2$o{uz66-uH*$ zlVi?-&!JZFL{0eWDWABRL+!0EzIb=@nHr7bq8(SQIUc-6YhEqJ)q!`;w;b#B0pEJy zD3-75tNAwf*&p%F!-&7lz7kL3D@T26+&P)+QO$F{JLH*t&tG5oajyqoe!Y^To{I07 zIpl@SCx@e&X&49F9MXIj$Fsjf@P0Sn$vy8oJO>EhO@E){==~8-oc12+S>t`!IubtT z^Zwl!ZLbjV`SZm$W7*}imkD3~e7LgPk4L`Ca^Q?3e!25aK6^@@%Y4S*$i&$zt1sNt z_6lh}#>DdBi?f){)eA?aulUJ_3vTuCU)HPHm!n?QGy15$d^1)J@U6Gn`3Rr$>1&K` zZsPOTgZX)_y5z-$7rwk}j`-;MluukaswPN9)_(h_`j3o16M)j{L>qE&oxDe003wlOA=g(J-^|e@h zVT+^7V~jW_@l{hf@D;z-S3C@x_6|W;dl>$6Ypyp$9d^Ok$f;k>cdXRe1jj8_Xh9Dlet!qP9*6 z`QuklIbcXWxc0%e{0!=0y+3+a#O+z)UDEyDd#Zb~!`|bEA;yVuVok|>=WI+Yv7Xn# zz)kMr%b}lFVcI)tSmTW~j_W!Yxo6yrw_apo=6L%AX1n5Ni)yh3N9(L7=F(9=tjp`} zJ1;(4y!PpRM?GOJ&KT@{k#2>|o73cG_xX#nYy0_9(K5{>IOl)&Zhp#4|yD#GI{ykXxnz-gj=k#`q z=ZX8lO@AM`{O)J2XV<`W?k_N;y?&JryY9!!;?x7*wRIWxgK@0u^G;u^^MmZe_S!%D zj_pm~@Q$l~4}8bGYRA4xZqLT+JlETgJN$HX&vyNN`+eW(`Tm~Y^a1((aC0yh*RopE zeD&D11?T!VUJOjnCs=mcHRinMz8JAY+!|Xhy6dxiYfX4zCbpRRyT;Bs%Qa)z#m*Wh zcIFGa>Z8~hH}kBqvnO!kR*dIoK6X;vIl{xPg5#=MXG}SJH#v$`Z!vN=zp2F^#a6TUS$FR6>tfQUBEJ=aPTcaoah>QQy<`dg`#}^sHgV zWuJ?i{;*Te@$1+#Hv2kp6H{Dzj$PL-HhrBq_o#_0mY)8b*bj?Q2S z3+MO4J!d?7dcJuEd7gRh=vDU^Ha`t-+*)`?>pjhV5uV?;XR~W^y~pUOak-2Y@3R{Y zF>=Vqju$RFez|&I>$4(E{5a%LH-GW?y+_~M<)()`>cVY~=0VG8Zv1?5RkIrFgId%r zMjf*@G0g{t;9GGplT$tA#w%A`^_P#psgKSVU!1hM;D|cpAYqEd)7--ti<7MeT5WjA zwDH#mah=zrdRjg5;G?bM8+N(Laq+$AMeO_@Q_tdN%R%xtzvf`9S|^4droM%r7+m?! z*~az2{Mj^#zj!|DFfn>wy>#O<*AY*-;Mw7e=LXE(7ZjUt&etV9@C$?*0^4PPa-r&mzpWS`Mcz${LXO70pp{6+U z%^cY{adq7kQ(ipP53}Oj|6$`3Uu<XK*!g_c^zG<(F&5^25)0sEZu=j`|`#f4#C_#7~aaT21)H%yB;T;cHxn$G^I8{ZsnPIF&1ew5?LH*?^ZXZ6W5W9#R{)#sx%5|5X_wMMNIK0dM4&qrpC zIHoULy>M=Q$@G=CKFd|_s~K;6N3~48a^T=6`PN>oJ*}2GkLFhXdbQI&GY@ecYYuVE z$v#udniqyot+aDLZzRoa=ACncDK?(^L+dce(~pWz^Tchp8CR9eK4)VZk~?nFVBVd z(fWOL&jI)8`8;6fx3l}w#iLu6=t9hO`m)0CdG4kT#i|bsD#_Q9X<6Q5{CB9l_EIwka`q}Oc;f;4s zI_h8jz#G?5j`(SO_>XctA8Wo|Z|XhjeS4#Mt9{O`Iq*%tJ`_9G{3u60I{uYQo_sWZ z*y`e&wHPC<$BN5Olh${Q<6mQEE#<(m)>l0w4smBQ2l0o73uFbHK+{ovY6| znOykg$w!wr9vW_qow%?t^`UWnXBQtAe{tnEmK~SaaMem5Y#h$%?H0dZ=sUxk z{=K6Z-#vPk_} zAu#b9PvX$OcxnE|#J8ql)_9oKvpAY>#oSaSxMJw?7f)Xo^Qf%%{5cTYdbB3>qwCQ* zyB_Fcb2pYfG5qxjzCOwk58X8}ZTS4SvvG9&;Lm>!bDdoAGza$pGC9M@r-mcU#lLO$ z)_b$BJM?sPk5td=?)xrqU-R^~ea#c@qvsAi6=#p*Q472t;m|jSy7*zkA6*yX2n=q5 zlQf2N+E-!2(?>byI6FCqZG7srzB#tqH^G|c8sE8|PI(lt*Zubs%|RcmuYEK3W&6W? z%&)_qC-%|rzwf+=`--RcH;^a9ojY!_PjTX^4*Ov4H?`OIi7_9tu1|H}1Y6F__@Rt+<8mtkl9E6;j?XLJ9C6xb+Pg`zv5QxJa^xjvE@xqEE_(}p81YqR=o4x z7q1h$#?M&!%vC+?u(LkCDZNk59>GtU`0U;XkJe_*7glUGeJ-~6H0&CC_xD{F?*Z-! zy+_Pz+#a4{Zym|Jr-+{%@bg+YisyR}9Ob@E{_1)V9J6QFnY%qKf7cH^IgDM!GdbeA zDyBKl*jYn$gj@BDE9V*?=CatMnANw&&+~Fjy~Z~-I%Y18m=a-Pcwzi~mv=LB^Lt&MH&e3{pTWGpb&Yz~>YeXJ zJhS{P54O*E>-|{{G4XZJqgxZ0p0(lRixakYN&Ln5LzIdJEtv1YOkj8SNCn!(RUpVv267vajT;oZ2m-T#CWw%O#Q1L;U@-H{&Ti*Juq)} z^N+uH{(2c^&DHqKb;MIHcy{>WM%QNT3 zR}bVNGdBF3NBukU;cC3Pn=8M0nP2N0hdixyYsA-hyg0Ls1%yq zt2JNqk+Z)mnDsSY-s)TPiYL_|4j&x5@!dQf&vnhskKiV)x%%?0>j6LKrdHA(H!hx! z-MHGDZ{y8r?yKUDavb^2<&ak%ImwKzpEI_#Y>mXjsk=Ja4r@|>;uk;rmw)DH{f>My zM}LpP7Y}|?pXI8CYQ`IW)>7{$pE>y38S^YRe*U#r;%Cj(vii!?Jom8Ep{CWh=73Ri z>m~=^xg3p~gMQ5%&K<3x`8mYY1NAt>&se_tuNU(WgJb&VwIa^gRe9kEKKN?MuO@kD z$6WK)tMy&iTs`f3yv>&`XFl_Gs9~;$xV86i{PN*fhx2-xy}N$SdepC(qn^+8#ZeA5 z${|*c@W%OCH)H12G1tS`tgrdP)br=) z`+GBc+_QnW2J9cc^t=Z6^0!AlyNYi-E;_D!^E!)*w%$1NiOW}A#$b+cuxo7bG-2ay9Wt~GBt=DUPiNqwnT=FQIUydGx9Kj$kqe{r+V?B>_pJI9eP{Z4hmT%Ugez~Tv8fK1STi>}J<%mQ4oLfDL!#FXYVrPBjz!x@Od1ns1xa666 z^HrCzSxemKaQV~LgA^Cnxiw#F!IO`UHy*ki?8f=n^BE1UdEgLR zt<{aoGqIfUpUcslW?$I#E8eM_$C^XlIk#}Dk3YUyU-L0eJoo1~{+VO;pd560kLu$q ze|;)P{PI5RHJ9^fzts1+9^sm!*!tIenp6JfR4hJYq#Uzt-)l&(`$lUEn&H z;?i^7+grxwI85u_`n4BUfBTBQ3={5AS?~FCp!xHt%0~~`0VnyZrEKvD~8`SI5Fy}=E*8Ru!QxuuJGTx~Zi0d7_jiOHVh({6m~IX>-)$)4lWepLTH!ai!>*@xD^&nwNxUN;Aa>vP_3>;baQyX!vA zxmW5(nC=xf!Csa#zMkth!J5ap`r_*zb`xxKrK>NVw0BGI74nCd6TW*{Sh)3Fw6S!2 zbl8=v_n7#?eyIPwS@*u~MQLl^eb>I4`+ALmJsRhqe9pt3!-q*9AWz;W~5m9Pr|B z&g=UsTb;#Tg2uIb)$Tx;$J?g4t-(KQbH?)%PD{Ez8`qoJYO~ z!O>i&KFW2OZ^mX{hCdoBjy@W{j_*NnTqoBN#`VqrT;_1ZdlO&xwwuJ9!#1CDKJ6K^+Hi@n;-+tnSy9?wa~f|rSOSBOE-sw& zIIA~hmXE_GHHYUC&QaEA*+$Elw9IgUO%2UWS?V9OaVxh^JiTEw)=_$I zAF{8DnRqeweS1GU41Uu1#9ybLc*MZC zHUIikj~ch%y5{-jH4&d!e&dtJo+b6hcs}@S_e>H$zr5YYaZcWB^NJ(i%#ke@uCA?O z%8Li)2xsm+W8xE^uR3vgPLQr$KF>tHnL`Yje6T%_@Z-prEv6jh6+`4%*TZ~{`f}uh zm1oY4Z`Puo84FM5JdWm;4_9`*nLhI{Kl=seAL{C!e_b*L>mX;Sp~2 z!Q#Zz`;Nbf$j9H`V$AxDi=Fku@~t`e!_$s@G%3ebYi@q{=ejxPZ+)FNuYAVkCP(Wr z=hm9G$K&T`H?CjJ7e9aVJgV;~$C0lbIO|V7IhxyyE$_sMg>7$$jgLQjH%|wS_>EbU z`iEBxDF=MGeB}sRj`?>w>sWo3OFXG&yg0R*0*cpdr5YfKNDuUH3vJg_j+hmVgKk7qYe2cKN?nAeIiA}{Pw z-g>bQKa-?wTX>LzjUH7}tn*!Ksn0W(4=xGg z9x;8+$x)6Y-;1}qZq3&mc#eE(T63&E<3~MMYZiCp zQ*(1yFTUw>PL5)aYF>SD$5XGSKi^RfKK0nWOQ1@q|BDA6(e#qxBq@^=OUCX}mS(JIWCkjxfdZ&2jwYXbeAld&K|Fu6wq% zBEGBieFm{#8)w&R-*JX99;WLa&hw^t{-Zt9GpXyM8t8g%ENR@B9M*s|K66xS7_s@{ zZp=E7>tMDIfxolUPixw`9sSIqbq`}dSkKn9J%OuryAGzfbn)`Ee&uf6>DE3>b>(ku z>Gsb#OdN2J%6iYA1I?e;>1q8~ZS$)~%@ua8N4?{(SNWV<`(kOm5f2lO*!=nQj@`93 z^X4xmjQYzp`O6Ex<|-Daap&b)`O8axF#nxh*O?xfD?Mf2!^0lo#B{x;C$6v(uRYk1t|JV5@4Q!G%MbrT_&d9E_r2~fQ@8i#UYX<5p4hAKSB>Ls z|K0>U>&eD5`QmMS)s0WRVvhL2-xgc^IX!vLVe-FF?x*g#WM2D6wmp61Kl0rKdlY}? zJKyV`5!cn*%f8^9+v`8cX{P*ziRirY9D*`j(Igc``SK$;QSC6siSdbP9_gbPT*ZV-t8Mbbk~t33bGPT^bz+M1JQdd*SAJtXqtiWC z*BG4fo{O7vt=`GY?)mO#m~zdS_}7?fqQ#rXtOtH#!u4}fT8x_39QdZpSZguoVN9-S z7ssA*6f^ZV3Ytl6jSVy>UQ zi#_?WUCjG4c5y9y<}R-3&)P-ppS_EF!sqN_j-R`W`F-9lj+bAk(-`~|JX7#rN7VCt zi1|<1Pxs?{-nMPuxyyI#@@>0(%P!xz%bR!c|2Y2IUEa9M>vwt0E?>OM%XWF`E-%^T zx&3{{&hd(!YnPYp^2NKnW|!CR^2S}hb{GF| ze%91FTYLNA6L+z1>?Qllp0oGtw|)=8Ub25~b4}QP_N0Ak@7mAyw>@ni+q;kLVvpLF z_M-h~&)H}8R{Lo;x6i*XFS@V!*xU9^Pw$zYu$Rsq_MQFjT2T|}UNN=(YOk3u5##!R zalM3XKiV(Gozr6A^bIyYUt>7+hOQ1cT;!!9>H+wWdr z8`%0#KjogBgVF;Ul@`*db%7d%* z6O(N$ZnnC}tO1@cZg|++uA};Kx;K!nt5xe?eU?vt^RRvsTR&zG)!RN#w{CQ6Qx8|Z z`dm!8m>^CoNFn$)*+^HD!v{`z*49Qt~+=4%e;`Q*85J;I%2{^2SG> z>lOde+=^Y-(m9Dw?NhvCbq?d49OXFjt$A@&13mf6Q;z4d=4&l-tv>lKTMu|~#Co(Q z%_(iX{_#!!O>@XO^R8U@rmwu~+|+ax4yK;RqxY>*TpE+=e%}2*u9=aUi<9EJ2 zLcc%Q=aczf>7GsO8`2ov=aeH%xN{iKv~|q>C+)q)>2j=?{B&d0YLDQ$4AUMjhAw~c z)|EXm;rJ7{{Y&Df_HV>?dG_BG?Y?{a*gdtFyI#-FUiH%)I?CsB-Rtf*okR`K zm81HP=1~6hxjG&MNByJgoxE&$*=hY_>jB$(v5z>!&-&vL-+I(fJmsEoGrqVqjv0R$ zhnOklpB%X2C~sOU8-C5tS0Cte9OA2C=AShbPluiQy7^r{=Qw8l)v@-mI`D*<8s7Pg ztAAq4PoLwM@sp?A@l1|zX_)e+i%S<@9mTF1ew7)Uy~Fn7x&0ib=e!=+7p@=olgsYK z)=kao=zh4H&wOv`zWIswZ{!#1O;5Ww<2`rWhoA1bFwVQbitD;w?W1cIw(A8x%=FJ| zdt&(8=hGIOzw1X2*tGtw7(OvD?XlbB5=+X=N zL$$lFsoOouHR3+wx^cLU`MdA57sSs#H*fI-e&(9k`gJZw+{%A0W@4|CLv1rA-n5$7 zaP00MN8E7Dfo|?%$WcuE#jP>bv2w3?apk!zrg^M+;!8Ka>T+~npLq5Wp0E4=I_^Bq zso|3~X5zBrFJ{|*_-z-zyYc2-zh)Qj0FRM-ySUhh0RedKHGD!nbAGmqxGr#u~T zsnzd^I4LH&y2xw@jn0izW=&^8?kM_?{PWw?SbB3o_yES z{{L>Sm2-zZZrmPp-O2B|vsYYaYI5jx*WA%{A#TcbFyU{4o!3h7t8SlP2P+nS<(TL3 zrRUgche^+IKIe_CdSbIzOy`YX#&;X+qxv3dp4QWx>=*meezY&`Ti1_$>mFd=x;`DQ z&7K$V^{w8}eE8V-*!bG>@|JsI;0PQkMh%z68as*=PuBbUxsBIznO2w9K}}m%*CGhy3dQB>j$^aZ_Otr zSz~9;nJ@gzTb*k@9N||jp3K;Cp37Ix`7E0;Yd$>1l#lkiVskyO%2%v8h~1ui$=kQ> z$M$F9_wM3%?0>^9Kl`?e--mwLD|UOA-|+aw@7#ayu77O*z5AEEQXYBr+P-$}yWU;X zju-FJ^Q*nvoKArKKh*;J?)%PD{1ZR%^tSzvPl&(l&~N$GAqRf7sLg%B9MvTcF1=Qx zdCTc{80GVO(+u51EHjY(ahbzp3;Jhx!ZR=d) zE<0~ttG+Des{y)`EA|Qap_l2TkgEJV)~>Ufi^+C%%=dnyRJzbX?W5 za#hbcj_OZW!>Wx>u31YqOtrD&IO4`tkLtzL&7;`(@=x8|@J)`RTB>R4$yH6}6xU_B zFB`*EZ{kW9m!35o*>M$5&pBL|M@)Tcj$)I^x!TTG*AME+NuD#m`~Cy)q~7wer+;ez z_qpSR^zRIK-g<7C?<$^&*A?sWfsj4zetgf{?*5&D=YDN`p#PnL-uLId(RJUwt$R`X zwCCY^Z|?r&`k(vPbG>JR9O3xp{RBU3_mA>AC$O#=^{&`zq33-HUM=x9N4WK#h7(r2 zar2K?ejIaN>cN3CJUi^XF8N>yY%$Kmf=R%>F8#QBlUR}Isi`01babug_#Im}s~oYQ1- z=C3zl&gF_9{)nesmi=HgT>Y@zdu#f84HH(s>xZt8x@Gb4>nhT-lSK z|2n-g@5_2+JpNfrxsGCw<~DseljbQ0nf`p2<-l9aWjSD)NBHKze>69^qx$&btH!jx zlgXWL%>grgajbbKpBU$1(|qp#4{FWjS?hBy-(~AzK5*t>Jz5jzN#oT%{nyP=O#HKt z#*T8Vz8RyI#%WT0D=vS!^y?5bG8ox7=GGe`KiCjQ75o-W6c4^PtE zCU>!6aDmkZt?r&KJ)xuFZ=s(@&11G@0W||eNm`q zidgr3hrMSUj(Crp?~=yJ9K&(+Y?>VBFu2#Ta@arQIvDjQYrOqM8mG@;_{%G1?&0>( z#LV%zkGB`-->0`9&aK(GzSg_qFI&^+gQNOs`yqYV-e?Z4dG_R(@z>!Hj|X;@b^dcd z&OO#WXpKM0e-%eLrxxS<=sMu55AJd78Jk^RTFjK$&*oAbJ!5CQxS7A$qdLxUh%bL@ zF?nX(thu;!v2^*n=f|>4-YJ#XSTmvhF?`Og}9wv~I$ds!Tw zo_)oqi(B=~J>&6Q9Cv@8-gVL*bIoVFw>Ccg^O~9%{`SYT#pcJ&wpQ%caK-S$g@M0K zE^)ZZ%Rb6gK6rT_g}+ZX-=t@R+K&V-OnSvx6Ta(Ui;auUw`#oPCfJq3dG*DYKEj3% zlb%?O?ctUGT#Ovo#j1u}cHNkA&?~nb)je@+dHTMtd&p5u#f7K$zd8T@7uw&aA6*YUOIO{s zHuv_5>HH?xVy>gFllwY64-4aZyeW6r@MUrFUKbmVepKH>&DVOW(LQvK@oaMs@ILDL z^!#ysdLMO7J6xO2VM%?Pb7ptX!pFwP7SsMLCTzOXQZWAz`!p7X7-=g!Z?ANkL5tp20e ze6Z{_=Bo4J&*`h;kH(L-Gpaii>Kq8dSb6@pX0o4{1I+)W*^~h;){pA zN!(@FooYWmH2yx_v+TB?QFO`Y6rW}KJmY=qy3%K%>*6P_SnD|bclKRBp3gmS*?r{s z8rweZd*8YJ{BM2d_Tzu}omc%E2s`H0JNDIk%&UC{(ku5)_W|EgxQ<=Zj(#TA{lR>E z2J@M#qt8mP@4oLm#s62|{7C*g3Fc|O-oMOeJ~!Goeb(%|7xRY;n;i!pvGs@6+di+- z^E;X1S1m5CwU%n4=N!sAV<$&(vmSPWt9Q}KF?p+n##d~*&*1TxS26I#6+3If(P#a5 z=*czbbHugQG5LHCFuBCztA@0F91rd9%;IT}Usl(g+vJIZPSk|6KFxY&EPIXVoUSgl z;#${lauvrXuK08{(X-$6r&`w7;`{r-SrcD#({~*BW-Y}RN2@_BaUSY?`RA8q@r7^VOg9jE|2mE_!muN8`|=qqUPWY_-ff znqR(^tGqZ!=i%c{8!yjpZg>Aq!o}YS`+wT&*(dCxKacIAXP>x>b^fGXtluZ^VhuiJ z7yI^8cX4ff+AgmBPv6CT?q$2Ur+>ySo?D-}i|6`h?cy2q*}Hhgf6gwR*`K?M=k@39 z;&}Omdgj?LMtqu`;J=Qj2X1Qi!#3HFaYW1r}`^}FtSo;~UB*+0<#PJ){4 zA=iL;xHf3w-!w61AGbGM3+CFmID441?~Lh-`LWA^t9aV=Dc|(5d$tu{+^QQFBVW3; zaJ|=OSRyBX^|@B>?Q)YtKOAD&&EGtm3tJt|^RtQhRd4o+F>VY#TOR!+`QxFptw}L# zJ$7!t5_N@_qkS9(UM@M#<-$98#EQe!oY>V_O?+YC`S;_Y{5|_zCu=p=$zCG*K5cVK z)J}}^wU-;`H{N-@k|$qr;o_YBeENoiCh-@`$DWw>S^45}9(MA~*f2Af@rl7v-ramC z>(q7R-s#Z4^`4`Su914D&gS1-XZ>vZi%h@0$~XIBj?FW>Yb0*|eAAwLx^evcm*r4X z`1(9~r;Q8ek#F+2w{?BNs`Kqsct)+8fobbI0!7Pe~;M||?akoM`U1+MzD+oxji60xM~tzONVs~4_$RA1b3dH*#J zhnRJ4Ge;t4;&2nk%%K(sF7a{X6U*li z?;Iy_%r^WJ5UpU&h+O2Ka^z;>Do%xG}oxc3-m3raa zz97>VE`Hkh%)#e;`sB?Qp01XBF!|1{hhBC6k*i*{Mtt%m<(+={$czo2uRQ{X+c^nG z<224zcVm3zT|YCx$bpN7#Z!*z%%5KQ@sy*O>VW0TUtf*mBi5FmT^!qefG(!{!x3Nn zw48C#lOtQ6_7r@=N3L4)YG{pGbG);b^5<*b<}}xXpVWJ6B9>2%)(KDkV&A#?Y5n4-%R6(~Q}Psp zqkX35 zAHH+;nj5ZKY4e4fd@#kv8xCLmbn9N3HRc?bBkpjxw_E((>22O0#q_@DUDEyD z_mA$i4)@ymJwN}vU)whXk66znF%x4wCuTlVU`czUI6CgM{=kJ1*I3#(T)Y!g4&&Fw z;GJ>ti?>c>V&?e7Y>&vlTh$urp*7PV>u(O$U;Wlw?GE#s>o0z;-|UT;t{vR=Li=H^ z1KjM5Yk?Fq`CHdD#x+BZ_QI@5{au?~bC<=mro}a%b&cmb7gHWFa#j0`Z62`YV7nKP z$vb;AvF0s@!{^Q!Q!U}Ux705=)Hb=RJ50KH+%!g9^TFjjF1cHWcz4$`_d@eIih;pl zoH+2j|M=mzUHrcb-n{GA?Bd@tdW_uL?Ok5;ifw!IF5kJ!55L0vt&6>2j~;zKZy)Nf zesyz6LsD6 z-!V9vpZV6~_WzM~k2vyQ$2YHm>)>yLc|LO7rmjaZ=DDopqcoqpHNXBf>0bJ<*Y0jT z9)6D>_8Q*t->uz$M>(n|eXh2Z8%|7dbFM4a=eCI#9OZcNF0KuGy!DW`qgvp;{l4=Q`{WNky={Ns39;vn z+gyLHXPni9L)}Mv(wx)`+kK*Im7j#6r_31K&A+%c*7>Yu))RK}XRk3cF3hSYrg~sz z9(%et_PLlaQ+M4=zBxYauzc+6#1ubcr|+B{o(^-Q8=v@m;pcfcW7+BOjjiY5roQ<1 zi{J9pcE$Iw`@j2jZ^zzyDA(Wi`lt7AtuDR(_US%zzv|x7JtXZ~pVv(DS93A071w__ zd#!Qz2mYRC?TB&z1hd$1gOS zeCQnaAB*qvjJ|s&-1Xo?XXoF|^sWPk9r&{2=b~rhAK9N5zi)q5ypRvizxUpMF23ge zbMae01!;I0FA9k}bjT?g(uaMyvm4%~I%t^%d(H?mBSSfx8aeb>OZ8cOAIvz+DGE$U1P@ zXU@B^_x|R+6Vsc1>_UI}-@niw{f{p6*Z<=S{l1^P&~N&u7y57f zvkU#@|KdV_^ow4xIllhqo%Bn-{1=`6?X8n<|Bv4{y!S2J_S(1Sc|`O#{~pXUGM=l?4g{rK`9 zxxoG5AHC3T_&XQ+-aow1-*~^zAGY-QYyQc__?bTA|C8VBc-aMR`^-gu_WkqEz0gm+ z{>IwhZ+5(RH{S9)_rKTN*YHs}W_|Y8qg3Bxdz1W|YV+^){r~z_pZ~vu<0tm|FRX3* zN4q`cpX}%4pAAe{f9KQjJ9Z$YOEL!}H&2=--Qo$MceSCXxRA82=UnS^xdk{%u$KBkqg;-%8@y^^v=L)Gi;r z%S(5e|BmQUebuN=cGum!_SSV<=Vo5!)LhJ?`ujI$)vL~<8h7`8yyV_VZ6E%OW{{pk z-?I0b{E1!u(0%#pUGI>)bvO9N8G#6A9Y`U>Aj=R9Y?;S&my?I%dPU>-RC{-BG>!> z>%Lr{e#dSnYrOMw9PalW#nU(8D4w1i&gXk5`{*6MXJ*ezdh)FA&T$@n9x)$+b85CEj}4`&IL~&0Om7IbF`F`%d<Hzb-uH%zxKxwM>U_* z*O^N>)c-=eUd$(1uU*$|>v^R0<=mR?p(kF~-nuT%>-*fN_4!C2<)3>@zH>)w)_zT& zyIzj+|IGclu5&rJucp7bmiMZ;%${b?xm|U={DZyLq@1fZ_XjbTwO7?kt6A^o{j+Bb z-ScJTa4!B|-WNO_`0Ufk`JkRJYaQq2B6o6~=S%acC(p-RuG(X2@C;b5{p&to&dsU0 z-929}epb3(`)9v@I5lqnKEjv8yZq~){{Hu;-lO{2$NKXRKL`2hUF!Xv{^03=>*U<= ze2<;0NcCL=o!^b8kJ&1PgXUTn!)6dK4XO8vz*S?qS_aX27)q5vw zzdzXT_1*uy!2RFey#KxLc7Yo|ckbtA7y8@Z|NZcZ@R_*nV*KyiAJ6~ZFH?7iY5A`A zi~pTGA9y|M+aDS4d(`SXb?D3g%Dt2B`}M2VcmMwVg#VfQzyG;?^2Pb~Y4`Q}zi*oJ zw?5X!?fFF090^r~(9{FC+aS8vuI$SwFd3pMJ7l_G`E8Q%}|(+^tVOS#RC%?4NkD-t+6W?GsMc zWB=Z^ef-J#q22n}ll9@R+kZpuWW8m#KKjD?4f}7=ovgq375ne3ovhdV#{K`4eqsFw z`{%Qh_2ldK-`G1@e|@(;>}0*y1zB zAM{Svdv@!6A7;P2=eKX$zc^WsyziZom>SVq4jobE* zPu92X)<3!!{XN_E4^P&If7Q1A{gd^YH*MSBJ6YTB-L}7TvcCAg+_oP(S?}GgzkRY^ z_BGq~|DLQry<6|Tu>R|9`EFL?KXS63_ygPaH!iIIX50Rsll4tsw{8FT$@=g= zv~B;_$$Gt#=eDk)w{lfYmw(V^v>s!BJ+rIB)J@%Gu``!!dk8Rs`pRCva@ooF_ zC+jVLV%xs!Wc~Hs`rl91%fD&c{zAFZ z*YDQLPu6eQtLo8S5MYo+^v_KtRL8|UvRSCwOc>`Wc~HsdhyBnq22O>kzcU=@NWIf z(+WPlTR(fUess6~*~xm(ZvFJh`tjZRCnxK@yY-VN>nC^X|2SDcy<6XTvVL~A{@0VW z{ZISi3_{20@O$0wtGzjn@9+2c_1LZFT=#X|_dTDP`?|0Dnz^nUeJbUlaVZ~t zBo&}BsStf26`@h77`-Qzpb@DQy)BiYVJV2-kjha)3ZYk}3N$2DqL-v9G$>W0=cO7n zAl0I0r8?9vh0)VeJ?fJp=n1I-#id46uGgpu?Jq@9P-;QPNHJ6;wW1@XHdHCKqr;>Q zR3UYuL!>SglDg4>QV)7Sd(exzr8v4@>O=QQ{pen40Ch=&=pJbZ-7O{1UD7b>luEZw zF}F!&=vJu`bx2`!yA(mUNPXx=sUNjT!{{by65T9Kp&KN#bBeiEN=Mg7e$*-zqU)q$ zbhVV+CBOx_)Nn+KIovKqhe@rdQtC!WNWEy0 zRC!d2IaCT9onj7_lFy}>h0+u%mplV0=0KYd9VF$W1Ee~%uM|f6NKGgxwWIx{PP9Pk zc{RoCDfOaKX%OutjiJ4z3ABgQkw`JSN}XsIDUM2{1lmm+K|4#aH&V#f(kRN8l4uLb^InSCQu3kAq{h({ zv$52KHj>&Y4W$&96#^`vx^EBVp-QX$$vDn{!{V`wdD9IYu$BfsSPFvYAb z`Oz9u^>~U|RjNTgDS}p$VrX@#4b7KECQ?k6G>Ya)N#vD0pQo5?$%p1j>EEW947(Ji zOSvdhDnfIl5|k#5eV1ZVq^_wH;|!z8G{rxrn14$p=w~T}W~5s5A1RFfB}M2q{6T6! zQ&J55D0QKqq#pFWRGXS=zLDzC*HR-&N^R&{sRMl_rF&A%=aL6aNV(_>sR(^3m7ve0 zp1G;!W2qN?Bn_f*X$*ZLO`s2@N^h!JAyuJKDU3dlqUfJe481Rn%uhA%NTcX&DTziT zk1y4{EBVk{QXIW5^`V56KyOGB=uIh!UXzM*Qq9X!33^Eip&_Xjy&{Fti_+MdspcQj zI2w?q(esjTtyJ@ZEOYP_hsTVyd z^`XB>p3PFtUnMVkL<*o@sTe&fm7<5G&Vp3)fYgP$r9SkaG>jgSM$!FJ`_`%E9;pM} zE%l-ah9H?NTGUMH)aiN`t6P8bvorQ|M-C z2HhZe?npJ)N?vr06hN&~F}hAFMORDHccz*vq#4vA`8re0l~O*sN-9Ln(!^b<<}zs# zT`HNoQ%zLzqvcWnT_QEzpK6v$QPe24ql=|pv`p$l7fFQ=q?*4-Md*Afh#I77bb(Zh z&XYzSN;PLoqo`g=qH`oqPpUar@}VVCvK`-(#ufM9GhilPaG`HAhQTs7eZ>W27iLR*Ipc zq^4(6&Ea+_I!tOul~OM{Lh3_{r0RiGbEs6fWturiDnbWJK@_t2(7{qIS}1j+eWV_= zKpH^%OQYxjX&jYF$sN*6sWgT5kUTr4nLVWda)w%FntZgoG`3Tk*+m*hJ4@4OSIJkL zW=bSKDwYyErd6ha=UtTN4{+odQ?szMo3J<60CP^uI-lAeEQ;;1z9%UtIj5q~z#{4DjMe@O}S zZ)pO}NJ%s;O%J7+DQO0MFZo_cGe1cA=trp#eJ2&alV-k_O3+tQ2z?{fqNEf?lT!Y> zX=XwyK%Ysa=yRzOeIZq&PbL5RY33s-7kwxdqK~B@8ka(7OzIs=Gow-*y)O-+71B8R zK$=AFN!1^vnYX1H^p+Gs??^E;BDJAm$@58?Nl0GwniN2*Fx<1{sOEc(Z$#-_T zxkbuHw@QWRCTZfFbaTBliLR5(x#{Kx$&cEk0BV&+BIzb3jiRfhB)VGioR@B{k$mV% zss6%rbGZ~j%cU07EOnw5sT)P5Kx4XTlJd|psTf@%h0vu^CAwG|yg1!lC=HsZ1vn<^-NWn|fO++e3=StP+JSl?Cmm1MIQvPM><}9fIohg-~B~m4-m#R@%>bgAL z)JfgwRH+}GCXJxer7?7h6u2tgoFwI;6QyEwvJ^tKQYEU9`dZUXwbYM}m4?xA(j+=w znnK4&ZP%xpDyh0H-5e#03Q8SoWSBCk6YVX<(E=%f_K`-=UQ%qW470n`iguH_ z&>m7hDwPINiBzy&hAEZ`(N0ns+F7bXyGS)?M`>jJ46~gyinf)KXnV=CL53-ke5g=r z+%UrwNKI%szGZ@5wxxpL%C8L@=GIIWtbdk6s;~L(HfFx>kPA|^X`$S~N{I%-=H1 z_mUq?Ndc6UM&cP}QW`~HN=fvU9d@cFV7gGJx8Rk(ipl&nnqoc z`7*EY5bfFYM=S%UlOmmLZht8G~=v-+6 zMWiIEm&UU)P1r6)XGk;XOex2kY0i>z(dkm{{7iF-REHKzjp$UV4b@2F!O%{q1Ug8XKp`oK%B8N&GEGqGM*B+rXg_HL?Jtd? zeWbFjGR?~rK))g*KIX&_+_AB-5-f<)QVYVzhx2LIJ4~l~-eP=ZpFR)JEbD)ft%nnjsrMjAXU)BG$|R%V(X zr7HA;6h=QuQ8X>Z(3I46e5OfC?dTh+2Yo9IqVJ>x`dW(CWSTFe7WBE)fxeXDXj1A& z6H?wOnPyzdM;}Wi=o6^|eJWLd&_5+pmubc%4;qysr)QcGsR6ws z#n8J_7kW?XL2pabXJ(o=q#5+OIyd=}~+NJ2PQXhI$8b*&vqv#Q-q&d?(D3ziIqzd$qREK(`dekj>ugNrB zk`LV@<)M3}5_F$bhVGVXuFEucNVVv8sR7+7wW3a`9d$^hH)NVyCC`nSrd?{gDbuvs zeCP(L2i+(QqMM`yx?URT%rw_Xqv&cWiLRAAcV(JZ$%kUn;N6*~MH)iQ(iplznnqVj z=AKM*xm44gX)cv&(Irv?x=dM`;yEx#%>h5S<|fQCJG0I;kyA zt3YZ;CrdqOu{4NIkrL=6sq{%&1yUJ0PO3yFNMTeXMNqXA|2wS$sSh0`CD75*1Ug1a zq9dj87ibIErD%~fgASK+25C`9xu`933J}q64L-w`dDUQM8}b zjt-D|QMuHIg3{;+Z2@Tv?JZ5A1(Nq&S`<CBwv&npz}8X;+DZzcZKPUMD1}jhluw}Yr2@2> zREjp2D$y2FHQH1f;04-98bljPqiADk3gt;NC?JJ-(Q>7Fw5}9I>q#AGeW?qrBl&r= ztSRN9HKancmJ~#ODTH#QHr`4;sU6LideExUAX-gIpjD*Ev2)BksR7NEVkk@MLSCr{ zd89Z8N4nI9(xe2+kS0*3ltigg@o96+FEk)%Gob%SA@r+Mi;VJx(TviDIiRPd5%iNZ ziT)*}QyKg$dC`wj4OPXIG)e{Wozycr$9ygIqOYVu^o=xzlF|g4l#-v$F%!}h`b_eC zHphG}1<)5#KKfJ|o0wxhlE%@8(lq*5@_jzXj7xqrCMCX@V>ld$#xQzcnm{Wgr=jwJ zgy@!~scK6M9E#M;wNvb)sR(|J@vukaE#$QXzU>3Zgfp5TZ(;Z2#08 z^O7`xUX(`A%Tf{zNz;gGhZ3dJbIgELhMtou(LbaxdR~g4XQjZu=9s6YJoJ=QjHvin zUkLR}m8ehh{d{J zE`Hmka&)s)jc$=5=vJu_-6R!rS$(}!g07Q7h=vAhu0?H97`00IT(HNa0(6yBimsL_ z5e*#5R--GW0lES%mj=;tX%x|PBHt8hk!Da-3e#oKB-Nv3QWViVqeKU~RO&((Oa4ne z=0YhKT_6>ri=-fGltQRMYNI0~BDJG)r5<#iG>FcZ66hQ$a=FKxB{d+L(CkYL(fCDO zs9x$pVQHFtV^pc*OX29K$h z{ODMz039clq2r};bd1#5<}p=L?oA$Zq?Dvv_AqG*Es{JbbIsvW098u)s6r~tn(JK5 z@yv@57kDU$4wkCXAyO?mPzuluy}y))_LGXy0a6H+OO+@n`RJ}LlXB4BQa)NBm7;y5 zAlggnrki|ssR!*Q4WK=wQB*38qY|l-uJdB43hg9?(aus7?IOj{j*`=5znzqhww3&7 zd#Ml=NyVs8YNSKIKx#r;N^OV^5Te$DwwB^(3#od&xn@(T25llm&}LE$bM&N$Fe7HLFM?*UmNbq){|iN}?>u(>m99B_Hxg{#)mobSW35Nrfmw z3ZhIYgi<9>$6WIZA2!gBf&L=}5FLr66(j!euN2W8iKcI#Yv}w$Gw3JDcgI{q_aA5 zr4#qhHJ?h8=o88LVEZ%4kLbQ8UjU6uwGYiTV^SUZr__i(l-kfoQU{`AoU*~5x#m5o z9K9=5Bf8vK8bPB{BN~ySPs}yLQVV)h>OgNvarCy-kKT|xPtP^4N?!De6hN;@#V8?_ zq9LjCxw&Rg>Oy=x!M^mN7o}nJk~E6=xPzrd|CnnAr0(bE8a_TDt&y(`JuNk%r=&LY zcc};QaSZw5s88zOX`YEo1Bj21SUQ3pmy+lSX&UkI6H9ye>eC}qFM3!SM1PgWP_HzB zdZZ4%BGoN*qWh&ddO%8`2c;2opH#xvuL!h;sYk$IpyeMsRHrA7HO5}9jO}ekr`<zP)E&7MliJp{t5Fd`Rv=2Qb4WfIc zVRWZ7f^LyU(GAi#x>}k*%~BFwB2A%-q-k`XRCL-rvy-l^O3}7bIoeXHM4L!8XalJh ztu57|)unorEk)2AsS%|}P3Yf>WEA}%4WKWj1o}i8MgNp0(7VzUdQ+N4uShfK1u2~` zkUk@M(36r6Ju2m(ha^9`SE@j_N!92^sSaH$MbH&e6S_=_qNP#``is#6Hl4zkcgZ7m?XUsEuN;zm($&YrBa?v(Y9@<>WM;l9pXg#S2ttAzs zRi%3LlTMF~=v%1;eJQn}Poz%tPpJpJEA^r`r8s&;>PIg~1LzrP2t6q!(4*2Y;*`X@ zIGwNd-X;0aZBj0}QOZX&7RXnGu8>O6Wl|YhDh1JBq!2n=sz7H*RcNtPjZTni(9u#W zI#lXF3#D$fuM|gnN&{$DDS>v7hS4_C2-;j4LmNxuh$b6*KZ(|ol4we0(m1Nw*5i2g1$p~t0O^pMn# z?v;knoze)pMH)q1TJVg<5SJxr0yRsM=n`oPT_jDT^CWZDJhMbfN2f_%bh6|_$4NQp zD5(q`EQQbkQWaVt)uKJ5I<&JCM%zmfw3XC=Hj|prhEf!*E5*;1zjM;(793@I#X&#r%IjZM5znWdB=0>K}Sfv z=uoK-EtLAvzS02NQ<^~M=u9$+_-YGlNuqP5DYQhIMrTRs3=^;=JSbbWlovgtr9Na! ztqkE(Rbf(G{qOeqgY>85|oA$H}eX9~dWJ{DITcQ%#5>@CZ<*P>X zr5bdG)?ABDm+Fx%5kYq;UjsTqYDBg~6S5^@=xmj3MGvSxXmiz$PSes3SKY{#=t2Kc ziC$N6H(#HtL1aq|p`%nH;c6JwX&WQ1#*r;Cfw(N;6`XXHbn{KQa)x}^66t8JN_bp( z(W%;o&s8q6B?9OOmB@3I@8&CTRg7$j67)A6p{1_M&?(wR&{YMpB`VPzZKKLnwVSWT zRT$N4E%oRKZ6o5U0WH?jMprG!mWZK8Rif2Zo13rQRTr`)x)Gg_&Qa#77u9MTaaRM# zmKa2bYa2tZ5^la>S7XSQ7)Q6*e6I$7IDx|%_@gfmo!&Q$g)-IWK~5?)t+WJ~0t zJyas#Di58cZREQuLbgOPx>+SkT$Q@{%3K9eSfk0y(TQ4L$W5z2HA<^=)2h%3N~?C$ zYS8gYt98@r&~Zu&yJ_{PT4@nCtpOdYv_?0r2_2)fsGHV;j#gUCO>0F}N^5h|+R;%; z^A1pBNyk#sT!3?HE3U{7VRU|p#@SHl}YtzZz+Pxr3Q3>)QEyo6FNeQqFtpH zw7(QXcWV4ATt66ixI${_F+ zQVSZDI?xAF9Q{-3NAF7!hL^u1HK4bp7#fkf(7RF(dP@p0aQ$^D4<)2x^oA5dZ%UQu zHEEE+>@Q10=p|_k4N24J70KjenHQxngXsSu)uRC^ik_D`&ubGm(;-|3Aam~s6&dQJER1h`$}bKAE^=rr7+r0 zil7D3#A#V(PiYdBO3nl`dr5w@w-i8oNcoX0v#V5qc9BX^iBySpld93qQticAW(TPb z6-kX~N2v|%Bz2(erOKu(vyD`RwwA)EP>P~$r5M^u8o4aXY%YzWd?|^xkUY^Wv!&!i zn@MrBvDAk)k`gFSnn0UKNwlFCR-Z2G0V)A#*s&wM)M@!O<5*O z@}oIY^yVy+CbghcsRN};ag-tTqZDcIt}OE(hBEW%9Ga2F&@a+7`c-l!m-@Hl>B%w- zFQtSRG2|2l(6m&H7;;KlDf&U0emKi~E6pH=wX)RrNS66d%17Tzh3Fe;;;*y?q)GIJ zATyisQ5eq!RRj6haJ9W_`8j zLn(|_NMldX7Ldl#h%}AflYCFoqLBQE;n%Ds`V?&esRg|ub)aD>j^2{`(d&{kec3Bg zI$}^bYw@F3r9$+YRE%DhBG1znkQ&hQQVb1BUFb!r2mM3J8KNy9`BA@AfS#4g&~s8b z`n!~Tg*Jnf{~E0VDW0HJAoZcgqy&mf6X)u0|Jf*z4#=&w>6dPwRR zrBxtxqWh#c>Xs7d0cix?D~)|hOF4#}C2 z@^;CCZjnNhv=pQY)F#!Uo1{i`vlK-)NQGa~Qjm(!HBu0@O4aB(sTN%=g@2-@Al0K5 zDT=O?I?z>87iyN0Khsi>rqHF5=ijs~qySnj<)cfa@GrC!qUMT(+2sRNxRb)m&l57RuJDD|QmX%L+xjiHmJ33P(g!4#3lN}cE!DUPb81UgO{ zK}SmgCYn4#%0rb>F>Rk~7)sp;9_JMDn8wsSquaiqXMRCDU3il&Vm< z6h;S1QFM?LLkCDBOftK#G>Z0-k|-#7^1Nn0$%ht5l}uH;r&NVXr7+q{ilV)x7}`VX zVv^6@q%kJE-Bk)R3GPl(J=#%w&X>ADS+0IiqX1KDOyXKK&wlWXf?^1Xfj9gqcx-eT2&fh;^S;-6nUj2 zT1E0OUFCeqhq9!~g$Ao^ZP zpl_s+YOncH8bx17Ni->Wj`NzYBp>=*@}KH8pGdiATq;DLNoqS(!{~Ww0u4$g;x#Wy9`p~X?gFoQMhc^TsR=P5 z6R&wYdQR#@f0yDHdd*W(@*=N!Qfgf4HGh+u5EDjGwhhIl9`v{rM@%v0yqlJJ&BIaw zV&W^(O3@=yC1PqT(y9?tWue+DyoO1*P#wBYYDC>q8)CvOmUf_frLG&ihH1b^>qblx zhWgRn(g?ao8beGl#?rPMz2-Kl9o;JRpblve-7Y22Et3BhuenjmMQu_cx=9M6o23w9 zDm1n+jjoku&^40pRCdR0^QwQa-vwYPsKQmP#?yD0QNXr9QMw8bB9GBi&wefzhxUO~gwBzI zC?Zv(^Q2mIwlwlE?E`5Pg{34qOY%HI`#|!cGbDc>?E@(nogx*YIw^=wlR{{*RQWvZ z1E~ttNMUr66h$XXF?50y9Hf09m7`;%YE&&n&~Z{DI$A1ziS~h1f-0pDI#Q}dM@eCH zxHR@M?E`5X9U@Jm3duJ_`#|!egQe)Jv=5{fR4#R(1En}RNa{xiNQJM{K9GvgK2i_` zrE0XFREri!BX80^kVa9dltg<;o?+Stk`L`6RlY;3K&nE!NMTeWMbU0j4DBo>-ltU{ z4WlAy0_`Z7QQ8)g2W>CaeMqZ73L_>kr093F52P04mpafoQXH)-^`o_< z!5P{I(hyor8bdkKG+IM4|Dk;##eboFAoU@ylt8OU6KKAaL|Iao$u@JOZj>qYBPI+b zk|SuYG=?&yP-?bGkt&dpYEi1xh|;7e`juNbQLm+En}16)=x527k!@zAeDoiw5dBN) zn3HXOkU9~Qu(FmoVscfKKtD+%=zA$RFWY=0m7}kvYLt{Bi0NG^+laoB`d7&|OcG1l z0AdPRG=jd6lITlm8hs`eubyo_mP*h^QV20QEoE!bCsG(O#Vu*W{%o^C8bM60OWGv* zKuTXb+x%1VqW7hqb+Qc;`I0Y^n{D2aJnLthH*G$|w81P5pkb*Py(N{R*QK5fvdt?} zFB*~t5z`t|b_~5HO`w;h-|3ZPD@7~Lh6 zqT8jOJ+sX%QZH(k2GOn37`jcGKsQU3W!dHisR~^$g;ARnMK?+@be%M^Z??Hw8bvWF ziLQ}6!EAG_6t2oP=SlS_B1O^pQV05r)P>HKs*lMwOQaffmJ~ttQVg9f zwV^YmnG>?jX_BeQHg!@CI$bJ2XGlfpRH^I4Y;&^IjZTvKQLQwB7E5F3L@898ZH|*F zP_CXJ!Pr3rMX zR2a@S2T4WfKq-hqQZ+hQsznQ>k+ZVRe$prkN=d{7^c=~aCE4Zx$%popLg!|iy`>7Y zmsE?&q(-zrilRNGhKsVzZgwduky_F2Qa9Q|>P5Rs;icJTC#fFoC`D1R)PZ)Ey3h_% zSv1>hD+N)ZRE4&a>e2R61KLJvZ_YMbN*!nmsTUPULue~$7;P>^uE;i6hv!F=9X-;hLnzSBtKeH zDnx5Z#b|Y@{f=xiU+O@sNWI7>4WU(~VU#TeJ2~%5<;Wvdqj^#UWl4=_j+DHc^S(5N zQYFtl*(O~IpbRM=rAXoXIPY^q6y_j6Gg1`&B6T3==39&;ME{mT_jBHtD$tKoEt-}Z z(Z8f9`aw!O$a!BHMoDP`eJ7cRXgx?C^o9+HyieyR9NS_M)Gx?2jNE~ysX zD}~Wrl7Es`fs~6nq(XFu6hwDQA#|Hm`6I0YsS0tcAC8JJYL}wu7Ab~qlt%tVt3Vn> ztx^(QFL{2ZZ6Wy(x1VBtmH(ktAXT9&r7+@#RVd}2t1a(Rc=vJu-af>TwYv>xO1+_@Ss8{`tW9UI?5_L(_=ng4;>s3s< zP4ec9K9{|p@cMmUXljUfHZ`jmU0StJ){77P%1!OQZc$iDnsp35M3{oqnK2IE|)4% zlT?K+lsZwp)Pqi!`cSPjh>n+rQI#}?4wJ@FNSZ+VOG#8FO`+YT8B{EpZC5edN$IFS zDnc7cr6^Y_M{7!z$S2jHc~TgqOZDg%o#`TIT53e!Nlj={YC)e$F*GK%qW7c$l#mkW zC2155NE7I3X$r+9v)wA@5h)#YOCEH$3my*aY&7jpJ z&-SYrujECUk`EclkA7CIl8dIKJoL4ck0zu-^pRAAMx_$;wp5A|QW<(lszuACI&`@d zc2$oqQCh@R6S5_uXi!UAT*cgct*$zdEzyY@bnJJz>PAgkOOLBQWJ~m;Csbm<)u5Yi z$khn4B}P$+N{qQ0N6WO030G6dmY7E8tHg{eQ?#-~x+@>DC34V=jv2qJTy(Lv5pY$2 zY>7g&i?&hZs@Tm};wp%2iE`AZZG>D^przVIrK=ibOVpyDRie&S*v(h(su9@|O{hU7 zqOMv{qqY%q)sAe54)ladbh_$t^L4w5qo~%>hqh3OepdtNA}t+sHH>VD5p=#vjJg_g z^NqVoB3oh#jp#_3b~S@8)HcixE9FJDgb(Fw8#%80ZoXVs`N)cj zt1@Iu1ku|nQSK__=Bsd3jV{w#YS6_hQR}J>HE3zrRRgjm8c~xbR=5f=!=q#oA+_W5YrqcXwS}qDJ ztqGkjMUfrN(T413j&@{6b95j(nxhlh(HvdKj^^k_b~Hy1vZFbA-LyEeqdEGJ9nH~? z>}ZYwWJhxhB0HL62-(pb31mle3?n<5V+7gJ9HYpN<`_eEG{-oyqd6v!9nCR`>}ZZ8 zvZFbs&;c1vD|Z^%(Ht|#j^;2stui~B!-MP?4llYR%PHYQb__=jvST>>=nO@&taueu zCk2s>X(h5TtwJ`Y)yT%Q2HBX_A{)~>WMdjeHm3D%S_IjcHXs|*Mr32!gltTs$i}n< z*_g(VjcF^gF>OOOrtQeav;*0gb|M?oE@WfcjciPNkd0|CvN4ULQxtq9oWIc}OC+34mX8{Gi1(al3Py7|aPw*cAb79tznB4ndmjBIpEkd1CBve7L=Ho8G% zqg#$_bVJBSw*uMdRw5hSDrBQujcjylk&S5`vM~)K8`FAZV;VvB9b302*9P;PcXk9_ zFEyc<6hoIw?WjrWLKjNiC?fTsv!pm;Vg}aNhfb0PP_;COj+BN_g*1c8CC^?wb14Vy zCI!$=QUTglDn?sMC1?|=6m1{{(b`fuT3xC@*-|B%BUPaksS%y6`k)CNqO_>17F4Bo zUCdQGvL!muuXCN}+v%zc9i*VW2M`~%@P3uEPC~X*(r91h?(C*SCDwd|v zc2fG@Tpvjuw5jAp0VxNqBl%H|l#5o8YEY&WMn-BtKdUttMN?8M`daEh6H+JoNa{kP zQV)7t>O~2u54|MyqXB6EJuOWj+xnVBUhP5B)f75h(U^9XUbeCg;z4~{i`SJ89i|dF zuKdWJyK~VZEe*J7d8k5Zy(lEb(Sgz+Iz$?Bl|UyeZ5Y{FWdzw;WfYyHrQ@z9&s zxzdVIjZ}T6xmpfAsed+bg1@aYCpCnO`}rDvp+|-bY{$i`~G z)gZF58bUT!30I@Y#%c`NSdAkat4UO?eM!2SLN->@u4a&pl{sK#tkRKOs(&e&>;HlpjL78H}(5QAi#^ATbY59&b|O1&r| z#nD+(KdO@k&`Ht|Vt5s06X-~37*$B=N706pe5g#yMY~J+s8}jO+exLUKq^CXDM@K4}VdO8%;qt%6*1i1sw#Di3X|cT>KrB4pbU#mJ~ciK|jn zs1jwaLdce=Kp~Z=bXDc%t9Dg~>UD+)qdT;x^{ygl8*QV(RTSA0E$A1Oh`DNY^R>BZ zN49m-fwtEAI^DD`w3X7j-LxK5ptK>ho%V0UNt4FWrcx3Gq#3l1WRB)tBBi5MBrozv zK9nlupqX^%y-|g}lWNhVRF6KD8qt{4g5Hzb(6H2wUX?n~pwxw)mAX-%)QcXI;;2XJ zL-$FO=vHYOwMps6@EMEbLoHGcx>WL`Mk#>Km-0}(RDe#G3Q?_8jEb z?rH#CrnL;BPL&vPl|cDgI_zo;*%IUEZk3pDHRT{Lj%8%@MD;E_jUjXea z<+;j7J1MOI*>hPTvgfiQw62yGyDC9DD6Q0087fj*&{a9wQE4Hxy;Om=lPXb(RE6wW zts1STv>LRVREz9ctq$3?FJB@5~XONAqIc{Zi(~*s?2ifR)k&Uho+34mV8(lxjv(ZI<8(lOTT{IhA zG#gzs8(lOTT{IhAG#g!4y{_VDHo9mwx@b1Kt_IO;bkS^d(QI^)ZHJAx8b!0wbv2G= zqw8uC%|;i^Mig zMz;jn=$0ZI-7;jO8$>p`<;X@ib9$VRuuRV}j7twT1tVPvCQk8E@! zt{RYyZlkLvWTP8()q-qvW5`Cg71`*vAsgLxWTV@GY|YS#Y;?Pjjczxx(d|Jty1mFo zH;(LkH}3@cb8K{x?f)xAw*RjL+5W#$WP4Z3&}?+kY;=+B{|h18|5xFrRU+H}SA}f< zUp2D*e>G^4+7`9Q_W#wP+2|tM|5uM}|6c^z{=Wuf`~Mn|?f+{+w*N1RZ2w;ivi*NC zWc&YGk?sF$L$=4d9nD4;+5W#yWP4Y;&}?+kY;=+B3G78X>v_bH?Oh!}HoAkzMt20+ z=#C;A-7#dNJC1C0CyA{*T)H*Ff(=*}P;T~o6%y6MP9*Mn?yy~sw_hir6n zkd3Y%+34mX8{Gi1(al3Py7|aPw*cAb79tznB4ndmjBIpEkd1CBve6A98`E-RV;Vv> zrWMG>v=Z6g)f!}DT8nIdNdz6DcX5NOMs%{$nvjiY6xo=zpp&$;)m0m^wLm*MQA;~q zbt4K2)s|{jLU(y{;W}HH2(`NdnnEfMImB%8sDpq)}vJHHPeU?KrB@ z(g|dvHi>N1lF0U#OruKWOFwaCtUSoZ%8zWUa$NoF_vau>b zHddvs%8`v#2-#RwARDVHRIUB1c2$FHtZH4=AseeOvaza1HdYa2W7U9ctQwJxRTHwY ziXt1U7Gz@;LpD}z=uquT2P)R_+lfw7S{GU@b)#CT2dyFXq8urX){*+q+EPE-LmEK4 zOM~bDX$b8vCD3ZpFj`d_K|W~|&6gH6PcEHIPci1u!w$dVshMAX{q^xZSr8xM=llC# zSTM~4^TL8j=TGwjPjfJL`NFXm77W|RV;QB{#w=ejxa@*4bN0OW1;76K>*rr(I#~yo zMMB&gi#4!v=kbct+EM4sV*WYyLaFoA*}Gw$*ul+|$rT(boU7bc&vs?|)0HT;s}edo^g6mpTc5w%2T<$>tqAgqJWhyANJx?|9yI z_IcN6zYne=3oq55?D8q>&i{|>dWOfGlKT5XwRRiTb{l{4#7;^3|CL>t3+(>q*>wjL z^yz2DGMtyODaCmm{wFB8Dp>T#f{J%z*KZ~M_=45^c{!fr;EKkbP z3-RYKZm`0Z2!(i&7EV9&VMg;Jp3S_D-%9-ULi)9h-%6x7&wOeBZ&`nP5Bv419Hs)5 z?j}-IVC+u|{2^;}}dT$3-+~U-8UwUV&A3a)eiIcW+ zPluZiF6K?jPL|jxmH**|X#2B`iD` zYaM0oI_%qRCdvDeBP^tT*7p8T>%p}COP!NVJ=`QXCkA>Ws4{ca`c&N0DT-m`p9a@$M= z%R{_jtV@@NoHK*7mio29`=w>9=)E%wZMj9B<$L+RoJZ~#O8r`slQ-YgAF0Y)TZ{!b zWvzTzusoLcyN9LAWBI>(ShhS?;67ZjXK+PZ;qM+6uV`Z+o!P$s*kg`bI^dj0cAd1l z@yXH8Iju?t(9@%Nk*h1wa;4qs>H&0#(w=fPgqA98)RptCsmbq>P+{^pW1_7tbM=_3Z_v2%ZJ4%F&I~O!t=ZL6=v(D;K3}$SX6~|b zJ_)ySW~^htEZe=-)l;rMboC3e&)m5N$kKCj+K4u-$xXY~O&fI6UU$=+d-vF~&b@_l zwHD`IMOMx|m#oTMorHE&zUAm7>1q_yKELQHG{=~$l-9s+qn@r5^@OMD+B;4CKIyZc zV;xS8Icn{4ClSnyO8lO02KepMNR}LplvzWgbJo)Mp7k|`Y6Fen+EgR zP@`hE)mY$SeT#87jf~%2BkK3otOY^MAaRgp3^`Qaim%YOdwnd|U3ad~OzJV+ z?dfXWBjOs}GvZp^HLF#3<+?$4D!WPdKf76XT5H#R*>2Ij`Ys)t7@tm&M^bh%`$I!Qyho}?v< zPd~Zt#N+GEIN?;@CRwWvlYS=Iv~Cp~BxNU3Y8UI_^lZV!g?c!~!*y7C!eWM&GrJtC zbl$CVbfxAfOW%lb#D_!tBo|Nj3+}JQvyUs>^y|pYVKDo1lOE|hA;44Ab;6i)oe(6$ z>~+G51zy#B%NLB*RukA$QuJ`yfM+=;h1tu7K`m0v8)(j1y7&zzXWF7%=S1r^N}Ctt zIA?~OrLX@?^75GT*@$yup#k6b!h#;2?yoN_=(K;FlNh%aXf@!epg1!sZ z=daTSuUMMC>!O|uvwwTId{NJrug_l7{IOim{HuOub+egUmpW~nT^Ds;$Z1Gxvnk6L zb^h05PC;oQKTR}eXIrCAq1lTiXZ@4fuSr|t36`1WmZkmtdGn*47fsH;qRDPhjn&~R zT2o5NLaAo&#k(%-ypZ#oZO8uiqU8&nUHD^}WhEDzhVA}j0W0HloVGvBGZk7id__~L zHneDRxi|LtVZ`$DZ+SickGOPRw4?iyH81ctdtS#{a-##XqtmQl3!@L+?fYTPk&{a6E2eV;yT%uJ>xV5m+$Y>ximoD-dPdq3?RHsd)<4(yRt+Yi5RZG#X}o%?+}F>gj++ z-fXOT<_FfE$N!Z-&iCG(C+YM%ul)IAowSFU|6g^IQ^u*2obf!39P;+(4|UQ>b!VJ$ zmaUmoDLEVICucSP6&?QCpFdPe%y6-)lVMN(FHu$G^g%dP)NhrO)1vaR<>SvdTD(Mg-Aaxw zku*05kMUd@$i&a;lyT|;r_5=`MNX(YZpjkzX06&cn;1Ustop_Ei_bWH3B4d$t2!0N zY+h&QRadU8FP(RdtuGzf`qB~iAz_0y%^CS^(^L-{9;zNRtoQL!cH)2P!O8a*Opc!B zU2*j2%IYuCydaTLl;w1n4AeTE2hNec(7z)68P%1G`<=A31v#PSMFT7Q9A+<3Mo(ld zPUcbXGtG;rPy8zujEyIa(8@0LZ=Z8>)6gBRJ8WzVK8enb1ch$cE2E>0g^ zIQqdePKCH=;N7ar)BkrBf&Z^n1pa#!fzOX8$^?(=CK_wa3kTjkqD<9<^D_KtHL-|& zw-rV$vem?y=m}m{ZgcN0y%*W$=1cBUXE3(S=M2TSx)#|g#%W~#cNMc8kJD7qq|bh7 z$!Yp~G*EP|25WNb7*d!Pl;2Dt#&0`_cvbTiUQGk;SJyNRIhxdA4NV%c)}K}!H?t?s z)6U_~%AY@09Q*vC;&9416~|@#y_h4={`{fhIJxeOmIfr$8zH z_0;)mfBs+V4`-pXiv_>c4Nm2;r&~7+@RB+UPgZR(%A-A5USn&O1P^~#IjpQl{-<(S zc?3HziamlI*(2DIZSm0N*+WOIa|xxRcGPLT?8o+IkJ{!1-W8>l?;btWMyd!d|YJ5mp(JYgOwe9 z-rr?tUg*1`BBg}pPCTQSefeFR$Ln0A&Tk5l`oGNwuDs{ZzrvY#;rH8WUO36|7+HBR zC7k1NOvj^kW)bZcGF%)PU6}abnRk!wes@9lD2I=;63=^KuBHdxo2w`5R45DM%bTut zPKtk$YrolR@|D^8Z8lqW;bilo`11dUxchVQD$TuueH=oG{J~-`n%~dT)E&S2^eN z{e8Zd-<$Wl=dSPP^YMJWU$58m^?JVkXWYbonx4_%25n*K3iAE-&@H^q<@xUiu!vFc zUkqRk**3hwG~SSH#~Gu4?ZQ4ww>?ygN0A}MWrz$?<<_Ug+zD$(RsL7wa*JGBAD5NA z#^uKH?y(sRbmM;-XqVwX4D^}*d7y*w`yU6|jo*!b*m&YL#?JoCc+5~N{}=DLXz6?x zv`5a4f_#9t{UY48NwWw)h~E(`xMz_H7Tj)e9i*B`1q)<%j}30|#=<;~R8ZoOZgY1; z32bb4>S|I!*+;tbz0m#bU%IWO+uXIvL5Z=Xg4*&(1(Dq~f`KjWw#x3*8>E7=?tY;` zK6kg%psc$uYhdZ!R!J&Y#k|Sy>RQF@PpYp!THm#b$w2!1GrI@+>kxR-I1;RAxbHLR z;O-GS`1^|t@poT|@%OM9>hG^J%-?q@)?XXFlfTQ?F8)4YaehC;uKtd3yZQUy?e6a^ z81Jt~-@{+CzNf#xWP-nA=-wfB9sO{BKiPf!eRmW6U3&NPcjMjP-&;7z-vRjmzZc>_ zf8XYVx4KeWP9!%Y_#e(MaIfAgwUND6YOai1sV(K-g)zPeA6s9k%_^ESbJ7goA9mH$ zkui_At4!Maro3Dbkq)P>B zNtYVr@7fbsGGPL9cSj2B!fx|bq~DV6*QV|K<=3V$)b~Ofe|4`-gB2#5#0jn+xO9G^ z>-4&AYe(d8VN1{c0`?BDd7W@vX8as>>?Zi_$BsoKg9Bv4^IapfI}-@vgR<=!#PvDy z-H@@6F>BO>_XxXb5xcNk78H*S6=m`D>XOa;7XEj6SC@43{NZ*N(1VS>X;En>>X%mt zTe}D&yj$YeN4>qiB8>ROmm3LY@pTG+22Fe>sbE9ZZC<*aXaoFBNrDBLyMa*9*xhbf zZS3wupnm>xgs8}Y?QCSApJT)Rg0k)WRuGRk#)BK71e>oh{st{W{mn&o^tYcG=5LJ? z>u=k$li%gI>sA|}yH%3=De=6!UcDP&danlP%D4vTZd7ywts;2!YJhYn*^_1ZldhIJ z-pRcEPv_s@)vNuvX5%u9iDpE`Ox!>6+@k{MJI>2HoJf=@&FA zmkJt{OY!hCcVOMkZ2vbKitGbx>~1*pJU30PgW}dj_37$Sb#H%7eV;8azKMx!HL-O> zL+UD!(Pzsown&MLn67O#in!ilq>hX};cZot5fkpIg=!;3)@JnS*--7;E(~f}n-LS; zQ-pm`Jw;-+Q42-PZ{biay@~jBQS&wX;!*MIGRk{?!QJhQ>aA|e4xM|vuQsEfUv#XC zD%D8znWw&=(QjM=OQLmA*XhP*;>Hy;^u-*|8P3!W+V=URf|a}5Mh;T1bf>=UPPuhW z@U6SST#&l2JLL|qbhZ3oXO-QO{2kwgeLLUI-$ZGUzqJMrNTEEpo#m6$%lVA)w;vqp zZ#Ow?t8KfHTy8e}t+stqueR;VxVHTk|CVm6Z5Pd$K55#7SyN5xcJ^si0ZA)cUS-flCPW=DleLG2WPocueb(M_2e(ca4!(6{*lbHOz z|DILg7Oi60O<7FmjgM{7Fvbuun9W`9J!mY~lL~gRJk?dJj;agLqc!x$y~%>?YPxO;O=wdW==Oxb-jA8;ClBkT^ZL1T-2Mk z)d((`F|BaI^t}HUZNSacZg|H8^SGN)yH;vJ1NdK^?Y252T*Ei+x46Yk*Q@u8a6+%8p)2EN1Q)ezTQfr8 zqzQIO=<2BBoxF#iUx|KXC*?dk67Ym=Ue!*s^ zx8F-eA3id@*)zqSg0<%tFr!SZi}rgB5*A1GT{N;-B%^QCqLFiYQFzh(5{7H_s1`o` zVZauDxUGeA5&O-ZvyHyMc)#pxphUk>@tn>#^{tG4>{DkMSl+cfb_3}T-A%6BYCgZC zh3$%|b)0)r%VE2PL}S)o8-Lx#+cwN*RBwHlhAgS{86ySR8RZH#_2(nR4!Ug&@RY69 zL^owrVledVe_OI}kRJs0(8rfnowj9vbZYhc*pVn%~{FK1}=kJ6ZLGux@EoD*|gH}HKhn3kC#Pq34a;se$6`4@W6`*lVDawL!ET(EMPa{+U$ZDPDl+O1B6!df zbZ4&xqo%LFinE{Juh~Cx4!b*ReW1UBAnfnR!gHLF-p9=+Vs3C_d3U{fPmta%+?83fh*qk-_>d09=eqW)hsE&6s@86s(y02m=6Uhyq+g6#CKVxRmM8E67O zGp1iQ(I2bsYN4c6uet1tQM0Gd?dLl# zGwgOBy7O&VIxHH=Y{+cdv3lWr_p{y0SBy@sb3@Q?)XJ`4LET%#ivP>N3FH=itU{yl=y6 z^tot0^H;fnH@g>m+EOOJ=yHC?0DqV{*wI*x1*s27E$7=W^Rb}&z=Z& zKDx6YwMDus6QlecGWtiZcyT*B!l7w=4)W*A@T@1&!Cj_@_`7_@_}z>oMn@~7@`gl6b zX07cis-s{oZ^n>${pMPGNTf|)MqPyMy{2_*!j&wACkJ0|tr>TdsfW5Mbc_!o!^|Wo*TH+2@`GS|-XL`|Y^L?U(K`GiHNQW56qP`m`y=HZKn4cVSr*FG- z0_n(Luxs8ON_2OZ=#CtmADG2pbFw}QqZWp4L2BRG>@Z}Z6<(YbHRQ>&=nt$}Wb&|F zBPu~U7S!f5ra0#A4iRo`nMDv5E75b$Ts>-~E91`RTj@72RxX&kvftbzY0rL}CAQy4 zPKH~#Agw%9v}Y~R=!&fTpv5n%)(pVO;44c9P}ZW!l2&ir2(r?LOjaT+Z@ zWNYIz`hRhpb`PE%r?J}@r&V3!wCXp;DG{r-Jx+bcwvt)4+0C}0^%pITv;>+3tB^(G z*zgOlOAj|6>A$|OnCW2J%Az|8fc2x6Hv4aaOYpW^f4$2_EceB;F8#?8m#@vmSUje5 z(fr`_+t>xgQK6#W^)#CzT6o905}qX8GdvqPxeTkYw#^EIL0hoWx9PsK59>7m&2=UH_(}VemJfDXZqU#_AE6In+a=tfr zYx5xWukO?h9BK}1J*nUTekZBXlo;S28y|FZr!hT(Z|8TX-X@jl^ZkWXkng8%bC*H{ zwmUyKSUJ0uwOu(6@Ryc`{e`33g-ZC2hd}em1EKijc71%t__ND~`3GI>?Duo+;vW?f z=QoSv{XZ~suC;r; z(H-O;s5ipjZ2l1cAi_iaE$9#Pk2XBQKjbmRKeF;j|Jco={9{K`{Xlg zoX{9P&+|9W$@aI^Ip6oRFYuQ(To@|l+nmtv`Mf0b6rYp)Erc!&eNH+*G=woeWvd$- z`|ypMY1~Sw>(#qs(tD?|E8{vQF6y1#1$%W&SgTLYn{78WTs3tRTgLl0yCrVp!ewxs zf$6iSO`J5-_YYi6j)ILs*By!FudW`1+dgsqkBi7Qvv=pjec8PqfXaJL#+@!FB)A)I zyL}$KTqf7uaWzi$dm_5}C+_6hg2}Urq@>#-b`S95+s9x_9M4d_ACz!gNNxePBc;1H>3omME!;+;)33VR4}U3t_h)=u>N{Xd zBi~*+bJFF0h`RP;xKB4Qfv(RnEjp;ZpGj6WCZou_`mdSUh z&*oapj*a_l{J?MO#VuOmqH$&O;*;WhkBy7%;uc@;FtX9^mU3Oop5sXM^Bd;fKh3?6s%Fm2qulHt*Y*6v3;Hn=i)aab*oBvQM9MrQZ~Hq3d|N zTw8A+ksTneH|;X)Ku&+Ax0_cx_+@S$>bXY7{lH+dx>PV(UFtvW{qEjYW`su0W$}AN zxH^UY=ce`PVZW~8qL+284tci(lrdQairmn^t4 zZVJ1o_w-C*P6;XEx~K6)GsaKgh{lZK@e?N(&74p)$xrM5ddI5UVylfz+Dr0%tFGqH zkqlw5lyi%<$hjSE&zalbqSscr1HW#JMvkGl`NSMUF`H~%ivu@;gZaj#g89a!y3aKJ zlRxdFiI~3G{>E<1?)hi!sMw&Jv-YA`m)?WI{vHW^++7A@Xa02UiBmZ3HMZ-rVt1CY z>+5#km>`ZBZ9yvcTBx1J57O<>z6az6%k+TUKF~P~`~ZLB%3uzfhLvKm{!vDE z`_vz?pijb6>3F#*YUi&gzYDKxKdNhJ!GYRA{!IJ9Tb-L8BbOVT?wNvg@44ytUKi!L zGOq5sc>lh;V6Sy+a8ceB6KDE)$yHIuJC66(mm865^4wuIm%*(#F3F!Tefp$=S$@sn z>T&32Pj@LvEPtf)zI^tCg2_c!`PHeJ(cDaF=A*6|$BnsQ#&M}&#&M}Zq0A>&-t*nZ zSD)Z#oMal9pK%)9Ci`fr(dB*D@`r^@OJw=OZ7t$MMcb_#72P~HcKt=JW4<8mdP=&D zTer#q7Dszna8>lLMLYNWz4)wX)(%6icTb-&I*vPB#0)8OCz$lXC_2i^nxy=sD#yND!6xk(qK+_9G+^;CE2&F<8? z?v&eV5AwNZh6Jg*N%06q>Tu1ws}Z{&*Ee(spZ)w@$%2){fXJD}*W!cxImLthbK`dK z*URqcpNTlkKTnct%Za;_f9~im{#2wm|7@gP{S#kz^G|l&-9JM%-amP15C0_HJ^j;r z_x9J&CHkj1?dvx+_V>>&PTJ}M!=2#jT8C@NU9a8?jMQEo3|Gc2FgEk=vYrLTWnE_^ zjxU-tt+1eLz2l~KW1W9aJi1_2l!=S?^6&Wec!HSAw8uvk!2yfsQj&d zShj4r3giM|cN35zjtz8dxRT&x?&+|(3w{9KVXOALYurtM)@QSFWp`MRX1P$mIz5Ts z@5-)Dcc(!GDYp~RrMhxvyIpIU-52LnbAX^Z`n>>2ujg8v(eH8f9!1t?=Xx*1*G1jh zbrM3gI|+dpo-=OcM91n#_I&R}ThH!UvKP8K`nzFXpIzKDh!rKsmdj4AHHwxK98&!4)%Z7 zDRPTLxBYK=+HU7SPfyz|l)9E&GbaTHIekZ+L67vj-D1!5yt|H!ZgH@rYfZrjlLeh!F10hC@Y3EI}3&(|6g6M6g13%ak$E9KH65 zm_?c4BkDHx_qR2RtgGEz+BJ_IOsb#1zh;!bCtH8Ni8at4Ior}<-_@&2u8 z-TRbWSH?~2vv|+j*0e5~QCKkPib)0LfL9&)-P^rveQuuL>IE-uCB@d1+mLqEboYI` zM!g#W!KinsVAQ)*WYf8UGJce&xKVxtfA#Lca)I+0cl;xoBck0m4~pqpI@85$QJYCb)^^E%Y zj(-2hWxZ!31O3xZwu>x33XsA68Di1?31(a0aK43HZqT|X8tL9GJFVBIjw|D)_BFh> zxvAssJTks(OUKnv$D1Gb+tc~KYt*jG(zT^Cal))g}HD-_$xA7Fd@11-Xe}A_3Tku$Mx;*!t_S6h4`aqlX&FSSFW?0$RlTu zS~n`*d_Q|QN6$F3Z_)LxqILc=IARjnF%!3uUVUsY8r~}iU4-~Wqqvb&a6`jt24hMe z2IRlp1fRF{{zv12xs9QsUUPWk#w=E$bSqehyOk*yJ1oi^;S;foGSj;*?&l!lqLImP z*Sb8FvnbzlM;RB5%rKnEh4Q{NxG`>8Lk52a=V6cSPUUr{7LfXgsm0a-sbKwkC#msYGd>4N>WLJMS_ip|P?z{VE#mD=n%_sQt7WNJu$&d{XoxtZl{s2j$e;(_;p-Yhc zLaxi26q?EBfm>aNyR9uZ+T(b4y?VFwk-b{FE8|+ai~7gzMZ{KjYD}9jeZpmv^87m7 zRa3`1mA7m1J+EGi_5ZH9yIT^u=I)mETwl?>fwCL!evR|#GdRhQTLg4%ytp!MtHzg^ zJiXi90GJ&jZh_HATPz~0Tl>2KawjW~? zK_j^c3sy!mNd@MbU(hr@CwDMw^!F!u4)8Y`8|ZH<8}?_N4)(Vji}qdS?fv5|gNJnv z+3L($PBb?{erx7T?KN|{GH&La!+V=EXZH=TT=Y8LZhmy{p4b2H^W?VHT5co`g(j-P=l-R`(-evs)u4q4d3R`%A`U+zqpmLc2=tB4(7oBXl!$eQFCUm|+Z z^)BGzCGK;e-a~G@&Skp8{W0XZ>)c5EHSv1)4|A%&o0dB>W${@_em9lB z|6%x(%iVGD^%o?tDa?rv>qjQ6&t_wFP1m}Do^DWxTPf113ewz4k@Z}V=01#ZCLMo7 z-G;CqRBB}ZUVX^juGg)k+;D6>l(gG89J(lr$T3+{b~Gojkr5eYg=p?E%6|CW$unKi zl6|xT{PwIng{I%>@xiEA=f{s(Ne62`;>_%dQ?p=hO~~)iTb(|_#qqt09yI*iOP5kjE&hg;%1veb&>0(R@ELn_6;=-&SnYuok zNgIUB@OQurJd?@Ha9q?i92E=ZR)l5`@dN26)dqJ9qs5~t+&nmMZ=Z+@%_DBb;xQGR zB6ZwZaq}XxraMCGGlaL6Gfd98k(__uA|^#_%y3sscXX4O>(di@M&ih;BVpXh7QVvh zP*>!oUHM~r@-xzdURbcphG6E)kzMzkzQC7cuB?d6l@%OloBWm==}hiLr!yNMVI%2Y z;*7Z76#;zfNe$BMAzzf`<^%6B>$5W%-G685`+2!+@u)ICeR9{w;U9H*i7!yHzK`Fx z!%@Lp`*Ua@-JQ5xm$qN~`(pQeO;k6px!SHTVx_q__;m9`f~#}mB>z>u`-*{F;u5af z1RvLqb>D!ymIqsW?eCb~U2Ot^ql1G<-P^wNSGk3u=}iolRVhja|BiYgT-=e$la4ENL^1V=(65KD(Gx}-)%p4TQu`^ zKOgTbW`>{(Jij}2KdGP&_rRs#OrG5Cl)IJbzo?g+xOS&jlM14I+@1Q0)b~E$58bI< z+2h!6Rq<-`% z_sE1Fe9ArM;ai__V<%W^_wf&3>gyk6)^)SeQG7SRKh!k1L)8#}LC#R$fga{}bH#@K zOrD)0=Ma5GdY905e8z=-;d6I?z5m|68$H~2qxT8z&bUtWo#}l;ZYyTL(6M~(?>o>3 zhTOH!$$m%KVgACA!~JQ&M}(&0DgI!=(V=@ur-gpc=kX!8SUABSGB`2x66y5N%Y2UX z*CL-3`jB)+D2i!%N@y28PYvzO=V|_N>Su-yA)OUEfzPu;r}24C$SoSjhA!uGTwW9hob6+e+MCs_3C$ z*Q?i`F`@ol-zJVuO+Mmq_OhrP)mu`w$df|1S4$mvWN$etxwjmB#1^teU8#rl&Xbzb zd%xRO&ggQzRX4`^F^MM3yi5+*xIU*}wFf)!%!ZchWSea$w*#+hKPr2F3nj`_qPvra zdAVY4_v;nZI3YMg#vUL#l`QTSACa8(+s-+XEUvLfa=LxM+lYAsSzMEk zTk>0ZcOjE&ev!Oxb-m5FsfV8st|9Zk07SG=wSPQiJ>|!L7UohxW!?YLGwq)UCz_ z`-6fmH7GQaZ`}%QuwT8q)F3}6xmDZXkh>F+OAYeJl!I~LRuaKD*bqq#4t>*Y!|5KNp?*9$trn{Mh%f)tTEP3yjA^Yuq>YsLLxcA}JPpsg_hGrg{Gb?Xu zPVwZz{G3@cFUcvGJTW--bMRq@@L$fAlcyhXcuqjvv)bJ@r)cseoPAl&|%(4#}HPG$BHaT1vI@q?<38Yj@o6!S91FZX5G=w;Qw9%Z+FEtR7#=f9Ka( z5phG{x-_f?c?y!t6UcF->Ucg@kDP@hh~&9EJQ=MgvfCAw5Ro9xVx)v8-1WqH0LhJr zQ*I6|z#~J7l5AFG#+~AVzKz&v5ODvm25rav)O6^J;tY z9E-T8NJyj~)i$1MYu_2EJjcpmNMV+h(~;aWt&B%vM6N{I&#-w)kz}5O%|HIlv3io_ zJbl}V8#JC*L9(6at@p@VB%31Qlq1{xQzz1aEEn01rdufzk5q^ph?Iz=A#tbLAv_bw zJjF^L5*C?*w2!iR+!{YCBEj$aBT|!Lf0ujKa79Fd-}M$!BJvrMFR~fQ64`;SbgIan zNU}&Wk|g3b9OFbTL^@Blzv5D)MdWfMOQZy;JIR*11*s8v6j>_rEK)2|hqR5fasGm2 zi+qZV7Wq4pF4A`ZV?$&pk}R?}5+`yP(sZJ&eI!yRG7f1^vw5Z&CgVY{lr5u?f z@-Whp8srJ)jaQI#k@sDmqiviokP?v}kpz+OK=K@ABkzSIL?oEUjzH>Tp}?Yb0Id zN2KO3n`dB{-zBmOQl4z{?2m**jz$U(wRuiOS`M*t9+D+;8B%w!&2uG^EK-Uj#M(R+ zNO*fIk0I^-t^5gTqI2!0a4?lWKq^JPaYARiC(riVv1}399my6s97z-zgKVaQ-VMEY_nPb1y_p4#_9mWdpPRPS0OSH$q~5*NffyYseHvoej3RYX+TDZG$HXK z-yrob+c*Q*kyR`*94UX!<~bfo6*&(HiCluTKWj@BBP&F1MdpY+j&wX_OVuMQMLtJL zMgEQyi}d64kl`FjWE#@)gw1mm(kOB>vP|S*q(J0#r2a7*=Tl^< zNC%QD5;cr9qsXpEn#keE2$3_8`bTYDlaUo73y>0#TaZGLDkM$hWh7c;Et3DRt!p!q zBC>-!1xRE!r2QdV>QH2rNG7sOBoC>rvZby?%0%u)vPB+5GDTiQ(nLN$QbhiNwEw}@ zHE1X11d&9fS|k}+CNc`i7P%OS6S*2Gzt7fn2a+lBBoZU?5)u+=M4Fe`I2(|aBK>!! zrQB=tBp_o&jztngPC;TsE<`%-v2lu!O(Nw;(ycbnV@RyX8%RsJ&GR18DDoAuO5|5$ zrO58=CNI9l#yJWp5XnMPMJ6N5xqPW-?NEvoic}&ki*24)kZO^)k!2!(MVfB1r8{(VWMB+teBW*Knp7}_V$el>F$dkxIk#~^FLL28Rq)3FL z=Am?vXe3!=Z=`dEjdLv0AaX8}G|lF@9NAo8Wie7Gau-q~QjIJVc>^gE`3y-C=|o~h zcINcYmZ`S(;Yg#%(a189ETllB0IAQnac)GGiu@kQ6?q)V5_t_t6j_IKUS=czh{RoL zWyd{O9!|0{0;v^AMV5<1k?%v&MV?2ZMP5fbFR`VXkXn&%kz$eU zIo95Ou`QK^EEhQmDHJ&a$rZT-NfVia#EVoQO*yu%XOI;l?;<54Ymq{czau#!1NUO7 zC9)4vdbX|W1f)nL8%Y<*Ly|?VLJ~!8L*hlAK$@~_U2h=`B3~dCBArP1Oj~OA1X{rv zR*pc@$5=TF35!fYihpPGEJ89w?nF{Vs*%FeZK*ern$xU&fwW~>`4veJ*==v~oNDvz zk2HxKk5q}AhZKnvA&nU}PC2qn>i8k`n$Y_ywkvNf0kg!NQ(tLuAGiV>$j>!HA?0;I05E%gAhROCe@ zS7bGkC9)pL5cv^F6Nw$+u5q(mkw=j#k=01c zcQ(!!NQ1~PNQKDYLs+AU?2QzO9EaqIWFwVrwyq+iOym|MTVxrMDe^RuCenbUh-^UG zzp{1pKa}<*l7Q5R9E?(NOX%zVYSt{}kk|Q$c zFy>Vbo%OVo{g7oMBawWOGmvbNJS0(M9^)16d}L zisXxoLb63JL^4EXBPk-cA%!b#T~8o6B5xr{A|D}fBAbvXkpV|B4qvj7_d$}MwsIm8 zFLD9W_LR+Y8PX&&7ikc=3t1(y0x7AnaT<{#k&Q^YNC%QEvcu6#FOei9USt%~^n|Tz z0@5Hd2dNNQii97xrJhC_tF64_+Al0=R};zZ6uT9?_{ry?svN|Bg* zY@RBl`EDzJLY9j(AQd8?BSj*e$XJnGkE5;%8~I3N(_L1wkXn(8kmVw?kfkC^kcA?T zB6Uk_l2l^rx(bOGS&Fn>Yx7h)nP=r~q(k!Ao+U{!5+`yy(sHHEQ;9T+Jcle5X+&~F zzCoI1**M#s$Wl}!5y=-h49ONb6-g19fW(T-LmDr)b=`whi#&@Ii@b*9i!>o)MZQBa zM24g@ehO_}2O$k2ryvy~=OCpblaa9^3y?&SN~C0(t!pJRTI6FSPNWqHi~NkV7T7qk zBWV{Rhan|XZJsemjz~U|Br+R`6IqNzi9CpGo?;`vh9pn0@+lH8@)OdQYx4{^i8)Fn z9$6)F6tY6(9HjkR8)pX6EOHaFT;wjKLgaCzOk_2(P^1+}A7|@wcSlYU*&PXqBq8l% zZK)HGR*`I^S!6a+agHr@D^ey>jbw|ga&opU^*NFt@-HW6**v>tFfFpI?2j~w9FJ6q zoQD*N6d{dcY@BjrnaE>EzDO;SE%Ik1QKSvoJlaO?KZi|mi&ikys$7P%OS6Pb#H zMdl-GPO-ytFH$8^i-a<4o;66r$yWY>RETsUr6N0?%AO^W5lDu}X-McK8+j7aJkm-D zvRq^dQX%q3WTD8*NRh}VNX^kU@(;)|k)fH)ha!6-*&-=OhR7L6ipW%?@L*fljYy8j zACM%GCy_XjH;`zNzamj0ok-n5wywC-n0rNzKuSc?kwTGkkvx$?Bu8Wk5_h1j>k%Yc zWEIkMfX&nFB+1IpNTtZI(~ITA1OI?}d} z&C`f9iF}1riMZQD7K!YEG$zr&cwAsel4`~${iPVUkfmDj*A!Q=- zkU1jvBDL?^x}Ha>MBYaVMgEH9ihPfZ6&W&)`A}p85`NFtm5FpVTDb(N7b!$)MQ%W< zMJkahk(ZI&zu3rYk+CA1kpz+GbCEyWQU@Y!?^-z-$!@SR5lIx8j>L*AKpNk%rIsP( zBDF|(waxPZQun5nZ;(=vpO9ja9nND}C$c{hC2}%S@|ul&F_IxtjKqj6L_#8WBdcDu zah^uXME;C~U$J>MAPp~D>6guVM`Q?6Dw2rgh#Zfkh@6jPy<{U7A&DY4BkeERJog|i zB2OYKMCy?;kyd1Rt&Q_5GDl?B^I2|)?2Dv|9E(JYoP)GJZzIn@LeE*b30d>3l`5oC zqy{M$c>`G}@+mS$ACY{K=m|_Ok$sU2k&#GAv8^iyDG<2=Nfo&cNfNmWi500qqC^^y z^y#*)uaOZVeI~Lro@VoGkF<#lN18>BL)M6#hm;rCI5UxjB4tRHNClEE@;H(r@+LAu z+5oCQc>j+Oh7WRY5=^Fo_v z6|zZWEm9%!9g-=s!z7k$V{M!Rkg&+fNaHy+&zVS_NFK6KWG*sV*8EMS0c?RS&Z;0%UEEP#X3PiGy(vxhQsYs5<^+=M)tw@~6LrAp9pO7e#bx2*h zt?LJ*MkHo3JtC2Kq(I~_BuV6Sr0ql-`BEhJI4kp!IFWmimSb(6hml5+l}NS7he(;o zw@BtOHcs>u`j8^~A?>L)&*4am$f-z!NG`HcWDe4Ch>dd>(kk*4QX}#*QYrF2vQ%Uv zQYJERD!=PsTi0+TO(YEoi;P2x53;3-kaUqUq~-vd=TTQm z1x$C5y^sWvG^ApT-ZoARvQ*?Jkm7G=2?Z*i+qAC6WNRui42{=m>+869E{|N zWFpBTeHACUSXwysx@l_G1AQjxEaVv$Z{tjNxV^cY2sK-#yrb)AVc zh)h8$M6N_iMV26WA`c@OBCC*4w5_WJX&!9lU&wNi@a5DlvL~`oBo!$V8Hd#Lv5_xF zmWh-h`672C*&Q4Iub2%0TLy0 zB~tgjjeI+@LgWdgMC2u;P~<%%Ph=yKBNCp)5N@`0B_h!xCn8P%w0X`$GQYDj8;KFQ z#mToe&yz@VyOotlgUI_xvB)MQNo2bs)+rlooPCkDHY@2!jmQ|JQsfdOPh>7KLgXG~ zd8>{598w_i9+E2ZDUu|z8HpF!VKz$%k%N%N&uv|&BCA9uBIP18kP?yWkphtikQ|Yf zNXKWkt|p{a#isqS@y887UIk=}P7wk>Noa%p${)npHN>2}qU5`A9e-ef_d`8q)l_Ep@$%BXU2ICGs@V{+ccIE>bSC z0m&2TL{dd!u4Z}os*RI~6pN%G`66c_F(Q{Bt#vj|F;XjXGg2l}h2)C7goH#IkeEN& z$gN1@Ggf{^Dn-KAum%y?4at4VmO2DU7C9LSiJXlz*4R>)B9$W7ATbZyJhvky_gQ%i zX}{e{9g=&Km5-3*8?F2k2`#iTWDf1U#7Y8Ed4-i^BvWKG5+jn0G|jf9@?0E|LL^^g z4w5WVigXm&I7^W_kxHagq#DT*sYT*MRv|63Y~=S`DUr{Rx|uf5w@9)`pSk?5%Wa;a zNQ}tdNJ*j1a~RS-!^%h`SL7_Dak|Yj5lI)BiPTK9c@`iEBDW*u1vbxvNJ!*4q%F_p zsYe!)$Ow_2k&csWofDo zYeaI9@{u;qwMdD`eaL8$$B{IVH<6BX8|Mq8R;1qomNscN&v2xTn`HM)_jII2Bnzn& znT*U4xdF)$c?gL+)<%8<*?f$ZFOWKse6G)Rt z15zdOHIn;=Efv0jxmRQ#r0sQ^Cj(g_at=}@G8M@cxe-Yac?hX^#YSF*WQlx+#EG;c zVUh5Sw3L@^oJ6EbhSn$iEes$rL#WNfEgiNfeoj)IDkIx)-SysYQxKRwMZ$e??M6{)I$|?6!z$T5an}MMj8> zLpmO_dGe4pkvYgpkqTs~$n!|eBR0;5$U>3tkSvitH_-##St{}zk|pv!5+m|0Qu+s5*O0{wv&aY}EOH#u@q1h99Au5i3}l7K%}8OT zEme(-7I_Pa6KO)iBJD`)12#@{8Ot$|gOHN@ZJyJR9Fa?rB$3%joX8R+O5_n_^L;jQ zJ(9fC%2!CdNWUda)7x#H9g!xH1Ca)iQ;=06laTa-ZJY&2vPdP;Il|_75ve`M$|uM| zk?)c818tt2Z>GO0vMPnSxY{EJEscws{^#mWixF@e}-g>{DLHiY=1jrRb*de(+)PyNTfj|7b)G|=9!1&iQJ1M zi#&=Xh`fe$M%y@_BF!TIMk)r|Ji9M-M_8<+BIzQhBFQ4-k$917kZ6&6kjy?daxIb~ z@*xruX+_#Ywp1t5DiU`Gzf0t3B>SFls2}0nn@gaPOp%#LtVkKs$fJ#VN>wAvMBYTQ z@3MKmLJ~zbBe5cb?WUR<` z71XuJ*0mqfEOHXETqFyr5V;J=6S)pa5vfGVZ?JW}jO2){MUq6mM&d+%K{j1)pB$~EpiDGCvrIw z7AZwKr`b4vL^g}OiWCmCc|JvQMSey`hzz@r-g19i>TqO*$QYzB%I2Alq>0Q$Mu^;j zwDq&4oyB& z$n!{y$X}36KifDPkp_`L4^Y=nHct|gCo&3278#2qh!h~vBBe-YhmHI&QX%pNvQXr6 zBunI5Bwb{?O6n5X7is1Zh&}7v3?%h?D-)3@k!z90%{I@?NS(+-$WoElkOGm)i53};M2XBp>e_8x%a9t87mzt3^+t-P-BIQU(7pD_iP$q*>$xq(S66B)s01im76G*lgusq)sFa zsSz2AREZQK%S3KL;&^yzzwY1lI1(0l8(A~k=4nOBi>yRF$lNQkClWWy<~adrooQt> zvPR?*q+Dbkk|nYXsh?)!ynvL5e28Rfh13{l7)0mwo-u9 zi(HM=irk7+iBuy?Mczgl$J@wXBP&JvJhDW zEEidhREYcu$rJemNfGHl$}hBa?X;Y^MdUCfN#sN%PUKu<(*-up<;W_LTacD)o2MFC zAySW&hmos5J<#v^OawRxr?t3(zeB_a$wLxFu0wK9wsk##j23wbi4%DX35&EKohR8i|3Ws4 z>{`v#X&zvft4ATZB4;BbM5ZEbpV(42AvGdZNWxm1XBD!k$;$gkv&aS{P9*Aa#_Gqm z)NrKyBP%B&^&eWf5LqfR8CfV&f~1Pvi?pw?ab7?&|6=7Mq~p(4zC%`tgr1-+i|m5r ziyV$5h-4wf^)~V}BuQiuvU#=5a~IMo@&r;Y@)nXV@->oOXX8XY$*NT(0jd9!&2tD+ zD>4e1Ba(|`h|ELkUb1oSMHY%Yk7S9wfuxHxBe5bsBAZ^ck$0-06}({OaHP4`${EOV zksPE#WEPSqax;=5QjL^9Ya_pfsG& zQ{*NjRpj?bl*meC%`>*HPmtuNto(>{)>s+#H1meY-bk%TDpDqL4w5HwIa2b3jeIjQ zR^(A6L8KOm5%~)eCGt0<^KlzF{0u`_ZDn6%xyVSQNaRc;PvlZ0L1aGC@|cbM0FwQ% zm6b@0NE6cZkj?WIQZMpvq)H@i1#L&i57VWsk_yd`U)u) ziF%%X_+p!9Z=^)zcx1H5?~pW+iAcvyHqKn6R^(nJ`39S(7HPZQ${J*a$md9v$WKU? zNNg=rP~>nVZk~;NCQ>)o%2cFOkwRpJ$jwNW$YV&F$Z8}k@*&c3xvhN@vPxv&OZ4JI_C?yK+fpYXD@86w zN<|8gVvz;NXp#GoM3I$9dV#HLEfOp8J<>AO=IOVRRw=R@vP$GgWTnVCNbwXKrx3{( zDMM03?m-eoo|EOH@|ATkr#e4LH51Zfa?3~4*Y=BY-JAaNo` zBdsa6_Op={B85oI;Wp0_r1>x_k08rMo<}M~{)`leY(O$Z2EIXiKh#D}L{dc3k&wt4 zNc$nS)Fh-;qy%XexgV)G*p_+;DHZt`87uN7k|ENGghY0EGZd;DVIv=jq$XK88)@I) z%5D<>!|J5x0M1~=?A_pQ>BBPL{B9|bIyW7Ym z$V!oANU6x9NU_MPNP$Q*k|**rlCYbtYnOW3pvVzO%dR%hXe2An%2Xsy}|F$L=Ho8qitPhAW0%qkj;Z_o?@g`S!sM8+d^zxEIHqXPG)1hP=10?8722uT-t8Hp8X zLN@(kBmaPe|7~Sh1IwsRD~BS>MUF=*M8+a{A~TQ_ktIm^Pd4(SNRG&xNRr4JBu-=_ z5+yR=U8Zt}jhu*-i;P6(h+KqZicCdPMXp1lMD9b@{AlZX2}%CmN)yt#*~(_5UZn4z znKwjsMao1{kUWvIk&^Fhi^%_K2PqO6iImsbI2R*%B3C2HBBe-z$OA~M$csp{NE1^3 zimmH=q*i3;N3=MRy^tc2qmX2gvyk?eZR8n9{tH&hkOYzCNL#JV^BmG7@-DJMqzzdr zGT>wS3D4U&`yeAkPDDDMvw6lKZ6bNdDv@iEDv|q;+-Gf^7m+lPkC3oPE7GyTmiiac zDzbAE>s*l(B<3+&>MW%5Q7hAsdXa08T9Mn3Dv`&Lr6TVjjg>ZX8?sU)YAwBYksXm@ zkpqwdkqjhHWFpdXjIHZhWR1wZNTtXMBqr6C`T%J<+R8Ub=22F*|AclSvO5wbayU|R zq%AcD$rYK36dz*qlp+ZtRY=>xHqX;YlgL}hGLcp!Po(cU#?JvZ&R$5B$Z<%a$Z1Hf zNG>u$0#E4vp zghXye8WQdBJc29}S&ek;ZS%Aut3*QUS@w$TfRu>ri;NXXM@EQTjAZU*>$(Ps7r6^* z+tcQG5NQ%wi8P3OjI0v*9x2(w#@X>x<^+*LkTj7rWQ52$NL##(GaXqjQideN**uRR zO}kim1F01G04W#w8&V+B|F86RMD{_#JKM@*MBYY5i?ku7 zzef4(>0q0>|7WbbMfOJ0MGi%hMNUByMJ6EeBG)1n6}GNrNSR12k}dKcQh%o{)sB>l z4Ej723f*Dz9Edb5wUUag6gd+q7MX&iij*QXx7aujBKab(BFQ3uK@vp1LRxROar%70 z{vVOOkfg;nPa3l6CM(%Ut;nUwa*?@6kw^uSA@Uqjd83W|0a76H44 zB9THQS!6NNKG#Nm1j)b3%9}`n$md8~vCY$tG>HuSnx&S=aAc`SI+AszjdKw)LgXr> z;|iPSMx;&Teq@!%3rLm7$4KsM8)q|;CKA)eIz?npq@&1|IudCW$wJnMOh;m-+ER;= z&M8(NM(RbLMQTMFkSdX{k)crO4lrm=0TN`@b=_{Agu=B=ZL=ry{W;4apZd3>hmj8p#lug0!^Rx^6@oME;0Wh&+Xqiqs=xMZQ21Mf!Zh z6#UZGwI?!KMmk!o=7|9el4oMX` z8%Y$IhQx|2MzY?ubuCBIL{=eTk@t~~23u+a(kc@5E#pvRI1=-^Ep;N&`I?mrk$REI zNUcZ-QY~^XQYG>Nl8|E~e}u$}e227LX!8vIj?DDkqo3X+vdqb#)@2yWQg2| zw4Y~7{T`_lc?GG>vUxs1az(yJl0^FclOYs|Lz>UDaSlhSM9xGKM%z47k=EZ?xdEvW zxgDt#c?2mCc^yd;X+bJ7ZRAcQPh^+Pv~H0^Bthg@BwA!F(s`IJ&b=S8`Ylz$Rs7AX&lav&+c6lFJ3cK)?6lQL73yH3&9I#rZgNO_GYSCFzs zlu=UtRFqkyY!YSb^L6Jhh_dVitvn#gfu#IGlr4+(nBR(WKPh|uM%DyUjuvGjDK8Rb z$)N7DT$Gulyh)U8i}aXxin4{28$`L2lrM>LJt+^1vUH*D^Q0&Pr0nsu{6tU6!J=$i zpsVJJ@+c{1iL#lLHKI&EPFG!-`W&m3kBD+7DL0F9GbvvcWfLinigFc{*~=#yx5vB;{^VmXh)VQSSSyuKJxQ*O4;)e`F;g<=LXlA!SgMEqCiauM*|y zFKOlVqTE2rMp4#~@`4k6{6qCEEZy7Ny(S@w5Y>HD1|M#`b0Z2N*9bBrik zNI6xMhe)|Vl+C1ED#}&2>ps_tas?@WBgzs|zAVZhDG!J;la!x}vL7kae=qCLZTea> zMY*1oQ$$%q%GshUC1trNGfBBZl&5ahoj)kbxwmNL3!)rC%Kf5j{k$IYLs1?f(bGpxqM42LGSd>#q853m=DOZXzlavpOatJA37Uhx8>T5kL%6+8# zmnhef@<&mwBxV0U2oEX8i_#(GY*8-zq`uY~QRa~HR#Be*gdTH^C|gPSq$u~2a+fGK zlJY}QmffiP{8p5cNZId?vO@aOwXMmK$MY&~;W}Jx}-9CdyJ$cJG_k*?OEFbF?V8ld?#Z8%cSY zD9cD$E6NN~-Y&|f=jzTkigGR~cZqT!Dc=@lIw}7l%0ox#KAnEyA?4YkbY|)?CyH|4 zbF}hmQLZCpM3gH@xk8jVqEl21+Ul8T#gSGM zWwt1fJxg~!Ta;x7Xl1P^GfDXiQMNr(kGWQqEu?%#l-o)9nkXAd`H3hu?Wg;6cAVC^ zf|Nrvxk;4!chh~oCd&1s{795F zq&zOlQc`x>d0OWzeAKONO?$l{%YBIROHZXo4KQTBRL zSAATRNB&DIUlC==6I%J9DEpD}b5V96rEgccgWGh~p`t7!)z)Ldt4Uwti2K*&xazq-+#rGbx`E*%5kFHLdprE+(639MY)2MQBf`=<(;A&_%FKir$l+`+giCtl)FfIK$KfZ*(%EQ zr1bAC=N3{97v;Wtb?4`catkRJh;jufYeX3(<;|ijCFQR~SwhMkqTKfk{jvjrMk}rqHKG)RxTA~6DikND36eGjwqW+d7UWtl5&+OZ#hf%`GhD_ zq}(masigdiD04{psVIk#GHw59o!v+|Oq82mqOWz5DA$p)RFq|;tPJC~OqBai)7P4IfIRc094g92QjQhn3Q|rJWssDMM0xrJ zy7L=FnK)T1n?#vK%I%_TJ4uiEswi7X`JO0ulJb-&*ORi(f%43ssQVl*$^a>6iP9nE zd{MTYpsOZC*-Xm2M7f!iPm8iAz&1Dst5q zM0pD-|0K%kq-+soIw`*v<*C2YeRe-sRyI?P<r6lEDH`yL|iCQ{~$(jn!1Q8s@-cfMSdJ4yM7C|8kk zS5mIkRX-EuTvB#ARFwDVF~^E>ASo|NW3JI-#?u&5t`;SI(n*`oZK7-<~C%9};m@-AKV;iSAnEBAlp9ES))6x15Ksv?p3useD3_6Ptth9Ga%)n?bk)P6Oef_xNm-}I z96D3paidx}IVo$jvO<*WNqMU%SCH~)QI?SMO;M(k^0+AXuhyM+KT?ztt;`i=6DjAU zF)Q_$$ux$P_lR;XDPIufKvEt|%5vT3H==AA*2?}z$rw@=i?U^z9`kBZHj(m1QI?VN z!KA!aSA9j4S)}|xl$$QnWBw@01Sy9;SCrT2F)t8hkd$Rfxj>Kk3sE|x+?bT}^_Xvp zvU#aiwu*8yDZ9^-r;e0klkz9J>Ksu{C1qV2^C~^&J!uRnpBLrn^YoYpMY)TVCzA3C zJ!b!-WhWwKz9@IST#tEm8bitkQBEc0gQ83)<%>xCgoJE{8E%nr0n`UQBKigju&MaDQ73;`FhN_D94eqQIz{m)?+>|$~B~H z7G(`7kBc%u%5HMzok_~^qHH@!cYbM72DS2fQSKn+>ZB~vWByi@D@pmbC^JZTLX@ow zb=4m7bHiPv%oSxLDK8V{3Q}G#$`VrEos@aH^KGK+Map-QGFOlJjVO=I(aJODh;qDE zP88)vQZ5kXN>bh|%DJTcbyA+E``j(cfu#I<8grZ;(?3_nkaD;v_aCdroFU34QdT78 zXg%ibqAVlj6KTvWJ?5Kf3@JYoz)ohPfrb9L3xNjXw0FBRn`QZ5!{7Afx*W!p?$ z^|_=Rp_K@o*KDK4uZ|sj!Es44+ZGV?wr}V`}!~LAs-?q+V_`TEl<1tn!R#l`G(aqUzxO> zD*K`=3mpbn$9oIo#keR zoj?4BYc8^V9JE=L;Nk5b^XNAs97#c#%RW{+egJymVhtLr1) zbky&i-9_o|yF$9|&^f4c?{%NQC+9M7&tV&y!T3YJcjOHwRo4qqx<>liz4>mpSMBv= zey#ufPMO#4a=-egeMTmnuJ@^@>N7vIZe-nxiOWk#x?e*phDS%o>-(m;gDQ>0oYVLx zeVI;8LlzR@kugXkU9YYBC0D7HWKVJW`#vP|+NHBk=SPqI;r5)yf)D=p$Em2J)7Y!2 zk{@ialI+=}aqhw2yOpcbt6!Eh_H5GlvZT>m@3%D#{mxBV`;L3d=I?*3Q=WL=x6|2k zp&-ats*-13C6?xu6MG^Jz*kLdA5oeyNGvh6Rnv3hQm3DvRN3EmlRRI~>Kxg5{lvRv zQBH$j_|cynSBBRrwf64YR9zwi(`uEz_GuE^`RKRQw1hoLHJyPHZ=xdwItlDSk5si6y4CYB5)-XKeq5F#W1` z$IiZ;XWjjVpX9`@e&-(F6ia>SXY84x_xHU-s^l`w*ZxgnJAL)pUnzq6$Ax8H`*%`e z-;>1B^)Bd7eCbO+8;K{+^b{G>e${6q-K%B{W}14nRZF=_&GZ1N?C-l@{OO%NI)C=- zS#ritgFmwE9{Gttf9aVXC`NzZ88WcW^nhljA3NrVH|d)E{bgmQ2XxX*e=0Lg*E?_L zXr_rL&-9{%fv-B#w5l~@Fw@klt(xE}HPf`>^!M!}{!TK}_b=)Hk37?V{Pb&wahc{D zJySV2NtGP?Fw=vYnQr~q;A*Z)uijr~dQd0L^hud%y59M_L^Dl1d8Sh`rv1`0ZN^}x zsaIR|Hm*`LmE)f!k1WOy%$?Rq45@_w?Xqrl;NT zxgT*=dUacw>A{^e)3k7>>uuaEnrY(6Gkpg$m-lH}Uz#zPY3kKhy_c)hOyy85%sa`> zu|sFS&a)2q`U!cackcf2cZj9F^i1WrE>&sutUKeO&3Bv5ydo{9=IdK!riV5&-CJgw zu6OWWn5jAq9wxQ<+>)C7+xw4__q`16^7V_-IaTq>mgbcc+r)D(iKVr$8H25AH43AH@+w*Hu<*)$Zu@)mrm?(G5Y%+PJfmmGn&MHaLt!Kqigc_ zzc2He(Iob4Ni1FOu6>Z0+Vy6LlV^H6Gnbj}Bz`jnGfll3r5XQau2M5SLdNy?Etfy# zcUYbIM?EFCJq`ZlHUIH-`G@+_GkuQe{eALF6U_98W~Tc*bn&CAqX|e-K%qQ=a<)idSjmHb$8EurM?ocY|m|~R7&;X(O8Jooj=GSj1)nZ8VBnyxo>7-p*8@3W-3J;|K);44n;^?siyol{l% zd8hp;@@VRF%?lpAq*tG-N}p6E=kRsC&fzJsd@sH$8Mj~cUYsmaGY0n}&9<#NrR%*o zMk?i}lBVU3o$u|kw=84n5+9xQ?RPaI{?JdI{F+Fr{xSVo{9~GX@vBQ;d=3im%?)Ly z$29liHF7V~^|n0+_d=~Ci6_tWAHtc+v^vcg%ry0CtM270_0%0FS>wXbgqZ+8_roS$eYnpaM2h|24;v77kK7$laM+Nx2mQi&ZetL6z{F~?3=cB^`#R_zX;;r_8i|Nw)tNUf3Yel-#%96b-X0jH||KHL%RdHfzUOBOM)SKE=*2JD6ubMGPEHSlJ*Kw6f zY@Uqk@B5vEw5yzazV^MtWRXmX&G^^dzAOJwUple*qWAaRCIjn2Hm^zSQ}6oUkExRK z?f&w&X42QZ&J5YDu9gha^}cm%l-PibYge}a`S9;A@0HlmrE{v{#L~QSViOd2O)Q=A znlVT$F|}3lKjKnf`ls3jqWAYbA)|Nh9MXB}lQ;cIPVBoofBDO*M84ID$*<_8>iJSt zZ^eQpv4f79{vxhQuU=5*wV*RY68nfGmag}yIZPoIs&zSt{5}Etbrswp|rmtN1@|@U}Tl=q87m{yv zVvC!qZ>2xWpur}w&ra-mR}s`dE-CXGY!bU!5=+51Oiz%R_D%be%rsr^X9IPnY52`$jJ%J{T~35~?jNcbO9lA-*sk(@ zGX`@{-P@}4n~e5L&;2Bk`}@*QhkJGo>ny&0<9MF?vg_af4{b&IPR~7^1N!@hrK&bQ zshRtx+s@d=Rq53~mU*4j%>7}Rd%E8FgLUruY$Lx=kk0je@zIS}Ufb(^k^W|1`bt&u zzEHc~DWbG}u6j}b>w5Khs`N=!+~-v4^TYRi?(|-Lc3YfzQWf`k0rh#{-wxc`tIy2R zCspzLJ>9STB-~P?7o~j?4wLVjF?bSE)@{}Ixk|m?Pm{|2zH8*q9p!hWkFUIVR#_oe zZ%mf@(oez*MepxBQm#=OpVmAH-*~Y9d{t7uJ*mv=w9X897d$3ULb~46iFgv!`#oJW z&-BN&bJIgw^?|HSfk_pJCVIA;Z`G@+_ zGd)A}{=UDIu4$)FU#B-SeeC3YD}I)nKhG^QJ-wOfE_-x3>3TQ6unwJh_TZd(vRFsoIt*Gg6ST8m_pT!hZ)T8reMaTqBJ=g5C&Kqhc{x>iHDK(?S+P&CgH;#qXe;c~X= zKKE-2PpZm11G4&lNN#6)t$}%+&MQfoFU&i#B4cE!X{+YV6XwHlcVu4k=E}TY3Pu0M zHC-z|t55P%SAH+CtaNVw{Y82j+Nv9NkOBBAPu+P*NJrWJzBTZ=fAd*MVrX(?YQx0P z=-SDt&d?k_)LmS3cjBl729a+ip zM#sli8>tLS&DM`h4o!`$n;1=TGr~~v<}TbYBnjgCx$65l`TOPL;}`33cwNTgbs8UB z5^?71$t}Y*!Yn14NqP?G`#Y4ZSSN? zS}C02se+}SYfL7`H?(eiWplgq6FfJ5g6HB1b`Pq=%}*Y+FqX{AJd{$dp1pMMaU%~M`n-;v%^gLrEU$+y%FPHvZ7{hp~IrT0*M%Oow| z*XAA5zRYi!T2gOPeT|$;?oEr;8-~}foE)lS=wYs6`?Ms*J}h;Vc~(TmlQBQuGDJpB z`mHtJZW&Fzc?8lRTwq{8KYR2*G*)oexum)60|Og|7R%7I4yNzZ%SRp2i4m0BsA9=D@OAiC=k3ZFnC>n@VY?ZbpgZc0*BWH5U&d)URxgh z*e1RPSRQ5rf*D|CuVT%Qu^@Xawk#Ih2n%L_mA#5JFUErGvDmU$a3d_30ao@Z z*4!8ivd3b}V!@5DUcO~n~%BHA<4&=yYuPDLq8 zG~Tn#0KIP4P0AS-r4&Udx*wJhG^{9Ppo}NW1UWB5{bSn8u8D&wF3Pg*-2BX09D6m{A*{LW& zDvP?M!iGiZnhKZcRI-y%ux;xb1kt9#2BX09slalnWT&D8sl=xOd7jy@C|y(GGM!3x zGRlJJS%GL%VS`cN`BY%JRI*c1f>ikUpw<;OEK1i@xJ;*l!-zzV(}8|gAlg*eU=(;h z6<98n?BrB%BG4!hEeacq0?(tsawyr!C^!XZ6o?ju4Mu_IQD8Zg>|_+|{2B$KMPY+c z;CU2S4kbH$xLDl#XHRS6hgLCqoJm?&CO#M)Nwi24cZQm{_RPe!#S@29QS6bV8K934 z_5JD$ixMA6Tp8Z4a4L#jI+_7R^r>jWqQpyw>&GamD5K!CfG1N*AzBnR7zLicL9pBn z%1%Wob72%cd3A&MtYT5Rrov@96&y(<0Gt*y3PhU<8;kWRNzG@x}Q!3M-oW| zrv;4y(Wb%%rvlHTz;dZ%C#Qnb0;A|zsCN)X2dTh|P;@_?3XUX_3Qh|e1)@!b4Ne7~ zM}g&1$xcoMrv;4y(W0=yDDXTAEQgYvjDpjGMuBKi*kBZR9tD;|$xcSWX+fhvv?y#a z3OtVj%b{e4k0gV=k0jQ{kwlChM-t;6v zCz?DYI?{N@0mX+JUx>GSYXPV%4S1&V5WQg31;{%NsFZ~X>6Qj4Sp^6O4+4VfZW%iU z2xb5T&)>3a0jPi*AUz$O5Fb|@P$>(6bW2JI2c2{aa0nqFs4gLP3=qr!2%b+UTO}bJ zMGTOhj!p>Uo4yXHdqP}D3E|L_62bw2fS|gB*fBsbgM{GugtAo*(yNTVF?JT17gPj!3==ld7y0ZRxV3YkFDIe*vc35-pZ9N)0bDlR!%BS z-#cphWSZ%d$J1{u0NJfP4~e#N?>L}%EBA%i7g`HIW#z;Jl85NUwr*73aX|4h>*(yNT zVF?JT17gPj!3==ld7x|+AndRN1l0ktV}M`=K=3?JwsL}%EBA$1^;!!+Wp%^@l85Lu zvu@?yaX_UkOh~shK*=gV__wtL1l8R#b_@{A00^GHW!VBy0XIN;Iyxa<-W^aW3xRY? zN(lQxx&>IS2?(l7h#dn2GXR3;6UtUe2+K7AL3Kdv7$BGd5Ihf*tpbGQnt-4>Aa)E8 z%m4_U2g+6f!g5VOP#q9E1_)*V1kVFys{moSCLpK|h#dn2GXR3;fwIN>f;`_n_66f& zUzp!}Ur@G8UtR_K0;x28@2KgMX{JvePrtPQWcP(UB-$6e^PwA32`AM zgnc1pf#sSKg6a}t#{j_$5`yOw%2r7T%QXQ(bwKPGAeaFVJP(wu0)*w7fS@`cb_@{A z00^E3%2olwa!o)`9S}PP2xb5T&jV$v0AaZ%AgB(A9Rmb20D|X%vc>y?Jl{R`1><60 znAdw>P_|58UIqICsWg4>sOghwrcWMEzqJ5l_k}zp+84azfZ~0@7h;iVEdbe7FAphd zkdSs9P`v8-mIf%56(B6vcw$pER0qV40fHIaGI;)$WeY%MQU*xpQ1^w5svQSZ%n(Qy zQbO1l(gm1jcAiFQ*A<@3z9S0Qe3%(GGOltwCEJk=h z@({g5)m6_s4k%vre4znKWd#V!H330&w~QSF1T(m0@cb>y7J#CJ_;9ZiV#fh>PlyXC zA?yn&Ni5ft5LA~CI|c}5kPtkdP_{}!Sgr{Ossm!j0Kp7^;CY~I6(B6v1O(Lqv15Q> z20-vUP__yXmTLln>VViWKrjO!cpfNQ1qjPE0YP;@>=+=J0T4V7lr7#D38ma?g#{j_$ZW%m(%d!QaGARS3bEx}5M%9i3DrN|z z3n?M&3+Vz_t_cXLONbo<1Tz4F=M&0SNeIg|0YP;@>=+=J0T4V7l&u1U<(hz?Iv{oo z5X=Awo(IZS0m5=kKu{eJI|c}500hqiWvc*Txh5c}4u~BC1Tz4F=Yg`t`+_{*J@y6T z=6zu>{RA*6|2bFrK+GZkpUq*rd1e0wnGxH`M@F5y@$}Sg$D~opO_htRb&x8>@ie9ZOO0ddB{TL+`TgCjJuOPtRJfl`B|Et}{_2)a1)@!b4Mu_IQ-S4D$xcNHQo-Ny@+f6=kP3<- z6kVoM$we6jKThdXAX*eQI2Cvv1(r)CI~fHVrbdBiQP^MyfRqD5hYQQ&zLSPmsS83h}oMuBKi z*kBZR9tD;|$&T852h$Hsy|z(pH-qg@S4PxRklJ>1W3*EskEcKuO`&z_Rn0b<2k70h ztkT}FDB(8h%j$a6Iu*q%jd_4x$_Pap7NvMmD!PnOl9N&JBTjwB5(-3ngV|_)ypc)0D zMPY+c;CU2S4kbJCVF~lx|LnzxElOlm6ys?WV<{Bv)bDAvHKIq+%dkZWR@^7~L3*0?*$dSWTHm$xgj$kP82h(X6&+ zbcoV574F9d9z`1#rE4muMrObsug^_WM`wqAL9YHh)Bv|NX0!DLcQizkszWMJCnl_{LG0k!eCBk5g+cT-u&!@(_J; zsjHxO98i3y@r8KHw-$ix`jdx53y^mlP`m{BLIae_3J?w+c*s*VRCmkRF+ebbTL#bH zvTOk;N{A07`j)ZdfVwBdg_KaX3J?wbv4HFPl2gHs6 zf*An8^FY}uK-i242&w~O#{j_$fZ%zcY!x7E$pi$|0kLC%U*(yL-un7pN17gPj!3==ld7x|+AS~Df1l0ktV}M`=K=3?J zwh9myYyyJnfY>oWFascX9;mVO2TJ0jDf7pPrY)j=K&ku{JXs>L-uyhrhWVu7W^np^ z%lZMFx|Q_N7Io7fT-wy6PVHxz=CMhW+0f@5C(V8cCZ>}=IkbefV0>)!a$z8`0nSSE z0i(FK{?yU->P5{TK5EBiRSni3^x0e}3Ffmyq0`5aLM@*sT%uE-j9QenW2?sTp~^+e z)0x~bkv?&GvWU%P=d3(UzcfRdy7D2Z0BFSKbB8B}SFV)5QKc`^=-obfIK|@zPpuyw zOGx&URmZ2+jI3|&cVMPY)zeQ9Aj?zOyp|myeds7YXj(p>6VF5bG}1}+$*1|_V5{DK z^6BJI`^l%1L+vM@%BQ6YU>)Cn@+m$cTHY`CpxfsAwC&XK=95nW(wwwXA%F7ebcUrwP0QTa8x~_PO|-U)YWTp233&{ zM`b}i8C3*zR2>*tAs>r6xvu-KklY9e^7{w#ACM`%TBBWMgQ~`?3vJ-*wKlNTa%)}v znogsE5hLo;YJ?aZOS|>X#~kbG*X6*JH>$vh5ldCq6pP<2MP2R@liQNucODiIMufrMT8L{vgr}w$B3{)#O$_+IOtnM7!e|y9ua zH5FWRC`iNfwyzgC>jiM#PXxA@R=8>^xUw43GnIzvRno#~FMum{m*jM@gG(mhuqPWh z=)rAe&%wbC;owHMHJb{qOvJ(I3377S;G6ydTq*4WryHB(a%aF{A2x8%gXGwAaIix- zxKVQ1RB&-}*tkPDJ^28xS909gBu6{G`(+@Yc~9os%ASLR9VQ1iN-mp#z^-d&mVR{9v3s~d@aPjII6+5_83OH=Ac+ztZ=)rAe&%wbC zZ!6sBwq{eo#mVum&B?JB!1YRwi%oLa(Q`uBU`=w+gXGwAaInMV;6}-16UkwNb#P_+ zA)NLCxL(QOf-zhw1spb50|z~TW6#0C4wHi$!DSP0*kBDD^Z<@M2M0TZgB!tR6L8pI z4IK0Ujy(qlJA{K9!DSP0*kBDD^Z<@M2M0TZgB!tR6L8pI4IK0Ujy(qlJA{K9!DW+o z^k!AjJ9gAo`}i4MD)AF|^y9tub0F!*N&5qO8r8}+4r_55%JtOBbXiod#R@j^G^ooy zZY_`1br-j#dbO`!i&fS>{q&?kdc{=xkhMHk*R|A^TC8>@O@GZNObfEViELRcxY137 z8QjF|)wHmSa$1lhEFGlB>X8 zlCdCrEVe8b+z1P1fR(+9g&mTyAbTvfEEe1d3ub_oy^4jsk+C3qEVe8b+z1P1fR#PB z5BK`PI&G8TE<9&@{~DbJNEFTMcE?2)MyD_$Po-gO6Nhm*4{a(qyTR09(S96x0bINz zN5xppwW;9BLg$jx%VS+RYYXiKaK-MDoGx~7$pjpBO9KZzxUK9tIM^W^+~~GuQ^A#q zI5<5)PLB840IrmFfzypma@eKwEyB)e;GhS|vFG4mhj4JC^V5tVRCSza|$GMxF+B*~hKrvAXW! zwp6cK)oZcJ+NYnMG^opJYAuh|buG1}7AqB2EbOI>1=-(3wk#Ih=qADpZesRYtS~L! znbqEtenFsv^jJO8;!;ja@7U4L)y*T%+bUtPWwGE!X~7KA%3e(iJ15^n$o?j><*|CC z#ig89_9_!~ zg%@vU7uLQ6kzTg{$pQqyG6fM>DhPHBG@BfR@>(pr3ztFBE*w}ME8c~JQY=ZzYq9LU zQU>YGqb}fq<+0+GGAOlJsjy<uVUdC!D&JEX|ZLo;6`b|4ARP8ixsBDrwe+v*z#CC(&AE13ul(*mf#q{X+idB zv1PH~Mrpwe(#l><3&#kHRVE!_Y0G2vNDCJWu~K2h!hf}iu^@Xawk#IhC@q))R`yz~ zGCPZ(xSt;nL zZTv!Ga63mS?Mo2pWpI>YnSux`6$HBmnoSNuc`cSbN|iy;Q7W)JR(zBSO7Y%TUW;Xy zq%tU4k^;+P#Y<99YOzvb#lq8_j>j#ACDh0_gVLH22}WwGE!STKXMvRBi>>4vc& zdn~pr7TgF6W`LEwiiOh+V?p*`|%=ijGo&<+0+UR8Wfd zzVccuyCjuCdhw`BQeb(kcu5LMEmkV5SUBC_X>J-o_BW9&iv>5ji71A+~Vwr*nEENR12AWL{LU}EgJxY~9(NQX}JXU;^ z3QFdWsqJx>H;2E9;+0_Y3Z&OD|r~A7l77K2K1v9vb*=w=N z1T2=G7p2ALA&*rGV=Ud3)51}zxg|K=FcxH=7F!kzZiEFhNGp3aEu3yFmYx@-g^H%P z$Lf(5mvUO!t5`VQFcxH=7F!kzZj=_xAg%1RSY>t=t7}?(9`aZ{(&AE13rDHu*~00D zu^{`j*s@q~qqJZKX=Sgbg`Y5fRn%*9(M_OFUY2hf<3#S{#g6y%_vRH5o z<*|CCg^Pt)sjy<<7{OSOJr-LQ3vQGa%m6EU6$|?{V?p*CLEVvOC%m6EU6$|?{V?p*CLEVvOC%m6EU6$|?{ zV?p*u6NK2UB{ezy`#^FHz`|Lgc=S(EPFU8gQCMhV0o1v5x1dld`&HDf{cSZrA= zxDgi204sYH3;Q)=LH1Z|SuD5_7R&%Edld`&HDf{cSZrA=xDgi204sYH3;Q)=LH1Z| zSuD5_7R&%Edld`&HDf{cSZrA=xDgi204sZZI7myF-u;7~+Q#8v{&o%r+Ls{G%iwUp zG6fM>DhPHBG@BfR@>(o=I4Fan!$DwqtoU#clwze+UW--MR6I6ikX~x*;UKU)Rw<0r z(p@c9@+ubgYsP}?Zz5Y33vPr3Gq{P_Yq81%ES8=ZrNukE$0~&}mhQ@F;c(F0671KE z1=**?mc@b_VZjX2%3e(io4Li(^P;p+(e(CMJ<{S*P78;FCN1pOj0M@J#g@f_8>Iy^ zNGp3aE$r8f1=(Y{Tr6*Ng?(W3gqi;6_+51FY;-EbP~e1=(Y{Tr6*Ng?(W3gqi;6_+51FY;-EbP~e1=(Y@ouxp^%M7Asz+~_943~plfTC6ZFJ^|G2u9-4h9;-)M zT*_(TaL`-?`!%Np*{8*p#ey591v5x1do?ZW*A}ZxI>OSH$Lf(5E*4^?!it6cnz0~z zEVe8b+$b%W0ao@Z7WQk#g6y%_vRH5nS)~UyX99xifY>n!!3==l`CFDP07VJ$X5AbC z?D(dy11ilzpsoq!tCb62L#BkFx`fy(kd%Lv^=|9Rmb2xMlGCEz1^w z%A^dC&Os-{8@2=Lo)8yOLUmhivcPUhKu}#m>=+=JK|=6+LfI+_VYf6u-4eq1rmq9) zo)8yOLUmhi62fjtKu}#m>=+=JK|=6+LfI+_VYeh8s1Ar70|YYwg6Dy20-vUP__yXc1r?+ z>VViWKrjO!cpfNQYFnPWu=(Bi-+3oTSbFXCSiuq-cePllu#UtA%2<#+7F!kz zZgdl21~)N#EmoKo@2<^;?JAny9;-)M+?CVHUcCr5Q%(!APm3*!1vg3yW{_6)TC6ZF z-f1ZvRAQiB;m9m`?T1ySa74X zUiiOh+-$ckBi!F-< zH@b;1gPWMW7OTw8V(CceCh~d6WA#XjOF1nZrJ7uEx?wEHJ}tH^7ThQ;m_b_Et7+kM zW3jrXg^H%P$Lf(5mvUM-N;PTW7{OSOeOhc;EVxlxFoU$RSJT3N%~+5<7F!kzZiEFh zz{+05!hX$IkUbV#77K2K1v9|PUd6(G%~+5<7F!kzZiEFhz{+05!hX$IkUbV#77K2K z1v9|PUd6(G%~+5<7F!kzZiEFhz{(yU4$_-a@BTqgZR2o|ezQ5bc5L?l*o+0)-$b@77ToA2!VGR=_FAkmJBy_wsmFt6%Dl&WtR87`DW`?w zL30u8*o+0)r^S}Vf*Yj;Ge|3YH7)Ge7OQJosAzh7tR87`DW`?wL6a7CY{r7@(_+hF z!Hv>_8KjlHnih6!#)9mz*s@q~BP^H!R`x0uc5KFi?6KIgSa2gOm;qMyDi(HZ#)9mz z*s@q~BP^H!R`x0uc5KFi?6KIgSa2gOm;qMyDi(HZ#)9mz*s@q~BP^H!R`ynnj*qV& zO8fkztoixXg1Pf9o4d$}^X3c;UN+CFbLY$(@ant;3ojcO9lzAHm^*LK_ie^(jxuK+kxiL2-}n;i?`O6!$=AZZ@h12KgTI z|1Wc)L2(aYcH>ArFevT;%w9b($oH5hmw?@^2MvmQbbmrhrl|)8`5trsFB~)|?tx2m zn@j3}LB2;?24HvVL4$mc=Dje`^_^D&;Za?>bYGEl7mVuC1Ye2Q>?cI%o26+y8d-v)ASl@%*-rai8Am4-E-QAk-s4iXb?(W$I zqq=m#Gt{#SMs?|er>JKaj8a|lQIFmcu17E?>;TFh9WW;B0Ky&}FvfLA&oT1u(t*Z= z9YENl1IC0MK-i-L#<&jjPU_Nu#)KX4KI+i{V_XM%7j@}CV_b*kEwsIx!Gq!+h`I|# z(*uLz9tgWv4-7Ir<_>ND-C@Rr9l#huVZLV4}{&T2L^Eu z`R(QQ7F{zWss~_1kn1rdss~*6dJM7k=|=Tjr{p)GdPr0cxcK_19z&vfz;&<35L@3o zC2->gJSOabr@co9jA=XMU+hpowm~o?sz*TG>oFv%?;1gSeGG}}F}d#7#}HfJ7D`PX1Q6AXq#^@zs;wDlMg)gzwn^%xS>cMYJuK8DzOPA3N7F>QzPYtY8-`c4i9 z#XS&`#n3%4DDHuvdiB5{*Q4i&qhQdOumc#oK%@>B6LtV$j}92)I?!pNO9vVgb^u|I z4j2=50AY^~7~?w7X`)L98WVQFli#BQ#<&h?d4Suc1C41rq~&kXQ1j-%9BqeaOxU3- zgX(}WwnNX8LT*4qqI%rucnYZ=L!$caM9}3vX1JbfbTGtTKh*;+=BFW1{dV|MeHxPf zefrq=y0v4&qv_T7%8{X|k#!TJ!&CD2LM|C!zkKcF(8$<|q)(1aZI~EZJGM6cPjl9f z43D0=V$Q0;g^O3ssb5vEuj@anzGBY8#Z^oHZ1n{LMqf2LwPA8(rHpvRc`qD#;hK>Z z7oRaXQC_}s&4#I!@$va#{ClOxO54$I#NO82a}c zJ437MeNyk53cg^@!g&KLSI%2CcX;ut6*i3AyfD@ate7)*klzR#(bV|F=*T4_qxC+q zo8Fokx9DrfR*lPoJ~Avb;Gy~I>xRdMS2u66@-Q!7tiFaTl|1Bzs!nkvKOhCU9Y3Nc nA#ZcOcwRzSTQQZ^pR%gVqxz~3%vm7++r{>))fcv+eAoH^Kl;Df diff --git a/cs/sdk/libraries/vorbisfile_static.lib b/cs/sdk/libraries/vorbisfile_static.lib deleted file mode 100644 index 5239ff1b5056bda36879ad4842bc9dc1839d30a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 287274 zcmeFa4SbZvwLkuB_8}~=l0{ZcHR`I1jSXs&-Mn>U3FH+CNgyP_3M?VnNHCBz*&u2X z#Wm>TuxRzC7OicsZLO{M*0#63zSa_=2DDWpzGOwLt=<-lRw`7YM)Uukndfb@yNJ^M z{`dd6|ABon&w0+AnK?6aX6DS9nX?KTJDb*iWBP@zXqT0hou8ARm+j4uhG(j;IR!a+ z!n=C9BuO7jlINy>{;zC}BpvNnk2sI#$8MCQWBL8$Z<6$7e}gAWlKJ=Y^^z3lXL0^o zI_}@ag_4DSwa*>juV=Mn(SG-ClPsV2+qq7%{15*n-ML)Se|OhQNniH&+{IGTm-&5g zm6T-qS?fBbnBVFo$x6S!Z2h15n>Wv2T;$Kps;VwqIKQ}LLD3cS-1FxbNh;iP@%)7s zS1+!rDVpalE^C>W6aBTOrnilBafO?|~dobF-(pNyXRUEm@78 z+(3392A-Xno9%6G&IUq3OOt``&G)nvWX0k)N2Nr=_hx2h1=i%}WKW{+&CG7}z~MW0 zI=E9QZ0}qHzG)290(e@qq)v(`GfU$| zbOJJUUZ`-D@S4_OXJatnZ)|Q})7IW}xgMkTp{Xs<*ck(DY3uG<+tJu`c>skuiB#)` z)>zu?QHA1s>27HW7|GPw<&R2>4!xqY zJs8l5aH{@E`Q)jK3fG_0jk!VMC%5fr12$+gaK}A>@erU_|Va`KK=)^ z3xgvDerKR7*w|@s! zH>;&7zeV!5w6(W)X8Hr0I@&vfYq~cyx9NernSn<9*9EiJo5v-T8Yl}{5jBC+z-tr@ z71%;@L-n_A2nISk+S^Dr5nS*0N*7lzDyytUA5~Hn)idRmmMxlJT)n8cNQjN7kLb1* zRF~IOmX%yww7j)r?L2RF=VkM9+FIAta{)UqXW=}O<~f<3Ot02!@vdl1%jA-sES1)x zWd=IUt+uIs{rbR$U{p&n!TiC-%k(O(!K3Am28|LQ8t_})fli}qh=Tf?+PgOx(m?$t zQb?Vz9_?kFjT^e#0{&p@dP6d_ZfI#2vaGB1s!8DJ^l{9n#2F$<#AcF)Z5>Vimd^I| zei|O=DIjP^XP~*Y$*78Jn(_*o8nZH+3bMV~*&e+LHaF(9G^0jkYJ%bV92P#=00GPNwMZ|vx3-Edj__Uj2Wc>*n224`D5Iho!TqXb%VoANzo&WRjr zPc6DNG2@c;%}qi78VK<#8mUX?uWDW5{+9Mm(-&2!iBb$`N!Lo%<7q6w04p;m$CI6_ z%NkEho+;ybdTDxE)^HKdM_Q)Z;Ax2(BI&gRETplU?zB8%td*M`@Mg!-Y01mV@#amI z?Vgrskzvrmhn9joP4a7S8Z3&O3T_(kti0x?mR#+d0ngUPmpp(0_e2c}4R}t0pgftr z;De5**J8nMZK9z&shoXn$g!FK^Sxp`U#{0%r|79Ir zS3+9w{s^z;w+?^f`i}LDn`l7O2m$Edh!I(PcL(o=;J>V`eNAJV9#{v6_C(k;s1D%S zxxTTDOSm{de;0Z;L7bznZ|vfoYKOnQr3IrRjK!P%>svPo6iT03orxB`Y8`Wj|6ARS z8-j>OO{IT*V12s?Hu;MYXD4vb_495};0D__1Vkd%wxDF1yPJZo?HFqc9DfabYTM?1 zj0jtsy94BhH(ARDCh9T#x|N$ z@-N*RG^PvIH3mJ|esv59Zu3_ypZ?aic68C;>*WFe6_|^FirVdSTG5@M0AYyT7BHp& zI*@`#ho%Y=cTmnhXd@*xKGTplI#$z%W-y?$9WA1{v&AfI`Kua=`}JbrZ=#~A@en6a zx%o^cs`uABc0Ch1#J{$&t%atKNBQLMi1QJ1&Zf)TH?;9atj=&dI@+%EYtt8v+v44S z873p@2+&)+U_o_NMR{2frbZ`|_gSn=*6p&v25z zeWPEU0-OD)y5KvFu<%{wEcwKMPe41{ySgyH<1Yq-fTg_IPCj6#qoykMZMO-Bi~2OGs(XX6z{1lo%pkN|o> z{$d2=6H-J;GgFd9je;wb+Qu~`lku%9(AnD9wxN6d8k(IGAPDsJB5y(7ZUH3Eqyg8Z%{v@d2Z}Ldenlk*Ym!un+B>n9t zl63N*BwhcqB>mcHk+zmuq{53W(sQ*IX?2f9+IFu+TDQ|8Ex$8Ks=qr)y7;*y>8cNs zq|Q34l(gC^ZT*Xt)cTT5vhaT=Nhfi?_C8C}{-tnViZlgy$^4fr&A>m4G!xGgIGp?^ z0CEC{O#y5s{!xgTl3hyTegPxAnSj$<5`S9wccMtRGo`8c(LaKm#3@Y0^CaL>Y&Lv3 ziQ^LOnG&T-`$z9i$%=nY{!P${eOjaw)qlx|P5h&{Pf-66FOK)0Lps_&3s0quKa-Gu z@sCn2xGqc4{|IV}`Zoi(Gjs^?YC8VW-`Si7g`W+a+4v{oA?oyQ)nr{(Rl?cszd`~0 z1x2eWkdHd=K31Lb7oD7|aWD8+Yoq@KLkm8#<0G{=gN#WdIg=_JqY*wUGWw|K9xO(U zGg(!hP^}~AdcN@7JAvwb@~kbvoH=&JIVnG1ScRWxb~t$^n@H6kJ;O~rtBjrneR0j= z7oC+R(nQ8znn*m0jjtd`w33i`*89aYpqLH+(`L!$y05i|#Ixr_OEifzvWaHf30G9i z$;mX*lW2CHU}-33Wk$3|Z)T#|{4wgXG84`EqwB9%tUQ_0KS`7OMYRH-qeF`siBDb{ zo1|4RG|4JoCM}(LCynI2h6bI>%S1Z6SWT6nAFJ;b@Pyipn3;o$KZ$QmFk ztQAq`y}Zx(zpyHBbS2EuW@}<4?dWTIab|X0k@LS?wWF_1s_VXAW+u-^7L#=;9C-Ze zFaBuVQvzl3mr?d&{`db+wEh2kCfX2p{~NTDlU50JC79mOxv(@Z$r)b~7&F8!H0nX3 zRCzjdlAXi9286G;0MSCt>L+Ha7IYTgF;UuOGcL}6NAP?@4GEKI*} zlA-nI*;!}hWM*qx-lbn(QCqTT#U|K~tmx`&S^?`3LH+!!3-E6R;_zgzs23yTT3*)v zrC1bd>$|e!*M5uW*f&%1S|H(O`|h#St}N{{uzY2GLJhoU27X* zCGbyam0hrtXlprsChL;Pg3W&;JwI!cqh?29q^BVb4s!ZmxMo@UT1UyDSa6#j=&^(nMD`G z!MiXXp5RMV`aHlZR&f)hZzVn~2F}l>ideDzCt>=w*tC?1zlqX!(=p%?%C;E1qPY3J zBL**)FNAVe3|=ffLb>-C@qTuUc)vPEyho1_Z|5=MJ#!3rRIgr)!HebJ8Nhqx81Sh6 z9zF&Nb>MvlynM(4a(erSQ=cn=vqHtw>hpyqrDgN$DwkC*T=4a?7uVJo zFI{%FD+*X$SyDBBacS+@E}~s6O_PeAy=-&E@r)|X!_$0ewu4eV6^rfDr73ptJZo`l z6D(WWTY|3irRTY-J77D}dKC;xUB&I|J0L_mB^UunQf*y53%VVwY^~?L24%x?Wy1<( z!)j$ib9j^eu@oS%sWtoYM+!YDhlb?PsHOWob^-zFCzjX&^gY#m3F~pE`aTU-*K3&l zJA%{wt5!bTJ25eF>0o%3T+6@IDpUDirCe6pZLEH-(qLz0nM%2XRe6#O4Hh#(Aq6CWrg16#1i~GKXCrL%Zl_Zj*KeuF-YdIDcuqzr2I-PPB6B8w$m$_YQ332HJ*_ue<5_dX(uMzKTB=lrz|K9GI z94KJmrRT$fZl@A-+f%lEfKcor3LEN8m4b`*mbmRAwXbzMU*|GEvLmu%WcTYl3z7Yi zL#l7*WXKx>k!J+#jh*{OM!&`uyV&rII(IOQJ-yvJFuTsJl(-$rGPm=OZElCa9F-}; z(7U#MX>Ojz+KE@$Vn;;&W#~yqs5eatdiL=|ymsJ^Z+`e>$yK%pe;rL@@-OFb1|z(Y zXu;xWdZDK+Am&qZyw!gIP+<;%QVEiM^=f2zUBudHBJ$U-K4`xA9KKBjd zN%bIE`ZJ!{+(#Ba7joY;)C?LkBui((C#um`;S<#;8$L=mYA$@|a^IX5+6ruk&5>|( zT3pijPyhbn;x(>$fV}zV+*9dqk;n73B6|P!yb5}E^^aQUeaA)nYALaBF93d3so3A= z3bwn*5X(i~yNmYrxoFHJT_Mfs^3Q3$V7(OL)k+FxvJ$t8Rl3vIGIweXUQ(CfEp_Rn z*P12!DUQ&Su0fJtcKnig?y1#?wnj3PoK5_ZzKOq6r3-kx0`%F0Bwc3xJduYPx-s)^ zQi(}L(3f>w(Aqr3?w2M&$0`-I1R8@EWM+buD#Sc`BdFCvWfASnBR9&4)pBz*0^ZD{ zHY>-W{)=4Tvd145K6+|U!by_MV=nq)wfqoIY7lpBdIuGVQbbO0i$c3dV#5&+h0`Ej z4WQ#x#6VW-5Q?1~)o|g6j(My|sjyl|1Zt^}dCJUbrXiZuLgJ06_3oQ}n!v`kh2{l- zkfRo8mCU2TseoE78Ye3KORv#VBS}~DFjNZ&W)4Ml#0YiI%$naBp{OO2BOH;hyZJjk zT$A!e-Eefil4J5k?aOMR5hjf)(`Ww|#D>O&9|J;eI;Tv&C+MNN=rqp&)JU^ay5uY^ zeUkKhH3Z>AhoY8Zgi3yWIMJb~J{onS$=$NY2sNUHA{-I_eiZ_M z3ON!5F}E)ox>zk|5GtH^*D2eyFpx-Ub_hp!i?j@Kh?!0*AXba^IqUtt)mj+L*Hkd! z2yZ|`jG;q4xWS(-_hvk&g^{G78j5hhAJfSER33`@6+$^>!><1}TJCl=)Txq-LYc&6TibHeO-O?q3tV#HVexHg-vy zc64ZDux?6wa)r5wcaqtRX=i*(Td=!}Z?)EvqHeo4HrcnX@4)tvrnYwM`%q0OJ@L;5 zP@^+8sEg>MOrP+gQ;C26fW9v;(f0fJ+w~J|r}wnPx8Z{=Sln&-o`lB)#J8dI8a76P zQyrbykBS|ze*W6QcPndI{&F^`f-X03R|_Dgko1nbNy|EGfPmolz#*0y*=@h~DSoSE9Bcdgm^VUJGJF>X?Mb z^;)J@N?~ClFMS5Q3bpg09zULbiF&kcS_ee|;ffqZG5Qw5yCWXnq7e{T|AB0bs9 zf%k-pOM)|zo^01K()(}V{o`}!J&o@Z_&r4f6*%f|67eNO0~M3wd@;#2`b7C%-Pv|8=HF<^)*?#4o|9i$mts;y&d*RrCb`UbWMf8~AU9iogv zLp8{{mldT6MTF9ZyqCC*f;*M?bgJNGCis!LcLiq0^sBtbz65|X_EW5wAg^Et*@86d zht>~6Pui^?LfD z6zz$xE17^H^3Xg9sY*w5=_sKR;FlmQy`R{9M(CP!DL4aqvCyuGOG8f<4k``lc=PPw zFRa{-s2kE#wrvM%LRUdgV`J?|*Z$EYwqH~Uq(1HSU*%K$<#NVT)~9^~sN98pwf%cj zwtY`zFEw0pmwhw^+;k%P^ze_|lyBcZ`g&P|obj^t72j}QXK24nHHk?z&Qfx<-^u`2Nv*zD}?A?9dLK-e3&9&?hr{o>Eqz zdY8E8B28W@!WC}s-ud*W6412QFLO<5i)fx+v=FqPl6@ua!pNHx;`L>2FX^nNT$Q|U z1YiOb5@3F}02Bf^7vvGT@{QfEm%H{gOePE-QdyeoOCidqP^&M*J|+Qjs!*P?Hn*Fp z%t3VtUE`4Ys=x@h?_h5ktF~qAvOag^Md6Zr1b@6?KJN_;TELUgCn;2Gd(U8wr7D+M zxh(@VgqTegP_{n3X?N%vr_}dN&~*6@_ALcXDrchWyNT*r-@I_!J$4jS=sg()y_K2~ zE0xsbAqA+flq-=+(0z_{yFBPMyODfoD^s@KN`a8-jB;CO$JFhiKToypWCsU6vm%W> zQy!a%&x(I8LpB86jDsN3|6yO6$Pcxmb+&bqrcknn{$}ZZhb_CuE;0sWEqdb6HPb0i zDcgQcu|oXz@9k^#9qJ3Pr!xjE<+cOgB{)(>c}9v*DblRGT@97fAV*TuS7&Dq_tc@V8U(p*xvNu|eu3Qu`-@epX+^7ElMks@6jOIfFLp2dwOJRIs0_6%3`3 zs!V0eeyWxp78ZueZJ;KxvbjpRomFKj)ectgRT`YEEMF;4WmSA}p*jsEFjSmQsJv&n zbg%;6^YL>^%kdOBgh!$Q6*+Aof$G+mRc>nIoF-0@9{)P!CJo@Doq2+d;>1*$2JgiD z;{P-J8>2Txv2kaW_ypUu08C$u$^0ME9=JseFbSO|@#F{xl?pD4KgAI*4S{R{#r!a&g=s+u_Iu{`3TnNP_uUx>m|A@zDFkW`4jbv#N(ou$D$x+ zl?{#Ljna9%VsEd;K}mW>4MjMDtACEBW14Q*IUVAvmM*L-;?2x?bSa37+6GbkYSPsg z7}$RYgxm>wnorOOafn%EGZT2xWkDODCBBHF?LE=dEy6%iRj9+R+A{8dO*COu{yf-_x``S9G=p1HsPj4LBYz3Z|t6%8^OOy=Z8vzG+ev zQAhS^s3u+1g<0Bub}{?c?O)Vg?gHv^VP6xsf62nWO7V&G1m{X~peMKrQtk#SDY$rg z0$Cfx3lu2JW9?tI;#=kWP6@Dj~SUjp9SDlXNWc=Pou0RJ0s0@Rw} zs2V1scO`HX6)zFJ7KFbII3Jnt64A3lI?Pt3S0Z`=&^sMC*Qt0%OWz&9x$kr6wS(R- zfODp*PoPGUD1A$S)2QMlO5Z{B0G9*jQfkR?)DRQV`zvscsCbF!5&ximk}e}ca7Rnu zcHsO}#Y;r*95C!Zf%A$g-RV!F^lik#!4~|;C8DFzcy>HOQ!Dn#p$9Nyba*~gii?!4 zN~No$ATwB5$Ebo!>nhe+CSGP^%GGP3I2bCIrNXqQL!V9UwuOsjr96G~gmq5BAOoe6 zhwQBKA-g)8C1Vyj^jS*J@JjzGsAC4xK~BuY8sQ^pA|wEHT;!6Zsa&*?+?pzp6_$;a zRnYXu5gM8r`s zy2165D+g(eOc6V|@s3EQ7w^=9oKh*C0`^Va2aiM@G&vlDi6!+e7;;!KtAE%kcj0kJicSEK2ps7V8P2jMZB6?RNZ)a*dr7=lhv#=|uiG6E!hWvNi4IeLE2 z%F@<(YbN$6<@uf+_)t)mMj!fCg}1pu2!2x5rgHHD)~7PkS-M$`jaityW$E^eox@`_ z;VoX^)+}Mw`Bv!8)SLkiG0vrE)4e=er%zDt`OQ!%7v=}9MrO1ucd~k9d1<07*CO*g zv*GVi*1>_I;I=I@UoH>;V}UtFtNcO$ay_HG`O3 zArtR<_Ih?GrHCXQ(Q$?;rI|{plT{%oN?0k+WcAK}rcs|rOy3)izEjZmUkZ`W8+1AnC8Yk3;3KKwlpfK2v^e77u+w#4 z7kt?q_6~g1tve+@Mpv2KcNu&aa^E)i1m*kS6H@#!-FGP%bph~_rN`i-zD&q?8s_6a zesm|L>nshzHWzgTBE{xcwPDcAsnT}suMr%Qq^wYg%Z3^ynTz4j(>3)% zAcvkzTjd`rE~1Eric9dsirb}wr2C`zoDy-Rko)rS6uFoWAJjGYx(H9wb&CGc=#@kc z3h;#tcPrht{@p3pJCS8JU+&)l%jE{*esBs~n>L!{d5?W-ZU2WU*RKK>Su*l+vZ~xp z7Iw5X6R)Cvj;e30jI#R`X46EHoh1Q-RoRyi9?X)lh=cE%&b`b5RD7>@Eal%reVJ15 zBG2A}m5#pi!@qSQ>uf5k&s6IrlkcjTSmGcJKDV3pt#tJKQKSPpNgjn9>hns$aw6gE z%L55i#!;JE5pQ9qz$BWs_jRfz$wJG!BNYv?2Lu zZw|z|T<$xY>*BGPDsKnHWRWb$4@$T1n{v;aqcX=RwGp4!+eN3HT*s5&|6%ZaR#s#R zSXN?wsW4vZc>vN98+|s+#4j1l1*^*Ob8;Krv*1hSmcYVyDc;NYSCYTN_W*pN(L4>G zz#D^4G@se1NCK7zA9eevsyeI@KC0ARy?%M|6S%8VkOtV@5@Z)Am z-0m1dE_IA0Oz~IA4Xkf1D_6OJv8K$*!HuEvB80?JC`Mr%2Br*^^VX)rAbN+&D+rC1 zIm1qyuinv<6P7DH6H1w*;A*)qU5s-fhgm&}>QOH1L6B8Jjz1C_;xhbdx#tbfj)G#j z?@ZAN0@ZmPt8#|zH?exVV!sX|)>ka|`~}Sjiu6kdWyC0QxdA>Gej>j+;Ukx%E&)`+ zFHGj&wbwR0d@WwNEMcphVfh}sq1&>$$Cbbs2WPCxWaFVviiXP4h-)d^et{>AI;h4e zD-Wk^`#u25%5kK&%-MIACdR9kXTHDed6ylGsq-$3atb0WR<&I~lt(y?`}r8Po$ z?HfUh1hO3DotuiTLS65`>+nva}mAb}1`v8fPoVRl;wv(!;Du zrk)2K?tED(J&aVPY;DF;QaJFgpBuAdq{mIzo!snq8Qz?df@dxF-H#_tVx6?3U-aSR|u~-hvMKxk01~R3Tx!58(?5u!I zgmu`n7ZOmZcY=8-+lD|$U6-qOg+4CoyO=E=XA5Pv6YE<^Y+#+MCgTN+Hkti9Vdu9S zgbV<)K(QYEIN;keURWA-ZeF_16)xF)t;$YtYjh6rsn5m=zn}38Rj_d3oosmEKoX6w z*)yR(Sr7e;_1cjn5)DYp)~moK&yH~5plX1C@YVrenWHa-Zy_;0P=1v%XZHyiWtpge zeInQ9pkGC{1Z(r)TY{fc-xJ`J?!>!bH+9N_-RGlf3B1s|snj#NSh36&rK59k(YQUG z#_g;+bwIs9=0>s_0%Gjugl7IgEGq|$@ss#8N(yC#B8t#_3} zV-wvDz@+Y3+Uj5GAe-r{lDnr36;nScjarrBxvX|BlkX7mXHrC=KU=ZPx(kvvQ}_qQ zk_J9XvT}%ZQ6?W=SqBP=xrsr~y>+4{)Vh_rR92j>l%}yob0IL4#jeoRupT%gbhTRw zri8AZD+Q-vxr|!YXqviiHac5R@R5GE1%%y-MU{pm-yG%v!}TQzTX? zl`tvbgHaVQ71=HEU~xOOphE^~vPF=}k8n1MX2DZYLsoGZjjdL4UpIWDFK|j*bl(%Yk4CL4_}AOvqpnwU z2c+aAUy_u^N24@@7AwM-c96La7Jg?yzcZCBN$Y>HdkTzP{DbxES2RgxOXYBtWzWa# zxuGH#!bz)?n#?^PhjvdW6{$)^zEa~#YKnpIR8g>l`j$4&j#Yysz{P;}Z1{+P7_xHJ5#H$hU2?7XkvUQk zDp5uMi;(3oB_UzHiiAiB43O|=F1wbp1)CO{q}WI;z_-hVo-7({6H@l%HRRZ$(=f6f8l`%2&3po6OHu;g2i-#x{5abfU8r7vIUD^wo4 z7D-YbBYv=p^OY(rtrtR16#BZ9a{YYFEUC7$ud#2^)X>2|RlW}MxjkchKHc*PK+BQB zOg4Y{c1u|WtfuB7(aUDlSF-sl0I8W(zl_aa4d3!v^()x?X82ams&Dp86!c{VrvtYT z0?{>U!?O@?wCAX@;7XaKWXiTy)CbkvrO%Dj{00>!)Rzw5VpJ!jE0rxEYZr$)nn%au ze1w`(*m)EFtbiI|E}O;dk3zzEUWC$N8O>7jF$s02Y^BiwNpJ}DW#LV>@M1Z<;yYs* zPXXr6Xag3St1-1Kal0e(E!2cZs>iGYkzzTtQyy739vXl~&Jh}QU?<%r??&YG5fU2i zNU>vN;X#5OjFen>aHRTRq}V>P@GwCRM@nuP2hy^U>cgQOpZZ>i6x&7?j?t&Fo;$b< z0~>*m?_1_xmJBFYC6OSu8lBPC&8AR`x#S@)xxKw3vCFo<%5b~-}u6N8t7!5Jfq32Sbo z+%Zx?99|9%&prqu?vaZRM#}9Y6~yJ`;4&Kzul&^a?8wE3BjvV{3gYncv7TEvhY`E) z4=LfrG&h4WR2X`SmotXL%WfM-rJ=Uz&e%gK##=snnG&5bJUR`rr1Md4*q%zsj>um@ zmPV$5dqt6=@z4P|^p0g@A*nfvD7NwLKOA@ml@@GBg%ry`1ETu7B<1>hP=Q5XjFBU8 zbOr1NPh)A1p0iyt5ExKn1{tGhPTgZ^H-9?iY#OWCe(#PTBe&g5~L; zm_~Ja#raV`sP|G)_s(_=F82xoK=4YCW&p`PMz7 zQxH7=7PLSa+D)0awxY=Vanx?TViW68v0u?5p$M(Je8VYWKL1Be0VFL0r5l!S$#{nM zu1>20`6y%Up!?7Pn$zipW2dU_MgpkDvlE%~QShF|OpqwxJ!pgf`6*lf4ZJsao-cS# zF{Nh^4q`<8p(m|OfY0fX63%b1?aT2y{n+@;5NQRk^GK%e<=&N?pF)a|+(_qABp+2A zoECg`LxxcOFjQ-pE>hYfvV*9_5hfLa=g;7CA)f#|0(LF8?!doYEQzH(j1QS%XFr%E zSziO|#z+#B^fZKP?HLhxDJhwu!SR97B#ivSg?z#n#%!qv&2fTVby(Rnj$Bl*!l_C= zyJ}q7B(tw8n_z6n3sStA!L}zAiYFPeuMg-L$GvgWNOf^aviK)bx$+t;# zG+Xca2v&VnnMWe0?LIPmPNjPpRLm1fRc5!H@&l7@%qvFo5k2)!URIy3^rbTS+v@Ne z^Bzb<8YMc^LHH+07>8R&_IzUfqq52g8ma8YYmsyIFz;oD&v`ZUF-H8J-3kXQHxhXC zBI;aWh05fRO1a+6_A~i5V`%?r5(aFHM02V&GW%8KJ498vg;TA{XMKfi;G7}MCQ|xu zpy<#$v-z29p_jdI&M=}(x&D2^uPVeBCVA61ugrPiUVM%MTFPKVhfVrU->#HxL>jCcy@uzB#tlc$7Pgze zs?--!y`iKn$Yd9L+1NQBg(fC~J|xUH##R+}%f3kPd|#yJ^lN0_*v3;}xtFmZ6El{p zXvRXR+cSowAvDpr*h_f@LHfKhICZGZg{Cd>MK~HuEx{YD%{Zm+K}ri>vaI=jh!LBB zJz>KlDaYHR`|v8!LNyImlcX7Z%(?-7j2kOqqCP(r#eg2QugEvw+3TZWo*kO3uR$BJ zK<+!Ewt-z~W0$0|!W+Vc-)EQDmBJ9lXP8g)`~@0;`F16l&39(ZPhF+iwbO)@91_Z1 zH=aB$s6J62N9#_R={H+`8N~SkRrB(*J9a zMgFQuDmqfO-Gx`$K~cCF?fo;kr!Fi%6nc7m;BQG-XbV@{!cG_#0wpyve@wY#ERxEW z%Mj(tCF7ChP;S^F7Ue6Eiq*b19#{_WF!3ejeS}G;OY6mO4C0u5K zfD5OkuvdDj*pZAwz;cBTJdtaj&iET=7BY??j=lM(5WFPE$x(Q6Q$Shp^ArKVQ-gd>hX@Md)D8h89CLa|1rcp@N;lqM zEx=^Eg-J1RTJWS)JT;t#h_&=A0EFCBJ@y6x;Lqr|sA5IOH8mzK^f15);7PeFUEaOM zh>M`)rs;9@2mpT)KBO0aibr(p*a$c&_GvM(&)_&zbBPDZH@vjYi2Y7L$j#7We?S26 zoXk}_V9`095fj%59ETPqNtcr3yZew4*Y5x!cLFF=J%eF5e~O35>Ao1qUv&tjhg_0H z18I=cVj$HbT$J~o8CEE51zKKKKWx{up(B+Qp*wKOe z6177*v~3zZxb~SN)8VTeISQq-wWEn&DJl-5pi6E9me{VsZ_bShpj}g`o<_pcq{93g zo4fqtyjWaEN!PDqpNoEdtZ~7tO3!o_xqjuS78TAY<|OosO{1^FjX~3nwKv^F%5M)5 z$xzYt15Bcz+GZLx#pWwuS6aR z=qLVCg$g#(jmm0fj4x4zYJl}K>a`H!%wK*9tOhc$aRsXR5)I=68isN2t^uBO`n;fx zQ&O_CqV_rIyPp!Al9HF5rJff|yPv)yosQj4wHOvGhom4EZ}-!GtjFJBzKdg?th$TCo;6_c~wObF*YxoT9ccffT+VPZacN5RXl2UHIl{|ee zDdqYb;e&}WZ0xkca;|e}1&1vGr0&(JrLD7QXhb=ac3YfCk13%)OpMNE8|0J+FBqMn zo2sz=p1u9=^}$Zhh4R5-&34buB^f(413kfoeLZgq&Hf<%&|xzC_+t_yPRWI*@XghI z9lCF`?t2hE5_nF&DP4qkO^3a$;~mz0F4P}^_YK`wtNS{1U$5@FS@+$i`y#sUzjfbX z-A5Bb5eI2INN~dfP>11FqTZNXk|c9^NS%+^CuZZvVLNHF7zJdXtxG-hK1?6>DEMB`LD8l3ze*pc zh>utRER$&+wI=kGMOfLBVVJ$351YAcDck-?Nx|Z!oS~X@*JwoTv<`Uvb)ZEXar#d3 z^~t?t*{jTbl=fp_`Eys#D2M{y^ScA2&C_BM(I9z2&1PBa=ajZ|hZAg9;5l9p(qT4Z=5$cnrzB!WvzC@|e0;rqkA^{M#_VIvbm{@h2`H8I-LxaCU`>2{_pjp2wi zv@jBhBJ4r^>nA$QiNX+H&(VD=bl+y(M{P*p{ZjWmuKS+Reec01S`Hm4Bhqpzd}`|9 zBYm0ZTxl#yE=k>DLQs7}qn%a2jM*u+6vA-J{xCmZTHB^o#=pbx{7Klj4W5ONqU91j zFFoL_9Ht%e#dmY6ht^-vfCAUpj@m11HJm+lY*)&Ie}GLAOpjNRwSjfFVQ&Dj%VdkP zV2nH^Hd$FPE_^oZisK-=vH+{1n#sZQv;c`>cKSZ;ox=%RpQrUfZ9%Z!!JM-c=VPeJ zum|yd+VdXDUF>i?8>tsOx}WEScqEpXD5rd3*RCDFe+Jf1KYyGf% z;{)#}S$Bj6Y@i-?@|wyvIB1!zb&Nc1>9W!~E_^oSJmIk`t+Kj^`o5+6c_N9$vNYeG z-m?VZog{0>LPe08`)zeCbx+TGXfsq|C@Czki^6ipEi7d5XUK$6Tr@-{C)0fdaOwCV zi@OHibPODD%-F>SV0pXWHt=VgXXn75Y;z{03CS}6%d-~-{wxn1kUh@~yeV(~Qwp4C z7aI=CVWKkdPLk&Z>+a2e_P|+pdxqK0;r(IziJpNub#T@fJv#>pj|TK+cRpUQYe;Z6 zm9v$VyIFg>ZsiF%({mB4cCob0{d=!WW!Ko)p@Gj*HorA-4aUEJp=ZV?qb}Bvmhwc& zsS`#x6mPhA0vk>c#PcC)M_QdGjzP0GE%d3SZ+7TCiy7MU&Zvy|f?PDQS2JG0GIXC0 zrIN}PlG(OHwZw-p=*kUd#B%dPog+&1)1T7NKDniKNMy zzNfA^QST6JSmETmVT{;SadgQbHDhX2PN@n{5BIIpVb|(D8m18coYK2^3OwkVRUbSO zO?U7g)p;5(>umV>im8p;(i*%%o|DO1MBcn=ka}4{6fNRR_{eECvjy<0J3}0-)VaNu zt+XBSVaPic_KJG{bck;a={+czsJ^N@MfxY$VWs=@YeM8u%*fZpLv0%1R=Tz#()mI@p1t<#a{h=bJjxOkS)@fZT4fKM!Y^EsRGDlb~-;-5oWxr0bKL)1LATGJ* zpbwOKc2434tfqN+RaLMY1wmSH~tXYSy7ii)n@%Y!7b=<5)q5m~6 zNLm54T4-8C1H2QSXooaL1>#Ot|5_y%gf%%@L=%o6IQP1({W3Fz{J9!{hcYi4620hU zpG3wWG_a&Tt8?24+l=&3J0NEmgZKpiPc4O;bO?1Y+E-xC&M8}@U zjDiL)MCR_a98_nG;2Ek%m{FMXbz%(VM5Ya-sHK$OTHA7wL7A=(A}356$VWYba6A_# zH7*T+tQJz_lJa)P)8E};(799%MJk>o$z7S9n}>2a6;K{ZKr*q?5e3PGH24^_44mA2 zNqQ$5f)+ul9}^Blz%$Vh3^+(bpyPN8AXpzTLvr%~p&n4+n0a^-@S;n{2^kP=&GL9Q1f>(9~vi#rbZrl*u*w|*el7g=Z$0IQLYH5SCw(=RZ zQmw6fN3Ff_*tO+ebrDd&Iy>7tH$vX)i{VjUH&Azm&$Qed*cj;S!dj)cCEZW?3N&NM z6_>91H*~LGLkp-{Wyc>=IkMePI3?A}f>OO%Yos5FN4R}8#2E*y~AWpgc7C3)U@e-BW zuR-Hg6^9eVBT+qNSbe=4KXQraHR9Wkfs;(*3OK?`M9%>nmkIC7u7aLA^S+agYZX*8 zxS`vdzx*mF&gG{a1Z;j9TPSPVz29961}J^*)4POn#v+0#4*B`$l?R6o;!kOyXC;PU*7BhpDO$m8DY+QdZ4XR^< zsBHN(jQf(8^=ecM$YVcaoj6hSj~t-S?*=oq9sh^<)gRJMEv9y*c7;a9f& z0DdSRF()6af%i20lKFW7r^4ryNZUapqGag@cv9|?r5w~<8rdaFWDZO9G+9~$AL*5o zrEkF}sNfau;5smR4YUi#A?E!$3TiMl^xbdq!uZ)`MA5n2u?ubkm> zZ3{Vxc`Rbf;VUxv(erF3KXXnFJ?((nw)-G!aN}Gub^~RNjyb#e2k>wd`y-?m<;Mh) zj-Sfy9Q>U8NUO8q6CLlR@R75qT8^{eKZd(!F94djdp3jnj&}EKIwwh2-n=^(s#1GB zE+i?la3osT)Kxg8z3E;3x}D?jFC)#HD0i4h8AE9Q?)pc^Qf^l4O(*?C)Lq5@_uk z;nenxD4d=kB}l0LVNoSy%Hc@ee(^R1Z>9U`4y8z1C^V4ddqzan^Bq(yoE%i=WGk_? z&lTEPGE};s5}_;}QR?0f4Qj`pv957(k1*EqK9hSEp@`U`F=h={-ee2ci^^g%D$6a{ zR7kq^iv6T(f5(FK&wqEM;$8eLIw;O&n17g`70~^%@3Y=>I4#h$J`W`z&a%ol5+RlP z$TSo?_8Y!2(Ea|%BAJ!G&1|88iO9->L#4KBs|SZfny$2l24=Ck{Sj26Qm1uzB<&U` zMENl{s8_)xmV_@#>FXn>a&`cAHDJg|?_o5`H&eF0gdDT(!^ZZ=!ru@RU|kb>NABO< zn+*EkO{CN&NX*C4c1bw>Y2-vs@M_|A(*Gdrzrl=Q9-6VQ_i%3o7z3^#d)8raCF2O+ z0{;aQi!Gmj7+L=&Tl_Y&M8L>^O=Wkt)4DT~wk2e-gbHT$Bo9H*b2-GiM@Gutj_iIT z!i%9>4lRCnN+fwCFs8w#Tt%>?&`$T}0qVT4z!MsDZ2ov0ex+`|viNPKdn9FR=u>Q> zEPXc|*rhI+kStz|pHphWvl72#DS&86yN*-4;H%)U+ux-8pjH74)v_EOI9CxKy#GV2 zH4Sf`{m&DA>L)8o=;d`L(aCI3m@m^bjARSaSxLXdt}zblqVXXs6~~}jhj7veY(`j;y8WNlaraZk2C(n{1#G`|uqS>2 zIvLMe-|>CaTR@{-)zkn62sx1LM?PV9`~VmV#|sr+Ck18SN7sB+6l6x3&59+Ho)^^x zDRfh0;l-EAFfy|bDo^}70*gfsdS8LJCHN&v&*3Rnd*R`eAg~mJ7;#QDjp+DN4fegS zWf+0Wwd|72I@U`2$~UDk`9bU(ck0I&utOOKts^*=+0B-?nS7`I;mC;fAe)c#Pj1jb zIEaF7lfp4)I8q_wATiTA!ulzlzNdR|V^dEy?J*yuS~-SG>yLbd{yUY0e*lEAeRHS) zXR6UM6m{M`e>c`|M5YIUCD9a&oJBgBj}7bL=VL=GcsWqiy-Nhpsd=rCyJak_zu~|48{E-ujN9N0F=! zCu~y4k|P`})|j*}QvfkS{deY*C`U*~?yz>j9pOZWBJLZZqOTiLr6{VuM#;~qh(|OX zntvH|ezN8-kn&pW>(x+%BVhe11R`36+@eD?9I|Q?j&RKCZsKLMQaW~-jAoEl3)Lcu z@ehAmfw_{#d8(J>jD5q83jlwL6z9YdkF;Mc*24=ajX2 z5q)bs4UotYPBiCfre)lh9er#3+Y|(jaH4rQ6Oia!#4c3PMAK>^%^JytDUZHBA$Z95 z*De^*APQ3ORFV!;5IDk#&IQfxjrx-vSpJp~N>&SwaH2!eq}Yh- zqVrq+%Lv7fMa6f*i4HZJhoV|UF8VU4xoTX56CKJ4h>^nn&<~dyanZ62Il_q!MFSfn zRKq_WLsiqbK_&_02q!w!$$%K4YDd;${YVRCEY@hSttuVSn#?jmEZ=A~isI73U_Xl* zif{z&pGDI#Y5r(@VzrR&k1&5UT7XX!cZ6a2`RNi&#e(Z{T1B!!68 z@@pal_l=WEDvY@HsgzHZT$3oHc_S3nD=l(yzqy%m8pml=adtjBgqp2kA5=YQ5>X~c z)}5M*&IPsW=(y7O($#E)h~9&yZsMbzjYXc8mZ-bNfy&{y>boF2t7T2D`c;F+xuGj+ zg-W}}tDqpq+vsg9$jNSmNAjEY9*XU8@pfvOw!1|we~JBpQ5yn9A`@TIF23hAdAu$8 znOfp;rB~d{dQ={m@FrdTrDbbPg78fRCWq{5_yJtyWjK`$E$y9GGX*Jw7JZeueixZHH%DDpqjj>A zrBUq0TR%e>EKzNYw@!9FjYZ8a&N^8b-+wU)uZZpVRB_5DRs z<_>c^B3u`Kw*%)lDjqeTM0)n$0q1!WUcB|H)d(K}P5}*3;EqPG7&x^iym<6}4;m|h zbDkJp@^b+ar7r}W+f+P?Hy%AY%Jm-LoTGLdBxyK3(+CV8J}w*7x)uV!C0bt^ioq+2 zyT0^%3|{>8B|4nT?BcCkQZej}!HcCwcz=wCXX+Iwu5A3?0^Uh9;DS3^xzYV>7n<Z4G=gDt`7UgaCo~| zNeRwjl5v#*?IIB>a>Qe#tU>`D#%PNgQbUa3jr2-qw^14SbZ ztMNuoyGWh##x1f*#Y0-3b*rJ_NfirT&|aji!<1K8Qm=C~sC$>lS0?W#I_r|*6&r(q zi48ddD#I%_-eA7X2SuSLy#+I|1*fODpi1ufMnRRWrvMxCauvits z&K_&eX<)9?w;;9mMA}S)y@wl|J$r@KI*!5P3}>I!3XeK2Y5F}-{nv{VNEGX_vbJN;}nwFWk2;G_T z5F((v>*-!JoFR&(M1B`K{JsIa*?X+v`4iY926Yy$P`F8v@1mWPf8>eZx`;GtQ2x<^ zqjU3+d>1L(l%6eiac=^(NiTlMQnl{86uvAD3*afVt?S{-;IJ$3Oy|DMcv729mTtpS z)Sm(P1ie>u-(TPp^bW!&=#9ZA=p~`B1wA`_g5H_%oed1E*gZ5%;-$#r`C8G<Pk`S^)jzXj|8yccoUGkB8focajp<-tk( zM=6LMPSk6t+eT^Iivz2#*yuLMr5(jj&GW@zK3kNww;YG6%eaJKNhHnPP{We332vLc zhVLl8kv7D6)jd|BCtWz}og%q(kQJw~$}M!^0d6f&?=3LhpdoG3`z+`IGD6Gf1B6^MkISqw5Q;_WjkI(nx{;h(B#ka_y7P^D4eW)0khAHzSS|o~y1)%`E&M4S z(Nle*7oD#}x0cfcfl}G@C+}J#_Ml36x*q#YDun(ZF4OdZMxKT;tLxd%&~b_MN&Ipa z3PCv0q3k@AjXuI%5joOtg!+j9ey-B+LUz-+MyTJZp{T2ij!P&FwYcs%H+R?w^}HI2 zaH2!en9s;pX2zC>j8K17LlI7NDB`6NDq6L7L=8naft9| zx%wzb?CueBdPtTzip)Fay71#BrQEXQL&rj66#2E8$5~U@Y@I> zj@HWb2R3!IcLvvVZ)k3Vb+eF*IO-`7z*$-??a;WG4)rpB6=uyUL^IOXY@VT8BIQk# z-b+P=5xBpt@v1Ae)4l}xs4MRCo3qyBW#wtwALyhSX{#(0Zro{bPop=hr76Efd&l>z zz?%FVO@pPuJ=q0;0RHRmhAvAt`&JVtG8L_UQ$Mxha4i^sXT>w+-YAT&HS>3Ve3Z~s z=^RyqXY0Y+x;p&9c7IcM=f;3^q1Tfw^i1OUdD^C|+${C5DAG1%b8XXoSSGcq4!t&kR%!yY z&g8>%QP~sC_Rj-OfeA03Ho}FNih*N3Gbs^0Iy0&FbLf$9yg|j`nZP3vz1xBJ!Bi04J#8kr?OnOv45WPs6wyRUCRJ7fmzqP<=Qt=Ye+k)`xRUCM^OT@oJz_Y4j)I{|5 zT>AM>^2hJ3+(x4_0|E9W7ZupT)MDG-QJIjTK$t9wf?}FhM ze&iC-dk__HsSDrda5Q5VPMrKM0ZyZemx$gELFRJc%*61O9N{HOUn+3YO?dI-)xS@H zN&z@;WN>o)e3?Y_*3HEhOZ>yfD{#K6;%W50j5ho4SKm5u{MziS7cH+tW+yuW|v#Jt^SrsbVcdT!oDv$OKfxVeePr0)*@4@po=RI+&k{1l!n)esmck`Z@dtYApN59Cs^2*2aK6`jqUip(R=iPe$ zTX|z$ALQ*g)slZ(-?aRX)}NT4{K0AYYnQ~!E-TIyRjWv5P>SCHz< znv*)e&uyu?PnW0KNBL79zxq$9_x$s*)H!>eNqywOmr~E_w)V zzxm>L>c#I$BYR!bXJlgBIV1o6=Zi+3_v)aL|Gpz}r1x9L$iA0nk8HT2VC0v&IV11f zcI!yTmgOUlUg#gWBj!&d4=sCaL85t~mY2>#D-x&F-VduydhWAH4dF0cPy`MZj za>m~!$G%>D95cT;+hJO8k)!h7L5`nBCpvE4ZH5t+# z-gb7{y^f30boqnQCYuw}W>q-ScD^(=?TZ&Cr!{+Lr@fbaYudX@mZ$xB*NU`}|9mj5 z*8W)9TdB{aRsFCb?Tg|!((ZkzA#F2zFYUD(KTW&q?Bi)a7E0;zAi5dwNCsihCbS&p!ER`m{dJ zq<^<BT^^IrOl3qMWYzq>X4#uO>zj({N}>6WuIRv#IVam8_a#x;Mx zHsk(t9T~eFV>5EDnVd1AeO5;0b4xNF7_>ZN>0K)_KArktM&qtWGfoB9XWa6@hK!5a zU(Zvb zUmT!EIfRu)bzck8vip548rhM^g%Ia|h2STUV!)n~MkD)wL4(rP8!^)*pIE`&f7ElT zo@mpgA<|LbuHc=GQ{<&aah^OP#2F(f$<9Ogj+tpq+)8&IS(#g!!Zv23f0|m-D>tcg z682+kxbh~Rl&NTsp_!t@>CMzKsr;INM~0ET{v~prV(~4OzF-ZxOvXw&u7K2$b)YiI zOLz5HvHDJzZC2Ha%UuI&UEl_m)Xjm7wIE7s@BGraF|{Rn*q&2Y!TXoQDCB+H<9r#o zhnG!pl^7HwbBK`j=gYqbkB~9G@~e>zGcKepfkJ{#O;>+@wE5tt{N%II_m=E9jWpqQ zKOfR$qZ95p{;cy<@?=)Iko}UFa1sy)*#ARm|GLD_kh^;e6 zt6x_Z!&;H&cp0Tjm8~&QuB++e6M1(N7xLakEEu#tP9obKE+vra8!EzDDr zbs&FlQ#Hk|g*}0!g~QSgZ-eak+Pi}vm`5gf6-8Z*L)#I?w%}>19*xF`6pQ2{@v!R1 zD=zn-YoN`k9^R&?^_DLTxOtOYjcDnzLJK=vUny!^E2@^IY`ftuZa~u6?ECWCKQrSG*XS_8XSp$Ec~K!0jrNSn)NHs5>3wSJeP^c)#FimkPA7C8)Fgm1_;iqZY|G9M7g&bF8l7WY_RS z`6pKqB9ihIyPxE!5B0uXf5)&+dlevCbjfYQ`5-;#8eV|sD>8S2aql4P|^>y8Crw< zOR(HkX-@&vi&y|M)E>+XdK2Y+9UzJe|3a)4P+Xaj-pgazDPWOUHFL4L+q)N)7dk7v z`>@FVhdU@eDO6gxVGq5i4)}Ic)vaivHx|uAjjz~Fm7*SKQI3|iL8>wKsJoF=VFL1nH}b@frWoL2 z6su@s0F#V2ge2t%gx4NJCmUjdRLm02H-Hr~jx)$O+&~vF%juoqIy_>^`)nc*mA@Wk zQ)^mRhq``Q9lg_fZytWJT;+KJhomFRvYzh$wF@u&8?p%p0&v&k$CII`x3eHu*-Cg9 z*3n?v`RjzQSzW>j%Gxd@$5PfOkWIG~no-GfX;a^9+OUH&0d3rxz;%mo)*|6xNamH6 zN*aCqX*oFlVVJUexWiQaB4Xso2cd{a8o5x%&3f1XTDE}oA<wYi}5KfvC3GGZrJwP$5WFVAJU07h(;$`AHpP~r6r^3C4)?I z#VMujjW6%LnZTA<$2;DV()l3l0@rbIH(jQg8?2g!VOlVbG(>f5o5!w$BsFc=ro+fn zH`#7vbzrz@!*0COr@2+JN-HH`}z~T|J`p zl~_><;4_ZW5&4pxC^-PI3%|_v?uuX;TD|S+YO(@rVyQzL-@2tRGLQ6YUCXW4$vtBsZvz*=vtA5 z^3OW-2dV`Kn9@T)Y9{Dgs5WJZ+T=nAYE#*V;wmzfmXTE++Yn1|MGF1Jn?z4cJIn9^ zr7ihVq_RsPDH`ZSLT!n!2aPP$$ZX*yRIP<9iLbv5T)G8_u~HGB5)RD=bTfw@*8HB< z{O|$p2=(`H+sd1fJz#tobv;d+`C8CwZH~8)4~w_&m5`}GwYQMC zjfXTct0EAEolGU2961b0L3yV@dJyT93g{;DaY%A`?-~MIXpY}$T33sC|7B!K)eLE6 z)g?5rplL%8?`isj)a*jCLCNriBE!RB*Pb#>CSsoCOavJ% zCLs9my+T z!&_$Z%6ev8S+&b6>tWBL9^W*rRD#LffgjC~Qm~hdn){+X8vuJ;MiXaiXp)fB zNF(^EsI*otAyL-Ii@Ds)_H0T4hXPyp@cqO;st%QBa38iOfC4}950u~`z+3Dzk2~>? zavRSb_o2DSiGRSXGk?nh_b9yQa?AxLQzEME)9}cjG9@=J@S1%FrR4yhO8d53T5g2( za#~z6tvUiS_@0gLExl;~NJ{u(8mCZTli!qcL3IX^!wdAEIUQ8bcyyGY1d6^LHYl9e zpjKHxwUX`<6j_7t%|~Xb@GO|bS#tx|cjg7w*e4@GaqSCLbsUJL8fx=xH~W5!@xR9T zfy$YTU@87eKGmcKO#>Lys-IAZfhsdzh>cjVqa^?x+fqqfVy{&aYf@j^LOcONoT>8f z2mta{wq_Geky!N>nl9l!^~#s{`?@!2KFD6&NDmYf#*$l-{ThXMuMu}W%WOYJSo`;% zX4S8W;AOFF{A1C>@{qA*#7_0D*FOUVlm zO;%rbq*p>qpjy5O7zLudzyS0YHX3YhN%r&xS1A|1pLJlL1+gYV@Y<;`{A;S|i+^Et zvcHmN)gvPTDa3=SZ@iOH;>hiJse;iSBjk&}x{?@qR}1La0;6?URk=DbcQ7|X>|BMDf3l^9#B~rQBQ&4W;749LI^}A7S zsCLxnd za*E&CFbmnUNZ;YFfJTBf)CXIn3=|c~L5s8uknkfrBm%k@sivvDMS27fow$p|4~KKm z)+WG5magFANH6^OI+LM*Jx}70Ptj?e#Z-A8zVQY6szaq-%F5J$@t;IQI{amBhA0Jpqd#!Hlu2AAV3O}Nz~Sl{#<&a`#aA{Fc7T0uRYs zln+aOoh>K9#r9&xBx(<>GhMB$Gu54nX&G2|O5bAL^p6)_xa#Cl$f4bJM=#OuMrL;3G_9g0hni;AYPKaX$^h9>ny?#4 zcCjwytN$4KyHYQ>;V`sf9KfiN^V`u3!g_-P6w9b~WAJg3!wm+fnu8Y|2 zlOac4S)YV`P-I}+S}XyJgzhk5TT5Ta8MGHPsaj;z=9g2Il=_pOudqK%m8Zpw^xBrc zv%EnbNd@jVZ9)x}(5J=WXVJHdRWF)~SLvt;y~vAHDeV&6G9-+Gv9**eUzHVqb-1E{ zZKJ&vto~qYOKg|~40*jQXd%hNrqyr?w*q*IGlMa5F zw9D}krdL*UcFFjq;FpG<3%@M_UoL(&Q{~%4pw{tSd0L>LZ{4T8XkyAnR&|#3 zZOE#mO9-&wiQXfTZF$p%@f2Go#R!*h?A?~Eu;oXP3ZP1`4T+4xVqkwlyDG7t} z3)r=+)3LB}vbPV3`yJjBEy%)}WQO0tBbZt1_h4zh4~>x_LA`s3E+jc`a+Jr)=V?8L z$}%rtbm@0-MGF0{gq<)Pr1XsI?5lyI^I52%P&fxL&RNGxGwFv^5G|j}Q)K)m7x@5_ ztduzF(lIiJ_5~u5D^Q_^GE-o%OaG1j8@`@4*fIWjIUqk@HUJfrl9Qh&;?w!4uz5t< zzCxUL1GOKjSs=(eS!ymMt8tr0UqouBax+zrqJB=PYTMWfE)PT_Gi@+zB1ZEim@1N} z2w^F|x#BGYF+gdFxB($~HQT}0MjbmmgOM{c`!^@E%E)Al9oq>HbO#%PddP ztC|`pmvQYNq;Cq<4fKX~W%!OwH&|V(MOIjVN{HB`ijh{P2ohX1r^7TjEn1i;*9&6H zF9NN5lrgw+k**QYk|zxyt*8ZH-RM` z`~uzGE?~w}C5IwZ<*U5GQZuu-Xt_3lmU5`|u2w1ozoMrTgXhB_z?%y~R~KWsFX(64A6M zYa*aDm>K~#`)TcAuy;Lt%vc7bktqgQ5LJ5kn@!a*)H#695KJ!4s#LXcnoXIfeAGr+@_nq31_f#8R)1+Usr03ZY@O&!KZaef zh|wgifv)Dg<_C@s*hlC$4}&3TTqeky(M65ZAA()2vmGCl%LzML;?$1R^t`T=r1Adt zlfjml{q5MRmp8Mul)?)8gVcLs`4;CYD(n^FrJ|*eItbm27+jo3#1xD{NRDjgas;9X z8^vIkQ1ta-ok^X%$8#fDiHJb#hl&B&J$M&>PiW8u;3%y?Sfp|d!mC6F5c}eZ8x43x zrBg4|%nV>7ZZo678FN|LIM^twm_&NID2W2G%4B8#Lv3*XkJLd6&E85{Fkk_ao2CtY zVZL!ITR03W3CTPt>u)J6NUw)6ujyV?xk!T!LKA7vkiF{{QZvV zS$^JBwpVG+M%Dn~OFe2SCcx-(_=57EInUq=*^5o&k)T0ytNKm&(AzM@izvh9R)l&O>MtnU@RxG9;?}qJ3J5QJw~?N`BpX7J zE98I0pJ??kn(jrbWA$`Zjt!U;SN}NgKf`e?fDgIeJg!LPD+7F^Dfe_$PJd1TR<>qe zeVL#fdH)buJ44%ncH8<3XP%PevhdqlE7V~@)T-{k^DIyU!o}srNqeA zeF4YG!(S@LMYm-i4^sxKxVu2IQM-uHsG-^(Ry{Q*wxNtDJh{{2ArTI88WD=*P&m}O zKJwM!P<@r`5RRZkXFi0p5uJ$oJOJL&`MLlS2)cL?QtKj)LtE=4cQP7NW`*-*S14a3 z@q9&4wsxU>Q5VV=a~xWVB3JX|&(p({hbWXU?n3zwz>QAx#a$?0!f~2GgE+9^&~1mq zl${FYOS(|Db)kGo7s>-U4%JBF)0nT?cZVrYR45PRl<`@jgMO-uF2PIT9qwhKZDGz+ zLJ>}MD2UpKP|?;pX)s2PaH31u4xea_4eXMyK^%uRWAuQ=-t*6h+WTjP@*v4}hE%`2 z3*|vwC||*GsCAIL;KkR`u@S+dC5xAq7NN-DuINHJ9=_3OzM>0dIt;4U(XuB=q_&G+ zLn}~{Dm|kBSAsHKv6VbD5%Py{c_`pZ(#t9`U}PMQ&zCqvp(0z#Rq%~Y&y`)$lfZHQ zhQCC(pY!EY;q)9(;!5D@iKI;9oM_4kT__`Cz@d38^+3x`lqH5KQ?EwuYEGG;Q;Lto zeISiT42Kkbj^lt1$>$NnA)i-8`+z_GXdlSu$_Sri+`|MtAEbh(CyGDU053WhS9i$; z9emX5XqrHhTSFRq90IvL@pvZhRmN4*R@^ZLPr9eVsL`u8u)E# zW;m{)3gsa@u1Lzr@EMecaLS_*Lg<+fiB>*$VhHGR4sklU#x*|j>$hC4R9C80G-mw7 ziTOjIn7;Uyxuc5ka(zLrM&_5))hP^=*(21|hw#h0!WVQYSC1*N{*o%YYLQVvjno#u zbt$yyC73H*G`ILRG{*&t@TT0tHFp%h@J!V|Pfi{&kBld3?}^2;@E@AxU`wfIX)#pi z6*>zSEP~p4#0vt=nls09i)Z1i(&D0d3lItZ6bU>@fbSzWmVPsi|DGp7iC1aDDl6A>1E99VHhzW1@GGBU@;q6Y09q zm#1~H<}>iPzI;TVPb6s6v6KXBgzHJ4kOA*81s6@OTm5X3pw9qDwJ=C{J<$sR@93}4 zi%0kqz`2Nq^l-mKZxC>XMc{R(k4a--r-H)?;!jWM%LCr5U!nI`g#ROO&gv_ukNMOQIweBe&i5DU+{K)l0?{a(?2b?7|IfJ8S*Ihnn z9&}j2Av|(D<)Z_5Mw-aM^%SoO<#9f62GO((?w86#hse*S1irG> zxy^w)bz!fDK$aO7!RhTC%|whfvV&|#!Uro2D~#}_U~TM2Uqk20vC!6|1pYAZX+oUm z?+sF{75g6=G4^A^4nm#CQFnQMU_0xM#+-PD?W7&#^|(o9lGtrTc?OExaN$#7eF|t@ zjh}@di5d(jR(b+|DJvFeCgqU{U0hX!Qw%U(Ih2JG4x6^hN#ef8+|Kt+Tl?o>PcW|Y zeH3{d2s?IqEVKiL4HbmpxAEYp>h$ncJi-Vi%@zd{Cj+7ip;MHR5&?52=BZq4aMK=( z1ZHYkP1qKghC`S*NuY7AgMH}7AviFPPMbtB5IkAk9skOpua|mb0e@xJ8nh+89I} zeldn$if&BWh097O$bMM%onV|XAOGeuCJn`LY{LIfq^M)#Ord5av)M5V^>&*HqK_VMJkrEnvlGE`~HpXs% zsg^FZ8_?FRbiywiwRn=km4ShoHmX&6B(krj!AZ;^!_VN)7tkr1X)M1su+@gNYG+FB zr>$ZbeKl55Wci(W2ArzrT$LR&joyzbl)3y$gu=QSO1KNYF#_K#@GTr4+4wbl3-D2< zapf7fmFx){hHX6kebketGP}=)u@SP=Pyd$YDe~ldYp|m{j;mB!G_;7E6Jcw)HSmNT z6j(n+4uKu0F~kw8_vk~y$p!hBt`_hA>xf#NNyT_ zqR~z&m|9{J6^GG*7bt2}e}b<VI@-HPkSCjFlu-KBF_3ePjBgkkT^(@sJ|=plpr)vB-ZzgVspEc}RZ0$QzoU8ni&)1c!TgspzA zLo5n{=8xpmi|h&kD+K|Q?h&;a#iG<(@D5ob6ZZbmaga`LkQ69MR*#kEPVx8VWdUa5 z=zbN=V5mS~N8pcf-VaM+MMhD$)Ut_AXZd9%%2l$&Kv-NjgjCU4t^h626Vtx+HmLz4 zqc@l5B6^6qsPKL+@l4fgIh7bwfKK)Cb0k7!PJzs%GhEavO_hs96g+)q@4vc>#=@h4 zbnG^oYj`wzQ(zE9!;eLB$vh>mGdCO!9g9)fVCg;@V|gBO19q+MHl7_Q8qSnA0Wb@X zgK9Xm|MSD~JVjUvyN%t)V<;~P++!=z6agR@lpCd@xLb8m#ig zKg!5@Z$^&L+Tv5QW#}|y8_MFD%jg(wEVJp4a&8*DkG1sTSjr(h@SLjp`NSl3lzC=# zr+K)j&?$gKb4EHJb!>Af6N;ttQ1VtdrZpYM(7lCiP1%o20Yt8fUumno&<{BD>sE6lpic6D; z5p%Pz=ya!4gP%k}l4|Fjc&_v;I>+RtKEMa%F!mM>NS4m=HOG`X=nwzOdkFp&x;DN$ z4N@stl~4BFWt2)k&IKu}k}SHALXd&pjPGtB)?!SUjI_t8Dc4YZ_u%u>I5(Au9!v84 z1!Uql8I^{RgA}a|30{bwg%3FeuczT%K#KwW5x-b&cY!!+k-o%V5@r^Ow%!TXB8eRb zfRbc`C#^Z@m0QT?1ID!hq>DZlqee_uWRHP&_1zSm5yQsGLv6d@pJI9nbBeM*G0gqSu@7?-9$(AgraNdS0ZT%q=`|P z!TS`IndV7%85H`q+xWcaE^sH7UqmZ->cG1wK^l??zne6Ou!Y|m4ce|j#6$5_hawTs z`5H8B!IJscOuX%8+rkC2r!2m0_JXCh>uj)yjSaKJWQ4@JIB*Sks-xiB0gJH%-FaKp zsf>h+MEmI_>MPh1Za*{&@1YH`i4b5g6QWdex*fxqS`=4)d0>ML^#nYgqK%(um=Qo? zXqbglwMB8>BPFqF6GT6!HAZtuEEIOOkPVl zWu&%%SSqhTEQ}$?5_NJOln({@UI?ZyF{`b- zAM+6nW(g2=bm08DA1I3wDU0_#Hqi)D;miwC#_|y$Md8jZF{{Eu&mQ8W#Lx!g0qd0f z+|ILk(&9KhqxW4BJzeP;%CiGSHg+zHDN%XC`r$lqB=KxRBsWGGHEG5pfUO54*x-F5 zQpgw!Z-khsM>nvuvxwgYC92kC$m*HGCLey{D@pfd_*uBJfbjdX_VpPJYS17OF%%wF z|G*Ow;t~y_QJLuD=>U-UTB1RB0TO-ulbRomR0JOB^$X~I4f;%je$*gDF46FooZ6q4 z115oH3CQ+I$~P5mhr>~c@6R|KKiKN^dvMKk@Q4gS$a|7g5h8b-$^ z_*uBJHZ@iYzv+htk``_&kxD3*A9@vjR9XT8!0jdW!ZQZ>BUgzZg*AM}6da2o&%v zVz8(%2kf%u``s>{b5`cU_#*zyRZQ}9@u8EyKgXkW;4Hg6w*gDHNVk8c(LdAdpK0;W zjPuVFgBJ{FvZ$B_D=dvmIz)mc75L1Zbw;9~@DNpEes>n=Tb1G}%Myvw%1bP+y2(;p z7BXbZQwH2fqCFq00RAF_zsTq>GW&}x4P!;I6)DMrwgQc?v}BPS`X};`M5Y##!|cI& z$oYOOg-&hr|5z&qlYRZr zg&b$_k2Ctmnf>D|{&8`BXa%@kC?RAX%XA+A5}eRpvLn8rlu`c*UH-x>e_=L_0^{gV ze9F=3RQB#{)QsqY)vC8zuuw|L^SiT^g3a!phvc0tco@qu1rNu_{+R}?SR2N~QM*)& z7S&%pmLFF?5+6i6$Oc3M5DQmCN(U6nt#ybxzXH*Q&P00!wc)5ln;L}SLKZSqIA8tR*R zQPBE<_(Q!Qg(ug_rw^Bl7iFmv8~u3y-zq2YeX%(TLH=<4pD8C$&ZAxAv06Po>2)-# zAlLn2cfDjot|JeqVFBWd18QBbBPU+!bywjp3RRl3bVNu%c;Si*^z6kc6C@UA2(m%m zM#e>@5PhVtCpCk3U{YM8{2}Zw5JZk@3^}1@K+sV7!`+#28Q>coS5Jxu)LWAKXWpjw z!*RK|A00|KlQJE9h^E|=;=x~miOMUnZ!fI~Q!Y>_li~q=m81oV4?Tp>9Z^1!JT&4< zbnHDTCy<<_I&q@#e24>;hxaLzNjV|6JT9 zC*nws3BG#WWc;N#zgSv!EFAkz9)i>`ZA$AS38cE{+Cq&zI;TA;C;W>r@ymGPDTpyO zr=KZgNjU+OBT`5uuGc+9fAKpy{p0Jxp-#bv+&NuB(fYDpHxGX)hO>sZjtGZRmm<&Q zq3~HsASA^_=Zo4$biR60Do}TOo<4ReD;(Ddh4OhkuE@G^eizC;DHTxnNo4lcUJ}8v z2?}LWDiEc7li~wZ;$g%A1(Gw-x#)V(|3Z#K8xAynYrIT`;8h7OQh*C3HLeQvljie4 z7oWd&@d+QWrWBIfrQxVP2cvul#YpB~n@4FeDyjp8i!=>pLB&&YSj>K_yRG~}?3?%m?=_kdfD_5_=*XX!9*#Xvp&V9VSQr%-#lAesCo=YHy2Rd- z;sKRDarfMn2iAvUe?XypEzf(Tl2sz7Od}I=PfeUXFk;!Idc{k&jKAqO#oUE zT4)-|7x8QBmM*ya4DSVt!a4w|0)&zj9!#Zr`+}k+OYh>^78+fC)L%hR!YnPFRk~mf z|1h^0Ww97}K)EbkFxOLD1eFe<8p0u56}SWi$zdh5(9Te=CXDt}vI!E={uI|zElCma ztEwJq%I;cJIv)vHS~MTkq!@KbEx6(CG1q5~o_PIemq1mDF7mcRg-Z&lC9|L$LEH%^ zhI^?=R4T-%iLOx-$L5Y7lQqso3%AZ>tlT<>X-l`xVb?k7IzzsAtJasuD0<8q#inIh ziB;sPXt4(>9ct2N-&I-+-l(s<`G~A2(ac&jYvEmCoAjBIpRhZIY-=8;VWZ%vEQrlnlrCyPEc`Dr_o|Rvj zviS7nDL4GxvNv|8;QqptV)QKY1{Ic;%+|hP^rBzG0@KD~Bz9u3YH+%Vi6k2lo~`Gwz%1eDS&> z=kd51&QDHEbLM|k;Jondd}se%6P>;Hk9RhHb{)T$=AJ9Fob5MeIyXL?;av5x!#N`{ z)!DIfxO3dMNzQ?VL!7hTyT##^QWA5NfO!1ht&C7rjdoqlHc&Ms7aT0psXxWZc&^5eI$QdM*Dr+6W$-B) zlRq(M?x>-f#+`UqU#}gW{9ox|4NXc-6b+WzYj56Ok75i(6Ag0RwO925UV(wX-L%)0 z@SfJC9hyf)PG%_lACR+836HOliD7$p=hTTcV-y?;N3Oej8EHT>t_z;4+xr6ZyTgl^ zno}J2AZ<4Q?|m9q!qISu()ZuWlW~wIMWbF%AN^~!^^OILl7`Nh!Z!+wCh@MhD8Crv zgr&tZ7A~3d`-BNj#nRnHI7Mlh8c6$|G87n#Bh%W!-Ubf)i`$#|H@X#uHJU1)!y6re zE-)lC1jfH^z@e_3HtffWl}$QH^sUZ!REF&se@>g<-2n?SZs5b3OtW0q3{(GfEIW{V ze`r*@ug)C2uGzQEj19!Yb)iwmg4Z3RXKV1fR(iGtuWLJ8=XoD-;lQlJV=lA8Zr{5B z<4VLAl3&4L=U^W)0qij!uJir}>C0(vvYs+kmC)+A$HLt0O=JP_2Y*?cY1MiZAI#V0 zwkGWK7j*b@T486fphLT$=BSN+1xa}nS9MnH<&$-v$8fvYuQ!o-Gse? z@q5}uq7ma!+#S?-ouM)7M0?YW6YU6)X=s{m@E&F#R!|#Wepjz?zTH2MD(x>=8mwzH zo@lb3K&gakaT3}P+(jGnKQ~@Y8A16R-rW>5RsRtt>0klrXW2U%r>Fx{IKS%*&=ClL z}U{9x@3ITTO{ga9qu#Y!tQ z$Ot(`i;aqy0HhisCy2K@)aN*AdS?9&eXYKhw={8fl$9A#kKgkbw0ru)WTA)c6}P6f z{1Myr;LEtcL}S8fe_2PMyhEuER$dtbqhx;}*(aXf=AYKV3Okrp?~h~CJN(mRcAO^UEWAGjO%U;1NHeC9^^MCP4x ztk+SuOkwwbJNM;q-j^z&Xip|ax*u=qv?6rPec6L^ah+@8w!df?p&oO%V1glTu_qjZ0--~i;VyBQGSo$3y+oAmtzyt9-& z=bq9>RrvzoTo!@XQ~kRdIO!31-PLCj_G5wbw1P(>si*ulDL6pkuBZHd@*DBK=nk(N zz8nSKDFwGDzDQ_CdhEmMX;29FOZ6&2!4a5BJ36DDwxK&u0^Sw0Qwc{y70#D4@Mtyd zP2ikE!&Nxyx_jc^`RF$y9r5pfGjna)e&Md)H*;P3|H3lZ=wr*Ark9sFZ<&DK_Hw8F z+;ZoOBg>re4zF{o%8AKX*Hq1T&qd z{wLizYJRHoggngoMpdG7TuXv;%J3_kkKBBzbN{l7owdv2oL9|1*ZEOuf9GT08=UFu z^v){^J2Jk$;dq88>C24e%^zj#zUSSH^S-UmxGHN?#(UluGroBAsf-~{t;u+3)ryR_ z-@P;A+!;4zYD-F+ z)*#(ANPi9TQG@){AYV1eUk&nEgZ$PY-!;g84fs$4e$;?3HQ-MT_*4Ua)qrm`;9m{+ zSOb36fUh;+Zw>fd1Af~mpBY-|9ANc1^Nsg9`|2y4NC$r8 zmX8Hb#sa`|;~2b;!8@K3o*U8WEO+CbIv+eYX5l>x?|4dhZXAvG(RjyG!gJ#&ypO^= zo)VrLGx45@cRVFLH@fid!aJT4o*Q{O@J?w#-Q0-H`sEpT$5X;{V>;f`@s6j2=SI|@ z74NBd$5X;{V+!6=@Q$a1=f)9u$B*3q zzdRkeJe?PcofPCFus0y5CC87UKZvU@17qnbF}Z+_2*MtMcLCOfa1*9pSzI!%C0??l zu#}LswLRgTkmPHoC63@taiMAEkSngSHZ(0RSVAsC@FsI;njz#e zlLs*6;7!KRG#RMmVf1Wt?D1Y4%39TqnX_Y0aPBHOG-FiOZm=K^|nT~7FQ{pwA#{1M4sv0MB1PPixO<8usA*-Fq_UZNXk@8MxF$yyE zQoY4Jt|Bzv6*mx1=sCcAMM#IUwT9q;DYOFD>+atC4vChSq#tlQ*#Pp(^z>sp=wP{& zP&c!l?MT{1PohILm>lj`<Rfk(UfSSxCRtRPC)`0vyjdLT`Vgh4yxJUv< zusghtz-U8Yrmn6fCNR;gTm{5Bg$eAY>9h>zYtg~{H5S@n_ZkapAy*p~(mYL|?f77s zMVR&o$q!*E%ke?ej1Sw(zr(tu2kVj}P&rtEF<|_@l~yaVUcuUAI~Gp0HPyhBPJh9% zLvH+U!>UVDR;szFu$g@zR@TH{Q}u&Ldq7SNOz6OQb}WGegdzm{h<%W7P+2nzzU^za zq3nZoO@*z&J&o?>CUP1p`wsU6_wc{Fam(R5O&>J{8~J#NR|XTi0L6}VNrfFs@brFkjCAG>Q zge3knW}Cs1rfCMxH@;gs5HW73$C9hBfi9i$w4r{O9ysz7mP%n1<2_|@3rIUV=~_Da z7xumgoN(c1;Z{?q^~OrI_$#0t8uTnUEBvTw31~MU>Lp^OkOq;?2K5B7(svrv3pH4T zI0w*h{*?^JCUI!(+`B$m_R}-e{lK->1isn$)X5z$ZB?GsO>u|ah!Bpii!x}k*c%6t zH?FlbaJfQu>7lj&L-I7b4#)xe8noe#K1<_Z`{7+d=o6W_LIzGvB6&1qAHyL!d_*&_ zSZ)tQKzM~a;+(nT(_0gZvRw2=9W>EaZB0;zOv)HMSwfHpMVfv`;wFP=EFaM4afnU{ ziDX_2NUTW`2L%LR6uMRXgyHnaZH1gB6v$~3 z-1ZKb{=jm0Gxx)qG?vcWyiTn72WECaT>EOtQb1rFb`KsWl;0?_e=a*0OX=7+kj2J9 z(~Q&Y-fx9qp&cdDs!u=+mQ8ZnTMUYHUF|Ewz73Z>O@+q-6FQsZ(@lk+hvZkiO9Oeh z;hMFhhi4z1JQOfKLgKK={kiDb8*`44$i6#PrK=~9f{-DRSVjfQ z^E@kP181ssHMx&@|3Hx()rD#g?}p?ishh=Qh`wEi>+kxiDR}r4-xq1hI^7=pgfdCD zVjkW`dokCbH}aKr#4o#B2t%@8!~0)TWgBhN@a+gEt^13e2yD|}b83`1pzKFrOE7Ya z=G*SKXb#gB%}0EThF_L_*xO1{t+D7v_C+DC*@RHj-bn1b@Wa(x_$wsNvl?_aD*9r) z#Y&fr`jheLbqx-_)neoOEaWfLag}TbsPfD6qd+)FACu?0RaiM+9;~2ir^6 z_sRa^R%~xJ$d6L3-GrDW?@U%^zz%A_`|mb(qV7L2eou2Cc_V%DdyX-@On$U2L_4hJ zpsU&UEk<-^i1pA7aiOu6pzB!Z21{rxKDCB!Fo(t(gRZvF4Mxvi=0;d-uyi=;myM7b&Lzpy~DZ{@!nt7%*s9w$g4xWS-~;L!>?iZM#i?Q@0Mo71EVg- zJfHhc$=F|Mkg=<<+*!jDJ_o@A-j!|G#lc=p8#|6R!_)tHWcoi>hdaU9=%TQX#8Y2{ zapVbCMqm;g?b~s!OMOBktyjs&7Kyd))6YdJCNClkys501+O!3YbO#I$XeMJNZUwW z%J9ksb!|#k&}9kbB0+IzBcWU~D!vQjVDQv{;jt&^IAwa^I6`47Szd{ulD4(w!fq_> zfCXJLhRvRDkM02$N?Y)0B<)I3$>Og1c0^3f!x&qM5`*(xOK?8L7o2Yl^CvP# zS<6+k)&xEeP_wm~CoVESw3qy&sL5q*%%jxtvLo=HI)&8>8OqItR6U2xv7A=E7uObX zS0c3cs__ZvCj=pPD+V#l)23Y1Dm38c14Sy4Cr$1AfP|5|Rq=otEi~Q|lYYRhgy*jg z$^RBKaM+QLh+X(u zU|?H?Xow;Fax~}yy|`+@B3-IMLjWZL!y=8>pql_K$QF{cDPnLSnvJ6YLm*otZiK=ZNEe!MUx)Wq*jMvl^Y%T|P*!MUAMQWx z`%0HkXuy?FgK@W43a)$x1fk2)Uc$Q>6zB?T8)o%RJd^1e9FH5s`FOYq=6bZ`WFtA* zNRAzYG5eW=F}53&>`055#$(vyM&4-jl#HJZwH zhvRTR3;sTg*RaoJ@L3Ixgnfp=hi;b+`;6vcRiDWHTZ%!i+ljwmx%84Q<2C^m&6!_3 z`z{eomTaIEd4Pc0VfX++`qlIPB{ty+f1(Ja90j14BE?4n9UKmb*ky^umuQs%nTLx^ zVQ-GZMG>IbuWB*=N9MR&pge`@Wh7+-zC=^*Nzsz>O|I`lw}7ll`F7!nvwA%55ozv= zFVU2HQnXYTqzcRnwyIp!E+>L&&Y6^{c1Kh0Nr|%iG&3d5q(m95G(;^ensQI~Inkal z@%pkm#$%qZ#`B~?Stv+G)&!C<;o}|0lc(9kJlv#&BAn<$AtbxPp`ukz_9>wVCpr|( z>BFHWZT<3ta9n(dfbWD89g0>b!=aX@&qT4PrL1O7uRzeX@bS`LdIXV|zRVHZysn<~}BQoD@@p!|z zcv+!*v1B`g@*lcT?&%(;8-Pg??SZi+uZ1Z$D3mV|lp{*n#wn}(!3&&PULPr;Y}_xh z#SMf{m_N5~`~rg&HPqKiD8h;6>ZMVkF8^-Mv2du=CKTe~F ziT6GIWjL;(N+?on6rfx20V;foibh{IYtCXCxx*1oBxPEv((7nPooeK^m*3hErkt