diff --git a/mythtv/configure b/mythtv/configure index e78713a4412..735439f25b6 100755 --- a/mythtv/configure +++ b/mythtv/configure @@ -84,6 +84,7 @@ SHFLAGS=-shared netserver="no" need_inet_aton="no" ffserver="no" +ffplay="no" LDFLAGS=-Wl,--warn-common FFSLDFLAGS=-Wl,-E LIBPREF="lib" @@ -93,6 +94,7 @@ SLIBSUF=".so" risky="yes" small="no" amr_nb="no" +amr_nb_fixed="no" # OS specific targetos=`uname -s` @@ -321,12 +323,16 @@ for opt do ;; --disable-ffserver) ffserver="no" ;; + --disable-ffplay) ffplay="no" + ;; --disable-risky) risky="no" ;; --enable-small) small="yes" ;; --enable-amr_nb) amr_nb="yes" ;; + --enable-amr_nb-fixed) amr_nb_fixed="yes" + ;; esac done @@ -590,6 +596,9 @@ if test "$vhook" = "default" ; then vhook="$dlopen" fi +########################################## +# imlib probe + cat > $TMPC << EOF #include #include @@ -601,6 +610,9 @@ if $cc -o $TMPE $TMPC -lImlib2 2> /dev/null ; then imlib2=yes fi +########################################## +# freetype probe + cat > $TMPC << EOF #include int main( void ) { return (int) FT_Init_FreeType(0); } @@ -615,6 +627,31 @@ if test "x$targetos" != "xBeOS" && test "$os2" != "yes"; then fi fi +########################################## +# SDL probe + +cat > $TMPC << EOF +#include +#undef main /* We don't want SDL to override our main() */ +int main( void ) { return SDL_Init (SDL_INIT_VIDEO); } +EOF + +sdl_too_old=no +sdl=no +if $cc -o $TMPE `sdl-config --cflags` $TMPC `sdl-config --libs` 2> /dev/null ; then +_sdlversion=`sdl-config --version | sed 's/[^0-9]//g'` +if test "$_sdlversion" -lt 121 ; then +sdl_too_old=yes +else +sdl=yes +fi +fi + + +if test "$sdl" = "no" ; then + ffplay=no +fi + if test "$small" = "yes"; then # CFLAGS=${CFLAGS//-O3/-Os} CFLAGS="$CFLAGS -Os" @@ -642,6 +679,7 @@ echo " --help print this message" #echo " --enable-shared-pp use libpostproc.so [default=no]" #echo " --enable-shared build shared libraries [default=no]" #echo " --enable-amr_nb enable amr_nb audio codec" +#echo " --enable-amr_nb-fixed use fixed point for amr-nb codec" #echo "" echo "Advanced options (experts only):" #echo " --source-path=PATH path of source code [$source_path]" @@ -666,6 +704,7 @@ echo " --disable-simple_idct disable simple IDCT routines [default=no]" echo " --disable-mpegaudio-hp faster (but less accurate)" echo " mpegaudio decoding [default=no]" #echo " --disable-ffserver disable ffserver build" +#echo " --disable-ffplay disable ffplay build" #echo " --disable-risky disables patent encumbered codecs" #echo " --enable-small optimize for size instead of speed" #echo "" @@ -702,6 +741,10 @@ echo "lcdproc support $lcdproc" #echo "pp support $pp" #echo "shared pp $shared_pp" #echo "Video hooking $vhook" +#echo "SDL support $sdl" +#if test $sdl_too_old = "yes"; then +#echo "-> Your SDL version is too old - please upgrade to have FFplay/SDL support" +#fi #echo "risky / patent encumbered codecs $risky" #echo "optimize for size $small" @@ -709,7 +752,8 @@ echo "lcdproc support $lcdproc" #echo "Imlib2 support $imlib2" #echo "freetype support $freetype2" #fi -#echo "AMR-NB support" $amr_nb +#echo "AMR-NB float support" $amr_nb +#echo "AMR-NB fixed support" $amr_nb_fixed echo "Creating config.mak and config.h" @@ -761,6 +805,7 @@ fi if test "$mmx" = "yes" ; then echo "TARGET_MMX=yes" >> config.mak echo "#define HAVE_MMX 1" >> $TMPH + echo "#define __CPU__ 586" >> $TMPH fi #if test "$builtin_vector" = "yes" ; then # echo "TARGET_BUILTIN_VECTOR=yes" >> config.mak @@ -796,6 +841,11 @@ fi if test "$freetype2" = "yes" ; then echo "HAVE_FREETYPE2=yes" >> config.mak fi +if test "$sdl" = "yes" ; then + echo "CONFIG_SDL=yes" >> config.mak + echo "SDL_LIBS=`sdl-config --libs`" >> config.mak + echo "SDL_CFLAGS=`sdl-config --cflags`" >> config.mak +fi if test "$have_lrintf" = "yes" ; then echo "#define HAVE_LRINTF 1" >> $TMPH fi @@ -970,6 +1020,10 @@ if test "$ffserver" = "yes" ; then echo "CONFIG_FFSERVER=yes" >> config.mak fi +if test "$ffplay" = "yes" ; then + echo "CONFIG_FFPLAY=yes" >> config.mak +fi + if test "$risky" = "yes" ; then echo "#define CONFIG_RISKY 1" >> $TMPH echo "CONFIG_RISKY=yes" >> config.mak @@ -995,13 +1049,26 @@ if test "$amr_nb" = "yes" ; then echo "#define AMR_NB 1" >> $TMPH echo "AMR_NB=yes" >> config.mak echo - echo "AMR NB NOTICE! Make sure you have downloaded TS26.073 from " +if test "$amr_nb_fixed" = "yes" ; then + echo "AMR_NB_FIXED=yes" >> config.mak + echo "#define AMR_NB_FIXED 1" >> $TMPH + echo "AMR NB FIXED POINT NOTICE! Make sure you have downloaded TS26.073 " + echo "REL-5 version 5.1.0 from " echo "http://www.3gpp.org/ftp/Specs/latest/Rel-5/26_series/26073-510.zip" echo "and extracted src to libavcodec/amr" - echo "You must also add -DMMS_IO to CFLAGS in libavcodec/amr/makefile." + echo "You must also add -DMMS_IO and remove -pedantic-errors to/from CFLAGS in libavcodec/amr/makefile." + echo "i.e. CFLAGS = -Wall -I. \$(CFLAGS_\$(MODE)) -D\$(VAD) -DMMS_IO" + echo +else + echo "AMR NB FLOAT NOTICE ! Make sure you have downloaded TS26.104" + echo "REL-5 V5.1.0 from " + echo "http://www.3gpp.org/ftp/Specs/latest/Rel-5/26_series/26104-510.zip" + echo "and extracted the source to libavcodec/amr_float" echo fi +fi + diff $TMPH config.h >/dev/null 2>&1 if test $? -ne 0 ; then mv -f $TMPH config.h diff --git a/mythtv/libs/libavcodec/4xm.c b/mythtv/libs/libavcodec/4xm.c new file mode 100644 index 00000000000..80e87c37976 --- /dev/null +++ b/mythtv/libs/libavcodec/4xm.c @@ -0,0 +1,752 @@ +/* + * 4XM codec + * Copyright (c) 2003 Michael Niedermayer + * + * This 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 of the License, or (at your option) any later version. + * + * This 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 this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/** + * @file 4xm.c + * 4XM codec. + */ + +#include "avcodec.h" +#include "dsputil.h" +#include "mpegvideo.h" + +//#undef NDEBUG +//#include + +#define BLOCK_TYPE_VLC_BITS 5 +#define ACDC_VLC_BITS 9 + +#define CFRAME_BUFFER_COUNT 100 + +static const uint8_t block_type_tab[4][8][2]={ + { //{8,4,2}x{8,4,2} + { 0,1}, { 2,2}, { 6,3}, {14,4}, {30,5}, {31,5}, { 0,0} + },{ //{8,4}x1 + { 0,1}, { 0,0}, { 2,2}, { 6,3}, {14,4}, {15,4}, { 0,0} + },{ //1x{8,4} + { 0,1}, { 2,2}, { 0,0}, { 6,3}, {14,4}, {15,4}, { 0,0} + },{ //1x2, 2x1 + { 0,1}, { 0,0}, { 0,0}, { 2,2}, { 6,3}, {14,4}, {15,4} + } +}; + +static const uint8_t size2index[4][4]={ + {-1, 3, 1, 1}, + { 3, 0, 0, 0}, + { 2, 0, 0, 0}, + { 2, 0, 0, 0}, +}; + +static const int8_t mv[256][2]={ +{ 0, 0},{ 0, -1},{ -1, 0},{ 1, 0},{ 0, 1},{ -1, -1},{ 1, -1},{ -1, 1}, +{ 1, 1},{ 0, -2},{ -2, 0},{ 2, 0},{ 0, 2},{ -1, -2},{ 1, -2},{ -2, -1}, +{ 2, -1},{ -2, 1},{ 2, 1},{ -1, 2},{ 1, 2},{ -2, -2},{ 2, -2},{ -2, 2}, +{ 2, 2},{ 0, -3},{ -3, 0},{ 3, 0},{ 0, 3},{ -1, -3},{ 1, -3},{ -3, -1}, +{ 3, -1},{ -3, 1},{ 3, 1},{ -1, 3},{ 1, 3},{ -2, -3},{ 2, -3},{ -3, -2}, +{ 3, -2},{ -3, 2},{ 3, 2},{ -2, 3},{ 2, 3},{ 0, -4},{ -4, 0},{ 4, 0}, +{ 0, 4},{ -1, -4},{ 1, -4},{ -4, -1},{ 4, -1},{ 4, 1},{ -1, 4},{ 1, 4}, +{ -3, -3},{ -3, 3},{ 3, 3},{ -2, -4},{ -4, -2},{ 4, -2},{ -4, 2},{ -2, 4}, +{ 2, 4},{ -3, -4},{ 3, -4},{ 4, -3},{ -5, 0},{ -4, 3},{ -3, 4},{ 3, 4}, +{ -1, -5},{ -5, -1},{ -5, 1},{ -1, 5},{ -2, -5},{ 2, -5},{ 5, -2},{ 5, 2}, +{ -4, -4},{ -4, 4},{ -3, -5},{ -5, -3},{ -5, 3},{ 3, 5},{ -6, 0},{ 0, 6}, +{ -6, -1},{ -6, 1},{ 1, 6},{ 2, -6},{ -6, 2},{ 2, 6},{ -5, -4},{ 5, 4}, +{ 4, 5},{ -6, -3},{ 6, 3},{ -7, 0},{ -1, -7},{ 5, -5},{ -7, 1},{ -1, 7}, +{ 4, -6},{ 6, 4},{ -2, -7},{ -7, 2},{ -3, -7},{ 7, -3},{ 3, 7},{ 6, -5}, +{ 0, -8},{ -1, -8},{ -7, -4},{ -8, 1},{ 4, 7},{ 2, -8},{ -2, 8},{ 6, 6}, +{ -8, 3},{ 5, -7},{ -5, 7},{ 8, -4},{ 0, -9},{ -9, -1},{ 1, 9},{ 7, -6}, +{ -7, 6},{ -5, -8},{ -5, 8},{ -9, 3},{ 9, -4},{ 7, -7},{ 8, -6},{ 6, 8}, +{ 10, 1},{-10, 2},{ 9, -5},{ 10, -3},{ -8, -7},{-10, -4},{ 6, -9},{-11, 0}, +{ 11, 1},{-11, -2},{ -2, 11},{ 7, -9},{ -7, 9},{ 10, 6},{ -4, 11},{ 8, -9}, +{ 8, 9},{ 5, 11},{ 7,-10},{ 12, -3},{ 11, 6},{ -9, -9},{ 8, 10},{ 5, 12}, +{-11, 7},{ 13, 2},{ 6,-12},{ 10, 9},{-11, 8},{ -7, 12},{ 0, 14},{ 14, -2}, +{ -9, 11},{ -6, 13},{-14, -4},{ -5,-14},{ 5, 14},{-15, -1},{-14, -6},{ 3,-15}, +{ 11,-11},{ -7, 14},{ -5, 15},{ 8,-14},{ 15, 6},{ 3, 16},{ 7,-15},{-16, 5}, +{ 0, 17},{-16, -6},{-10, 14},{-16, 7},{ 12, 13},{-16, 8},{-17, 6},{-18, 3}, +{ -7, 17},{ 15, 11},{ 16, 10},{ 2,-19},{ 3,-19},{-11,-16},{-18, 8},{-19, -6}, +{ 2,-20},{-17,-11},{-10,-18},{ 8, 19},{-21, -1},{-20, 7},{ -4, 21},{ 21, 5}, +{ 15, 16},{ 2,-22},{-10,-20},{-22, 5},{ 20,-11},{ -7,-22},{-12, 20},{ 23, -5}, +{ 13,-20},{ 24, -2},{-15, 19},{-11, 22},{ 16, 19},{ 23,-10},{-18,-18},{ -9,-24}, +{ 24,-10},{ -3, 26},{-23, 13},{-18,-20},{ 17, 21},{ -4, 27},{ 27, 6},{ 1,-28}, +{-11, 26},{-17,-23},{ 7, 28},{ 11,-27},{ 29, 5},{-23,-19},{-28,-11},{-21, 22}, +{-30, 7},{-17, 26},{-27, 16},{ 13, 29},{ 19,-26},{ 10,-31},{-14,-30},{ 20,-27}, +{-29, 18},{-16,-31},{-28,-22},{ 21,-30},{-25, 28},{ 26,-29},{ 25,-32},{-32,-32} +}; + +// this is simply the scaled down elementwise product of the standard jpeg quantizer table and the AAN premul table +static const uint8_t dequant_table[64]={ + 16, 15, 13, 19, 24, 31, 28, 17, + 17, 23, 25, 31, 36, 63, 45, 21, + 18, 24, 27, 37, 52, 59, 49, 20, + 16, 28, 34, 40, 60, 80, 51, 20, + 18, 31, 48, 66, 68, 86, 56, 21, + 19, 38, 56, 59, 64, 64, 48, 20, + 27, 48, 55, 55, 56, 51, 35, 15, + 20, 35, 34, 32, 31, 22, 15, 8, +}; + +static VLC block_type_vlc[4]; + + +typedef struct CFrameBuffer{ + int allocated_size; + int size; + int id; + uint8_t *data; +}CFrameBuffer; + +typedef struct FourXContext{ + AVCodecContext *avctx; + DSPContext dsp; + AVFrame current_picture, last_picture; + GetBitContext pre_gb; ///< ac/dc prefix + GetBitContext gb; + uint8_t *bytestream; + uint16_t *wordstream; + int mv[256]; + VLC pre_vlc; + int last_dc; + DCTELEM __align8 block[6][64]; + uint8_t *bitstream_buffer; + int bitstream_buffer_size; + CFrameBuffer cfrm[CFRAME_BUFFER_COUNT]; +} FourXContext; + + +#define FIX_1_082392200 70936 +#define FIX_1_414213562 92682 +#define FIX_1_847759065 121095 +#define FIX_2_613125930 171254 + +#define MULTIPLY(var,const) (((var)*(const)) >> 16) + +static void idct(DCTELEM block[64]){ + int tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + int tmp10, tmp11, tmp12, tmp13; + int z5, z10, z11, z12, z13; + int i; + int temp[64]; + + for(i=0; i<8; i++){ + tmp10 = block[8*0 + i] + block[8*4 + i]; + tmp11 = block[8*0 + i] - block[8*4 + i]; + + tmp13 = block[8*2 + i] + block[8*6 + i]; + tmp12 = MULTIPLY(block[8*2 + i] - block[8*6 + i], FIX_1_414213562) - tmp13; + + tmp0 = tmp10 + tmp13; + tmp3 = tmp10 - tmp13; + tmp1 = tmp11 + tmp12; + tmp2 = tmp11 - tmp12; + + z13 = block[8*5 + i] + block[8*3 + i]; + z10 = block[8*5 + i] - block[8*3 + i]; + z11 = block[8*1 + i] + block[8*7 + i]; + z12 = block[8*1 + i] - block[8*7 + i]; + + tmp7 = z11 + z13; + tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); + + z5 = MULTIPLY(z10 + z12, FIX_1_847759065); + tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; + tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; + + tmp6 = tmp12 - tmp7; + tmp5 = tmp11 - tmp6; + tmp4 = tmp10 + tmp5; + + temp[8*0 + i] = tmp0 + tmp7; + temp[8*7 + i] = tmp0 - tmp7; + temp[8*1 + i] = tmp1 + tmp6; + temp[8*6 + i] = tmp1 - tmp6; + temp[8*2 + i] = tmp2 + tmp5; + temp[8*5 + i] = tmp2 - tmp5; + temp[8*4 + i] = tmp3 + tmp4; + temp[8*3 + i] = tmp3 - tmp4; + } + + for(i=0; i<8*8; i+=8){ + tmp10 = temp[0 + i] + temp[4 + i]; + tmp11 = temp[0 + i] - temp[4 + i]; + + tmp13 = temp[2 + i] + temp[6 + i]; + tmp12 = MULTIPLY(temp[2 + i] - temp[6 + i], FIX_1_414213562) - tmp13; + + tmp0 = tmp10 + tmp13; + tmp3 = tmp10 - tmp13; + tmp1 = tmp11 + tmp12; + tmp2 = tmp11 - tmp12; + + z13 = temp[5 + i] + temp[3 + i]; + z10 = temp[5 + i] - temp[3 + i]; + z11 = temp[1 + i] + temp[7 + i]; + z12 = temp[1 + i] - temp[7 + i]; + + tmp7 = z11 + z13; + tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); + + z5 = MULTIPLY(z10 + z12, FIX_1_847759065); + tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; + tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; + + tmp6 = tmp12 - tmp7; + tmp5 = tmp11 - tmp6; + tmp4 = tmp10 + tmp5; + + block[0 + i] = (tmp0 + tmp7)>>6; + block[7 + i] = (tmp0 - tmp7)>>6; + block[1 + i] = (tmp1 + tmp6)>>6; + block[6 + i] = (tmp1 - tmp6)>>6; + block[2 + i] = (tmp2 + tmp5)>>6; + block[5 + i] = (tmp2 - tmp5)>>6; + block[4 + i] = (tmp3 + tmp4)>>6; + block[3 + i] = (tmp3 - tmp4)>>6; + } +} + +static void init_vlcs(FourXContext *f){ + static int done = 0; + int i; + + if (!done) { + done = 1; + + for(i=0; i<4; i++){ + init_vlc(&block_type_vlc[i], BLOCK_TYPE_VLC_BITS, 7, + &block_type_tab[i][0][1], 2, 1, + &block_type_tab[i][0][0], 2, 1); + } + } +} + +static void init_mv(FourXContext *f){ + int i; + + for(i=0; i<256; i++){ + f->mv[i] = mv[i][0] + mv[i][1]*f->current_picture.linesize[0]/2; + } +} + +static inline void mcdc(uint16_t *dst, uint16_t *src, int log2w, int h, int stride, int scale, int dc){ + int i; + dc*= 0x10001; + + switch(log2w){ + case 0: + for(i=0; igb, block_type_vlc[index].table, BLOCK_TYPE_VLC_BITS, 1); + + assert(code>=0 && code<=6); + + if(code == 0){ + src += f->mv[ *f->bytestream++ ]; + mcdc(dst, src, log2w, h, stride, 1, 0); + }else if(code == 1){ + log2h--; + decode_p_block(f, dst , src , log2w, log2h, stride); + decode_p_block(f, dst + (stride<mv[ *f->bytestream++ ]; + mcdc(dst, src, log2w, h, stride, 1, le2me_16(*f->wordstream++)); + }else if(code == 5){ + mcdc(dst, src, log2w, h, stride, 0, le2me_16(*f->wordstream++)); + }else if(code == 6){ + if(log2w){ + dst[0] = le2me_16(*f->wordstream++); + dst[1] = le2me_16(*f->wordstream++); + }else{ + dst[0 ] = le2me_16(*f->wordstream++); + dst[stride] = le2me_16(*f->wordstream++); + } + } +} + +static int get32(void *p){ + return le2me_32(*(uint32_t*)p); +} + +static int decode_p_frame(FourXContext *f, uint8_t *buf, int length){ + int x, y; + const int width= f->avctx->width; + const int height= f->avctx->height; + uint16_t *src= (uint16_t*)f->last_picture.data[0]; + uint16_t *dst= (uint16_t*)f->current_picture.data[0]; + const int stride= f->current_picture.linesize[0]>>1; + const int bitstream_size= get32(buf+8); + const int bytestream_size= get32(buf+16); + const int wordstream_size= get32(buf+12); + + if(bitstream_size+ bytestream_size+ wordstream_size + 20 != length) + printf("lengths %d %d %d %d\n", bitstream_size, bytestream_size, wordstream_size, + bitstream_size+ bytestream_size+ wordstream_size - length); + + f->bitstream_buffer= av_fast_realloc(f->bitstream_buffer, &f->bitstream_buffer_size, bitstream_size + FF_INPUT_BUFFER_PADDING_SIZE); + f->dsp.bswap_buf((uint32_t*)f->bitstream_buffer, (uint32_t*)(buf + 20), bitstream_size/4); + init_get_bits(&f->gb, f->bitstream_buffer, 8*bitstream_size); + + f->wordstream= (uint16_t*)(buf + 20 + bitstream_size); + f->bytestream= buf + 20 + bitstream_size + wordstream_size; + + init_mv(f); + + for(y=0; ygb)+31)/32*4) + printf(" %d %d %d bytes left\n", + bitstream_size - (get_bits_count(&f->gb)+31)/32*4, + bytestream_size - (f->bytestream - (buf + 20 + bitstream_size + wordstream_size)), + wordstream_size - (((uint8_t*)f->wordstream) - (buf + 20 + bitstream_size)) + ); + + return 0; +} + +/** + * decode block and dequantize. + * Note this is allmost identical to mjpeg + */ +static int decode_i_block(FourXContext *f, DCTELEM *block){ + int code, i, j, level, val; + + /* DC coef */ + val = get_vlc2(&f->pre_gb, f->pre_vlc.table, ACDC_VLC_BITS, 3); + if (val>>4){ + printf("error dc run != 0\n"); + } + + if(val) + val = get_xbits(&f->gb, val); + + val = val * dequant_table[0] + f->last_dc; + f->last_dc = + block[0] = val; + /* AC coefs */ + i = 1; + for(;;) { + code = get_vlc2(&f->pre_gb, f->pre_vlc.table, ACDC_VLC_BITS, 3); + + /* EOB */ + if (code == 0) + break; + if (code == 0xf0) { + i += 16; + } else { + level = get_xbits(&f->gb, code & 0xf); + i += code >> 4; + if (i >= 64) { + printf("run %d oveflow\n", i); + return 0; + } + + j= ff_zigzag_direct[i]; + block[j] = level * dequant_table[j]; + i++; + if (i >= 64) + break; + } + } + + return 0; +} + +static inline void idct_put(FourXContext *f, int x, int y){ + DCTELEM (*block)[64]= f->block; + int stride= f->current_picture.linesize[0]>>1; + int i; + uint16_t *dst = ((uint16_t*)f->current_picture.data[0]) + y * stride + x; + + for(i=0; i<4; i++){ + block[i][0] += 0x80*8*8; + idct(block[i]); + } + + if(!(f->avctx->flags&CODEC_FLAG_GRAY)){ + for(i=4; i<6; i++) idct(block[i]); + } + + for(y=0; y<8; y++){ + for(x=0; x<8; x++){ + DCTELEM *temp= block[(x>>2) + 2*(y>>2)] + 2*(x&3) + 2*8*(y&3); //FIXME optimize + int cb= block[4][x + 8*y]; + int cr= block[5][x + 8*y]; + int cg= (cb + cr)>>1; + int y; + + cb+=cb; + + y = temp[0]; + dst[0 ]= ((y+cb)>>3) + (((y-cg)&0xFC)<<3) + (((y+cr)&0xF8)<<8); + y = temp[1]; + dst[1 ]= ((y+cb)>>3) + (((y-cg)&0xFC)<<3) + (((y+cr)&0xF8)<<8); + y = temp[8]; + dst[ stride]= ((y+cb)>>3) + (((y-cg)&0xFC)<<3) + (((y+cr)&0xF8)<<8); + y = temp[9]; + dst[1+stride]= ((y+cb)>>3) + (((y-cg)&0xFC)<<3) + (((y+cr)&0xF8)<<8); + dst += 2; + } + dst += 2*stride - 2*8; + } +} + +static int decode_i_mb(FourXContext *f){ + int i; + + f->dsp.clear_blocks(f->block[0]); + + for(i=0; i<6; i++){ + if(decode_i_block(f, f->block[i]) < 0) + return -1; + } + + return 0; +} + +static uint8_t *read_huffman_tables(FourXContext *f, uint8_t * const buf){ + int frequency[512]; + uint8_t flag[512]; + int up[512]; + uint8_t len_tab[257]; + int bits_tab[257]; + int start, end; + uint8_t *ptr= buf; + int j; + + memset(frequency, 0, sizeof(frequency)); + memset(up, -1, sizeof(up)); + + start= *ptr++; + end= *ptr++; + for(;;){ + int i; + + for(i=start; i<=end; i++){ + frequency[i]= *ptr++; +// printf("%d %d %d\n", start, end, frequency[i]); + } + start= *ptr++; + if(start==0) break; + + end= *ptr++; + } + frequency[256]=1; + + while((ptr - buf)&3) ptr++; // 4byte align + +// for(j=0; j<16; j++) +// printf("%2X", ptr[j]); + + for(j=257; j<512; j++){ + int min_freq[2]= {256*256, 256*256}; + int smallest[2]= {0, 0}; + int i; + for(i=0; i 31) printf("vlc length overflow\n"); //can this happen at all ? + } + + bits_tab[j]= bits; + len_tab[j]= len; + } + + init_vlc(&f->pre_vlc, ACDC_VLC_BITS, 257, + len_tab , 1, 1, + bits_tab, 4, 4); + + return ptr; +} + +static int decode_i_frame(FourXContext *f, uint8_t *buf, int length){ + int x, y; + const int width= f->avctx->width; + const int height= f->avctx->height; + uint16_t *dst= (uint16_t*)f->current_picture.data[0]; + const int stride= f->current_picture.linesize[0]>>1; + const int bitstream_size= get32(buf); + const int token_count= get32(buf + bitstream_size + 8); + int prestream_size= 4*get32(buf + bitstream_size + 4); + uint8_t *prestream= buf + bitstream_size + 12; + + if(prestream_size + bitstream_size + 12 != length) + fprintf(stderr, "size missmatch %d %d %d\n", prestream_size, bitstream_size, length); + + prestream= read_huffman_tables(f, prestream); + + init_get_bits(&f->gb, buf + 4, 8*bitstream_size); + + prestream_size= length + buf - prestream; + + f->bitstream_buffer= av_fast_realloc(f->bitstream_buffer, &f->bitstream_buffer_size, prestream_size + FF_INPUT_BUFFER_PADDING_SIZE); + f->dsp.bswap_buf((uint32_t*)f->bitstream_buffer, (uint32_t*)prestream, prestream_size/4); + init_get_bits(&f->pre_gb, f->bitstream_buffer, 8*prestream_size); + + f->last_dc= 0*128*8*8; + + for(y=0; ypre_gb, f->pre_vlc.table, ACDC_VLC_BITS, 3) != 256) + printf("end missmatch\n"); + + return 0; +} + +static int decode_frame(AVCodecContext *avctx, + void *data, int *data_size, + uint8_t *buf, int buf_size) +{ + FourXContext * const f = avctx->priv_data; + AVFrame *picture = data; + AVFrame *p, temp; + int i, frame_4cc, frame_size; + + *data_size = 0; + + /* special case for last picture */ + if (buf_size == 0) { + return 0; + } + + frame_4cc= get32(buf); + if(buf_size != get32(buf+4)+8){ + fprintf(stderr, "size missmatch %d %d\n", buf_size, get32(buf+4)); + } + + if(frame_4cc == ff_get_fourcc("cfrm")){ + int free_index=-1; + const int data_size= buf_size - 20; + const int id= get32(buf+12); + const int whole_size= get32(buf+16); + CFrameBuffer *cfrm; + + for(i=0; icfrm[i].id && f->cfrm[i].id < avctx->frame_number) + printf("lost c frame %d\n", f->cfrm[i].id); + } + + for(i=0; icfrm[i].id == id) break; + if(f->cfrm[i].size == 0 ) free_index= i; + } + + if(i>=CFRAME_BUFFER_COUNT){ + i= free_index; + f->cfrm[i].id= id; + } + cfrm= &f->cfrm[i]; + + cfrm->data= av_fast_realloc(cfrm->data, &cfrm->allocated_size, cfrm->size + data_size + FF_INPUT_BUFFER_PADDING_SIZE); + + memcpy(cfrm->data + cfrm->size, buf+20, data_size); + cfrm->size += data_size; + + if(cfrm->size >= whole_size){ + buf= cfrm->data; + frame_size= cfrm->size; + + if(id != avctx->frame_number){ + printf("cframe id missmatch %d %d\n", id, avctx->frame_number); + } + + cfrm->size= cfrm->id= 0; + frame_4cc= ff_get_fourcc("pfrm"); + }else + return buf_size; + }else{ + buf= buf + 12; + frame_size= buf_size - 12; + } + + temp= f->current_picture; + f->current_picture= f->last_picture; + f->last_picture= temp; + + p= &f->current_picture; + avctx->coded_frame= p; + + avctx->flags |= CODEC_FLAG_EMU_EDGE; // alternatively we would have to use our own buffer management + + if(p->data[0]) + avctx->release_buffer(avctx, p); + + p->reference= 1; + if(avctx->get_buffer(avctx, p) < 0){ + fprintf(stderr, "get_buffer() failed\n"); + return -1; + } + + if(frame_4cc == ff_get_fourcc("ifrm")){ + p->pict_type= I_TYPE; + if(decode_i_frame(f, buf, frame_size) < 0) + return -1; + }else if(frame_4cc == ff_get_fourcc("pfrm")){ + p->pict_type= P_TYPE; + if(decode_p_frame(f, buf, frame_size) < 0) + return -1; + }else if(frame_4cc == ff_get_fourcc("snd_")){ + printf("ignoring snd_ chunk length:%d\n", buf_size); + }else{ + printf("ignoring unknown chunk length:%d\n", buf_size); + } + +#if 0 +for(i=0; i<20; i++){ + printf("%2X %c ", buf[i], clip(buf[i],16,126)); +} +#endif + + p->key_frame= p->pict_type == I_TYPE; + + *picture= *p; + *data_size = sizeof(AVPicture); + + emms_c(); + + return buf_size; +} + + +static void common_init(AVCodecContext *avctx){ + FourXContext * const f = avctx->priv_data; + + dsputil_init(&f->dsp, avctx); + + f->avctx= avctx; +} + +static int decode_init(AVCodecContext *avctx){ + FourXContext * const f = avctx->priv_data; + + common_init(avctx); + init_vlcs(f); + + avctx->pix_fmt= PIX_FMT_RGB565; + + return 0; +} + + +static int decode_end(AVCodecContext *avctx){ + FourXContext * const f = avctx->priv_data; + int i; + + av_freep(&f->bitstream_buffer); + f->bitstream_buffer_size=0; + for(i=0; icfrm[i].data); + f->cfrm[i].allocated_size= 0; + } + free_vlc(&f->pre_vlc); + + avcodec_default_free_buffers(avctx); + + return 0; +} + +AVCodec fourxm_decoder = { + "4xm", + CODEC_TYPE_VIDEO, + CODEC_ID_4XM, + sizeof(FourXContext), + decode_init, + NULL, + decode_end, + decode_frame, + /*CODEC_CAP_DR1,*/ +}; + diff --git a/mythtv/libs/libavcodec/adpcm.c b/mythtv/libs/libavcodec/adpcm.c index e94d16b5136..45c9dd19593 100644 --- a/mythtv/libs/libavcodec/adpcm.c +++ b/mythtv/libs/libavcodec/adpcm.c @@ -312,6 +312,33 @@ static inline short adpcm_ima_expand_nibble(ADPCMChannelStatus *c, char nibble) return (short)predictor; } +static inline short adpcm_4xa_expand_nibble(ADPCMChannelStatus *c, char nibble) +{ + int step_index; + int predictor; + int sign, delta, diff, step; + + step = step_table[c->step_index]; + step_index = c->step_index + index_table[(unsigned)nibble]; + if (step_index < 0) step_index = 0; + else if (step_index > 88) step_index = 88; + + sign = nibble & 8; + delta = nibble & 7; + + diff = (delta*step + (step>>1))>>3; // difference to code above + + predictor = c->predictor; + if (sign) predictor -= diff; + else predictor += diff; + + CLAMP_TO_SHORT(predictor); + c->predictor = predictor; + c->step_index = step_index; + + return (short)predictor; +} + static inline short adpcm_ms_expand_nibble(ADPCMChannelStatus *c, char nibble) { int predictor; @@ -334,7 +361,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, { ADPCMContext *c = avctx->priv_data; ADPCMChannelStatus *cs; - int n, m, channel; + int n, m, channel, i; int block_predictor[2]; short *samples; uint8_t *src; @@ -444,6 +471,34 @@ static int adpcm_decode_frame(AVCodecContext *avctx, } src++; } + break; + case CODEC_ID_ADPCM_4XM: + cs = &(c->status[0]); + c->status[0].predictor= (int16_t)(src[0] + (src[1]<<8)); src+=2; + if(st){ + c->status[1].predictor= (int16_t)(src[0] + (src[1]<<8)); src+=2; + } + c->status[0].step_index= (int16_t)(src[0] + (src[1]<<8)); src+=2; + if(st){ + c->status[1].step_index= (int16_t)(src[0] + (src[1]<<8)); src+=2; + } +// if (cs->step_index < 0) cs->step_index = 0; +// if (cs->step_index > 88) cs->step_index = 88; + + m= (buf_size - (src - buf))>>st; +//printf("%d %d %d %d\n", st, m, c->status[0].predictor, c->status[0].step_index); + //FIXME / XXX decode chanels individual & interleave samples + for(i=0; istatus[0], src[i] & 0x0F); + if (st) + *samples++ = adpcm_4xa_expand_nibble(&c->status[1], src[i+m] & 0x0F); + *samples++ = adpcm_4xa_expand_nibble(&c->status[0], src[i] >> 4); + if (st) + *samples++ = adpcm_4xa_expand_nibble(&c->status[1], src[i+m] >> 4); + } + + src += m<idct_put = simple_idct_put_axp; c->idct_add = simple_idct_add_axp; + c->idct_idct = simple_idct_axp; } diff --git a/mythtv/libs/libavcodec/amr.c b/mythtv/libs/libavcodec/amr.c index ca3df7fabdd..50fe003f813 100644 --- a/mythtv/libs/libavcodec/amr.c +++ b/mythtv/libs/libavcodec/amr.c @@ -16,18 +16,93 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -//#define DEBUG -#define MMS_IO + /* + This code implements amr-nb audio encoder/decoder through external reference + code from www.3gpp.org. The licence of the code from 3gpp is unclear so you + have to download the code separately. Two versions exists: One fixed-point + and one with floats. For some reason the float-encoder is significant faster + atleast on a P4 1.5GHz (0.9s instead of 9.9s on a 30s audio clip at MR102). + + The fixed-point (TS26.073) can be downloaded from: + http://www.3gpp.org/ftp/Specs/latest/Rel-5/26_series/26073-510.zip + Extract the soure into ffmpeg/libavcodec/amr + To use the float version run "./configure" with "--enable-amr-nb-fixed" + + The float version (default) can be downloaded from: + http://www.3gpp.org/ftp/Specs/latest/Rel-5/26_series/26104-510.zip + Extract the soure into ffmpeg/libavcodec/amr_float + + The specification for amr-nb can be found in TS 26.071 + (http://www.3gpp.org/ftp/Specs/html-info/26071.htm) and some other + info at http://www.3gpp.org/ftp/Specs/html-info/26-series.htm + + In the future support for AMR-WB might also be included here. + Reference code exist in TS26.173 and TS 26.204. + + */ +#define DEBUG +//#define AMR_NB_FIXED +#include "../config.h" #include "avcodec.h" +#ifdef AMR_NB_FIXED + +#define MMS_IO + #include "amr/sp_dec.h" #include "amr/d_homing.h" #include "amr/typedef.h" +#include "amr/sp_enc.h" +#include "amr/sid_sync.h" +#include "amr/e_homing.h" +#else +#include "amr_float/interf_dec.h" +#include "amr_float/interf_enc.h" +#endif + +/* Common code for fixed and float version*/ +typedef struct AMR_bitrates +{ + int startrate; + int stoprate; + enum Mode mode; + +} AMR_bitrates; + +/* Match desired bitrate with closest one*/ +static enum Mode getBitrateMode(int bitrate) +{ + /* Adjusted so that all bitrates can be used from commandline where + only a multiple of 1000 can be specified*/ + AMR_bitrates rates[]={ {0,4999,MR475}, //4 + {5000,5899,MR515},//5 + {5900,6699,MR59},//6 + {6700,7000,MR67},//7 + {7001,7949,MR74},//8 + {7950,9999,MR795},//9 + {10000,11999,MR102},//10 + {12000,64000,MR122},//12 + + }; + int i; + for(i=0;i=bitrate) + { + return(rates[i].mode); + } + } + /*Return highest possible*/ + return(MR122); +} + +#ifdef AMR_NB_FIXED +/* fixed point version*/ /* frame size in serial bitstream file (frame type + serial stream + flags) */ #define SERIAL_FRAMESIZE (1+MAX_SERIAL_SIZE+5) -typedef struct AMRDecodeContext { +typedef struct AMRContext { int frameCount; Speech_Decode_FrameState *speech_decoder_state; enum RXFrameType rx_type; @@ -35,11 +110,17 @@ typedef struct AMRDecodeContext { Word16 reset_flag; Word16 reset_flag_old; -} AMRDecodeContext; + enum Mode enc_bitrate; + Speech_Encode_FrameState *enstate; + sid_syncState *sidstate; + enum TXFrameType tx_frametype; + + +} AMRContext; static int amr_nb_decode_init(AVCodecContext * avctx) { - AMRDecodeContext *s = avctx->priv_data; + AMRContext *s = avctx->priv_data; s->frameCount=0; s->speech_decoder_state=NULL; s->rx_type = (enum RXFrameType)0; @@ -49,23 +130,75 @@ static int amr_nb_decode_init(AVCodecContext * avctx) if(Speech_Decode_Frame_init(&s->speech_decoder_state, "Decoder")) { - printf("error\r\n"); + printf("Speech_Decode_Frame_init error\n"); return -1; } return 0; } -static int amr_decode_close(AVCodecContext * avctx) +static int amr_nb_encode_init(AVCodecContext * avctx) { - AMRDecodeContext *s = avctx->priv_data; + AMRContext *s = avctx->priv_data; + s->frameCount=0; + s->speech_decoder_state=NULL; + s->rx_type = (enum RXFrameType)0; + s->mode= (enum Mode)0; + s->reset_flag=0; + s->reset_flag_old=1; + + if(avctx->sample_rate!=8000) + { +#ifdef DEBUG + printf("Only 8000Hz sample rate supported\n"); +#endif + return -1; + } + + if(avctx->channels!=1) + { +#ifdef DEBUG + printf("Only mono supported\n"); +#endif + return -1; + } + + avctx->frame_size=160; + avctx->coded_frame= avcodec_alloc_frame(); + + if(Speech_Encode_Frame_init(&s->enstate, 0, "encoder") || sid_sync_init (&s->sidstate)) + { +#ifdef DEBUG + printf("Speech_Encode_Frame_init error\n"); +#endif + return -1; + } + + s->enc_bitrate=getBitrateMode(avctx->bit_rate); + + return 0; +} + +static int amr_nb_encode_close(AVCodecContext * avctx) +{ + AMRContext *s = avctx->priv_data; + Speech_Encode_Frame_exit(&s->enstate); + sid_sync_exit (&s->sidstate); + av_freep(&avctx->coded_frame); + return 0; +} + +static int amr_nb_decode_close(AVCodecContext * avctx) +{ + AMRContext *s = avctx->priv_data; Speech_Decode_Frame_exit(&s->speech_decoder_state); + return 0; } static int amr_nb_decode_frame(AVCodecContext * avctx, void *data, int *data_size, uint8_t * buf, int buf_size) { - AMRDecodeContext *s = avctx->priv_data; + AMRContext *s = avctx->priv_data; uint8_t*amrData=buf; int offset=0; @@ -75,29 +208,34 @@ static int amr_nb_decode_frame(AVCodecContext * avctx, Word16 serial[SERIAL_FRAMESIZE]; /* coded bits */ Word16 *synth; UWord8 *packed_bits; + *data_size=0; static Word16 packed_size[16] = {12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0}; int i; - //printf("amr_decode_frame data=0x%X data_size=%i buf=0x%X buf_size=%d frameCount=%d!!\n",data,&data_size,buf,buf_size,s->frameCount); + //printf("amr_decode_frame data_size=%i buf=0x%X buf_size=%d frameCount=%d!!\n",*data_size,buf,buf_size,s->frameCount); synth=data; - while(offset> 2) & 0x01; ft = (toc >> 3) & 0x0F; + //printf("offset=%d, packet_size=%d amrData= 0x%X %X %X %X\n",offset,packed_size[ft],amrData[offset],amrData[offset+1],amrData[offset+2],amrData[offset+3]); + + offset++; + packed_bits=amrData+offset; offset+=packed_size[ft]; - //Unsort and unpack bits + //Unsort and unpack bits s->rx_type = UnpackBits(q, ft, packed_bits, &s->mode, &serial[1]); - //We have a new frame + //We have a new frame s->frameCount++; if (s->rx_type == RX_NO_DATA) @@ -128,7 +266,7 @@ static int amr_nb_decode_frame(AVCodecContext * avctx, Speech_Decode_Frame(s->speech_decoder_state, s->mode, &serial[1], s->rx_type, synth); } - //Each AMR-frame results in 160 16-bit samples + //Each AMR-frame results in 160 16-bit samples *data_size+=160*2; synth+=160; @@ -146,18 +284,177 @@ static int amr_nb_decode_frame(AVCodecContext * avctx, s->reset_flag_old = s->reset_flag; } + return offset; +} + + +static int amr_nb_encode_frame(AVCodecContext *avctx, + unsigned char *frame/*out*/, int buf_size, void *data/*in*/) +{ + short serial_data[250] = {0}; + + AMRContext *s = avctx->priv_data; + int written; + + s->reset_flag = encoder_homing_frame_test(data); + + Speech_Encode_Frame(s->enstate, s->enc_bitrate, data, &serial_data[1], &s->mode); + + /* add frame type and mode */ + sid_sync (s->sidstate, s->mode, &s->tx_frametype); + + written = PackBits(s->mode, s->enc_bitrate, s->tx_frametype, &serial_data[1], frame); + + if (s->reset_flag != 0) + { + Speech_Encode_Frame_reset(s->enstate); + sid_sync_reset(s->sidstate); + } + return written; +} + + +#else /* Float point version*/ + +typedef struct AMRContext { + int frameCount; + void * decState; + int *enstate; + enum Mode enc_bitrate; +} AMRContext; + +static int amr_nb_decode_init(AVCodecContext * avctx) +{ + AMRContext *s = avctx->priv_data; + s->frameCount=0; + s->decState=Decoder_Interface_init(); + if(!s->decState) + { + printf("Decoder_Interface_init error\r\n"); + return -1; + } + return 0; +} + +static int amr_nb_encode_init(AVCodecContext * avctx) +{ + AMRContext *s = avctx->priv_data; + s->frameCount=0; + + if(avctx->sample_rate!=8000) + { +#ifdef DEBUG + printf("Only 8000Hz sample rate supported\n"); +#endif + return -1; + } + + if(avctx->channels!=1) + { +#ifdef DEBUG + printf("Only mono supported\n"); +#endif + return -1; + } + + avctx->frame_size=160; + avctx->coded_frame= avcodec_alloc_frame(); + + s->enstate=Encoder_Interface_init(0); + if(!s->enstate) + { + printf("Encoder_Interface_init error\n"); + return -1; + } + + s->enc_bitrate=getBitrateMode(avctx->bit_rate); + + return 0; +} + +static int amr_nb_decode_close(AVCodecContext * avctx) +{ + AMRContext *s = avctx->priv_data; + Decoder_Interface_exit(s->decState); + return 0; +} + +static int amr_nb_encode_close(AVCodecContext * avctx) +{ + AMRContext *s = avctx->priv_data; + Encoder_Interface_exit(s->enstate); + av_freep(&avctx->coded_frame); + return 0; +} + +static int amr_nb_decode_frame(AVCodecContext * avctx, + void *data, int *data_size, + uint8_t * buf, int buf_size) +{ + AMRContext *s = (AMRContext*)avctx->priv_data; + + uint8_t*amrData=buf; + int offset=0; + static short block_size[16]={ 12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0 }; + enum Mode dec_mode; + int packet_size; + *data_size=0; + + //printf("amr_decode_frame data_size=%i buf=0x%X buf_size=%d frameCount=%d!!\n",*data_size,buf,buf_size,s->frameCount); + + while(offset> 3) & 0x000F; + packet_size = block_size[dec_mode]; + + s->frameCount++; + //printf("offset=%d, packet_size=%d amrData= 0x%X %X %X %X\n",offset,packet_size,amrData[offset],amrData[offset+1],amrData[offset+2],amrData[offset+3]); + /* call decoder */ + Decoder_Interface_Decode(s->decState, &amrData[offset], data+*data_size, 0); + *data_size+=160*2; + + offset+=packet_size+1; + } return buf_size; } +static int amr_nb_encode_frame(AVCodecContext *avctx, + unsigned char *frame/*out*/, int buf_size, void *data/*in*/) +{ + AMRContext *s = (AMRContext*)avctx->priv_data; + int written; + + written = Encoder_Interface_Encode(s->enstate, + s->enc_bitrate, + data, + frame, + 0); + + return written; +} + +#endif + AVCodec amr_nb_decoder = { "amr_nb", CODEC_TYPE_AUDIO, CODEC_ID_AMR_NB, - sizeof(AMRDecodeContext), + sizeof(AMRContext), amr_nb_decode_init, NULL, - amr_decode_close, + amr_nb_decode_close, amr_nb_decode_frame, }; +AVCodec amr_nb_encoder = +{ + "amr_nb", + CODEC_TYPE_AUDIO, + CODEC_ID_AMR_NB, + sizeof(AMRContext), + amr_nb_encode_init, + amr_nb_encode_frame, + amr_nb_encode_close, + NULL, +}; diff --git a/mythtv/libs/libavcodec/armv4l/dsputil_arm.c b/mythtv/libs/libavcodec/armv4l/dsputil_arm.c index e3cc05f638a..74eb96961af 100644 --- a/mythtv/libs/libavcodec/armv4l/dsputil_arm.c +++ b/mythtv/libs/libavcodec/armv4l/dsputil_arm.c @@ -48,6 +48,7 @@ void dsputil_init_armv4l(DSPContext* c, AVCodecContext *avctx) if(idct_algo==FF_IDCT_AUTO || idct_algo==FF_IDCT_ARM){ c->idct_put= arm_idct_put; c->idct_add= arm_idct_add; + c->idct = j_rev_dct_ARM; c->idct_permutation_type= FF_LIBMPEG2_IDCT_PERM;/* FF_NO_IDCT_PERM */ } } diff --git a/mythtv/libs/libavcodec/asv1.c b/mythtv/libs/libavcodec/asv1.c index bc36f1b0032..0f751ae01d8 100644 --- a/mythtv/libs/libavcodec/asv1.c +++ b/mythtv/libs/libavcodec/asv1.c @@ -95,8 +95,6 @@ static inline int get_level(GetBitContext *gb){ else return code - 3; } -#ifdef CONFIG_ENCODERS - static inline void put_level(PutBitContext *pb, int level){ unsigned int index= level + 3; @@ -107,8 +105,6 @@ static inline void put_level(PutBitContext *pb, int level){ } } -#endif //CONFIG_ENCODERS - static inline int decode_block(ASV1Context *a, DCTELEM block[64]){ int i; @@ -125,17 +121,15 @@ static inline int decode_block(ASV1Context *a, DCTELEM block[64]){ } if(ccp&1) block[a->scantable.permutated[4*i+0]]= (get_level(&a->gb) * a->intra_matrix[4*i+0])>>4; - if(ccp&2) block[a->scantable.permutated[4*i+1]]= (get_level(&a->gb) * a->intra_matrix[4*i+1])>>4;; - if(ccp&4) block[a->scantable.permutated[4*i+2]]= (get_level(&a->gb) * a->intra_matrix[4*i+2])>>4;; - if(ccp&8) block[a->scantable.permutated[4*i+3]]= (get_level(&a->gb) * a->intra_matrix[4*i+3])>>4;; + if(ccp&2) block[a->scantable.permutated[4*i+1]]= (get_level(&a->gb) * a->intra_matrix[4*i+1])>>4; + if(ccp&4) block[a->scantable.permutated[4*i+2]]= (get_level(&a->gb) * a->intra_matrix[4*i+2])>>4; + if(ccp&8) block[a->scantable.permutated[4*i+3]]= (get_level(&a->gb) * a->intra_matrix[4*i+3])>>4; } } return 0; } -#ifdef CONFIG_ENCODERS - static inline void encode_block(ASV1Context *a, DCTELEM block[64]){ int i; int nc_count=0; @@ -169,8 +163,6 @@ static inline void encode_block(ASV1Context *a, DCTELEM block[64]){ put_bits(&a->pb, ccp_tab[16][1], ccp_tab[16][0]); } -#endif //CONFIG_ENCODERS - static inline int decode_mb(ASV1Context *a, DCTELEM block[6][64]){ int i; @@ -183,8 +175,6 @@ static inline int decode_mb(ASV1Context *a, DCTELEM block[6][64]){ return 0; } -#ifdef CONFIG_ENCODERS - static inline void encode_mb(ASV1Context *a, DCTELEM block[6][64]){ int i; @@ -192,8 +182,6 @@ static inline void encode_mb(ASV1Context *a, DCTELEM block[6][64]){ encode_block(a, block[i]); } } - -#endif //CONFIG_ENCODERS static inline void idct_put(ASV1Context *a, int mb_x, int mb_y){ DCTELEM (*block)[64]= a->block; @@ -214,8 +202,6 @@ static inline void idct_put(ASV1Context *a, int mb_x, int mb_y){ } } -#ifdef CONFIG_ENCODERS - static inline void dct_get(ASV1Context *a, int mb_x, int mb_y){ DCTELEM (*block)[64]= a->block; int linesize= a->picture.linesize[0]; @@ -240,8 +226,6 @@ static inline void dct_get(ASV1Context *a, int mb_x, int mb_y){ } } -#endif //CONFIG_ENCODERS - static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size) @@ -324,8 +308,6 @@ for(i=0; iavctx->extradata_size; i++){ return (get_bits_count(&a->gb)+31)/32*4; } -#ifdef CONFIG_ENCODERS - static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){ ASV1Context * const a = avctx->priv_data; AVFrame *pict = data; @@ -374,8 +356,6 @@ static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, return size*4; } -#endif //CONFIG_ENCODERS - static void common_init(AVCodecContext *avctx){ ASV1Context * const a = avctx->priv_data; @@ -416,8 +396,6 @@ static int decode_init(AVCodecContext *avctx){ return 0; } -#ifdef CONFIG_ENCODERS - static int encode_init(AVCodecContext *avctx){ ASV1Context * const a = avctx->priv_data; int i; @@ -441,8 +419,6 @@ static int encode_init(AVCodecContext *avctx){ return 0; } -#endif //CONFIG_ENCODERS - static int decode_end(AVCodecContext *avctx){ ASV1Context * const a = avctx->priv_data; diff --git a/mythtv/libs/libavcodec/avcodec.h b/mythtv/libs/libavcodec/avcodec.h index 49a2ebdeb42..6daf668c67f 100644 --- a/mythtv/libs/libavcodec/avcodec.h +++ b/mythtv/libs/libavcodec/avcodec.h @@ -15,8 +15,8 @@ extern "C" { #define LIBAVCODEC_VERSION_INT 0x000406 #define LIBAVCODEC_VERSION "0.4.6" -#define LIBAVCODEC_BUILD 4668 -#define LIBAVCODEC_BUILD_STR "4668" +#define LIBAVCODEC_BUILD 4669 +#define LIBAVCODEC_BUILD_STR "4669" #define LIBAVCODEC_IDENT "FFmpeg" LIBAVCODEC_VERSION "b" LIBAVCODEC_BUILD_STR @@ -31,6 +31,7 @@ enum CodecID { CODEC_ID_AC3, CODEC_ID_MJPEG, CODEC_ID_MJPEGB, + CODEC_ID_LJPEG, CODEC_ID_MPEG4, CODEC_ID_RAWVIDEO, CODEC_ID_MSMPEG4V1, @@ -56,6 +57,7 @@ enum CodecID { CODEC_ID_AAC, CODEC_ID_MPEG4AAC, CODEC_ID_ASV1, + CODEC_ID_FFV1, CODEC_ID_4XM, /* various pcm "codecs" */ @@ -76,6 +78,9 @@ enum CodecID { /* AMR */ CODEC_ID_AMR_NB, + /* RealAudio codecs*/ + CODEC_ID_RA_144, + CODEC_ID_RA_288, }; enum CodecType { @@ -88,24 +93,24 @@ enum CodecType { * Pixel format. */ enum PixelFormat { - PIX_FMT_YUV420P, - PIX_FMT_YUV422, - PIX_FMT_RGB24, ///< 3 bytes, R is first - PIX_FMT_BGR24, ///< 3 bytes, B is first - PIX_FMT_YUV422P, - PIX_FMT_YUV444P, - PIX_FMT_RGBA32, ///< always stored in cpu endianness - PIX_FMT_YUV410P, - PIX_FMT_YUV411P, + PIX_FMT_YUV420P, ///< Planar YUV 4:2:0 (1 Cr & Cb sample per 2x2 Y samples) + PIX_FMT_YUV422, + PIX_FMT_RGB24, ///< Packed pixel, 3 bytes per pixel, RGBRGB... + PIX_FMT_BGR24, ///< Packed pixel, 3 bytes per pixel, BGRBGR... + PIX_FMT_YUV422P, ///< Planar YUV 4:2:2 (1 Cr & Cb sample per 2x1 Y samples) + PIX_FMT_YUV444P, ///< Planar YUV 4:4:4 (1 Cr & Cb sample per 1x1 Y samples) + PIX_FMT_RGBA32, ///< Packed pixel, 4 bytes per pixel, BGRABGRA... + PIX_FMT_YUV410P, ///< Planar YUV 4:1:0 (1 Cr & Cb sample per 4x4 Y samples) + PIX_FMT_YUV411P, ///< Planar YUV 4:1:1 (1 Cr & Cb sample per 4x1 Y samples) PIX_FMT_RGB565, ///< always stored in cpu endianness PIX_FMT_RGB555, ///< always stored in cpu endianness, most significant bit to 1 PIX_FMT_GRAY8, PIX_FMT_MONOWHITE, ///< 0 is white PIX_FMT_MONOBLACK, ///< 0 is black PIX_FMT_PAL8, ///< 8 bit with RGBA palette - PIX_FMT_YUVJ420P, ///< YUV full scale (jpeg) - PIX_FMT_YUVJ422P, ///< YUV full scale (jpeg) - PIX_FMT_YUVJ444P, ///< YUV full scale (jpeg) + PIX_FMT_YUVJ420P, ///< Planar YUV 4:2:0 full scale (jpeg) + PIX_FMT_YUVJ422P, ///< Planar YUV 4:2:2 full scale (jpeg) + PIX_FMT_YUVJ444P, ///< Planar YUV 4:4:4 full scale (jpeg) PIX_FMT_NB, }; @@ -1123,6 +1128,22 @@ typedef struct AVCodecContext { * - decoding: unused */ int global_quality; + +#define FF_CODER_TYPE_VLC 0 +#define FF_CODER_TYPE_AC 1 + /** + * coder type + * - encoding: set by user. + * - decoding: unused + */ + int coder_type; + + /** + * context model + * - encoding: set by user. + * - decoding: unused + */ + int context_model; } AVCodecContext; @@ -1194,7 +1215,7 @@ typedef struct AVCodec { */ typedef struct AVPicture { uint8_t *data[4]; - int linesize[4]; + int linesize[4]; ///< number of bytes per line } AVPicture; extern AVCodec ac3_encoder; @@ -1206,6 +1227,7 @@ extern AVCodec h263_encoder; extern AVCodec h263p_encoder; extern AVCodec rv10_encoder; extern AVCodec mjpeg_encoder; +extern AVCodec ljpeg_encoder; extern AVCodec mpeg4_encoder; extern AVCodec msmpeg4v1_encoder; extern AVCodec msmpeg4v2_encoder; @@ -1215,6 +1237,7 @@ extern AVCodec wmv2_encoder; extern AVCodec huffyuv_encoder; extern AVCodec h264_encoder; extern AVCodec asv1_encoder; +extern AVCodec ffv1_encoder; extern AVCodec h263_decoder; extern AVCodec mpeg4_decoder; @@ -1245,9 +1268,14 @@ extern AVCodec h264_decoder; extern AVCodec indeo3_decoder; extern AVCodec vp3_decoder; extern AVCodec amr_nb_decoder; +extern AVCodec amr_nb_encoder; extern AVCodec aac_decoder; extern AVCodec mpeg4aac_decoder; extern AVCodec asv1_decoder; +extern AVCodec ffv1_decoder; +extern AVCodec fourxm_decoder; +extern AVCodec ra_144_decoder; +extern AVCodec ra_288_decoder; /* pcm codecs */ #define PCM_CODEC(id, name) \ @@ -1268,6 +1296,7 @@ PCM_CODEC(CODEC_ID_PCM_MULAW, pcm_mulaw); PCM_CODEC(CODEC_ID_ADPCM_IMA_QT, adpcm_ima_qt); PCM_CODEC(CODEC_ID_ADPCM_IMA_WAV, adpcm_ima_wav); PCM_CODEC(CODEC_ID_ADPCM_MS, adpcm_ms); +PCM_CODEC(CODEC_ID_ADPCM_4XM, adpcm_4xm); #undef PCM_CODEC diff --git a/mythtv/libs/libavcodec/cabac.c b/mythtv/libs/libavcodec/cabac.c index c4bd2740cb1..3e50dc82a0f 100644 --- a/mythtv/libs/libavcodec/cabac.c +++ b/mythtv/libs/libavcodec/cabac.c @@ -91,6 +91,7 @@ void ff_init_cabac_encoder(CABACContext *c, uint8_t *buf, int buf_size){ * @param buf_size size of buf in bits */ void ff_init_cabac_decoder(CABACContext *c, uint8_t *buf, int buf_size){ + c->bytestream_start= c->bytestream= buf; c->low= *c->bytestream++; @@ -158,7 +159,7 @@ STOP_TIMER("put_cabac_u") for(i=0; irange -= 2; if(!bit){ @@ -159,6 +164,8 @@ static inline void put_cabac_terminate(CABACContext *c, int bit){ #ifdef STRICT_LIMITS c->symCount++; #endif + + return (get_bit_count(&c->pb)+7)>>3; } /** @@ -199,12 +206,16 @@ static inline void put_cabac_u(CABACContext *c, uint8_t * state, int v, int max, /** * put unary exp golomb k-th order binarization. */ -static inline void put_cabac_ueg(CABACContext *c, uint8_t * state, int v, int sign, int max, int is_signed, int k, int max_index){ +static inline void put_cabac_ueg(CABACContext *c, uint8_t * state, int v, int max, int is_signed, int k, int max_index){ int i; if(v==0) put_cabac(c, state, 0); else{ + const int sign= v < 0; + + if(is_signed) v= ABS(v); + if(vrange -= 2<<8; if(c->low < c->range){ renorm_cabac_decoder(c); return 0; }else{ - return 1; + return c->bytestream - c->bytestream_start; } } diff --git a/mythtv/libs/libavcodec/dsputil.c b/mythtv/libs/libavcodec/dsputil.c index f286beb0110..df33e511287 100644 --- a/mythtv/libs/libavcodec/dsputil.c +++ b/mythtv/libs/libavcodec/dsputil.c @@ -1038,6 +1038,103 @@ static inline void put_tpel_pixels_mc22_c(uint8_t *dst, const uint8_t *src, int dst += stride; } } + +static inline void avg_tpel_pixels_mc00_c(uint8_t *dst, const uint8_t *src, int stride, int width, int height){ + switch(width){ + case 2: avg_pixels2_c (dst, src, stride, height); break; + case 4: avg_pixels4_c (dst, src, stride, height); break; + case 8: avg_pixels8_c (dst, src, stride, height); break; + case 16:avg_pixels16_c(dst, src, stride, height); break; + } +} + +static inline void avg_tpel_pixels_mc10_c(uint8_t *dst, const uint8_t *src, int stride, int width, int height){ + int i,j; + for (i=0; i < height; i++) { + for (j=0; j < width; j++) { + dst[j] = (dst[j] + ((683*(2*src[j] + src[j+1] + 1)) >> 11) + 1) >> 1; + } + src += stride; + dst += stride; + } +} + +static inline void avg_tpel_pixels_mc20_c(uint8_t *dst, const uint8_t *src, int stride, int width, int height){ + int i,j; + for (i=0; i < height; i++) { + for (j=0; j < width; j++) { + dst[j] = (dst[j] + ((683*(src[j] + 2*src[j+1] + 1)) >> 11) + 1) >> 1; + } + src += stride; + dst += stride; + } +} + +static inline void avg_tpel_pixels_mc01_c(uint8_t *dst, const uint8_t *src, int stride, int width, int height){ + int i,j; + for (i=0; i < height; i++) { + for (j=0; j < width; j++) { + dst[j] = (dst[j] + ((683*(2*src[j] + src[j+stride] + 1)) >> 11) + 1) >> 1; + } + src += stride; + dst += stride; + } +} + +static inline void avg_tpel_pixels_mc11_c(uint8_t *dst, const uint8_t *src, int stride, int width, int height){ + int i,j; + for (i=0; i < height; i++) { + for (j=0; j < width; j++) { + dst[j] = (dst[j] + ((2731*(4*src[j] + 3*src[j+1] + 3*src[j+stride] + 2*src[j+stride+1] + 6)) >> 15) + 1) >> 1; + } + src += stride; + dst += stride; + } +} + +static inline void avg_tpel_pixels_mc12_c(uint8_t *dst, const uint8_t *src, int stride, int width, int height){ + int i,j; + for (i=0; i < height; i++) { + for (j=0; j < width; j++) { + dst[j] = (dst[j] + ((2731*(3*src[j] + 4*src[j+1] + 2*src[j+stride] + 3*src[j+stride+1] + 6)) >> 15) + 1) >> 1; + } + src += stride; + dst += stride; + } +} + +static inline void avg_tpel_pixels_mc02_c(uint8_t *dst, const uint8_t *src, int stride, int width, int height){ + int i,j; + for (i=0; i < height; i++) { + for (j=0; j < width; j++) { + dst[j] = (dst[j] + ((683*(src[j] + 2*src[j+stride] + 1)) >> 11) + 1) >> 1; + } + src += stride; + dst += stride; + } +} + +static inline void avg_tpel_pixels_mc21_c(uint8_t *dst, const uint8_t *src, int stride, int width, int height){ + int i,j; + for (i=0; i < height; i++) { + for (j=0; j < width; j++) { + dst[j] = (dst[j] + ((2731*(3*src[j] + 2*src[j+1] + 4*src[j+stride] + 3*src[j+stride+1] + 6)) >> 15) + 1) >> 1; + } + src += stride; + dst += stride; + } +} + +static inline void avg_tpel_pixels_mc22_c(uint8_t *dst, const uint8_t *src, int stride, int width, int height){ + int i,j; + for (i=0; i < height; i++) { + for (j=0; j < width; j++) { + dst[j] = (dst[j] + ((2731*(2*src[j] + 3*src[j+1] + 3*src[j+stride] + 4*src[j+stride+1] + 6)) >> 15) + 1) >> 1; + } + src += stride; + dst += stride; + } +} #if 0 #define TPEL_WIDTH(width)\ static void put_tpel_pixels ## width ## _mc00_c(uint8_t *dst, const uint8_t *src, int stride, int height){\ @@ -2763,10 +2860,12 @@ void dsputil_init(DSPContext* c, AVCodecContext *avctx) if(avctx->idct_algo==FF_IDCT_INT){ c->idct_put= ff_jref_idct_put; c->idct_add= ff_jref_idct_add; + c->idct = j_rev_dct; c->idct_permutation_type= FF_LIBMPEG2_IDCT_PERM; }else{ //accurate/default c->idct_put= simple_idct_put; c->idct_add= simple_idct_add; + c->idct = simple_idct; c->idct_permutation_type= FF_NO_IDCT_PERM; } @@ -2809,6 +2908,8 @@ void dsputil_init(DSPContext* c, AVCodecContext *avctx) dspfunc(avg_no_rnd, 0, 16); dspfunc(avg, 1, 8); dspfunc(avg_no_rnd, 1, 8); + dspfunc(avg, 2, 4); + dspfunc(avg, 3, 2); #undef dspfunc c->put_tpel_pixels_tab[ 0] = put_tpel_pixels_mc00_c; @@ -2821,6 +2922,16 @@ void dsputil_init(DSPContext* c, AVCodecContext *avctx) c->put_tpel_pixels_tab[ 9] = put_tpel_pixels_mc12_c; c->put_tpel_pixels_tab[10] = put_tpel_pixels_mc22_c; + c->avg_tpel_pixels_tab[ 0] = avg_tpel_pixels_mc00_c; + c->avg_tpel_pixels_tab[ 1] = avg_tpel_pixels_mc10_c; + c->avg_tpel_pixels_tab[ 2] = avg_tpel_pixels_mc20_c; + c->avg_tpel_pixels_tab[ 4] = avg_tpel_pixels_mc01_c; + c->avg_tpel_pixels_tab[ 5] = avg_tpel_pixels_mc11_c; + c->avg_tpel_pixels_tab[ 6] = avg_tpel_pixels_mc21_c; + c->avg_tpel_pixels_tab[ 8] = avg_tpel_pixels_mc02_c; + c->avg_tpel_pixels_tab[ 9] = avg_tpel_pixels_mc12_c; + c->avg_tpel_pixels_tab[10] = avg_tpel_pixels_mc22_c; + #define dspfunc(PFX, IDX, NUM) \ c->PFX ## _pixels_tab[IDX][ 0] = PFX ## NUM ## _mc00_c; \ c->PFX ## _pixels_tab[IDX][ 1] = PFX ## NUM ## _mc10_c; \ diff --git a/mythtv/libs/libavcodec/dsputil.h b/mythtv/libs/libavcodec/dsputil.h index d04f05fa0da..0a2935bbff4 100644 --- a/mythtv/libs/libavcodec/dsputil.h +++ b/mythtv/libs/libavcodec/dsputil.h @@ -34,7 +34,6 @@ //#define DEBUG /* dct code */ typedef short DCTELEM; -//typedef int DCTELEM; void fdct_ifast (DCTELEM *data); void ff_jpeg_fdct_islow (DCTELEM *data); @@ -162,15 +161,15 @@ typedef struct DSPContext { /** * Halfpel motion compensation with rounding (a+b+1)>>1. - * this is an array[2][4] of motion compensation funcions for 2 - * horizontal blocksizes (8,16) and the 4 halfpel positions
+ * This is an array[4][4] of motion compensation functions for 4 + * horizontal blocksizes (2,4,8,16) and the 4 halfpel positions
* *pixels_tab[ 0->16xH 1->8xH ][ xhalfpel + 2*yhalfpel ] * @param block destination into which the result is averaged (a+b+1)>>1 * @param pixels source * @param line_size number of bytes in a horizontal line of block * @param h height */ - op_pixels_func avg_pixels_tab[2][4]; + op_pixels_func avg_pixels_tab[4][4]; /** * Halfpel motion compensation with no rounding (a+b)>>1. @@ -206,7 +205,8 @@ typedef struct DSPContext { * @param h height */ tpel_mc_func put_tpel_pixels_tab[11]; //FIXME individual func ptr per width? - + tpel_mc_func avg_tpel_pixels_tab[11]; //FIXME individual func ptr per width? + qpel_mc_func put_qpel_pixels_tab[2][16]; qpel_mc_func avg_qpel_pixels_tab[2][16]; qpel_mc_func put_no_rnd_qpel_pixels_tab[2][16]; @@ -239,6 +239,9 @@ typedef struct DSPContext { /* (I)DCT */ void (*fdct)(DCTELEM *block/* align 16*/); + /* IDCT really*/ + void (*idct)(DCTELEM *block/* align 16*/); + /** * block -> idct -> clip to unsigned 8 bit -> dest. * (-1392, 0, 0, ...) -> idct -> (-174, -174, ...) -> put -> (0, 0, ...) diff --git a/mythtv/libs/libavcodec/ffv1.c b/mythtv/libs/libavcodec/ffv1.c new file mode 100644 index 00000000000..b68afa6b483 --- /dev/null +++ b/mythtv/libs/libavcodec/ffv1.c @@ -0,0 +1,918 @@ +/* + * FFV1 codec for libavcodec + * + * Copyright (c) 2003 Michael Niedermayer + * + * This 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 of the License, or (at your option) any later version. + * + * This 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 this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +/** + * @file ffv1.c + * FF Video Codec 1 (a experimental lossless codec) + */ + +#include "common.h" +#include "avcodec.h" +#include "dsputil.h" +#include "cabac.h" +#include "golomb.h" + +#define MAX_PLANES 4 +#define CONTEXT_SIZE 32 + +static const int8_t quant3[256]={ + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, +}; +static const int8_t quant5[256]={ + 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, +-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, +-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, +-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, +-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, +-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, +-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, +-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1, +}; +static const int8_t quant7[256]={ + 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, +-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, +-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, +-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, +-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, +-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3, +-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2, +-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2, +-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1, +}; +static const int8_t quant9[256]={ + 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, +-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, +-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, +-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, +-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, +-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, +-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, +-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3, +-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1, +}; +static const int8_t quant11[256]={ + 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, +-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, +-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, +-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, +-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, +-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, +-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4, +-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4, +-4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1, +}; +static const int8_t quant13[256]={ + 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, +-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6, +-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6, +-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6, +-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6, +-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5, +-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, +-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5, +-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1, +}; + +static const uint8_t log2_run[32]={ + 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, + 4, 4, 5, 5, 6, 6, 7, 7, + 8, 9,10,11,12,13,14,15, +}; + +typedef struct VlcState{ + int16_t drift; + uint16_t error_sum; + int8_t bias; + uint8_t count; +} VlcState; + +typedef struct PlaneContext{ + int context_count; + uint8_t (*state)[CONTEXT_SIZE]; + VlcState *vlc_state; + uint8_t interlace_bit_state[2]; +} PlaneContext; + +typedef struct FFV1Context{ + AVCodecContext *avctx; + CABACContext c; + GetBitContext gb; + PutBitContext pb; + int version; + int width, height; + int chroma_h_shift, chroma_v_shift; + int flags; + int picture_number; + AVFrame picture; + int plane_count; + int ac; ///< 1-> CABAC 0-> golomb rice + PlaneContext plane[MAX_PLANES]; + int16_t quant_table[5][256]; + + DSPContext dsp; +}FFV1Context; + +static inline int predict(uint8_t *src, uint8_t *last){ + const int LT= last[-1]; + const int T= last[ 0]; + const int L = src[-1]; + uint8_t *cm = cropTbl + MAX_NEG_CROP; + const int gradient= cm[L + T - LT]; + + return mid_pred(L, gradient, T); +} + +static inline int get_context(FFV1Context *f, uint8_t *src, uint8_t *last, uint8_t *last2){ + const int LT= last[-1]; + const int T= last[ 0]; + const int RT= last[ 1]; + const int L = src[-1]; + + if(f->quant_table[3][127]){ + const int TT= last2[0]; + const int LL= src[-2]; + return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF] + +f->quant_table[3][(LL-L) & 0xFF] + f->quant_table[4][(TT-T) & 0xFF]; + }else + return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF]; +} + +/** + * put + */ +static inline void put_symbol(CABACContext *c, uint8_t *state, int v, int is_signed){ + int i; + + if(v){ + const int a= ABS(v); + const int e= av_log2(a); + + put_cabac(c, state+0, 0); + put_cabac_u(c, state+1, e, 7, 6, 1); //1..7 + if(e<7){ + for(i=e-1; i>=0; i--){ + static const int offset[7]= {15+0, 15+0, 15+1, 15+3, 15+6, 15+10, 15+11}; + put_cabac(c, state+offset[e]+i, (a>>i)&1); //15..31 + } + if(is_signed) + put_cabac(c, state+8 + e, v < 0); //8..14 + } + }else{ + put_cabac(c, state+0, 1); + } +} + +static inline int get_symbol(CABACContext *c, uint8_t *state, int is_signed){ + int i; + + if(get_cabac(c, state+0)) + return 0; + else{ + const int e= get_cabac_u(c, state+1, 7, 6, 1); //1..7 + + if(e<7){ + int a= 1<=0; i--){ + static const int offset[7]= {15+0, 15+0, 15+1, 15+3, 15+6, 15+10, 15+11}; + a += get_cabac(c, state+offset[e]+i)<drift; + int count= state->count; + state->error_sum += ABS(v); + drift += v; + + if(count == 128){ //FIXME variable + count >>= 1; + drift >>= 1; + state->error_sum >>= 1; + } + count++; + + if(drift <= -count){ + if(state->bias > -128) state->bias--; + + drift += count; + if(drift <= -count) + drift= -count + 1; + }else if(drift > 0){ + if(state->bias < 127) state->bias++; + + drift -= count; + if(drift > 0) + drift= 0; + } + + state->drift= drift; + state->count= count; +} + +static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int v){ + int i, k, code; +//printf("final: %d ", v); + v = (int8_t)(v - state->bias); + + i= state->count; + k=0; + while(i < state->error_sum){ //FIXME optimize + k++; + i += i; + } +#if 0 // JPEG LS + if(k==0 && 2*state->drift <= - state->count) code= v ^ (-1); + else code= v; +#else + code= v ^ ((2*state->drift + state->count)>>31); +#endif + + code = -2*code-1; + code^= (code>>31); +//printf("v:%d/%d bias:%d error:%d drift:%d count:%d k:%d\n", v, code, state->bias, state->error_sum, state->drift, state->count, k); + set_ur_golomb(pb, code, k, 8, 8); + + update_vlc_state(state, v); +} + +static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state){ + int k, i, v, ret; + + i= state->count; + k=0; + while(i < state->error_sum){ //FIXME optimize + k++; + i += i; + } + + v= get_ur_golomb(gb, k, 8, 8); +//printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k); + + v++; + if(v&1) v= (v>>1); + else v= -(v>>1); + +#if 0 // JPEG LS + if(k==0 && 2*state->drift <= - state->count) v ^= (-1); +#else + v ^= ((2*state->drift + state->count)>>31); +#endif + + ret= (int8_t)(v + state->bias); + + update_vlc_state(state, v); +//printf("final: %d\n", ret); + return ret; +} + + + +static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){ + PlaneContext * const p= &s->plane[plane_index]; + CABACContext * const c= &s->c; + int x,y; + uint8_t pred_diff_buffer[4][w+6]; //FIXME rema,e + uint8_t *pred_diff[4]= {pred_diff_buffer[0]+3, pred_diff_buffer[1]+3, pred_diff_buffer[2]+3, pred_diff_buffer[3]+3}; + int run_index=0; + + memset(pred_diff_buffer, 0, sizeof(pred_diff_buffer)); + + for(y=0; yac) + put_symbol(c, p->state[context], diff, 1); + else{ + if(context == 0) run_mode=1; + + if(run_mode){ + + if(diff){ + while(run_count >= 1<pb, 1, 1); + } + + put_bits(&s->pb, 1 + log2_run[run_index], run_count); + if(run_index) run_index--; + run_count=0; + run_mode=0; + if(diff>0) diff--; + }else{ + run_count++; + } + } + +// printf("count:%d index:%d, mode:%d, x:%d y:%d pos:%d\n", run_count, run_index, run_mode, x, y, (int)get_bit_count(&s->pb)); + + if(run_mode == 0) + put_vlc_symbol(&s->pb, &p->vlc_state[context], diff); + } + + pred_diff[3][x]= temp_src[0]; + } + if(run_mode){ + while(run_count >= 1<pb, 1, 1); + } + + if(run_count) + put_bits(&s->pb, 1, 1); + } + } +} + +static void write_quant_table(CABACContext *c, int16_t *quant_table){ + int last=0; + int i; + uint8_t state[CONTEXT_SIZE]={0}; + + for(i=1; i<128 ; i++){ + if(quant_table[i] != quant_table[i-1]){ + put_symbol(c, state, i-last-1, 0); + last= i; + } + } + put_symbol(c, state, i-last-1, 0); +} + +static void write_header(FFV1Context *f){ + uint8_t state[CONTEXT_SIZE]={0}; + int i; + CABACContext * const c= &f->c; + + put_symbol(c, state, f->version, 0); + put_symbol(c, state, f->avctx->coder_type, 0); + put_symbol(c, state, 0, 0); //YUV cs type + put_cabac(c, state, 1); //chroma planes + put_symbol(c, state, f->chroma_h_shift, 0); + put_symbol(c, state, f->chroma_v_shift, 0); + put_cabac(c, state, 0); //no transparency plane + + for(i=0; i<5; i++) + write_quant_table(c, f->quant_table[i]); +} + +static int common_init(AVCodecContext *avctx){ + FFV1Context *s = avctx->priv_data; + int width, height; + + s->avctx= avctx; + s->flags= avctx->flags; + + dsputil_init(&s->dsp, avctx); + + width= s->width= avctx->width; + height= s->height= avctx->height; + + assert(width && height); + + return 0; +} + +static int encode_init(AVCodecContext *avctx) +{ + FFV1Context *s = avctx->priv_data; + int i; + + common_init(avctx); + + s->version=0; + s->ac= avctx->coder_type; + + s->plane_count=3; + for(i=0; i<256; i++){ + s->quant_table[0][i]= quant11[i]; + s->quant_table[1][i]= 11*quant11[i]; + if(avctx->context_model==0){ + s->quant_table[2][i]= 11*11*quant11[i]; + s->quant_table[3][i]= + s->quant_table[4][i]=0; + }else{ + s->quant_table[2][i]= 11*11*quant5 [i]; + s->quant_table[3][i]= 5*11*11*quant5 [i]; + s->quant_table[4][i]= 5*5*11*11*quant5 [i]; + } + } + + for(i=0; iplane_count; i++){ + PlaneContext * const p= &s->plane[i]; + + if(avctx->context_model==0){ + p->context_count= (11*11*11+1)/2; + }else{ + p->context_count= (11*11*5*5*5+1)/2; + } + + if(s->ac){ + if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t)); + }else{ + if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState)); + } + } + + avctx->coded_frame= &s->picture; + switch(avctx->pix_fmt){ + case PIX_FMT_YUV444P: + case PIX_FMT_YUV422P: + case PIX_FMT_YUV420P: + case PIX_FMT_YUV411P: + case PIX_FMT_YUV410P: + avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift); + break; + default: + fprintf(stderr, "format not supported\n"); + return -1; + } + + + s->picture_number=0; + + return 0; +} + + +static void clear_state(FFV1Context *f){ + int i, j; + + for(i=0; iplane_count; i++){ + PlaneContext *p= &f->plane[i]; + + p->interlace_bit_state[0]= 0; + p->interlace_bit_state[1]= 0; + + for(j=0; jcontext_count; j++){ + if(f->ac){ + memset(p->state[j], 0, sizeof(uint8_t)*CONTEXT_SIZE); + p->state[j][7] = 2*62; + }else{ + p->vlc_state[j].drift= 0; + p->vlc_state[j].error_sum= 4; //FFMAX((RANGE + 32)/64, 2); + p->vlc_state[j].bias= 0; + p->vlc_state[j].count= 1; + } + } + } +} + +static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){ + FFV1Context *f = avctx->priv_data; + CABACContext * const c= &f->c; + AVFrame *pict = data; + const int width= f->width; + const int height= f->height; + AVFrame * const p= &f->picture; + int used_count= 0; + + if(avctx->strict_std_compliance >= 0){ + printf("this codec is under development, files encoded with it wont be decodeable with future versions!!!\n" + "use vstrict=-1 to use it anyway\n"); + return -1; + } + + ff_init_cabac_encoder(c, buf, buf_size); + ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64); + + *p = *pict; + p->pict_type= FF_I_TYPE; + + if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){ + put_cabac_bypass(c, 1); + p->key_frame= 1; + write_header(f); + clear_state(f); + }else{ + put_cabac_bypass(c, 0); + p->key_frame= 0; + } + + if(!f->ac){ + used_count += put_cabac_terminate(c, 1); +//printf("pos=%d\n", used_count); + init_put_bits(&f->pb, buf + used_count, buf_size - used_count, NULL, NULL); + } + + if(1){ + const int chroma_width = -((-width )>>f->chroma_h_shift); + const int chroma_height= -((-height)>>f->chroma_v_shift); + + encode_plane(f, p->data[0], width, height, p->linesize[0], 0); + + encode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1); + encode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 2); + } + emms_c(); + + f->picture_number++; + + if(f->ac){ + return put_cabac_terminate(c, 1); + }else{ + flush_put_bits(&f->pb); //nicer padding FIXME + return used_count + (get_bit_count(&f->pb)+7)/8; + } +} + +static void common_end(FFV1Context *s){ + int i; + + for(i=0; iplane_count; i++){ + PlaneContext *p= &s->plane[i]; + + av_freep(&p->state); + } +} + +static int encode_end(AVCodecContext *avctx) +{ + FFV1Context *s = avctx->priv_data; + + common_end(s); + + return 0; +} + +static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){ + PlaneContext * const p= &s->plane[plane_index]; + CABACContext * const c= &s->c; + int x,y; + uint8_t pred_diff_buffer[4][w+6]; + uint8_t *pred_diff[4]= {pred_diff_buffer[0]+3, pred_diff_buffer[1]+3, pred_diff_buffer[2]+3, pred_diff_buffer[3]+3}; + int run_index=0; + + memset(pred_diff_buffer, 0, sizeof(pred_diff_buffer)); + + for(y=0; yac) + diff= get_symbol(c, p->state[context], 1); + else{ + if(context == 0 && run_mode==0) run_mode=1; + + if(run_mode){ + if(run_count==0 && run_mode==1){ + if(get_bits1(&s->gb)){ + run_count = 1<gb, log2_run[run_index]); + else run_count=0; + if(run_index) run_index--; + run_mode=2; + } + } + run_count--; + if(run_count < 0){ + run_mode=0; + run_count=0; + diff= get_vlc_symbol(&s->gb, &p->vlc_state[context]); + if(diff>=0) diff++; + }else + diff=0; + }else + diff= get_vlc_symbol(&s->gb, &p->vlc_state[context]); + +// printf("count:%d index:%d, mode:%d, x:%d y:%d pos:%d\n", run_count, run_index, run_mode, x, y, get_bits_count(&s->gb)); + } + + if(sign) diff= (int8_t)(-diff); //FIXME remove cast + + pred_diff[3][x]= + temp_src[0] = predict(pred_diff[3] + x, pred_diff[2] + x) + diff; + + assert(diff>= -128 && diff <= 127); + } + } +} + +static int read_quant_table(CABACContext *c, int16_t *quant_table, int scale){ + int v; + int i=0; + uint8_t state[CONTEXT_SIZE]={0}; + + for(v=0; i<128 ; v++){ + int len= get_symbol(c, state, 0) + 1; + + if(len + i > 128) return -1; + + while(len--){ + quant_table[i] = scale*v; + i++; +//printf("%2d ",v); +//if(i%16==0) printf("\n"); + } + } + + for(i=1; i<128; i++){ + quant_table[256-i]= -quant_table[i]; + } + quant_table[128]= -quant_table[127]; + + return 2*v - 1; +} + +static int read_header(FFV1Context *f){ + uint8_t state[CONTEXT_SIZE]={0}; + int i, context_count; + CABACContext * const c= &f->c; + + f->version= get_symbol(c, state, 0); + f->ac= f->avctx->coder_type= get_symbol(c, state, 0); + get_symbol(c, state, 0); //YUV cs type + get_cabac(c, state); //no chroma = false + f->chroma_h_shift= get_symbol(c, state, 0); + f->chroma_v_shift= get_symbol(c, state, 0); + get_cabac(c, state); //transparency plane + f->plane_count= 3; + + context_count=1; + for(i=0; i<5; i++){ + context_count*= read_quant_table(c, f->quant_table[i], context_count); + } + context_count= (context_count+1)/2; + + for(i=0; iplane_count; i++){ + PlaneContext * const p= &f->plane[i]; + + p->context_count= context_count; + + if(f->ac){ + if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t)); + }else{ + if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState)); + } + } + + return 0; +} + +static int decode_init(AVCodecContext *avctx) +{ +// FFV1Context *s = avctx->priv_data; + + common_init(avctx); + +#if 0 + switch(s->bitstream_bpp){ + case 12: + avctx->pix_fmt = PIX_FMT_YUV420P; + break; + case 16: + avctx->pix_fmt = PIX_FMT_YUV422P; + break; + case 24: + case 32: + if(s->bgr32){ + avctx->pix_fmt = PIX_FMT_RGBA32; + }else{ + avctx->pix_fmt = PIX_FMT_BGR24; + } + break; + default: + assert(0); + } +#endif + + return 0; +} + +static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size){ + FFV1Context *f = avctx->priv_data; + CABACContext * const c= &f->c; + const int width= f->width; + const int height= f->height; + AVFrame * const p= &f->picture; + int bytes_read; + + AVFrame *picture = data; + + *data_size = 0; + + /* no supplementary picture */ + if (buf_size == 0) + return 0; + + ff_init_cabac_decoder(c, buf, buf_size); + ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64); + + p->reference= 0; + if(avctx->get_buffer(avctx, p) < 0){ + fprintf(stderr, "get_buffer() failed\n"); + return -1; + } + + p->pict_type= FF_I_TYPE; //FIXME I vs. P + if(get_cabac_bypass(c)){ + p->key_frame= 1; + read_header(f); + clear_state(f); + }else{ + p->key_frame= 0; + } + if(avctx->debug&FF_DEBUG_PICT_INFO) + printf("keyframe:%d\n", p->key_frame); + + if(!f->ac){ + bytes_read = get_cabac_terminate(c); + if(bytes_read ==0) printf("error at end of AC stream\n"); +//printf("pos=%d\n", bytes_read); + init_get_bits(&f->gb, buf + bytes_read, buf_size - bytes_read); + } + + if(1){ + const int chroma_width = -((-width )>>f->chroma_h_shift); + const int chroma_height= -((-height)>>f->chroma_v_shift); + decode_plane(f, p->data[0], width, height, p->linesize[0], 0); + + decode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1); + decode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 2); + } + + emms_c(); + + f->picture_number++; + + *picture= *p; + + avctx->release_buffer(avctx, p); //FIXME + + *data_size = sizeof(AVFrame); + + if(f->ac){ + bytes_read= get_cabac_terminate(c); + if(bytes_read ==0) printf("error at end of frame\n"); + }else{ + bytes_read+= (get_bits_count(&f->gb)+7)/8; + } + + return bytes_read; +} + +static int decode_end(AVCodecContext *avctx) +{ + FFV1Context *s = avctx->priv_data; + int i; + + if(avctx->get_buffer == avcodec_default_get_buffer){ + for(i=0; i<4; i++){ + av_freep(&s->picture.base[i]); + s->picture.data[i]= NULL; + } + av_freep(&s->picture.opaque); + } + + return 0; +} + +AVCodec ffv1_decoder = { + "ffv1", + CODEC_TYPE_VIDEO, + CODEC_ID_FFV1, + sizeof(FFV1Context), + decode_init, + NULL, + decode_end, + decode_frame, + CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/, + NULL +}; + +#ifdef CONFIG_ENCODERS +AVCodec ffv1_encoder = { + "ffv1", + CODEC_TYPE_VIDEO, + CODEC_ID_FFV1, + sizeof(FFV1Context), + encode_init, + encode_frame, + encode_end, +}; +#endif diff --git a/mythtv/libs/libavcodec/golomb.h b/mythtv/libs/libavcodec/golomb.h index f1e6d6d9876..9861b18d1a1 100644 --- a/mythtv/libs/libavcodec/golomb.h +++ b/mythtv/libs/libavcodec/golomb.h @@ -178,6 +178,37 @@ static inline int svq3_get_se_golomb(GetBitContext *gb){ } } +/** + * read unsigned golomb rice code. + */ +static inline int get_ur_golomb(GetBitContext *gb, int k, int limit, int esc_len){ + unsigned int buf; + int log; + + OPEN_READER(re, gb); + UPDATE_CACHE(re, gb); + buf=GET_CACHE(re, gb); + + log= av_log2(buf); +//printf("buf:%X log:%d\n", buf, log); + if(log > 31-limit){ + buf >>= log - k; + buf += (30-log)<>= log - esc_len; + buf -= 1<=0); + + e= i>>k; + if(e s->width + extra_width || full_my + 16/*FIXME*/ > s->height + extra_height){ - ff_emulated_edge_mc(s, src_y - 2 - 2*s->linesize, s->linesize, 16+5, 16+5/*FIXME*/, full_mx-2, full_my-2, s->width, s->height); + ff_emulated_edge_mc(s->edge_emu_buffer, src_y - 2 - 2*s->linesize, s->linesize, 16+5, 16+5/*FIXME*/, full_mx-2, full_my-2, s->width, s->height); src_y= s->edge_emu_buffer + 2 + 2*s->linesize; emu=1; } @@ -1908,13 +1911,13 @@ static inline void mc_dir_part(H264Context *h, Picture *pic, int n, int square, if(s->flags&CODEC_FLAG_GRAY) return; if(emu){ - ff_emulated_edge_mc(s, src_cb, s->uvlinesize, 9, 9/*FIXME*/, (mx>>3), (my>>3), s->width>>1, s->height>>1); + ff_emulated_edge_mc(s->edge_emu_buffer, src_cb, s->uvlinesize, 9, 9/*FIXME*/, (mx>>3), (my>>3), s->width>>1, s->height>>1); src_cb= s->edge_emu_buffer; } chroma_op(dest_cb, src_cb, s->uvlinesize, chroma_height, mx&7, my&7); if(emu){ - ff_emulated_edge_mc(s, src_cr, s->uvlinesize, 9, 9/*FIXME*/, (mx>>3), (my>>3), s->width>>1, s->height>>1); + ff_emulated_edge_mc(s->edge_emu_buffer, src_cr, s->uvlinesize, 9, 9/*FIXME*/, (mx>>3), (my>>3), s->width>>1, s->height>>1); src_cr= s->edge_emu_buffer; } chroma_op(dest_cr, src_cr, s->uvlinesize, chroma_height, mx&7, my&7); @@ -4006,8 +4009,8 @@ static int decode_nal_units(H264Context *h, uint8_t *buf, int buf_size){ MpegEncContext * const s = &h->s; AVCodecContext * const avctx= s->avctx; int buf_index=0; - int i; #if 0 + int i; for(i=0; i<32; i++){ printf("%X ", buf[i]); } diff --git a/mythtv/libs/libavcodec/huffyuv.c b/mythtv/libs/libavcodec/huffyuv.c index 26058b19ee2..e9233c28e22 100644 --- a/mythtv/libs/libavcodec/huffyuv.c +++ b/mythtv/libs/libavcodec/huffyuv.c @@ -153,7 +153,6 @@ static inline void add_median_prediction(uint8_t *dst, uint8_t *src1, uint8_t *d *left_top= lt; } -#ifdef CONFIG_ENCODERS //FIXME optimize static inline void sub_median_prediction(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w, int *left, int *left_top){ int i; @@ -173,8 +172,6 @@ static inline void sub_median_prediction(uint8_t *dst, uint8_t *src1, uint8_t *s *left_top= lt; } -#endif //CONFIG_ENCODERS - static inline void add_left_prediction_bgr32(uint8_t *dst, uint8_t *src, int w, int *red, int *green, int *blue){ int i; int r,g,b; @@ -197,7 +194,6 @@ static inline void add_left_prediction_bgr32(uint8_t *dst, uint8_t *src, int w, *blue= b; } -#ifdef CONFIG_ENCODERS static inline int sub_left_prediction(HYuvContext *s, uint8_t *dst, uint8_t *src, int w, int left){ int i; if(w<32){ @@ -217,7 +213,7 @@ static inline int sub_left_prediction(HYuvContext *s, uint8_t *dst, uint8_t *src return src[w-1]; } } -#endif //CONFIG_ENCODERS + static void read_len_table(uint8_t *dst, GetBitContext *gb){ int i, val, repeat; @@ -250,8 +246,6 @@ static int generate_bits_table(uint32_t *dst, uint8_t *len_table){ return 0; } -#ifdef CONFIG_ENCODERS - static void generate_len_table(uint8_t *dst, uint64_t *stats, int size){ uint64_t counts[2*size]; int up[2*size]; @@ -308,8 +302,6 @@ static void generate_len_table(uint8_t *dst, uint64_t *stats, int size){ } } -#endif //CONFIG_ENCODERS - static int read_huffman_tables(HYuvContext *s, uint8_t *src, int length){ GetBitContext gb; int i; @@ -460,8 +452,6 @@ s->bgr32=1; return 0; } -#ifdef CONFIG_ENCODERS - static void store_table(HYuvContext *s, uint8_t *len){ int i; int index= s->avctx->extradata_size; @@ -583,8 +573,6 @@ static int encode_init(AVCodecContext *avctx) return 0; } -#endif //CONFIG_ENCODERS - static void decode_422_bitstream(HYuvContext *s, int count){ int i; @@ -609,8 +597,6 @@ static void decode_gray_bitstream(HYuvContext *s, int count){ } } -#ifdef CONFIG_ENCODERS - static void encode_422_bitstream(HYuvContext *s, int count){ int i; @@ -649,8 +635,6 @@ static void encode_gray_bitstream(HYuvContext *s, int count){ } } -#endif //CONFIG_ENCODERS - static void decode_bgr_bitstream(HYuvContext *s, int count){ int i; @@ -961,8 +945,6 @@ static int decode_end(AVCodecContext *avctx) return 0; } -#ifdef CONFIG_ENCODERS - static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){ HYuvContext *s = avctx->priv_data; AVFrame *pict = data; @@ -1124,8 +1106,6 @@ static int encode_end(AVCodecContext *avctx) return 0; } -#endif //CONFIG_ENCODERS - static const AVOption huffyuv_options[] = { AVOPTION_CODEC_INT("prediction_method", "prediction_method", prediction_method, 0, 2, 0), diff --git a/mythtv/libs/libavcodec/i386/dsputil_mmx.c b/mythtv/libs/libavcodec/i386/dsputil_mmx.c index d58ebcc4ef3..adf27d4a111 100644 --- a/mythtv/libs/libavcodec/i386/dsputil_mmx.c +++ b/mythtv/libs/libavcodec/i386/dsputil_mmx.c @@ -1567,14 +1567,17 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx) if(idct_algo==FF_IDCT_AUTO || idct_algo==FF_IDCT_SIMPLEMMX){ c->idct_put= ff_simple_idct_put_mmx; c->idct_add= ff_simple_idct_add_mmx; + c->idct = ff_simple_idct_mmx; c->idct_permutation_type= FF_SIMPLE_IDCT_PERM; }else if(idct_algo==FF_IDCT_LIBMPEG2MMX){ if(mm_flags & MM_MMXEXT){ c->idct_put= ff_libmpeg2mmx2_idct_put; c->idct_add= ff_libmpeg2mmx2_idct_add; + c->idct = ff_mmxext_idct; }else{ c->idct_put= ff_libmpeg2mmx_idct_put; c->idct_add= ff_libmpeg2mmx_idct_add; + c->idct = ff_mmx_idct; } c->idct_permutation_type= FF_LIBMPEG2_IDCT_PERM; } diff --git a/mythtv/libs/libavcodec/libavcodec.pro b/mythtv/libs/libavcodec/libavcodec.pro index 8d8e9ba3157..6ac321b16c8 100644 --- a/mythtv/libs/libavcodec/libavcodec.pro +++ b/mythtv/libs/libavcodec/libavcodec.pro @@ -25,7 +25,8 @@ SOURCES += motion_est.c imgconvert.c imgresample.c msmpeg4.c mpeg12.c SOURCES += h263dec.c svq1.c rv10.c mpegaudiodec.c pcm.c simple_idct.c SOURCES += ratecontrol.c adpcm.c eval.c jfdctint.c dv.c error_resilience.c SOURCES += wmadec.c fft.c mdct.c mace.c huffyuv.c opts.c cyuv.c -SOURCES += golomb.c h264.c raw.c indeo3.c asv1.c vp3.c +SOURCES += golomb.c h264.c raw.c indeo3.c asv1.c vp3.c 4xm.c cabac.c +SOURCES += ffv1.c ra144.c ra288.c contains( CONFIG_AC3, yes ) { SOURCES += a52dec.c diff --git a/mythtv/libs/libavcodec/mjpeg.c b/mythtv/libs/libavcodec/mjpeg.c index 83be2c875c0..f3f83a94d74 100644 --- a/mythtv/libs/libavcodec/mjpeg.c +++ b/mythtv/libs/libavcodec/mjpeg.c @@ -27,6 +27,8 @@ */ //#define DEBUG +#include + #include "avcodec.h" #include "dsputil.h" #include "mpegvideo.h" @@ -36,7 +38,7 @@ #undef TWOMATRIXES typedef struct MJpegContext { - uint8_t huff_size_dc_luminance[12]; + uint8_t huff_size_dc_luminance[12]; //FIXME use array [3] instead of lumi / chrom, for easier addressing uint16_t huff_code_dc_luminance[12]; uint8_t huff_size_dc_chrominance[12]; uint16_t huff_code_dc_chrominance[12]; @@ -279,6 +281,18 @@ void mjpeg_close(MpegEncContext *s) av_free(s->mjpeg_ctx); } +#define PREDICT(ret, topleft, top, left, predictor)\ + switch(predictor){\ + case 1: ret= left; break;\ + case 2: ret= top; break;\ + case 3: ret= topleft; break;\ + case 4: ret= left + top - topleft; break;\ + case 5: ret= left + ((top - topleft)>>1); break;\ + case 6: ret= top + ((left - topleft)>>1); break;\ + case 7: ret= (left + top)>>1; break;\ + } + +#ifdef CONFIG_ENCODERS static inline void put_marker(PutBitContext *p, int code) { put_bits(p, 8, 0xff); @@ -356,7 +370,7 @@ static void jpeg_put_comments(MpegEncContext *s) int size; uint8_t *ptr; - if (s->aspect_ratio_info) + if (s->aspect_ratio_info /* && !lossless */) { /* JFIF header */ put_marker(p, APP0); @@ -405,6 +419,8 @@ static void jpeg_put_comments(MpegEncContext *s) void mjpeg_picture_header(MpegEncContext *s) { + const int lossless= s->avctx->codec_id == CODEC_ID_LJPEG; + put_marker(&s->pb, SOI); if (!s->mjpeg_data_only_frames) @@ -413,10 +429,13 @@ void mjpeg_picture_header(MpegEncContext *s) if (s->mjpeg_write_tables) jpeg_table_header(s); - put_marker(&s->pb, SOF0); + put_marker(&s->pb, lossless ? SOF3 : SOF0); put_bits(&s->pb, 16, 17); - put_bits(&s->pb, 8, 8); /* 8 bits/component */ + if(lossless && s->avctx->pix_fmt == PIX_FMT_RGBA32) + put_bits(&s->pb, 8, 9); /* 9 bits/component RCT */ + else + put_bits(&s->pb, 8, 8); /* 8 bits/component */ put_bits(&s->pb, 16, s->height); put_bits(&s->pb, 16, s->width); put_bits(&s->pb, 8, 3); /* 3 components */ @@ -432,7 +451,7 @@ void mjpeg_picture_header(MpegEncContext *s) put_bits(&s->pb, 4, s->mjpeg_hsample[1]); /* H factor */ put_bits(&s->pb, 4, s->mjpeg_vsample[1]); /* V factor */ #ifdef TWOMATRIXES - put_bits(&s->pb, 8, 1); /* select matrix */ + put_bits(&s->pb, 8, lossless ? 0 : 1); /* select matrix */ #else put_bits(&s->pb, 8, 0); /* select matrix */ #endif @@ -442,7 +461,7 @@ void mjpeg_picture_header(MpegEncContext *s) put_bits(&s->pb, 4, s->mjpeg_hsample[2]); /* H factor */ put_bits(&s->pb, 4, s->mjpeg_vsample[2]); /* V factor */ #ifdef TWOMATRIXES - put_bits(&s->pb, 8, 1); /* select matrix */ + put_bits(&s->pb, 8, lossless ? 0 : 1); /* select matrix */ #else put_bits(&s->pb, 8, 0); /* select matrix */ #endif @@ -461,15 +480,15 @@ void mjpeg_picture_header(MpegEncContext *s) /* Cb component */ put_bits(&s->pb, 8, 2); /* index */ put_bits(&s->pb, 4, 1); /* DC huffman table index */ - put_bits(&s->pb, 4, 1); /* AC huffman table index */ + put_bits(&s->pb, 4, lossless ? 0 : 1); /* AC huffman table index */ /* Cr component */ put_bits(&s->pb, 8, 3); /* index */ put_bits(&s->pb, 4, 1); /* DC huffman table index */ - put_bits(&s->pb, 4, 1); /* AC huffman table index */ + put_bits(&s->pb, 4, lossless ? 0 : 1); /* AC huffman table index */ - put_bits(&s->pb, 8, 0); /* Ss (not used) */ - put_bits(&s->pb, 8, 63); /* Se (not used) */ + put_bits(&s->pb, 8, lossless ? s->avctx->prediction_method+1 : 0); /* Ss (not used) */ + put_bits(&s->pb, 8, lossless ? 0 : 63); /* Se (not used) */ put_bits(&s->pb, 8, 0); /* Ah/Al (not used) */ } @@ -557,7 +576,7 @@ static inline void mjpeg_encode_dc(MpegEncContext *s, int val, mant--; } - nbits= av_log2(val) + 1; + nbits= av_log2_16bit(val) + 1; put_bits(&s->pb, huff_size[nbits], huff_code[nbits]); @@ -632,6 +651,147 @@ void mjpeg_encode_mb(MpegEncContext *s, } } +static int encode_picture_lossless(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){ + MpegEncContext * const s = avctx->priv_data; + MJpegContext * const m = s->mjpeg_ctx; + AVFrame *pict = data; + const int width= s->width; + const int height= s->height; + AVFrame * const p= (AVFrame*)&s->current_picture; + const int predictor= avctx->prediction_method+1; + + init_put_bits(&s->pb, buf, buf_size, NULL, NULL); + + *p = *pict; + p->pict_type= FF_I_TYPE; + p->key_frame= 1; + + mjpeg_picture_header(s); + + s->header_bits= get_bit_count(&s->pb); + + if(avctx->pix_fmt == PIX_FMT_RGBA32){ + int x, y, i; + const int linesize= p->linesize[0]; + uint16_t buffer[2048][4]; + int left[3], top[3], topleft[3]; + + for(i=0; i<3; i++){ + buffer[0][i]= 1 << (9 - 1); + } + + for(y = 0; y < height; y++) { + const int modified_predictor= y ? 1 : predictor; + uint8_t *ptr = p->data[0] + (linesize * y); + + for(i=0; i<3; i++){ + top[i]= left[i]= topleft[i]= buffer[0][i]; + } + for(x = 0; x < width; x++) { + buffer[x][1] = ptr[4*x+0] - ptr[4*x+1] + 0x100; + buffer[x][2] = ptr[4*x+2] - ptr[4*x+1] + 0x100; + buffer[x][0] = (ptr[4*x+0] + 2*ptr[4*x+1] + ptr[4*x+2])>>2; + + for(i=0;i<3;i++) { + int pred, diff; + + PREDICT(pred, topleft[i], top[i], left[i], modified_predictor); + + topleft[i]= top[i]; + top[i]= buffer[x+1][i]; + + left[i]= buffer[x][i]; + + diff= ((left[i] - pred + 0x100)&0x1FF) - 0x100; + + if(i==0) + mjpeg_encode_dc(s, diff, m->huff_size_dc_luminance, m->huff_code_dc_luminance); //FIXME ugly + else + mjpeg_encode_dc(s, diff, m->huff_size_dc_chrominance, m->huff_code_dc_chrominance); + } + } + } + }else{ + int mb_x, mb_y, i; + const int mb_width = (width + s->mjpeg_hsample[0] - 1) / s->mjpeg_hsample[0]; + const int mb_height = (height + s->mjpeg_vsample[0] - 1) / s->mjpeg_vsample[0]; + + for(mb_y = 0; mb_y < mb_height; mb_y++) { + for(mb_x = 0; mb_x < mb_width; mb_x++) { + if(mb_x==0 || mb_y==0){ + for(i=0;i<3;i++) { + uint8_t *ptr; + int x, y, h, v, linesize; + h = s->mjpeg_hsample[i]; + v = s->mjpeg_vsample[i]; + linesize= p->linesize[i]; + + for(y=0; ydata[i] + (linesize * (v * mb_y + y)) + (h * mb_x + x); //FIXME optimize this crap + if(y==0 && mb_y==0){ + if(x==0 && mb_x==0){ + pred= 128; + }else{ + pred= ptr[-1]; + } + }else{ + if(x==0 && mb_x==0){ + pred= ptr[-linesize]; + }else{ + PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor); + } + } + + if(i==0) + mjpeg_encode_dc(s, (int8_t)(*ptr - pred), m->huff_size_dc_luminance, m->huff_code_dc_luminance); //FIXME ugly + else + mjpeg_encode_dc(s, (int8_t)(*ptr - pred), m->huff_size_dc_chrominance, m->huff_code_dc_chrominance); + } + } + } + }else{ + for(i=0;i<3;i++) { + uint8_t *ptr; + int x, y, h, v, linesize; + h = s->mjpeg_hsample[i]; + v = s->mjpeg_vsample[i]; + linesize= p->linesize[i]; + + for(y=0; ydata[i] + (linesize * (v * mb_y + y)) + (h * mb_x + x); //FIXME optimize this crap +//printf("%d %d %d %d %8X\n", mb_x, mb_y, x, y, ptr); + PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor); + + if(i==0) + mjpeg_encode_dc(s, (int8_t)(*ptr - pred), m->huff_size_dc_luminance, m->huff_code_dc_luminance); //FIXME ugly + else + mjpeg_encode_dc(s, (int8_t)(*ptr - pred), m->huff_size_dc_chrominance, m->huff_code_dc_chrominance); + } + } + } + } + } + } + } + + emms_c(); + + mjpeg_picture_trailer(s); + s->picture_number++; + + flush_put_bits(&s->pb); + return pbBufPtr(&s->pb) - s->pb.buf; +// return (get_bit_count(&f->pb)+7)/8; +} + +#endif //CONFIG_ENCODERS + /******************************************/ /* decoding */ @@ -653,6 +813,11 @@ typedef struct MJpegDecodeContext { int first_picture; /* true if decoding first picture */ int interlaced; /* true if interlaced */ int bottom_field; /* true if bottom field */ + int lossless; + int rgb; + int rct; /* standard rct */ + int pegasus_rct; /* pegasus reversible colorspace transform */ + int bits; /* bits per component */ int width, height; int nb_components; @@ -810,15 +975,21 @@ static int mjpeg_decode_dht(MJpegDecodeContext *s) return 0; } -static int mjpeg_decode_sof0(MJpegDecodeContext *s) +static int mjpeg_decode_sof(MJpegDecodeContext *s) { int len, nb_components, i, width, height; /* XXX: verify len field validity */ len = get_bits(&s->gb, 16); - /* only 8 bits/component accepted */ - if (get_bits(&s->gb, 8) != 8) + s->bits= get_bits(&s->gb, 8); + + if(s->pegasus_rct) s->bits=9; + if(s->bits==9 && !s->pegasus_rct) s->rct=1; //FIXME ugly + + if (s->bits != 8 && !s->lossless){ + printf("only 8 bits/component accepted\n"); return -1; + } height = get_bits(&s->gb, 16); width = get_bits(&s->gb, 16); dprintf("sof0: picture: %dx%d\n", width, height); @@ -846,6 +1017,8 @@ static int mjpeg_decode_sof0(MJpegDecodeContext *s) dprintf("component %d %d:%d id: %d quant:%d\n", i, s->h_count[i], s->v_count[i], s->component_id[i], s->quant_index[i]); } + + if(s->v_max==1 && s->h_max==1 && s->lossless==1) s->rgb=1; /* if different size, realloc/alloc picture */ /* XXX: also check h_count and v_count */ @@ -863,7 +1036,17 @@ static int mjpeg_decode_sof0(MJpegDecodeContext *s) s->bottom_field = 0; } - for(i=0;irgb){ + int w, h; + w = s->width; + h = s->height; + if (s->interlaced) + w *= 2; + s->linesize[0] = 4*w; + s->current_picture[0] = av_mallocz(4*w * h); + s->current_picture[1] = s->current_picture[2] = NULL; + }else{ + for(i=0;iwidth + 8 * s->h_max - 1) / (8 * s->h_max); h = (s->height + 8 * s->v_max - 1) / (8 * s->v_max); @@ -878,6 +1061,7 @@ static int mjpeg_decode_sof0(MJpegDecodeContext *s) dprintf("error: no picture buffers allocated\n"); return -1; } + } } s->first_picture = 0; } @@ -959,7 +1143,7 @@ static int decode_block(MJpegDecodeContext *s, DCTELEM *block, static int mjpeg_decode_sos(MJpegDecodeContext *s) { - int len, nb_components, i, j, n, h, v, ret; + int len, nb_components, i, j, n, h, v, ret, point_transform, predictor; int mb_width, mb_height, mb_x, mb_y, vmax, hmax, index, id; int comp_index[4]; int dc_index[4]; @@ -967,7 +1151,8 @@ static int mjpeg_decode_sos(MJpegDecodeContext *s) int nb_blocks[4]; int h_count[4]; int v_count[4]; - + const int block_size= s->lossless ? 1 : 8; + /* XXX: verify len field validity */ len = get_bits(&s->gb, 16); nb_components = get_bits(&s->gb, 8); @@ -998,6 +1183,7 @@ static int mjpeg_decode_sos(MJpegDecodeContext *s) } comp_index[i] = index; + nb_blocks[i] = s->h_count[index] * s->v_count[index]; h_count[i] = s->h_count[index]; v_count[i] = s->v_count[index]; @@ -1025,29 +1211,178 @@ static int mjpeg_decode_sos(MJpegDecodeContext *s) break; } } - skip_bits(&s->gb, 8); /* Ss */ + + predictor= get_bits(&s->gb, 8); /* lossless predictor or start of spectral (Ss) */ skip_bits(&s->gb, 8); /* Se */ - skip_bits(&s->gb, 8); /* Ah and Al (each are 4 bits) */ + skip_bits(&s->gb, 4); /* Ah */ + point_transform= get_bits(&s->gb, 4); /* Al */ for(i=0;ilast_dc[i] = 1024; if (nb_components > 1) { /* interleaved stream */ - mb_width = (s->width + s->h_max * 8 - 1) / (s->h_max * 8); - mb_height = (s->height + s->v_max * 8 - 1) / (s->v_max * 8); + mb_width = (s->width + s->h_max * block_size - 1) / (s->h_max * block_size); + mb_height = (s->height + s->v_max * block_size - 1) / (s->v_max * block_size); } else { h = s->h_max / s->h_count[comp_index[0]]; v = s->v_max / s->v_count[comp_index[0]]; - mb_width = (s->width + h * 8 - 1) / (h * 8); - mb_height = (s->height + v * 8 - 1) / (v * 8); + mb_width = (s->width + h * block_size - 1) / (h * block_size); + mb_height = (s->height + v * block_size - 1) / (v * block_size); nb_blocks[0] = 1; h_count[0] = 1; v_count[0] = 1; } + + if(s->avctx->debug & FF_DEBUG_PICT_INFO) + printf("%s %s p:%d >>:%d\n", s->lossless ? "lossless" : "sequencial DCT", s->rgb ? "RGB" : "", predictor, point_transform); - for(mb_y = 0; mb_y < mb_height; mb_y++) { + if(s->lossless){ + if(s->rgb){ + uint16_t buffer[2048][4]; + int left[3], top[3], topleft[3]; + const int linesize= s->linesize[0]; + const int mask= (1<bits)-1; + + for(i=0; i<3; i++){ + buffer[0][i]= 1 << (s->bits + point_transform - 1); + } + for(mb_y = 0; mb_y < mb_height; mb_y++) { + const int modified_predictor= mb_y ? 1 : predictor; + uint8_t *ptr = s->current_picture[0] + (linesize * mb_y); + + if (s->interlaced && s->bottom_field) + ptr += linesize >> 1; + + for(i=0; i<3; i++){ + top[i]= left[i]= topleft[i]= buffer[0][i]; + } + for(mb_x = 0; mb_x < mb_width; mb_x++) { + if (s->restart_interval && !s->restart_count) + s->restart_count = s->restart_interval; + + for(i=0;i<3;i++) { + int pred; + + topleft[i]= top[i]; + top[i]= buffer[mb_x][i]; + + PREDICT(pred, topleft[i], top[i], left[i], modified_predictor); + + left[i]= + buffer[mb_x][i]= mask & (pred + (mjpeg_decode_dc(s, dc_index[i]) << point_transform)); + } + + if (s->restart_interval && !--s->restart_count) { + align_get_bits(&s->gb); + skip_bits(&s->gb, 16); /* skip RSTn */ + } + } + + if(s->rct){ + for(mb_x = 0; mb_x < mb_width; mb_x++) { + ptr[4*mb_x+1] = buffer[mb_x][0] - ((buffer[mb_x][1] + buffer[mb_x][2] - 0x200)>>2); + ptr[4*mb_x+0] = buffer[mb_x][1] + ptr[4*mb_x+1]; + ptr[4*mb_x+2] = buffer[mb_x][2] + ptr[4*mb_x+1]; + } + }else if(s->pegasus_rct){ + for(mb_x = 0; mb_x < mb_width; mb_x++) { + ptr[4*mb_x+1] = buffer[mb_x][0] - ((buffer[mb_x][1] + buffer[mb_x][2])>>2); + ptr[4*mb_x+0] = buffer[mb_x][1] + ptr[4*mb_x+1]; + ptr[4*mb_x+2] = buffer[mb_x][2] + ptr[4*mb_x+1]; + } + }else{ + for(mb_x = 0; mb_x < mb_width; mb_x++) { + ptr[4*mb_x+0] = buffer[mb_x][0]; + ptr[4*mb_x+1] = buffer[mb_x][1]; + ptr[4*mb_x+2] = buffer[mb_x][2]; + } + } + } + }else{ + for(mb_y = 0; mb_y < mb_height; mb_y++) { + for(mb_x = 0; mb_x < mb_width; mb_x++) { + if (s->restart_interval && !s->restart_count) + s->restart_count = s->restart_interval; + + if(mb_x==0 || mb_y==0 || s->interlaced){ + for(i=0;ilinesize[c]; + + for(j=0; jcurrent_picture[c] + (linesize * (v * mb_y + y)) + (h * mb_x + x); //FIXME optimize this crap + if(y==0 && mb_y==0){ + if(x==0 && mb_x==0){ + pred= 128 << point_transform; + }else{ + pred= ptr[-1]; + } + }else{ + if(x==0 && mb_x==0){ + pred= ptr[-linesize]; + }else{ + PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor); + } + } + + if (s->interlaced && s->bottom_field) + ptr += linesize >> 1; + *ptr= pred + (mjpeg_decode_dc(s, dc_index[i]) << point_transform); + + if (++x == h) { + x = 0; + y++; + } + } + } + }else{ + for(i=0;ilinesize[c]; + + for(j=0; jcurrent_picture[c] + (linesize * (v * mb_y + y)) + (h * mb_x + x); //FIXME optimize this crap + PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor); + *ptr= pred + (mjpeg_decode_dc(s, dc_index[i]) << point_transform); + if (++x == h) { + x = 0; + y++; + } + } + } + } + if (s->restart_interval && !--s->restart_count) { + align_get_bits(&s->gb); + skip_bits(&s->gb, 16); /* skip RSTn */ + } + } + } + } + }else{ + for(mb_y = 0; mb_y < mb_height; mb_y++) { for(mb_x = 0; mb_x < mb_width; mb_x++) { + if (s->restart_interval && !s->restart_count) + s->restart_count = s->restart_interval; + for(i=0;irestart_interval && !s->restart_count) - s->restart_count = s->restart_interval; for(j=0;jblock, 0, sizeof(s->block)); if (decode_block(s, s->block, i, @@ -1091,6 +1424,7 @@ static int mjpeg_decode_sos(MJpegDecodeContext *s) } } } + } ret = 0; the_end: emms_c(); @@ -1123,6 +1457,10 @@ static int mjpeg_decode_app(MJpegDecodeContext *s) id = be2me_32(id); len -= 6; + if(s->avctx->debug & FF_DEBUG_STARTCODE){ + printf("APPx %8X\n", id); + } + /* buggy AVID, it puts EOI only at every 10th frame */ /* also this fourcc is used by non-avid files too, it holds some informations, but it's always present in AVID creates files */ @@ -1204,6 +1542,28 @@ static int mjpeg_decode_app(MJpegDecodeContext *s) len -= 7; goto out; } + + if (id == ff_get_fourcc("LJIF")){ + printf("Pegasus lossless jpeg header found\n"); + skip_bits(&s->gb, 16); /* version ? */ + skip_bits(&s->gb, 16); /* unknwon always 0? */ + skip_bits(&s->gb, 16); /* unknwon always 0? */ + skip_bits(&s->gb, 16); /* unknwon always 0? */ + switch( get_bits(&s->gb, 8)){ + case 1: + s->rgb= 1; + s->pegasus_rct=0; + break; + case 2: + s->rgb= 1; + s->pegasus_rct=1; + break; + default: + printf("unknown colorspace\n"); + } + len -= 9; + goto out; + } /* Apple MJPEG-A */ if ((s->start_code == APP1) && (len > (0x28 - 8))) @@ -1241,7 +1601,7 @@ static int mjpeg_decode_app(MJpegDecodeContext *s) static int mjpeg_decode_com(MJpegDecodeContext *s) { /* XXX: verify len field validity */ - unsigned int len = get_bits(&s->gb, 16); + int len = get_bits(&s->gb, 16); if (len >= 2 && len < 32768) { /* XXX: any better upper bound */ uint8_t *cbuf = av_malloc(len - 1); @@ -1393,6 +1753,9 @@ static int mjpeg_decode_frame(AVCodecContext *avctx, init_get_bits(&s->gb, buf_ptr, (buf_end - buf_ptr)*8); s->start_code = start_code; + if(s->avctx->debug & FF_DEBUG_STARTCODE){ + printf("startcode: %X\n", start_code); + } /* process markers */ if (start_code >= 0xd0 && start_code <= 0xd7) { @@ -1418,7 +1781,13 @@ static int mjpeg_decode_frame(AVCodecContext *avctx, mjpeg_decode_dht(s); break; case SOF0: - if (mjpeg_decode_sof0(s) < 0) + s->lossless=0; + if (mjpeg_decode_sof(s) < 0) + return -1; + break; + case SOF3: + s->lossless=1; + if (mjpeg_decode_sof(s) < 0) return -1; break; case EOI: @@ -1443,7 +1812,10 @@ static int mjpeg_decode_frame(AVCodecContext *avctx, /* XXX: not complete test ! */ switch((s->h_count[0] << 4) | s->v_count[0]) { case 0x11: - avctx->pix_fmt = PIX_FMT_YUV444P; + if(s->rgb){ + avctx->pix_fmt = PIX_FMT_RGBA32; + }else + avctx->pix_fmt = PIX_FMT_YUV444P; break; case 0x21: avctx->pix_fmt = PIX_FMT_YUV422P; @@ -1471,7 +1843,6 @@ static int mjpeg_decode_frame(AVCodecContext *avctx, break; case SOF1: case SOF2: - case SOF3: case SOF5: case SOF6: case SOF7: @@ -1570,7 +1941,7 @@ static int mjpegb_decode_frame(AVCodecContext *avctx, { init_get_bits(&s->gb, buf+sof_offs, (buf_end - (buf+sof_offs))*8); s->start_code = SOF0; - if (mjpeg_decode_sof0(s) < 0) + if (mjpeg_decode_sof(s) < 0) return -1; } @@ -1668,3 +2039,15 @@ AVCodec mjpegb_decoder = { 0, NULL }; + +#ifdef CONFIG_ENCODERS +AVCodec ljpeg_encoder = { //FIXME avoid MPV_* lossless jpeg shouldnt need them + "ljpeg", + CODEC_TYPE_VIDEO, + CODEC_ID_LJPEG, + sizeof(MpegEncContext), + MPV_encode_init, + encode_picture_lossless, + MPV_encode_end, +}; +#endif diff --git a/mythtv/libs/libavcodec/mlib/dsputil_mlib.c b/mythtv/libs/libavcodec/mlib/dsputil_mlib.c index 30111e2825a..46594f5a61c 100644 --- a/mythtv/libs/libavcodec/mlib/dsputil_mlib.c +++ b/mythtv/libs/libavcodec/mlib/dsputil_mlib.c @@ -221,6 +221,11 @@ static void ff_idct_add_mlib(uint8_t *dest, int line_size, DCTELEM *data) mlib_VideoAddBlock_U8_S16(dest, (mlib_s16 *)data, line_size); } +static void ff_idct_mlib(uint8_t *dest, int line_size, DCTELEM *data) +{ + mlib_VideoIDCT8x8_S16_S16 (data, data); +} + static void ff_fdct_mlib(DCTELEM *data) { mlib_VideoDCT8x8_S16_S16 (data, data); @@ -264,6 +269,7 @@ void MPV_common_init_mlib(MpegEncContext *s) if(s->avctx->idct_algo==FF_IDCT_AUTO || s->avctx->idct_algo==FF_IDCT_MLIB){ s->dsp.idct_put= ff_idct_put_mlib; s->dsp.idct_add= ff_idct_add_mlib; + s->dsp.idct = ff_idct_mlib; s->dsp.idct_permutation_type= FF_NO_IDCT_PERM; } } diff --git a/mythtv/libs/libavcodec/mpeg12.c b/mythtv/libs/libavcodec/mpeg12.c index 7dc5ab12d5b..01621970503 100644 --- a/mythtv/libs/libavcodec/mpeg12.c +++ b/mythtv/libs/libavcodec/mpeg12.c @@ -73,6 +73,13 @@ static uint8_t fcode_tab[MAX_MV*2+1]; static uint32_t uni_mpeg1_ac_vlc_bits[64*64*2]; static uint8_t uni_mpeg1_ac_vlc_len [64*64*2]; + +/* simple include everything table for dc, first byte is bits number next 3 are code*/ +static uint32_t mpeg1_lum_dc_uni[512]; +static uint32_t mpeg1_chr_dc_uni[512]; + +static uint8_t mpeg1_index_run[2][64]; +static int8_t mpeg1_max_level[2][64]; #endif static void init_2d_vlc_rl(RLTable *rl) @@ -114,6 +121,7 @@ static void init_2d_vlc_rl(RLTable *rl) } } +#ifdef CONFIG_ENCODERS static void init_uni_ac_vlc(RLTable *rl, uint32_t *uni_ac_vlc_bits, uint8_t *uni_ac_vlc_len){ int i; @@ -309,6 +317,7 @@ static void mpeg1_skip_picture(MpegEncContext *s, int pict_num) put_bits(&s->pb, 1, 1); put_bits(&s->pb, 1, 1); } +#endif static void common_init(MpegEncContext *s) { @@ -316,6 +325,13 @@ static void common_init(MpegEncContext *s) s->c_dc_scale_table= ff_mpeg1_dc_scale_table; } +void ff_mpeg1_clean_buffers(MpegEncContext *s){ + s->last_dc[0] = 1 << (7 + s->intra_dc_precision); + s->last_dc[1] = s->last_dc[0]; + s->last_dc[2] = s->last_dc[0]; + memset(s->last_mv, 0, sizeof(s->last_mv)); +} + #ifdef CONFIG_ENCODERS void ff_mpeg1_encode_slice_header(MpegEncContext *s){ @@ -324,13 +340,6 @@ void ff_mpeg1_encode_slice_header(MpegEncContext *s){ put_bits(&s->pb, 1, 0); /* slice extra information */ } -void ff_mpeg1_clean_buffers(MpegEncContext *s){ - s->last_dc[0] = 1 << (7 + s->intra_dc_precision); - s->last_dc[1] = s->last_dc[0]; - s->last_dc[2] = s->last_dc[0]; - memset(s->last_mv, 0, sizeof(s->last_mv)); -} - void mpeg1_encode_picture_header(MpegEncContext *s, int picture_number) { mpeg1_encode_sequence_header(s); @@ -959,12 +968,16 @@ static int mpeg_decode_mb(MpegEncContext *s, /* just parse them */ if (s->picture_structure != PICT_FRAME) skip_bits1(&s->gb); /* field select */ - mpeg_decode_motion(s, s->mpeg_f_code[0][0], 0); - mpeg_decode_motion(s, s->mpeg_f_code[0][1], 0); + + s->mv[0][0][0]= s->last_mv[0][0][0]= s->last_mv[0][1][0] = + mpeg_decode_motion(s, s->mpeg_f_code[0][0], s->last_mv[0][0][0]); + s->mv[0][0][1]= s->last_mv[0][0][1]= s->last_mv[0][1][1] = + mpeg_decode_motion(s, s->mpeg_f_code[0][1], s->last_mv[0][0][1]); + skip_bits1(&s->gb); /* marker */ - } + }else + memset(s->last_mv, 0, sizeof(s->last_mv)); /* reset mv prediction */ s->mb_intra = 1; - memset(s->last_mv, 0, sizeof(s->last_mv)); /* reset mv prediction */ if (s->mpeg2) { for(i=0;i<6;i++) { @@ -1984,6 +1997,9 @@ static int slice_end(AVCodecContext *avctx, AVFrame *pict) Mpeg1Context *s1 = avctx->priv_data; MpegEncContext *s = &s1->mpeg_enc_ctx; + if (!s1->mpeg_enc_ctx_allocated) + return 0; + /* end of slice reached */ if (/*s->mb_y<mb_height &&*/ !s->first_field) { /* end of image */ diff --git a/mythtv/libs/libavcodec/mpeg12data.h b/mythtv/libs/libavcodec/mpeg12data.h index ba52ef22e76..938897528c2 100644 --- a/mythtv/libs/libavcodec/mpeg12data.h +++ b/mythtv/libs/libavcodec/mpeg12data.h @@ -25,7 +25,7 @@ const int16_t ff_mpeg1_default_non_intra_matrix[64] = { 16, 16, 16, 16, 16, 16, 16, 16, }; -const unsigned char vlc_dc_table[256] = { +static const unsigned char vlc_dc_table[256] = { 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, @@ -48,10 +48,10 @@ const unsigned char vlc_dc_table[256] = { 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, }; -const uint16_t vlc_dc_lum_code[12] = { +static const uint16_t vlc_dc_lum_code[12] = { 0x4, 0x0, 0x1, 0x5, 0x6, 0xe, 0x1e, 0x3e, 0x7e, 0xfe, 0x1fe, 0x1ff, }; -const unsigned char vlc_dc_lum_bits[12] = { +static const unsigned char vlc_dc_lum_bits[12] = { 3, 2, 2, 3, 3, 4, 5, 6, 7, 8, 9, 9, }; @@ -62,10 +62,6 @@ const unsigned char vlc_dc_chroma_bits[12] = { 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, }; -/* simple include everything table for dc, first byte is bits number next 3 are code*/ -static uint32_t mpeg1_lum_dc_uni[512]; -static uint32_t mpeg1_chr_dc_uni[512]; - static const uint16_t mpeg1_vlc[113][2] = { { 0x3, 2 }, { 0x4, 4 }, { 0x5, 5 }, { 0x6, 7 }, { 0x26, 8 }, { 0x21, 8 }, { 0xa, 10 }, { 0x1d, 12 }, @@ -166,9 +162,6 @@ static const int8_t mpeg1_run[111] = { 25, 26, 27, 28, 29, 30, 31, }; -static uint8_t mpeg1_index_run[2][64]; -static int8_t mpeg1_max_level[2][64]; - static RLTable rl_mpeg1 = { 111, 111, diff --git a/mythtv/libs/libavcodec/mpegvideo.c b/mythtv/libs/libavcodec/mpegvideo.c index 7ea53da3d0d..16d9e49fa27 100644 --- a/mythtv/libs/libavcodec/mpegvideo.c +++ b/mythtv/libs/libavcodec/mpegvideo.c @@ -513,7 +513,6 @@ void MPV_common_end(MpegEncContext *s) av_freep(&s->ac_stats); av_freep(&s->error_status_table); av_freep(&s->mb_index2xy); - av_freep(&s->parse_context.buffer); for(i=0; ipriv_data; int i; - - avctx->pix_fmt = PIX_FMT_YUV420P; + int chroma_h_shift, chroma_v_shift; s->bit_rate = avctx->bit_rate; s->bit_rate_tolerance = avctx->bit_rate_tolerance; @@ -622,22 +620,25 @@ int MPV_encode_init(AVCodecContext *avctx) s->intra_quant_bias= avctx->intra_quant_bias; if(avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS) s->inter_quant_bias= avctx->inter_quant_bias; - + + avcodec_get_chroma_sub_sample(avctx->pix_fmt, &chroma_h_shift, &chroma_v_shift); + switch(avctx->codec->id) { case CODEC_ID_MPEG1VIDEO: s->out_format = FMT_MPEG1; s->low_delay= 0; //s->max_b_frames ? 0 : 1; avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1); break; + case CODEC_ID_LJPEG: case CODEC_ID_MJPEG: s->out_format = FMT_MJPEG; s->intra_only = 1; /* force intra only for jpeg */ s->mjpeg_write_tables = 1; /* write all tables */ s->mjpeg_data_only_frames = 0; /* write all the needed headers */ - s->mjpeg_vsample[0] = 2; /* set up default sampling factors */ - s->mjpeg_vsample[1] = 1; /* the only currently supported values */ + s->mjpeg_vsample[0] = 1<mjpeg_vsample[1] = 1; s->mjpeg_vsample[2] = 1; - s->mjpeg_hsample[0] = 2; + s->mjpeg_hsample[0] = 1<mjpeg_hsample[1] = 1; s->mjpeg_hsample[2] = 1; if (mjpeg_init(s) < 0) @@ -1603,7 +1604,7 @@ static inline void gmc1_motion(MpegEncContext *s, if(s->flags&CODEC_FLAG_EMU_EDGE){ if(src_x<0 || src_y<0 || src_x + 17 >= s->h_edge_pos || src_y + 17 >= s->v_edge_pos){ - ff_emulated_edge_mc(s, ptr, linesize, 17, 17, src_x, src_y, s->h_edge_pos, s->v_edge_pos); + ff_emulated_edge_mc(s->edge_emu_buffer, ptr, linesize, 17, 17, src_x, src_y, s->h_edge_pos, s->v_edge_pos); ptr= s->edge_emu_buffer; } } @@ -1642,7 +1643,7 @@ static inline void gmc1_motion(MpegEncContext *s, if(s->flags&CODEC_FLAG_EMU_EDGE){ if(src_x<0 || src_y<0 || src_x + 9 >= s->h_edge_pos>>1 || src_y + 9 >= s->v_edge_pos>>1){ - ff_emulated_edge_mc(s, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1); + ff_emulated_edge_mc(s->edge_emu_buffer, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1); ptr= s->edge_emu_buffer; emu=1; } @@ -1651,7 +1652,7 @@ static inline void gmc1_motion(MpegEncContext *s, ptr = ref_picture[2] + offset; if(emu){ - ff_emulated_edge_mc(s, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1); + ff_emulated_edge_mc(s->edge_emu_buffer, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1); ptr= s->edge_emu_buffer; } s->dsp.gmc1(dest_cr + (dest_offset>>1), ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding); @@ -1722,12 +1723,22 @@ static inline void gmc_motion(MpegEncContext *s, s->h_edge_pos>>1, s->v_edge_pos>>1); } - -void ff_emulated_edge_mc(MpegEncContext *s, uint8_t *src, int linesize, int block_w, int block_h, +/** + * Copies a rectangular area of samples to a temporary buffer and replicates the boarder samples. + * @param buf destination buffer + * @param src source buffer + * @param linesize number of bytes between 2 vertically adjacent samples in both the source and destination buffers + * @param block_w width of block + * @param block_h height of block + * @param src_x x coordinate of the top left sample of the block in the source buffer + * @param src_y y coordinate of the top left sample of the block in the source buffer + * @param w width of the source buffer + * @param h height of the source buffer + */ +void ff_emulated_edge_mc(uint8_t *buf, uint8_t *src, int linesize, int block_w, int block_h, int src_x, int src_y, int w, int h){ int x, y; int start_y, start_x, end_y, end_x; - uint8_t *buf= s->edge_emu_buffer; if(src_y>= h){ src+= (h-1-src_y)*linesize; @@ -1823,7 +1834,7 @@ if(s->quarter_sample) if(s->flags&CODEC_FLAG_EMU_EDGE){ if(src_x<0 || src_y<0 || src_x + (motion_x&1) + 16 > s->h_edge_pos || src_y + (motion_y&1) + h > v_edge_pos){ - ff_emulated_edge_mc(s, ptr - src_offset, s->linesize, 17, 17+field_based, //FIXME linesize? and uv below + ff_emulated_edge_mc(s->edge_emu_buffer, ptr - src_offset, s->linesize, 17, 17+field_based, //FIXME linesize? and uv below src_x, src_y<h_edge_pos, s->v_edge_pos); ptr= s->edge_emu_buffer + src_offset; emu=1; @@ -1860,7 +1871,7 @@ if(s->quarter_sample) offset = (src_y * uvlinesize) + src_x + (src_offset >> 1); ptr = ref_picture[1] + offset; if(emu){ - ff_emulated_edge_mc(s, ptr - (src_offset >> 1), s->uvlinesize, 9, 9+field_based, + ff_emulated_edge_mc(s->edge_emu_buffer, ptr - (src_offset >> 1), s->uvlinesize, 9, 9+field_based, src_x, src_y<h_edge_pos>>1, s->v_edge_pos>>1); ptr= s->edge_emu_buffer + (src_offset >> 1); } @@ -1868,7 +1879,7 @@ if(s->quarter_sample) ptr = ref_picture[2] + offset; if(emu){ - ff_emulated_edge_mc(s, ptr - (src_offset >> 1), s->uvlinesize, 9, 9+field_based, + ff_emulated_edge_mc(s->edge_emu_buffer, ptr - (src_offset >> 1), s->uvlinesize, 9, 9+field_based, src_x, src_y<h_edge_pos>>1, s->v_edge_pos>>1); ptr= s->edge_emu_buffer + (src_offset >> 1); } @@ -1908,7 +1919,7 @@ static inline void qpel_motion(MpegEncContext *s, if(s->flags&CODEC_FLAG_EMU_EDGE){ if(src_x<0 || src_y<0 || src_x + (motion_x&3) + 16 > s->h_edge_pos || src_y + (motion_y&3) + h > v_edge_pos){ - ff_emulated_edge_mc(s, ptr - src_offset, s->linesize, 17, 17+field_based, + ff_emulated_edge_mc(s->edge_emu_buffer, ptr - src_offset, s->linesize, 17, 17+field_based, src_x, src_y<h_edge_pos, s->v_edge_pos); ptr= s->edge_emu_buffer + src_offset; emu=1; @@ -1958,7 +1969,7 @@ static inline void qpel_motion(MpegEncContext *s, offset = (src_y * uvlinesize) + src_x + (src_offset >> 1); ptr = ref_picture[1] + offset; if(emu){ - ff_emulated_edge_mc(s, ptr - (src_offset >> 1), s->uvlinesize, 9, 9 + field_based, + ff_emulated_edge_mc(s->edge_emu_buffer, ptr - (src_offset >> 1), s->uvlinesize, 9, 9 + field_based, src_x, src_y<h_edge_pos>>1, s->v_edge_pos>>1); ptr= s->edge_emu_buffer + (src_offset >> 1); } @@ -1966,7 +1977,7 @@ static inline void qpel_motion(MpegEncContext *s, ptr = ref_picture[2] + offset; if(emu){ - ff_emulated_edge_mc(s, ptr - (src_offset >> 1), s->uvlinesize, 9, 9 + field_based, + ff_emulated_edge_mc(s->edge_emu_buffer, ptr - (src_offset >> 1), s->uvlinesize, 9, 9 + field_based, src_x, src_y<h_edge_pos>>1, s->v_edge_pos>>1); ptr= s->edge_emu_buffer + (src_offset >> 1); } @@ -2060,7 +2071,7 @@ static inline void MPV_motion(MpegEncContext *s, if(s->flags&CODEC_FLAG_EMU_EDGE){ if(src_x<0 || src_y<0 || src_x + (motion_x&3) + 8 > s->h_edge_pos || src_y + (motion_y&3) + 8 > s->v_edge_pos){ - ff_emulated_edge_mc(s, ptr, s->linesize, 9, 9, src_x, src_y, s->h_edge_pos, s->v_edge_pos); + ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->linesize, 9, 9, src_x, src_y, s->h_edge_pos, s->v_edge_pos); ptr= s->edge_emu_buffer; } } @@ -2091,7 +2102,7 @@ static inline void MPV_motion(MpegEncContext *s, if(s->flags&CODEC_FLAG_EMU_EDGE){ if(src_x<0 || src_y<0 || src_x + (motion_x&1) + 8 > s->h_edge_pos || src_y + (motion_y&1) + 8 > s->v_edge_pos){ - ff_emulated_edge_mc(s, ptr, s->linesize, 9, 9, src_x, src_y, s->h_edge_pos, s->v_edge_pos); + ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->linesize, 9, 9, src_x, src_y, s->h_edge_pos, s->v_edge_pos); ptr= s->edge_emu_buffer; } } @@ -2126,7 +2137,7 @@ static inline void MPV_motion(MpegEncContext *s, if(s->flags&CODEC_FLAG_EMU_EDGE){ if(src_x<0 || src_y<0 || src_x + (dxy &1) + 8 > s->h_edge_pos>>1 || src_y + (dxy>>1) + 8 > s->v_edge_pos>>1){ - ff_emulated_edge_mc(s, ptr, s->uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1); + ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1); ptr= s->edge_emu_buffer; emu=1; } @@ -2135,7 +2146,7 @@ static inline void MPV_motion(MpegEncContext *s, ptr = ref_picture[2] + offset; if(emu){ - ff_emulated_edge_mc(s, ptr, s->uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1); + ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1); ptr= s->edge_emu_buffer; } pix_op[1][dxy](dest_cr, ptr, s->uvlinesize, 8); @@ -2674,7 +2685,7 @@ static void encode_mb(MpegEncContext *s, int motion_x, int motion_y) ptr = s->new_picture.data[0] + (mb_y * 16 * wrap_y) + mb_x * 16; if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){ - ff_emulated_edge_mc(s, ptr, wrap_y, 16, 16, mb_x*16, mb_y*16, s->width, s->height); + ff_emulated_edge_mc(s->edge_emu_buffer, ptr, wrap_y, 16, 16, mb_x*16, mb_y*16, s->width, s->height); ptr= s->edge_emu_buffer; emu=1; } @@ -2706,14 +2717,14 @@ static void encode_mb(MpegEncContext *s, int motion_x, int motion_y) int wrap_c = s->uvlinesize; ptr = s->new_picture.data[1] + (mb_y * 8 * wrap_c) + mb_x * 8; if(emu){ - ff_emulated_edge_mc(s, ptr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1); + ff_emulated_edge_mc(s->edge_emu_buffer, ptr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1); ptr= s->edge_emu_buffer; } s->dsp.get_pixels(s->block[4], ptr, wrap_c); ptr = s->new_picture.data[2] + (mb_y * 8 * wrap_c) + mb_x * 8; if(emu){ - ff_emulated_edge_mc(s, ptr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1); + ff_emulated_edge_mc(s->edge_emu_buffer, ptr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1); ptr= s->edge_emu_buffer; } s->dsp.get_pixels(s->block[5], ptr, wrap_c); @@ -2753,7 +2764,7 @@ static void encode_mb(MpegEncContext *s, int motion_x, int motion_y) } if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){ - ff_emulated_edge_mc(s, ptr_y, wrap_y, 16, 16, mb_x*16, mb_y*16, s->width, s->height); + ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, wrap_y, 16, 16, mb_x*16, mb_y*16, s->width, s->height); ptr_y= s->edge_emu_buffer; emu=1; } @@ -2785,12 +2796,12 @@ static void encode_mb(MpegEncContext *s, int motion_x, int motion_y) skip_dct[5]= 1; }else{ if(emu){ - ff_emulated_edge_mc(s, ptr_cb, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1); + ff_emulated_edge_mc(s->edge_emu_buffer, ptr_cb, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1); ptr_cb= s->edge_emu_buffer; } s->dsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c); if(emu){ - ff_emulated_edge_mc(s, ptr_cr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1); + ff_emulated_edge_mc(s->edge_emu_buffer, ptr_cr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1); ptr_cr= s->edge_emu_buffer; } s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c); diff --git a/mythtv/libs/libavcodec/mpegvideo.h b/mythtv/libs/libavcodec/mpegvideo.h index 9f25065de1c..8f255d41441 100644 --- a/mythtv/libs/libavcodec/mpegvideo.h +++ b/mythtv/libs/libavcodec/mpegvideo.h @@ -710,7 +710,7 @@ void ff_copy_bits(PutBitContext *pb, uint8_t *src, int length); void ff_clean_intra_table_entries(MpegEncContext *s); void ff_init_scantable(uint8_t *, ScanTable *st, const uint8_t *src_scantable); void ff_draw_horiz_band(MpegEncContext *s, int y, int h); -void ff_emulated_edge_mc(MpegEncContext *s, uint8_t *src, int linesize, int block_w, int block_h, +void ff_emulated_edge_mc(uint8_t *buf, uint8_t *src, int linesize, int block_w, int block_h, int src_x, int src_y, int w, int h); #define END_NOT_FOUND -100 int ff_combine_frame( MpegEncContext *s, int next, uint8_t **buf, int *buf_size); @@ -879,7 +879,7 @@ void ff_wmv2_encode_mb(MpegEncContext * s, DCTELEM block[6][64], int motion_x, int motion_y); -/* mjpegenc.c */ +/* mjpeg.c */ int mjpeg_init(MpegEncContext *s); void mjpeg_close(MpegEncContext *s); void mjpeg_encode_mb(MpegEncContext *s, diff --git a/mythtv/libs/libavcodec/msmpeg4.c b/mythtv/libs/libavcodec/msmpeg4.c index 72481e325e2..839d8dbac42 100644 --- a/mythtv/libs/libavcodec/msmpeg4.c +++ b/mythtv/libs/libavcodec/msmpeg4.c @@ -58,17 +58,13 @@ static uint32_t v2_dc_lum_table[512][2]; static uint32_t v2_dc_chroma_table[512][2]; -#ifdef CONFIG_ENCODERS static inline void msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n); -#endif //CONFIG_ENCODERS static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block, int n, int coded, const uint8_t *scantable); static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr); static int msmpeg4_decode_motion(MpegEncContext * s, int *mx_ptr, int *my_ptr); -#ifdef CONFIG_ENCODERS static void msmpeg4v2_encode_motion(MpegEncContext * s, int val); -#endif //CONFIG_ENCODERS static void init_h263_dc_for_msmpeg4(void); static inline void msmpeg4_memsetw(short *tab, int val, int n); #ifdef CONFIG_ENCODERS @@ -86,7 +82,9 @@ int frame_count = 0; #include "msmpeg4data.h" +#ifdef CONFIG_ENCODERS //strangely gcc includes this even if its not references static uint8_t rl_length[NB_RL_TABLES][MAX_LEVEL+1][MAX_RUN+1][2]; +#endif //CONFIG_ENCODERS #ifdef STATS @@ -850,8 +848,6 @@ static inline int msmpeg4_pred_dc(MpegEncContext * s, int n, #define DC_MAX 119 -#ifdef CONFIG_ENCODERS - static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr) { int sign, code; @@ -1044,8 +1040,6 @@ else } } -#endif //CONFIG_ENCODERS - /****************************************/ /* decoding stuff */ @@ -1428,8 +1422,6 @@ static inline void msmpeg4_memsetw(short *tab, int val, int n) tab[i] = val; } -#ifdef CONFIG_ENCODERS - static void msmpeg4v2_encode_motion(MpegEncContext * s, int val) { int range, bit_size, sign, code, bits; @@ -1463,8 +1455,6 @@ static void msmpeg4v2_encode_motion(MpegEncContext * s, int val) } } -#endif //CONFIG_ENCODERS - /* this is identical to h263 except that its range is multiplied by 2 */ static int msmpeg4v2_decode_motion(MpegEncContext * s, int pred, int f_code) { diff --git a/mythtv/libs/libavcodec/ps2/dsputil_mmi.c b/mythtv/libs/libavcodec/ps2/dsputil_mmi.c index 3932f39e1e0..f7bea7e3596 100644 --- a/mythtv/libs/libavcodec/ps2/dsputil_mmi.c +++ b/mythtv/libs/libavcodec/ps2/dsputil_mmi.c @@ -25,7 +25,7 @@ void ff_mmi_idct_put(uint8_t *dest, int line_size, DCTELEM *block); void ff_mmi_idct_add(uint8_t *dest, int line_size, DCTELEM *block); - +void ff_mmi_idct(DCTELEM *block); static void clear_blocks_mmi(DCTELEM * blocks) { @@ -154,6 +154,7 @@ void dsputil_init_mmi(DSPContext* c, AVCodecContext *avctx) if(idct_algo==FF_IDCT_AUTO || idct_algo==FF_IDCT_PS2){ c->idct_put= ff_mmi_idct_put; c->idct_add= ff_mmi_idct_add; + c->idct = ff_mmi_idct; c->idct_permutation_type= FF_LIBMPEG2_IDCT_PERM; } } diff --git a/mythtv/libs/libavcodec/ra144.c b/mythtv/libs/libavcodec/ra144.c new file mode 100644 index 00000000000..443db6e87de --- /dev/null +++ b/mythtv/libs/libavcodec/ra144.c @@ -0,0 +1,2918 @@ +/* + * Real Audio 1.0 (14.4K) + * Copyright (c) 2003 the ffmpeg project + * + * This 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 of the License, or (at your option) any later version. + * + * This 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 this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "avcodec.h" + +#define DATABLOCK1 20 /* size of 14.4 input block in bytes */ +#define DATACHUNK1 1440 /* size of 14.4 input chunk in bytes */ +#define AUDIOBLOCK 160 /* size of output block in 16-bit words (320 bytes) */ +#define AUDIOBUFFER 12288 /* size of output buffer in 16-bit words (24576 bytes) */ +/* consts */ +#define NBLOCKS 4 /* number of segments within a block */ +#define BLOCKSIZE 40 /* (quarter) block size in 16-bit words (80 bytes) */ +#define HALFBLOCK 20 /* BLOCKSIZE/2 */ +#define BUFFERSIZE 146 /* for do_output */ + + +/* internal globals */ +typedef struct { + unsigned int resetflag, val, oldval; + unsigned int unpacked[28]; /* buffer for unpacked input */ + unsigned int *iptr; /* pointer to current input (from unpacked) */ + unsigned int gval; + unsigned short *gsp; + unsigned int gbuf1[8]; + unsigned short gbuf2[120]; + signed short output_buffer[40]; + unsigned int *decptr; /* decoder ptr */ + signed short *decsp; + + /* the swapped buffers */ + unsigned int swapb1a[10]; + unsigned int swapb2a[10]; + unsigned int swapb1b[10]; + unsigned int swapb2b[10]; + unsigned int *swapbuf1; + unsigned int *swapbuf2; + unsigned int *swapbuf1alt; + unsigned int *swapbuf2alt; + + unsigned int buffer[5]; + unsigned short int buffer_2[148]; + unsigned short int buffer_a[40]; + unsigned short int buffer_b[40]; + unsigned short int buffer_c[40]; + unsigned short int buffer_d[40]; + + unsigned short int work[50]; + unsigned short *sptr; + + int buffer1[10]; + int buffer2[10]; + + signed short wavtable1[2304]; + unsigned short wavtable2[2304]; +} Real144_internal; + +/* 14.4 data tables */ +const unsigned short sqrt_table[4096]={ +0x0000,0x0400,0x05a8,0x06ed,0x0800,0x08f1,0x09cc,0x0a95, +0x0b50,0x0c00,0x0ca6,0x0d44,0x0ddb,0x0e6c,0x0ef7,0x0f7d, +0x1000,0x107e,0x10f8,0x116f,0x11e3,0x1254,0x12c2,0x132e, +0x1398,0x1400,0x1465,0x14c8,0x152a,0x158a,0x15e8,0x1645, +0x16a0,0x16fa,0x1752,0x17aa,0x1800,0x1854,0x18a8,0x18fa, +0x194c,0x199c,0x19ec,0x1a3a,0x1a88,0x1ad5,0x1b21,0x1b6c, +0x1bb6,0x1c00,0x1c48,0x1c90,0x1cd8,0x1d1e,0x1d64,0x1daa, +0x1dee,0x1e33,0x1e76,0x1eb9,0x1efb,0x1f3d,0x1f7e,0x1fbf, +0x2000,0x203f,0x207f,0x20bd,0x20fc,0x2139,0x2177,0x21b4, +0x21f0,0x222d,0x2268,0x22a4,0x22df,0x2319,0x2353,0x238d, +0x23c6,0x2400,0x2438,0x2471,0x24a9,0x24e0,0x2518,0x254f, +0x2585,0x25bc,0x25f2,0x2628,0x265d,0x2693,0x26c8,0x26fc, +0x2731,0x2765,0x2799,0x27cc,0x2800,0x2833,0x2865,0x2898, +0x28ca,0x28fc,0x292e,0x2960,0x2991,0x29c2,0x29f3,0x2a24, +0x2a54,0x2a85,0x2ab5,0x2ae5,0x2b14,0x2b44,0x2b73,0x2ba2, +0x2bd1,0x2c00,0x2c2e,0x2c5c,0x2c8a,0x2cb8,0x2ce6,0x2d13, +0x2d41,0x2d6e,0x2d9b,0x2dc8,0x2df4,0x2e21,0x2e4d,0x2e79, +0x2ea5,0x2ed1,0x2efd,0x2f28,0x2f54,0x2f7f,0x2faa,0x2fd5, +0x3000,0x302a,0x3055,0x307f,0x30a9,0x30d3,0x30fd,0x3127, +0x3150,0x317a,0x31a3,0x31cc,0x31f5,0x321e,0x3247,0x3270, +0x3298,0x32c1,0x32e9,0x3311,0x3339,0x3361,0x3389,0x33b0, +0x33d8,0x3400,0x3427,0x344e,0x3475,0x349c,0x34c3,0x34ea, +0x3510,0x3537,0x355d,0x3584,0x35aa,0x35d0,0x35f6,0x361c, +0x3642,0x3667,0x368d,0x36b2,0x36d8,0x36fd,0x3722,0x3747, +0x376c,0x3791,0x37b6,0x37db,0x3800,0x3824,0x3848,0x386d, +0x3891,0x38b5,0x38d9,0x38fd,0x3921,0x3945,0x3969,0x398c, +0x39b0,0x39d3,0x39f7,0x3a1a,0x3a3d,0x3a60,0x3a83,0x3aa6, +0x3ac9,0x3aec,0x3b0f,0x3b31,0x3b54,0x3b76,0x3b99,0x3bbb, +0x3bdd,0x3c00,0x3c22,0x3c44,0x3c66,0x3c87,0x3ca9,0x3ccb, +0x3ced,0x3d0e,0x3d30,0x3d51,0x3d72,0x3d94,0x3db5,0x3dd6, +0x3df7,0x3e18,0x3e39,0x3e5a,0x3e7b,0x3e9c,0x3ebc,0x3edd, +0x3efd,0x3f1e,0x3f3e,0x3f5f,0x3f7f,0x3f9f,0x3fbf,0x3fdf, +0x4000,0x401f,0x403f,0x405f,0x407f,0x409f,0x40be,0x40de, +0x40fe,0x411d,0x413c,0x415c,0x417b,0x419a,0x41ba,0x41d9, +0x41f8,0x4217,0x4236,0x4255,0x4273,0x4292,0x42b1,0x42d0, +0x42ee,0x430d,0x432b,0x434a,0x4368,0x4387,0x43a5,0x43c3, +0x43e1,0x4400,0x441e,0x443c,0x445a,0x4478,0x4495,0x44b3, +0x44d1,0x44ef,0x450c,0x452a,0x4548,0x4565,0x4583,0x45a0, +0x45be,0x45db,0x45f8,0x4615,0x4633,0x4650,0x466d,0x468a, +0x46a7,0x46c4,0x46e1,0x46fe,0x471b,0x4737,0x4754,0x4771, +0x478d,0x47aa,0x47c7,0x47e3,0x4800,0x481c,0x4838,0x4855, +0x4871,0x488d,0x48a9,0x48c6,0x48e2,0x48fe,0x491a,0x4936, +0x4952,0x496e,0x498a,0x49a5,0x49c1,0x49dd,0x49f9,0x4a14, +0x4a30,0x4a4b,0x4a67,0x4a83,0x4a9e,0x4ab9,0x4ad5,0x4af0, +0x4b0b,0x4b27,0x4b42,0x4b5d,0x4b78,0x4b93,0x4bae,0x4bca, +0x4be5,0x4c00,0x4c1a,0x4c35,0x4c50,0x4c6b,0x4c86,0x4ca1, +0x4cbb,0x4cd6,0x4cf1,0x4d0b,0x4d26,0x4d40,0x4d5b,0x4d75, +0x4d90,0x4daa,0x4dc4,0x4ddf,0x4df9,0x4e13,0x4e2d,0x4e48, +0x4e62,0x4e7c,0x4e96,0x4eb0,0x4eca,0x4ee4,0x4efe,0x4f18, +0x4f32,0x4f4c,0x4f65,0x4f7f,0x4f99,0x4fb3,0x4fcc,0x4fe6, +0x5000,0x5019,0x5033,0x504c,0x5066,0x507f,0x5099,0x50b2, +0x50cb,0x50e5,0x50fe,0x5117,0x5130,0x514a,0x5163,0x517c, +0x5195,0x51ae,0x51c7,0x51e0,0x51f9,0x5212,0x522b,0x5244, +0x525d,0x5276,0x528f,0x52a7,0x52c0,0x52d9,0x52f2,0x530a, +0x5323,0x533c,0x5354,0x536d,0x5385,0x539e,0x53b6,0x53cf, +0x53e7,0x5400,0x5418,0x5430,0x5449,0x5461,0x5479,0x5491, +0x54a9,0x54c2,0x54da,0x54f2,0x550a,0x5522,0x553a,0x5552, +0x556a,0x5582,0x559a,0x55b2,0x55ca,0x55e2,0x55fa,0x5611, +0x5629,0x5641,0x5659,0x5670,0x5688,0x56a0,0x56b7,0x56cf, +0x56e6,0x56fe,0x5716,0x572d,0x5745,0x575c,0x5773,0x578b, +0x57a2,0x57ba,0x57d1,0x57e8,0x5800,0x5817,0x582e,0x5845, +0x585c,0x5874,0x588b,0x58a2,0x58b9,0x58d0,0x58e7,0x58fe, +0x5915,0x592c,0x5943,0x595a,0x5971,0x5988,0x599f,0x59b5, +0x59cc,0x59e3,0x59fa,0x5a11,0x5a27,0x5a3e,0x5a55,0x5a6b, +0x5a82,0x5a99,0x5aaf,0x5ac6,0x5adc,0x5af3,0x5b09,0x5b20, +0x5b36,0x5b4d,0x5b63,0x5b7a,0x5b90,0x5ba6,0x5bbd,0x5bd3, +0x5be9,0x5c00,0x5c16,0x5c2c,0x5c42,0x5c58,0x5c6f,0x5c85, +0x5c9b,0x5cb1,0x5cc7,0x5cdd,0x5cf3,0x5d09,0x5d1f,0x5d35, +0x5d4b,0x5d61,0x5d77,0x5d8d,0x5da3,0x5db9,0x5dce,0x5de4, +0x5dfa,0x5e10,0x5e26,0x5e3b,0x5e51,0x5e67,0x5e7c,0x5e92, +0x5ea8,0x5ebd,0x5ed3,0x5ee9,0x5efe,0x5f14,0x5f29,0x5f3f, +0x5f54,0x5f6a,0x5f7f,0x5f95,0x5faa,0x5fbf,0x5fd5,0x5fea, +0x6000,0x6015,0x602a,0x603f,0x6055,0x606a,0x607f,0x6094, +0x60aa,0x60bf,0x60d4,0x60e9,0x60fe,0x6113,0x6128,0x613d, +0x6152,0x6168,0x617d,0x6192,0x61a7,0x61bb,0x61d0,0x61e5, +0x61fa,0x620f,0x6224,0x6239,0x624e,0x6263,0x6277,0x628c, +0x62a1,0x62b6,0x62ca,0x62df,0x62f4,0x6309,0x631d,0x6332, +0x6347,0x635b,0x6370,0x6384,0x6399,0x63ad,0x63c2,0x63d7, +0x63eb,0x6400,0x6414,0x6428,0x643d,0x6451,0x6466,0x647a, +0x648e,0x64a3,0x64b7,0x64cb,0x64e0,0x64f4,0x6508,0x651d, +0x6531,0x6545,0x6559,0x656e,0x6582,0x6596,0x65aa,0x65be, +0x65d2,0x65e6,0x65fa,0x660f,0x6623,0x6637,0x664b,0x665f, +0x6673,0x6687,0x669b,0x66af,0x66c3,0x66d6,0x66ea,0x66fe, +0x6712,0x6726,0x673a,0x674e,0x6761,0x6775,0x6789,0x679d, +0x67b1,0x67c4,0x67d8,0x67ec,0x6800,0x6813,0x6827,0x683b, +0x684e,0x6862,0x6875,0x6889,0x689d,0x68b0,0x68c4,0x68d7, +0x68eb,0x68fe,0x6912,0x6925,0x6939,0x694c,0x6960,0x6973, +0x6986,0x699a,0x69ad,0x69c1,0x69d4,0x69e7,0x69fb,0x6a0e, +0x6a21,0x6a35,0x6a48,0x6a5b,0x6a6e,0x6a82,0x6a95,0x6aa8, +0x6abb,0x6ace,0x6ae2,0x6af5,0x6b08,0x6b1b,0x6b2e,0x6b41, +0x6b54,0x6b67,0x6b7a,0x6b8d,0x6ba1,0x6bb4,0x6bc7,0x6bda, +0x6bed,0x6c00,0x6c12,0x6c25,0x6c38,0x6c4b,0x6c5e,0x6c71, +0x6c84,0x6c97,0x6caa,0x6cbc,0x6ccf,0x6ce2,0x6cf5,0x6d08, +0x6d1a,0x6d2d,0x6d40,0x6d53,0x6d65,0x6d78,0x6d8b,0x6d9e, +0x6db0,0x6dc3,0x6dd6,0x6de8,0x6dfb,0x6e0d,0x6e20,0x6e33, +0x6e45,0x6e58,0x6e6a,0x6e7d,0x6e8f,0x6ea2,0x6eb4,0x6ec7, +0x6ed9,0x6eec,0x6efe,0x6f11,0x6f23,0x6f36,0x6f48,0x6f5a, +0x6f6d,0x6f7f,0x6f92,0x6fa4,0x6fb6,0x6fc9,0x6fdb,0x6fed, +0x7000,0x7012,0x7024,0x7036,0x7049,0x705b,0x706d,0x707f, +0x7091,0x70a4,0x70b6,0x70c8,0x70da,0x70ec,0x70fe,0x7110, +0x7123,0x7135,0x7147,0x7159,0x716b,0x717d,0x718f,0x71a1, +0x71b3,0x71c5,0x71d7,0x71e9,0x71fb,0x720d,0x721f,0x7231, +0x7243,0x7255,0x7267,0x7279,0x728a,0x729c,0x72ae,0x72c0, +0x72d2,0x72e4,0x72f5,0x7307,0x7319,0x732b,0x733d,0x734e, +0x7360,0x7372,0x7384,0x7395,0x73a7,0x73b9,0x73ca,0x73dc, +0x73ee,0x7400,0x7411,0x7423,0x7434,0x7446,0x7458,0x7469, +0x747b,0x748c,0x749e,0x74b0,0x74c1,0x74d3,0x74e4,0x74f6, +0x7507,0x7519,0x752a,0x753c,0x754d,0x755f,0x7570,0x7581, +0x7593,0x75a4,0x75b6,0x75c7,0x75d8,0x75ea,0x75fb,0x760d, +0x761e,0x762f,0x7641,0x7652,0x7663,0x7674,0x7686,0x7697, +0x76a8,0x76ba,0x76cb,0x76dc,0x76ed,0x76fe,0x7710,0x7721, +0x7732,0x7743,0x7754,0x7766,0x7777,0x7788,0x7799,0x77aa, +0x77bb,0x77cc,0x77dd,0x77ee,0x7800,0x7811,0x7822,0x7833, +0x7844,0x7855,0x7866,0x7877,0x7888,0x7899,0x78aa,0x78bb, +0x78cc,0x78dd,0x78ee,0x78fe,0x790f,0x7920,0x7931,0x7942, +0x7953,0x7964,0x7975,0x7986,0x7996,0x79a7,0x79b8,0x79c9, +0x79da,0x79eb,0x79fb,0x7a0c,0x7a1d,0x7a2e,0x7a3e,0x7a4f, +0x7a60,0x7a71,0x7a81,0x7a92,0x7aa3,0x7ab3,0x7ac4,0x7ad5, +0x7ae5,0x7af6,0x7b07,0x7b17,0x7b28,0x7b39,0x7b49,0x7b5a, +0x7b6b,0x7b7b,0x7b8c,0x7b9c,0x7bad,0x7bbd,0x7bce,0x7bde, +0x7bef,0x7c00,0x7c10,0x7c21,0x7c31,0x7c41,0x7c52,0x7c62, +0x7c73,0x7c83,0x7c94,0x7ca4,0x7cb5,0x7cc5,0x7cd5,0x7ce6, +0x7cf6,0x7d07,0x7d17,0x7d27,0x7d38,0x7d48,0x7d58,0x7d69, +0x7d79,0x7d89,0x7d9a,0x7daa,0x7dba,0x7dcb,0x7ddb,0x7deb, +0x7dfb,0x7e0c,0x7e1c,0x7e2c,0x7e3c,0x7e4d,0x7e5d,0x7e6d, +0x7e7d,0x7e8d,0x7e9e,0x7eae,0x7ebe,0x7ece,0x7ede,0x7eee, +0x7efe,0x7f0f,0x7f1f,0x7f2f,0x7f3f,0x7f4f,0x7f5f,0x7f6f, +0x7f7f,0x7f8f,0x7f9f,0x7faf,0x7fbf,0x7fcf,0x7fdf,0x7fef, +0x8000,0x800f,0x801f,0x802f,0x803f,0x804f,0x805f,0x806f, +0x807f,0x808f,0x809f,0x80af,0x80bf,0x80cf,0x80df,0x80ef, +0x80ff,0x810e,0x811e,0x812e,0x813e,0x814e,0x815e,0x816d, +0x817d,0x818d,0x819d,0x81ad,0x81bc,0x81cc,0x81dc,0x81ec, +0x81fc,0x820b,0x821b,0x822b,0x823b,0x824a,0x825a,0x826a, +0x8279,0x8289,0x8299,0x82a8,0x82b8,0x82c8,0x82d7,0x82e7, +0x82f7,0x8306,0x8316,0x8326,0x8335,0x8345,0x8354,0x8364, +0x8374,0x8383,0x8393,0x83a2,0x83b2,0x83c1,0x83d1,0x83e0, +0x83f0,0x8400,0x840f,0x841f,0x842e,0x843e,0x844d,0x845c, +0x846c,0x847b,0x848b,0x849a,0x84aa,0x84b9,0x84c9,0x84d8, +0x84e7,0x84f7,0x8506,0x8516,0x8525,0x8534,0x8544,0x8553, +0x8562,0x8572,0x8581,0x8591,0x85a0,0x85af,0x85be,0x85ce, +0x85dd,0x85ec,0x85fc,0x860b,0x861a,0x862a,0x8639,0x8648, +0x8657,0x8667,0x8676,0x8685,0x8694,0x86a3,0x86b3,0x86c2, +0x86d1,0x86e0,0x86ef,0x86ff,0x870e,0x871d,0x872c,0x873b, +0x874a,0x8759,0x8769,0x8778,0x8787,0x8796,0x87a5,0x87b4, +0x87c3,0x87d2,0x87e1,0x87f0,0x8800,0x880f,0x881e,0x882d, +0x883c,0x884b,0x885a,0x8869,0x8878,0x8887,0x8896,0x88a5, +0x88b4,0x88c3,0x88d2,0x88e1,0x88f0,0x88ff,0x890e,0x891c, +0x892b,0x893a,0x8949,0x8958,0x8967,0x8976,0x8985,0x8994, +0x89a3,0x89b2,0x89c0,0x89cf,0x89de,0x89ed,0x89fc,0x8a0b, +0x8a19,0x8a28,0x8a37,0x8a46,0x8a55,0x8a64,0x8a72,0x8a81, +0x8a90,0x8a9f,0x8aad,0x8abc,0x8acb,0x8ada,0x8ae8,0x8af7, +0x8b06,0x8b15,0x8b23,0x8b32,0x8b41,0x8b50,0x8b5e,0x8b6d, +0x8b7c,0x8b8a,0x8b99,0x8ba8,0x8bb6,0x8bc5,0x8bd4,0x8be2, +0x8bf1,0x8c00,0x8c0e,0x8c1d,0x8c2b,0x8c3a,0x8c49,0x8c57, +0x8c66,0x8c74,0x8c83,0x8c91,0x8ca0,0x8caf,0x8cbd,0x8ccc, +0x8cda,0x8ce9,0x8cf7,0x8d06,0x8d14,0x8d23,0x8d31,0x8d40, +0x8d4e,0x8d5d,0x8d6b,0x8d7a,0x8d88,0x8d97,0x8da5,0x8db4, +0x8dc2,0x8dd1,0x8ddf,0x8ded,0x8dfc,0x8e0a,0x8e19,0x8e27, +0x8e36,0x8e44,0x8e52,0x8e61,0x8e6f,0x8e7d,0x8e8c,0x8e9a, +0x8ea9,0x8eb7,0x8ec5,0x8ed4,0x8ee2,0x8ef0,0x8eff,0x8f0d, +0x8f1b,0x8f2a,0x8f38,0x8f46,0x8f54,0x8f63,0x8f71,0x8f7f, +0x8f8e,0x8f9c,0x8faa,0x8fb8,0x8fc7,0x8fd5,0x8fe3,0x8ff1, +0x9000,0x900e,0x901c,0x902a,0x9038,0x9047,0x9055,0x9063, +0x9071,0x907f,0x908d,0x909c,0x90aa,0x90b8,0x90c6,0x90d4, +0x90e2,0x90f0,0x90ff,0x910d,0x911b,0x9129,0x9137,0x9145, +0x9153,0x9161,0x916f,0x917e,0x918c,0x919a,0x91a8,0x91b6, +0x91c4,0x91d2,0x91e0,0x91ee,0x91fc,0x920a,0x9218,0x9226, +0x9234,0x9242,0x9250,0x925e,0x926c,0x927a,0x9288,0x9296, +0x92a4,0x92b2,0x92c0,0x92ce,0x92dc,0x92ea,0x92f8,0x9306, +0x9314,0x9321,0x932f,0x933d,0x934b,0x9359,0x9367,0x9375, +0x9383,0x9391,0x939f,0x93ac,0x93ba,0x93c8,0x93d6,0x93e4, +0x93f2,0x9400,0x940d,0x941b,0x9429,0x9437,0x9445,0x9452, +0x9460,0x946e,0x947c,0x948a,0x9497,0x94a5,0x94b3,0x94c1, +0x94cf,0x94dc,0x94ea,0x94f8,0x9506,0x9513,0x9521,0x952f, +0x953c,0x954a,0x9558,0x9566,0x9573,0x9581,0x958f,0x959c, +0x95aa,0x95b8,0x95c5,0x95d3,0x95e1,0x95ee,0x95fc,0x960a, +0x9617,0x9625,0x9633,0x9640,0x964e,0x965c,0x9669,0x9677, +0x9684,0x9692,0x96a0,0x96ad,0x96bb,0x96c8,0x96d6,0x96e4, +0x96f1,0x96ff,0x970c,0x971a,0x9727,0x9735,0x9742,0x9750, +0x975d,0x976b,0x9779,0x9786,0x9794,0x97a1,0x97af,0x97bc, +0x97ca,0x97d7,0x97e5,0x97f2,0x9800,0x980d,0x981a,0x9828, +0x9835,0x9843,0x9850,0x985e,0x986b,0x9879,0x9886,0x9893, +0x98a1,0x98ae,0x98bc,0x98c9,0x98d6,0x98e4,0x98f1,0x98ff, +0x990c,0x9919,0x9927,0x9934,0x9942,0x994f,0x995c,0x996a, +0x9977,0x9984,0x9992,0x999f,0x99ac,0x99ba,0x99c7,0x99d4, +0x99e2,0x99ef,0x99fc,0x9a09,0x9a17,0x9a24,0x9a31,0x9a3f, +0x9a4c,0x9a59,0x9a66,0x9a74,0x9a81,0x9a8e,0x9a9b,0x9aa9, +0x9ab6,0x9ac3,0x9ad0,0x9ade,0x9aeb,0x9af8,0x9b05,0x9b12, +0x9b20,0x9b2d,0x9b3a,0x9b47,0x9b54,0x9b62,0x9b6f,0x9b7c, +0x9b89,0x9b96,0x9ba3,0x9bb1,0x9bbe,0x9bcb,0x9bd8,0x9be5, +0x9bf2,0x9c00,0x9c0d,0x9c1a,0x9c27,0x9c34,0x9c41,0x9c4e, +0x9c5b,0x9c68,0x9c75,0x9c83,0x9c90,0x9c9d,0x9caa,0x9cb7, +0x9cc4,0x9cd1,0x9cde,0x9ceb,0x9cf8,0x9d05,0x9d12,0x9d1f, +0x9d2c,0x9d39,0x9d46,0x9d53,0x9d60,0x9d6d,0x9d7a,0x9d87, +0x9d94,0x9da1,0x9dae,0x9dbb,0x9dc8,0x9dd5,0x9de2,0x9def, +0x9dfc,0x9e09,0x9e16,0x9e23,0x9e30,0x9e3d,0x9e4a,0x9e57, +0x9e64,0x9e71,0x9e7e,0x9e8b,0x9e98,0x9ea4,0x9eb1,0x9ebe, +0x9ecb,0x9ed8,0x9ee5,0x9ef2,0x9eff,0x9f0c,0x9f18,0x9f25, +0x9f32,0x9f3f,0x9f4c,0x9f59,0x9f66,0x9f72,0x9f7f,0x9f8c, +0x9f99,0x9fa6,0x9fb3,0x9fbf,0x9fcc,0x9fd9,0x9fe6,0x9ff3, +0xa000,0xa00c,0xa019,0xa026,0xa033,0xa03f,0xa04c,0xa059, +0xa066,0xa073,0xa07f,0xa08c,0xa099,0xa0a6,0xa0b2,0xa0bf, +0xa0cc,0xa0d9,0xa0e5,0xa0f2,0xa0ff,0xa10b,0xa118,0xa125, +0xa132,0xa13e,0xa14b,0xa158,0xa164,0xa171,0xa17e,0xa18a, +0xa197,0xa1a4,0xa1b0,0xa1bd,0xa1ca,0xa1d6,0xa1e3,0xa1f0, +0xa1fc,0xa209,0xa216,0xa222,0xa22f,0xa23c,0xa248,0xa255, +0xa261,0xa26e,0xa27b,0xa287,0xa294,0xa2a0,0xa2ad,0xa2ba, +0xa2c6,0xa2d3,0xa2df,0xa2ec,0xa2f8,0xa305,0xa312,0xa31e, +0xa32b,0xa337,0xa344,0xa350,0xa35d,0xa369,0xa376,0xa382, +0xa38f,0xa39b,0xa3a8,0xa3b5,0xa3c1,0xa3ce,0xa3da,0xa3e7, +0xa3f3,0xa400,0xa40c,0xa418,0xa425,0xa431,0xa43e,0xa44a, +0xa457,0xa463,0xa470,0xa47c,0xa489,0xa495,0xa4a2,0xa4ae, +0xa4ba,0xa4c7,0xa4d3,0xa4e0,0xa4ec,0xa4f9,0xa505,0xa511, +0xa51e,0xa52a,0xa537,0xa543,0xa54f,0xa55c,0xa568,0xa574, +0xa581,0xa58d,0xa59a,0xa5a6,0xa5b2,0xa5bf,0xa5cb,0xa5d7, +0xa5e4,0xa5f0,0xa5fc,0xa609,0xa615,0xa621,0xa62e,0xa63a, +0xa646,0xa653,0xa65f,0xa66b,0xa678,0xa684,0xa690,0xa69d, +0xa6a9,0xa6b5,0xa6c1,0xa6ce,0xa6da,0xa6e6,0xa6f2,0xa6ff, +0xa70b,0xa717,0xa724,0xa730,0xa73c,0xa748,0xa754,0xa761, +0xa76d,0xa779,0xa785,0xa792,0xa79e,0xa7aa,0xa7b6,0xa7c3, +0xa7cf,0xa7db,0xa7e7,0xa7f3,0xa800,0xa80c,0xa818,0xa824, +0xa830,0xa83c,0xa849,0xa855,0xa861,0xa86d,0xa879,0xa885, +0xa892,0xa89e,0xa8aa,0xa8b6,0xa8c2,0xa8ce,0xa8da,0xa8e6, +0xa8f3,0xa8ff,0xa90b,0xa917,0xa923,0xa92f,0xa93b,0xa947, +0xa953,0xa960,0xa96c,0xa978,0xa984,0xa990,0xa99c,0xa9a8, +0xa9b4,0xa9c0,0xa9cc,0xa9d8,0xa9e4,0xa9f0,0xa9fc,0xaa09, +0xaa15,0xaa21,0xaa2d,0xaa39,0xaa45,0xaa51,0xaa5d,0xaa69, +0xaa75,0xaa81,0xaa8d,0xaa99,0xaaa5,0xaab1,0xaabd,0xaac9, +0xaad5,0xaae1,0xaaed,0xaaf9,0xab05,0xab11,0xab1d,0xab29, +0xab35,0xab41,0xab4d,0xab58,0xab64,0xab70,0xab7c,0xab88, +0xab94,0xaba0,0xabac,0xabb8,0xabc4,0xabd0,0xabdc,0xabe8, +0xabf4,0xac00,0xac0b,0xac17,0xac23,0xac2f,0xac3b,0xac47, +0xac53,0xac5f,0xac6b,0xac76,0xac82,0xac8e,0xac9a,0xaca6, +0xacb2,0xacbe,0xacc9,0xacd5,0xace1,0xaced,0xacf9,0xad05, +0xad11,0xad1c,0xad28,0xad34,0xad40,0xad4c,0xad57,0xad63, +0xad6f,0xad7b,0xad87,0xad92,0xad9e,0xadaa,0xadb6,0xadc2, +0xadcd,0xadd9,0xade5,0xadf1,0xadfd,0xae08,0xae14,0xae20, +0xae2c,0xae37,0xae43,0xae4f,0xae5b,0xae66,0xae72,0xae7e, +0xae8a,0xae95,0xaea1,0xaead,0xaeb8,0xaec4,0xaed0,0xaedc, +0xaee7,0xaef3,0xaeff,0xaf0a,0xaf16,0xaf22,0xaf2e,0xaf39, +0xaf45,0xaf51,0xaf5c,0xaf68,0xaf74,0xaf7f,0xaf8b,0xaf97, +0xafa2,0xafae,0xafba,0xafc5,0xafd1,0xafdd,0xafe8,0xaff4, +0xb000,0xb00b,0xb017,0xb022,0xb02e,0xb03a,0xb045,0xb051, +0xb05c,0xb068,0xb074,0xb07f,0xb08b,0xb097,0xb0a2,0xb0ae, +0xb0b9,0xb0c5,0xb0d0,0xb0dc,0xb0e8,0xb0f3,0xb0ff,0xb10a, +0xb116,0xb121,0xb12d,0xb139,0xb144,0xb150,0xb15b,0xb167, +0xb172,0xb17e,0xb189,0xb195,0xb1a0,0xb1ac,0xb1b8,0xb1c3, +0xb1cf,0xb1da,0xb1e6,0xb1f1,0xb1fd,0xb208,0xb214,0xb21f, +0xb22b,0xb236,0xb242,0xb24d,0xb259,0xb264,0xb270,0xb27b, +0xb286,0xb292,0xb29d,0xb2a9,0xb2b4,0xb2c0,0xb2cb,0xb2d7, +0xb2e2,0xb2ee,0xb2f9,0xb305,0xb310,0xb31b,0xb327,0xb332, +0xb33e,0xb349,0xb355,0xb360,0xb36b,0xb377,0xb382,0xb38e, +0xb399,0xb3a4,0xb3b0,0xb3bb,0xb3c7,0xb3d2,0xb3dd,0xb3e9, +0xb3f4,0xb400,0xb40b,0xb416,0xb422,0xb42d,0xb438,0xb444, +0xb44f,0xb45a,0xb466,0xb471,0xb47c,0xb488,0xb493,0xb49f, +0xb4aa,0xb4b5,0xb4c1,0xb4cc,0xb4d7,0xb4e2,0xb4ee,0xb4f9, +0xb504,0xb510,0xb51b,0xb526,0xb532,0xb53d,0xb548,0xb554, +0xb55f,0xb56a,0xb575,0xb581,0xb58c,0xb597,0xb5a3,0xb5ae, +0xb5b9,0xb5c4,0xb5d0,0xb5db,0xb5e6,0xb5f1,0xb5fd,0xb608, +0xb613,0xb61e,0xb62a,0xb635,0xb640,0xb64b,0xb657,0xb662, +0xb66d,0xb678,0xb684,0xb68f,0xb69a,0xb6a5,0xb6b0,0xb6bc, +0xb6c7,0xb6d2,0xb6dd,0xb6e8,0xb6f4,0xb6ff,0xb70a,0xb715, +0xb720,0xb72c,0xb737,0xb742,0xb74d,0xb758,0xb763,0xb76f, +0xb77a,0xb785,0xb790,0xb79b,0xb7a6,0xb7b2,0xb7bd,0xb7c8, +0xb7d3,0xb7de,0xb7e9,0xb7f4,0xb800,0xb80b,0xb816,0xb821, +0xb82c,0xb837,0xb842,0xb84d,0xb858,0xb864,0xb86f,0xb87a, +0xb885,0xb890,0xb89b,0xb8a6,0xb8b1,0xb8bc,0xb8c7,0xb8d3, +0xb8de,0xb8e9,0xb8f4,0xb8ff,0xb90a,0xb915,0xb920,0xb92b, +0xb936,0xb941,0xb94c,0xb957,0xb962,0xb96d,0xb978,0xb983, +0xb98f,0xb99a,0xb9a5,0xb9b0,0xb9bb,0xb9c6,0xb9d1,0xb9dc, +0xb9e7,0xb9f2,0xb9fd,0xba08,0xba13,0xba1e,0xba29,0xba34, +0xba3f,0xba4a,0xba55,0xba60,0xba6b,0xba76,0xba81,0xba8c, +0xba97,0xbaa2,0xbaad,0xbab8,0xbac3,0xbace,0xbad8,0xbae3, +0xbaee,0xbaf9,0xbb04,0xbb0f,0xbb1a,0xbb25,0xbb30,0xbb3b, +0xbb46,0xbb51,0xbb5c,0xbb67,0xbb72,0xbb7d,0xbb88,0xbb92, +0xbb9d,0xbba8,0xbbb3,0xbbbe,0xbbc9,0xbbd4,0xbbdf,0xbbea, +0xbbf5,0xbc00,0xbc0a,0xbc15,0xbc20,0xbc2b,0xbc36,0xbc41, +0xbc4c,0xbc57,0xbc61,0xbc6c,0xbc77,0xbc82,0xbc8d,0xbc98, +0xbca3,0xbcad,0xbcb8,0xbcc3,0xbcce,0xbcd9,0xbce4,0xbcef, +0xbcf9,0xbd04,0xbd0f,0xbd1a,0xbd25,0xbd30,0xbd3a,0xbd45, +0xbd50,0xbd5b,0xbd66,0xbd70,0xbd7b,0xbd86,0xbd91,0xbd9c, +0xbda6,0xbdb1,0xbdbc,0xbdc7,0xbdd2,0xbddc,0xbde7,0xbdf2, +0xbdfd,0xbe08,0xbe12,0xbe1d,0xbe28,0xbe33,0xbe3d,0xbe48, +0xbe53,0xbe5e,0xbe68,0xbe73,0xbe7e,0xbe89,0xbe93,0xbe9e, +0xbea9,0xbeb4,0xbebe,0xbec9,0xbed4,0xbedf,0xbee9,0xbef4, +0xbeff,0xbf0a,0xbf14,0xbf1f,0xbf2a,0xbf34,0xbf3f,0xbf4a, +0xbf55,0xbf5f,0xbf6a,0xbf75,0xbf7f,0xbf8a,0xbf95,0xbf9f, +0xbfaa,0xbfb5,0xbfbf,0xbfca,0xbfd5,0xbfdf,0xbfea,0xbff5, +0xc000,0xc00a,0xc015,0xc01f,0xc02a,0xc035,0xc03f,0xc04a, +0xc055,0xc05f,0xc06a,0xc075,0xc07f,0xc08a,0xc095,0xc09f, +0xc0aa,0xc0b5,0xc0bf,0xc0ca,0xc0d4,0xc0df,0xc0ea,0xc0f4, +0xc0ff,0xc109,0xc114,0xc11f,0xc129,0xc134,0xc13e,0xc149, +0xc154,0xc15e,0xc169,0xc173,0xc17e,0xc189,0xc193,0xc19e, +0xc1a8,0xc1b3,0xc1bd,0xc1c8,0xc1d3,0xc1dd,0xc1e8,0xc1f2, +0xc1fd,0xc207,0xc212,0xc21d,0xc227,0xc232,0xc23c,0xc247, +0xc251,0xc25c,0xc266,0xc271,0xc27b,0xc286,0xc290,0xc29b, +0xc2a5,0xc2b0,0xc2bb,0xc2c5,0xc2d0,0xc2da,0xc2e5,0xc2ef, +0xc2fa,0xc304,0xc30f,0xc319,0xc324,0xc32e,0xc339,0xc343, +0xc34e,0xc358,0xc363,0xc36d,0xc377,0xc382,0xc38c,0xc397, +0xc3a1,0xc3ac,0xc3b6,0xc3c1,0xc3cb,0xc3d6,0xc3e0,0xc3eb, +0xc3f5,0xc400,0xc40a,0xc414,0xc41f,0xc429,0xc434,0xc43e, +0xc449,0xc453,0xc45d,0xc468,0xc472,0xc47d,0xc487,0xc492, +0xc49c,0xc4a6,0xc4b1,0xc4bb,0xc4c6,0xc4d0,0xc4da,0xc4e5, +0xc4ef,0xc4fa,0xc504,0xc50e,0xc519,0xc523,0xc52e,0xc538, +0xc542,0xc54d,0xc557,0xc562,0xc56c,0xc576,0xc581,0xc58b, +0xc595,0xc5a0,0xc5aa,0xc5b4,0xc5bf,0xc5c9,0xc5d4,0xc5de, +0xc5e8,0xc5f3,0xc5fd,0xc607,0xc612,0xc61c,0xc626,0xc631, +0xc63b,0xc645,0xc650,0xc65a,0xc664,0xc66f,0xc679,0xc683, +0xc68e,0xc698,0xc6a2,0xc6ac,0xc6b7,0xc6c1,0xc6cb,0xc6d6, +0xc6e0,0xc6ea,0xc6f5,0xc6ff,0xc709,0xc713,0xc71e,0xc728, +0xc732,0xc73d,0xc747,0xc751,0xc75b,0xc766,0xc770,0xc77a, +0xc784,0xc78f,0xc799,0xc7a3,0xc7ae,0xc7b8,0xc7c2,0xc7cc, +0xc7d7,0xc7e1,0xc7eb,0xc7f5,0xc800,0xc80a,0xc814,0xc81e, +0xc828,0xc833,0xc83d,0xc847,0xc851,0xc85c,0xc866,0xc870, +0xc87a,0xc884,0xc88f,0xc899,0xc8a3,0xc8ad,0xc8b7,0xc8c2, +0xc8cc,0xc8d6,0xc8e0,0xc8ea,0xc8f5,0xc8ff,0xc909,0xc913, +0xc91d,0xc928,0xc932,0xc93c,0xc946,0xc950,0xc95a,0xc965, +0xc96f,0xc979,0xc983,0xc98d,0xc997,0xc9a2,0xc9ac,0xc9b6, +0xc9c0,0xc9ca,0xc9d4,0xc9df,0xc9e9,0xc9f3,0xc9fd,0xca07, +0xca11,0xca1b,0xca26,0xca30,0xca3a,0xca44,0xca4e,0xca58, +0xca62,0xca6c,0xca76,0xca81,0xca8b,0xca95,0xca9f,0xcaa9, +0xcab3,0xcabd,0xcac7,0xcad1,0xcadc,0xcae6,0xcaf0,0xcafa, +0xcb04,0xcb0e,0xcb18,0xcb22,0xcb2c,0xcb36,0xcb40,0xcb4a, +0xcb55,0xcb5f,0xcb69,0xcb73,0xcb7d,0xcb87,0xcb91,0xcb9b, +0xcba5,0xcbaf,0xcbb9,0xcbc3,0xcbcd,0xcbd7,0xcbe1,0xcbeb, +0xcbf5,0xcc00,0xcc0a,0xcc14,0xcc1e,0xcc28,0xcc32,0xcc3c, +0xcc46,0xcc50,0xcc5a,0xcc64,0xcc6e,0xcc78,0xcc82,0xcc8c, +0xcc96,0xcca0,0xccaa,0xccb4,0xccbe,0xccc8,0xccd2,0xccdc, +0xcce6,0xccf0,0xccfa,0xcd04,0xcd0e,0xcd18,0xcd22,0xcd2c, +0xcd36,0xcd40,0xcd4a,0xcd54,0xcd5e,0xcd68,0xcd72,0xcd7c, +0xcd86,0xcd90,0xcd99,0xcda3,0xcdad,0xcdb7,0xcdc1,0xcdcb, +0xcdd5,0xcddf,0xcde9,0xcdf3,0xcdfd,0xce07,0xce11,0xce1b, +0xce25,0xce2f,0xce39,0xce43,0xce4c,0xce56,0xce60,0xce6a, +0xce74,0xce7e,0xce88,0xce92,0xce9c,0xcea6,0xceb0,0xceba, +0xcec3,0xcecd,0xced7,0xcee1,0xceeb,0xcef5,0xceff,0xcf09, +0xcf13,0xcf1d,0xcf26,0xcf30,0xcf3a,0xcf44,0xcf4e,0xcf58, +0xcf62,0xcf6c,0xcf75,0xcf7f,0xcf89,0xcf93,0xcf9d,0xcfa7, +0xcfb1,0xcfbb,0xcfc4,0xcfce,0xcfd8,0xcfe2,0xcfec,0xcff6, +0xd000,0xd009,0xd013,0xd01d,0xd027,0xd031,0xd03b,0xd044, +0xd04e,0xd058,0xd062,0xd06c,0xd076,0xd07f,0xd089,0xd093, +0xd09d,0xd0a7,0xd0b0,0xd0ba,0xd0c4,0xd0ce,0xd0d8,0xd0e1, +0xd0eb,0xd0f5,0xd0ff,0xd109,0xd112,0xd11c,0xd126,0xd130, +0xd13a,0xd143,0xd14d,0xd157,0xd161,0xd16b,0xd174,0xd17e, +0xd188,0xd192,0xd19b,0xd1a5,0xd1af,0xd1b9,0xd1c3,0xd1cc, +0xd1d6,0xd1e0,0xd1ea,0xd1f3,0xd1fd,0xd207,0xd211,0xd21a, +0xd224,0xd22e,0xd238,0xd241,0xd24b,0xd255,0xd25f,0xd268, +0xd272,0xd27c,0xd285,0xd28f,0xd299,0xd2a3,0xd2ac,0xd2b6, +0xd2c0,0xd2c9,0xd2d3,0xd2dd,0xd2e7,0xd2f0,0xd2fa,0xd304, +0xd30d,0xd317,0xd321,0xd32b,0xd334,0xd33e,0xd348,0xd351, +0xd35b,0xd365,0xd36e,0xd378,0xd382,0xd38b,0xd395,0xd39f, +0xd3a8,0xd3b2,0xd3bc,0xd3c6,0xd3cf,0xd3d9,0xd3e3,0xd3ec, +0xd3f6,0xd400,0xd409,0xd413,0xd41c,0xd426,0xd430,0xd439, +0xd443,0xd44d,0xd456,0xd460,0xd46a,0xd473,0xd47d,0xd487, +0xd490,0xd49a,0xd4a3,0xd4ad,0xd4b7,0xd4c0,0xd4ca,0xd4d4, +0xd4dd,0xd4e7,0xd4f0,0xd4fa,0xd504,0xd50d,0xd517,0xd521, +0xd52a,0xd534,0xd53d,0xd547,0xd551,0xd55a,0xd564,0xd56d, +0xd577,0xd581,0xd58a,0xd594,0xd59d,0xd5a7,0xd5b0,0xd5ba, +0xd5c4,0xd5cd,0xd5d7,0xd5e0,0xd5ea,0xd5f4,0xd5fd,0xd607, +0xd610,0xd61a,0xd623,0xd62d,0xd637,0xd640,0xd64a,0xd653, +0xd65d,0xd666,0xd670,0xd679,0xd683,0xd68c,0xd696,0xd6a0, +0xd6a9,0xd6b3,0xd6bc,0xd6c6,0xd6cf,0xd6d9,0xd6e2,0xd6ec, +0xd6f5,0xd6ff,0xd708,0xd712,0xd71b,0xd725,0xd72f,0xd738, +0xd742,0xd74b,0xd755,0xd75e,0xd768,0xd771,0xd77b,0xd784, +0xd78e,0xd797,0xd7a1,0xd7aa,0xd7b4,0xd7bd,0xd7c7,0xd7d0, +0xd7da,0xd7e3,0xd7ed,0xd7f6,0xd800,0xd809,0xd812,0xd81c, +0xd825,0xd82f,0xd838,0xd842,0xd84b,0xd855,0xd85e,0xd868, +0xd871,0xd87b,0xd884,0xd88e,0xd897,0xd8a0,0xd8aa,0xd8b3, +0xd8bd,0xd8c6,0xd8d0,0xd8d9,0xd8e3,0xd8ec,0xd8f5,0xd8ff, +0xd908,0xd912,0xd91b,0xd925,0xd92e,0xd938,0xd941,0xd94a, +0xd954,0xd95d,0xd967,0xd970,0xd979,0xd983,0xd98c,0xd996, +0xd99f,0xd9a9,0xd9b2,0xd9bb,0xd9c5,0xd9ce,0xd9d8,0xd9e1, +0xd9ea,0xd9f4,0xd9fd,0xda07,0xda10,0xda19,0xda23,0xda2c, +0xda35,0xda3f,0xda48,0xda52,0xda5b,0xda64,0xda6e,0xda77, +0xda81,0xda8a,0xda93,0xda9d,0xdaa6,0xdaaf,0xdab9,0xdac2, +0xdacb,0xdad5,0xdade,0xdae8,0xdaf1,0xdafa,0xdb04,0xdb0d, +0xdb16,0xdb20,0xdb29,0xdb32,0xdb3c,0xdb45,0xdb4e,0xdb58, +0xdb61,0xdb6a,0xdb74,0xdb7d,0xdb86,0xdb90,0xdb99,0xdba2, +0xdbac,0xdbb5,0xdbbe,0xdbc8,0xdbd1,0xdbda,0xdbe4,0xdbed, +0xdbf6,0xdc00,0xdc09,0xdc12,0xdc1b,0xdc25,0xdc2e,0xdc37, +0xdc41,0xdc4a,0xdc53,0xdc5d,0xdc66,0xdc6f,0xdc78,0xdc82, +0xdc8b,0xdc94,0xdc9e,0xdca7,0xdcb0,0xdcb9,0xdcc3,0xdccc, +0xdcd5,0xdcde,0xdce8,0xdcf1,0xdcfa,0xdd04,0xdd0d,0xdd16, +0xdd1f,0xdd29,0xdd32,0xdd3b,0xdd44,0xdd4e,0xdd57,0xdd60, +0xdd69,0xdd73,0xdd7c,0xdd85,0xdd8e,0xdd98,0xdda1,0xddaa, +0xddb3,0xddbd,0xddc6,0xddcf,0xddd8,0xdde2,0xddeb,0xddf4, +0xddfd,0xde06,0xde10,0xde19,0xde22,0xde2b,0xde35,0xde3e, +0xde47,0xde50,0xde59,0xde63,0xde6c,0xde75,0xde7e,0xde87, +0xde91,0xde9a,0xdea3,0xdeac,0xdeb5,0xdebf,0xdec8,0xded1, +0xdeda,0xdee3,0xdeed,0xdef6,0xdeff,0xdf08,0xdf11,0xdf1a, +0xdf24,0xdf2d,0xdf36,0xdf3f,0xdf48,0xdf52,0xdf5b,0xdf64, +0xdf6d,0xdf76,0xdf7f,0xdf89,0xdf92,0xdf9b,0xdfa4,0xdfad, +0xdfb6,0xdfbf,0xdfc9,0xdfd2,0xdfdb,0xdfe4,0xdfed,0xdff6, +0xe000,0xe009,0xe012,0xe01b,0xe024,0xe02d,0xe036,0xe03f, +0xe049,0xe052,0xe05b,0xe064,0xe06d,0xe076,0xe07f,0xe088, +0xe092,0xe09b,0xe0a4,0xe0ad,0xe0b6,0xe0bf,0xe0c8,0xe0d1, +0xe0db,0xe0e4,0xe0ed,0xe0f6,0xe0ff,0xe108,0xe111,0xe11a, +0xe123,0xe12c,0xe136,0xe13f,0xe148,0xe151,0xe15a,0xe163, +0xe16c,0xe175,0xe17e,0xe187,0xe190,0xe199,0xe1a3,0xe1ac, +0xe1b5,0xe1be,0xe1c7,0xe1d0,0xe1d9,0xe1e2,0xe1eb,0xe1f4, +0xe1fd,0xe206,0xe20f,0xe218,0xe221,0xe22b,0xe234,0xe23d, +0xe246,0xe24f,0xe258,0xe261,0xe26a,0xe273,0xe27c,0xe285, +0xe28e,0xe297,0xe2a0,0xe2a9,0xe2b2,0xe2bb,0xe2c4,0xe2cd, +0xe2d6,0xe2df,0xe2e8,0xe2f1,0xe2fa,0xe303,0xe30c,0xe315, +0xe31f,0xe328,0xe331,0xe33a,0xe343,0xe34c,0xe355,0xe35e, +0xe367,0xe370,0xe379,0xe382,0xe38b,0xe394,0xe39d,0xe3a6, +0xe3af,0xe3b8,0xe3c1,0xe3ca,0xe3d3,0xe3dc,0xe3e5,0xe3ee, +0xe3f7,0xe400,0xe408,0xe411,0xe41a,0xe423,0xe42c,0xe435, +0xe43e,0xe447,0xe450,0xe459,0xe462,0xe46b,0xe474,0xe47d, +0xe486,0xe48f,0xe498,0xe4a1,0xe4aa,0xe4b3,0xe4bc,0xe4c5, +0xe4ce,0xe4d7,0xe4e0,0xe4e9,0xe4f2,0xe4fa,0xe503,0xe50c, +0xe515,0xe51e,0xe527,0xe530,0xe539,0xe542,0xe54b,0xe554, +0xe55d,0xe566,0xe56f,0xe578,0xe580,0xe589,0xe592,0xe59b, +0xe5a4,0xe5ad,0xe5b6,0xe5bf,0xe5c8,0xe5d1,0xe5da,0xe5e3, +0xe5eb,0xe5f4,0xe5fd,0xe606,0xe60f,0xe618,0xe621,0xe62a, +0xe633,0xe63c,0xe644,0xe64d,0xe656,0xe65f,0xe668,0xe671, +0xe67a,0xe683,0xe68c,0xe694,0xe69d,0xe6a6,0xe6af,0xe6b8, +0xe6c1,0xe6ca,0xe6d3,0xe6db,0xe6e4,0xe6ed,0xe6f6,0xe6ff, +0xe708,0xe711,0xe71a,0xe722,0xe72b,0xe734,0xe73d,0xe746, +0xe74f,0xe758,0xe760,0xe769,0xe772,0xe77b,0xe784,0xe78d, +0xe795,0xe79e,0xe7a7,0xe7b0,0xe7b9,0xe7c2,0xe7cb,0xe7d3, +0xe7dc,0xe7e5,0xe7ee,0xe7f7,0xe800,0xe808,0xe811,0xe81a, +0xe823,0xe82c,0xe834,0xe83d,0xe846,0xe84f,0xe858,0xe861, +0xe869,0xe872,0xe87b,0xe884,0xe88d,0xe895,0xe89e,0xe8a7, +0xe8b0,0xe8b9,0xe8c1,0xe8ca,0xe8d3,0xe8dc,0xe8e5,0xe8ed, +0xe8f6,0xe8ff,0xe908,0xe911,0xe919,0xe922,0xe92b,0xe934, +0xe93c,0xe945,0xe94e,0xe957,0xe960,0xe968,0xe971,0xe97a, +0xe983,0xe98b,0xe994,0xe99d,0xe9a6,0xe9ae,0xe9b7,0xe9c0, +0xe9c9,0xe9d2,0xe9da,0xe9e3,0xe9ec,0xe9f5,0xe9fd,0xea06, +0xea0f,0xea18,0xea20,0xea29,0xea32,0xea3b,0xea43,0xea4c, +0xea55,0xea5e,0xea66,0xea6f,0xea78,0xea80,0xea89,0xea92, +0xea9b,0xeaa3,0xeaac,0xeab5,0xeabe,0xeac6,0xeacf,0xead8, +0xeae0,0xeae9,0xeaf2,0xeafb,0xeb03,0xeb0c,0xeb15,0xeb1d, +0xeb26,0xeb2f,0xeb38,0xeb40,0xeb49,0xeb52,0xeb5a,0xeb63, +0xeb6c,0xeb74,0xeb7d,0xeb86,0xeb8f,0xeb97,0xeba0,0xeba9, +0xebb1,0xebba,0xebc3,0xebcb,0xebd4,0xebdd,0xebe5,0xebee, +0xebf7,0xec00,0xec08,0xec11,0xec1a,0xec22,0xec2b,0xec34, +0xec3c,0xec45,0xec4e,0xec56,0xec5f,0xec68,0xec70,0xec79, +0xec82,0xec8a,0xec93,0xec9c,0xeca4,0xecad,0xecb5,0xecbe, +0xecc7,0xeccf,0xecd8,0xece1,0xece9,0xecf2,0xecfb,0xed03, +0xed0c,0xed15,0xed1d,0xed26,0xed2e,0xed37,0xed40,0xed48, +0xed51,0xed5a,0xed62,0xed6b,0xed74,0xed7c,0xed85,0xed8d, +0xed96,0xed9f,0xeda7,0xedb0,0xedb8,0xedc1,0xedca,0xedd2, +0xeddb,0xede4,0xedec,0xedf5,0xedfd,0xee06,0xee0f,0xee17, +0xee20,0xee28,0xee31,0xee3a,0xee42,0xee4b,0xee53,0xee5c, +0xee65,0xee6d,0xee76,0xee7e,0xee87,0xee8f,0xee98,0xeea1, +0xeea9,0xeeb2,0xeeba,0xeec3,0xeecc,0xeed4,0xeedd,0xeee5, +0xeeee,0xeef6,0xeeff,0xef08,0xef10,0xef19,0xef21,0xef2a, +0xef32,0xef3b,0xef43,0xef4c,0xef55,0xef5d,0xef66,0xef6e, +0xef77,0xef7f,0xef88,0xef90,0xef99,0xefa2,0xefaa,0xefb3, +0xefbb,0xefc4,0xefcc,0xefd5,0xefdd,0xefe6,0xefee,0xeff7, +0xf000,0xf008,0xf011,0xf019,0xf022,0xf02a,0xf033,0xf03b, +0xf044,0xf04c,0xf055,0xf05d,0xf066,0xf06e,0xf077,0xf07f, +0xf088,0xf090,0xf099,0xf0a1,0xf0aa,0xf0b2,0xf0bb,0xf0c3, +0xf0cc,0xf0d4,0xf0dd,0xf0e5,0xf0ee,0xf0f6,0xf0ff,0xf107, +0xf110,0xf118,0xf121,0xf129,0xf132,0xf13a,0xf143,0xf14b, +0xf154,0xf15c,0xf165,0xf16d,0xf176,0xf17e,0xf187,0xf18f, +0xf198,0xf1a0,0xf1a9,0xf1b1,0xf1ba,0xf1c2,0xf1cb,0xf1d3, +0xf1dc,0xf1e4,0xf1ec,0xf1f5,0xf1fd,0xf206,0xf20e,0xf217, +0xf21f,0xf228,0xf230,0xf239,0xf241,0xf24a,0xf252,0xf25a, +0xf263,0xf26b,0xf274,0xf27c,0xf285,0xf28d,0xf296,0xf29e, +0xf2a6,0xf2af,0xf2b7,0xf2c0,0xf2c8,0xf2d1,0xf2d9,0xf2e1, +0xf2ea,0xf2f2,0xf2fb,0xf303,0xf30c,0xf314,0xf31c,0xf325, +0xf32d,0xf336,0xf33e,0xf347,0xf34f,0xf357,0xf360,0xf368, +0xf371,0xf379,0xf381,0xf38a,0xf392,0xf39b,0xf3a3,0xf3ac, +0xf3b4,0xf3bc,0xf3c5,0xf3cd,0xf3d6,0xf3de,0xf3e6,0xf3ef, +0xf3f7,0xf400,0xf408,0xf410,0xf419,0xf421,0xf429,0xf432, +0xf43a,0xf443,0xf44b,0xf453,0xf45c,0xf464,0xf46d,0xf475, +0xf47d,0xf486,0xf48e,0xf496,0xf49f,0xf4a7,0xf4b0,0xf4b8, +0xf4c0,0xf4c9,0xf4d1,0xf4d9,0xf4e2,0xf4ea,0xf4f2,0xf4fb, +0xf503,0xf50c,0xf514,0xf51c,0xf525,0xf52d,0xf535,0xf53e, +0xf546,0xf54e,0xf557,0xf55f,0xf567,0xf570,0xf578,0xf580, +0xf589,0xf591,0xf599,0xf5a2,0xf5aa,0xf5b2,0xf5bb,0xf5c3, +0xf5cb,0xf5d4,0xf5dc,0xf5e4,0xf5ed,0xf5f5,0xf5fd,0xf606, +0xf60e,0xf616,0xf61f,0xf627,0xf62f,0xf638,0xf640,0xf648, +0xf651,0xf659,0xf661,0xf66a,0xf672,0xf67a,0xf682,0xf68b, +0xf693,0xf69b,0xf6a4,0xf6ac,0xf6b4,0xf6bd,0xf6c5,0xf6cd, +0xf6d6,0xf6de,0xf6e6,0xf6ee,0xf6f7,0xf6ff,0xf707,0xf710, +0xf718,0xf720,0xf728,0xf731,0xf739,0xf741,0xf74a,0xf752, +0xf75a,0xf762,0xf76b,0xf773,0xf77b,0xf784,0xf78c,0xf794, +0xf79c,0xf7a5,0xf7ad,0xf7b5,0xf7bd,0xf7c6,0xf7ce,0xf7d6, +0xf7de,0xf7e7,0xf7ef,0xf7f7,0xf800,0xf808,0xf810,0xf818, +0xf821,0xf829,0xf831,0xf839,0xf842,0xf84a,0xf852,0xf85a, +0xf863,0xf86b,0xf873,0xf87b,0xf883,0xf88c,0xf894,0xf89c, +0xf8a4,0xf8ad,0xf8b5,0xf8bd,0xf8c5,0xf8ce,0xf8d6,0xf8de, +0xf8e6,0xf8ef,0xf8f7,0xf8ff,0xf907,0xf90f,0xf918,0xf920, +0xf928,0xf930,0xf939,0xf941,0xf949,0xf951,0xf959,0xf962, +0xf96a,0xf972,0xf97a,0xf982,0xf98b,0xf993,0xf99b,0xf9a3, +0xf9ab,0xf9b4,0xf9bc,0xf9c4,0xf9cc,0xf9d4,0xf9dd,0xf9e5, +0xf9ed,0xf9f5,0xf9fd,0xfa06,0xfa0e,0xfa16,0xfa1e,0xfa26, +0xfa2f,0xfa37,0xfa3f,0xfa47,0xfa4f,0xfa58,0xfa60,0xfa68, +0xfa70,0xfa78,0xfa80,0xfa89,0xfa91,0xfa99,0xfaa1,0xfaa9, +0xfab1,0xfaba,0xfac2,0xfaca,0xfad2,0xfada,0xfae2,0xfaeb, +0xfaf3,0xfafb,0xfb03,0xfb0b,0xfb13,0xfb1c,0xfb24,0xfb2c, +0xfb34,0xfb3c,0xfb44,0xfb4c,0xfb55,0xfb5d,0xfb65,0xfb6d, +0xfb75,0xfb7d,0xfb85,0xfb8e,0xfb96,0xfb9e,0xfba6,0xfbae, +0xfbb6,0xfbbe,0xfbc7,0xfbcf,0xfbd7,0xfbdf,0xfbe7,0xfbef, +0xfbf7,0xfc00,0xfc08,0xfc10,0xfc18,0xfc20,0xfc28,0xfc30, +0xfc38,0xfc40,0xfc49,0xfc51,0xfc59,0xfc61,0xfc69,0xfc71, +0xfc79,0xfc81,0xfc8a,0xfc92,0xfc9a,0xfca2,0xfcaa,0xfcb2, +0xfcba,0xfcc2,0xfcca,0xfcd2,0xfcdb,0xfce3,0xfceb,0xfcf3, +0xfcfb,0xfd03,0xfd0b,0xfd13,0xfd1b,0xfd23,0xfd2c,0xfd34, +0xfd3c,0xfd44,0xfd4c,0xfd54,0xfd5c,0xfd64,0xfd6c,0xfd74, +0xfd7c,0xfd84,0xfd8d,0xfd95,0xfd9d,0xfda5,0xfdad,0xfdb5, +0xfdbd,0xfdc5,0xfdcd,0xfdd5,0xfddd,0xfde5,0xfded,0xfdf5, +0xfdfd,0xfe06,0xfe0e,0xfe16,0xfe1e,0xfe26,0xfe2e,0xfe36, +0xfe3e,0xfe46,0xfe4e,0xfe56,0xfe5e,0xfe66,0xfe6e,0xfe76, +0xfe7e,0xfe86,0xfe8e,0xfe97,0xfe9f,0xfea7,0xfeaf,0xfeb7, +0xfebf,0xfec7,0xfecf,0xfed7,0xfedf,0xfee7,0xfeef,0xfef7, +0xfeff,0xff07,0xff0f,0xff17,0xff1f,0xff27,0xff2f,0xff37, +0xff3f,0xff47,0xff4f,0xff57,0xff5f,0xff67,0xff6f,0xff77, +0xff7f,0xff87,0xff8f,0xff97,0xff9f,0xffa7,0xffaf,0xffb7, +0xffbf,0xffc7,0xffcf,0xffd7,0xffdf,0xffe7,0xffef,0xfff7}; + +const signed short wavtable1[2304]={ +0x021d,0x03bc,0x0300,0xfc0d,0xfcd5,0xfd33,0xfdc5,0xfc83, +0xfdc0,0x036d,0x0245,0x0238,0xfc1b,0xfc31,0xfd7a,0xfd10, +0xfd6b,0xfd88,0x02a3,0x0313,0x027b,0xfdf9,0xfcba,0xfc2f, +0xfc86,0xfda3,0xfceb,0x0270,0x02dc,0x029c,0xfc83,0xfcd1, +0xfc44,0xfd06,0xfdf5,0xfc97,0x026f,0x0347,0x02b9,0xfc02, +0xfcaf,0xfdc5,0xfd09,0xfd50,0xfc4b,0x0280,0x02b5,0x03df, +0xfc9d,0xfd95,0xfd61,0xfce0,0xfc54,0xfc41,0x039d,0x02af, +0x0260,0xfd93,0xfddb,0xfccf,0xfcbb,0xfc64,0xfd2e,0x0228, +0x031d,0x023c,0xfca3,0xfd97,0xfc84,0xfdac,0xfd93,0xfd80, +0x0217,0x0340,0x031f,0xfc99,0xfcbc,0xfd77,0xfdd0,0xfd5c, +0xfd90,0x02fa,0x025d,0x0241,0xfc7a,0xfca5,0xfd56,0xfdc8, +0xfd34,0xfd76,0x0340,0x0231,0x03eb,0xfc6f,0xfcd1,0xfdda, +0xfd5c,0xfd98,0xfc2a,0x024e,0x02af,0x024c,0xfce7,0xfd59, +0xfcea,0xfd57,0xfc65,0xfd5b,0x0286,0x0385,0x02dc,0xfdc7, +0xfc64,0xfd7b,0xfcd0,0xfce6,0xfdf4,0x033c,0x02b1,0x0380, +0xfdd3,0xfd2b,0xfda5,0xfd62,0xfc61,0xfcf0,0x036b,0x0270, +0x0350,0xfdeb,0xfd2b,0xfdfc,0xfd14,0xfd08,0xfd42,0x023b, +0x03ae,0x03fe,0xfdf2,0xfdc6,0xfc53,0xfd82,0xfc9c,0xfc04, +0x0338,0x02e0,0x0283,0xfdaf,0xfdfb,0xfc63,0xfd69,0xfdee, +0xfcd8,0x0205,0x02fd,0x0200,0xfcfa,0xfdfa,0xfd01,0xfdf5, +0xfdc4,0xfdff,0x0232,0x038c,0x02f9,0xfc1b,0xfcbc,0xfd5d, +0xfd97,0xfcdb,0xfdca,0x02b6,0x0391,0x02a3,0xfd95,0xfc6c, +0xfda5,0xfc53,0xfcd1,0xfc85,0x02c0,0x020c,0x02a0,0xfd2e, +0xfc63,0xfd4f,0xfc37,0xfde6,0xfc8d,0x02d1,0x02f5,0x022e, +0xfdea,0xfcee,0xfcc6,0xfc06,0xfdcf,0xfda0,0x0374,0x0227, +0x0279,0xfc49,0xfdde,0xfd57,0xfd05,0xfdb0,0xfcf0,0x022e, +0x03ef,0x034e,0xfddb,0xfc65,0xfcc0,0xfda0,0xfc21,0xfd45, +0x03a4,0x02ea,0x0309,0xfd59,0xfd3d,0xfdca,0xfcaf,0xfde0, +0xfdb3,0x0236,0x0336,0x039e,0xfc72,0xfdff,0xfd18,0xfd8d, +0xfd6d,0xfcb9,0x0265,0x0303,0x0263,0xfc64,0xfd25,0xfc67, +0xfd23,0xfdbb,0xfd27,0x02e1,0x029f,0x03f0,0xfc39,0xfd2a, +0xfd6b,0xfded,0xfc90,0xfc1f,0x028b,0x0252,0x0243,0xfd0b, +0xfd1f,0xfd5f,0xfcc2,0xfd4d,0xfd71,0x0321,0x027c,0x0234, +0xfc1c,0xfc8d,0xfd42,0xfd8e,0xfce8,0xfd92,0x0354,0x038e, +0x02cf,0xfd0b,0xfda9,0xfd81,0xfd3b,0xfcd7,0xfc0c,0x03e6, +0x0266,0x023f,0xfda9,0xfdcf,0xfd4d,0xfc32,0xfd1f,0xfd79, +0x0299,0x03a7,0x0274,0xfda1,0xfcd0,0xfdc2,0xfca1,0xfcaa, +0xfcfd,0x0277,0x0254,0x033d,0xfd21,0xfc01,0xfc3a,0xfcf6, +0xfd4a,0xfd60,0x0284,0x039e,0x020e,0xfdb9,0xfd69,0xfc47, +0xfcd5,0xfcba,0xfde2,0x036f,0x03dc,0x0265,0xfcb0,0xfdf2, +0xfdb0,0xfd0d,0xfc47,0xfd22,0x03ad,0x02b4,0x02b5,0xfd83, +0xfd82,0xfc55,0xfc9e,0xfc57,0xfc54,0x0235,0x02a0,0x0240, +0xfd1a,0xfd83,0xfd0b,0xfd8f,0xfc8e,0xfd77,0x0223,0x0274, +0x02e4,0xfd61,0xfce9,0xfc73,0xfdb7,0xfcfd,0xfde9,0x027f, +0x0214,0x0219,0xfd67,0xfd61,0xfdd1,0xfce2,0xfdd6,0xfdcc, +0x03bb,0x025c,0x0256,0xfdcc,0xfdd2,0xfd3e,0xfc85,0xfd36, +0xfd45,0x0232,0x0244,0x0384,0xfd83,0xfc23,0xfc03,0xfd97, +0xfd6e,0xfce9,0x025b,0x0383,0x026d,0xfdee,0xfd23,0xfddf, +0xfd38,0xfceb,0xfd0d,0x02ea,0x0215,0x0270,0xfcf8,0xfc73, +0xfd76,0xfde1,0xfdd5,0xfd07,0x02d9,0x0202,0x02df,0xfd23, +0xfdf5,0xfd1d,0xfdf9,0xfdfb,0xfdf0,0x0355,0x0227,0x02b4, +0xfc69,0xfdbf,0xfd17,0xfd39,0xfdaf,0xfc58,0x03b5,0x03fa, +0x03ec,0xfc50,0xfc5d,0xfc19,0xfc90,0xfc0b,0xfc27,0x0220, +0x03dc,0x02df,0xfdf3,0xfcf3,0xfd3a,0xfdbe,0xfc46,0xfdf0, +0x0315,0x030e,0x0335,0xfda5,0xfd87,0xfd8c,0xfda0,0xfdaa, +0xfd6d,0x0381,0x0204,0x02f2,0xfc76,0xfd6b,0xfd07,0xfcee, +0xfdf7,0xfdd4,0x0205,0x02be,0x033c,0xfd3a,0xfcbb,0xfdc8, +0xfdf5,0xfc3d,0xfd62,0x024a,0x0332,0x02fb,0xfc57,0xfc96, +0xfd9f,0xfd60,0xfd72,0xfdc8,0x038b,0x028c,0x0250,0xfdbe, +0xfdf3,0xfd0e,0xfcdc,0xfcc2,0xfd52,0x0210,0x028c,0x0282, +0xfd5f,0xfd69,0xfcce,0xfdde,0xfcc2,0xfcda,0x0213,0x02c4, +0x030c,0xfd20,0xfcd5,0xfde4,0xfdd8,0xfc2b,0xfdad,0x029a, +0x0271,0x02d7,0xfcd3,0xfc4e,0xfc88,0xfc9d,0xfd05,0xfdfc, +0x03b3,0x02d7,0x022a,0xfd5f,0xfe00,0xfced,0xfc95,0xfdfb, +0xfda9,0x0225,0x0291,0x03d5,0xfd3f,0xfdf2,0xfd8a,0xfdb3, +0xfcb5,0xfc53,0x025d,0x0398,0x0354,0xfde0,0xfc10,0xfd02, +0xfd34,0xfcc5,0xfd3b,0x0270,0x026b,0x03d7,0xfd0d,0xfda9, +0xfdad,0xfd07,0xfd12,0xfc50,0x025d,0x038d,0x0223,0xfde7, +0xfd7a,0xfc35,0xfd35,0xfcd9,0xfdb8,0x02b2,0x03a7,0x0204, +0xfd89,0xfd47,0xfc50,0xfc5c,0xfca9,0xfdf7,0x02bc,0x0264, +0x0355,0xfcba,0xfdb8,0xfc03,0xfc41,0xfd24,0xfd39,0x02ff, +0x0340,0x023e,0xfd91,0xfca3,0xfc5b,0xfdc1,0xfd5c,0xfd7d, +0x020b,0x0382,0x039b,0xfc69,0xfc4f,0xfcd6,0xfde8,0xfceb, +0xfcbf,0x02d2,0x03be,0x02b3,0xfd5c,0xfc30,0xfd79,0xfc04, +0xfc80,0xfc59,0x0265,0x0303,0x03a0,0xfc64,0xfdd4,0xfd44, +0xfd22,0xfdbb,0xfcb6,0x02f6,0x02f5,0x0248,0xfdcf,0xfc9e, +0xfc9f,0xfdce,0xfdd0,0xfd65,0x0200,0x0237,0x0241,0xfdc9, +0xfdbf,0xfd81,0xfe00,0xfd8c,0xfd76,0x0267,0x027e,0x02ba, +0xfd02,0xfcb9,0xfc99,0xfd1d,0xfce5,0xfc46,0x023e,0x0282, +0x024d,0xfd30,0xfd6c,0xfd1d,0xfd7c,0xfcda,0xfd5b,0x03e1, +0x02aa,0x036e,0xfd6a,0xfcac,0xfdb7,0xfc3d,0xfc72,0xfd0f, +0x021b,0x037a,0x0391,0xfc55,0xfc3d,0xfce5,0xfdc7,0xfcf9, +0xfcd1,0x02b6,0x03a0,0x0220,0xfd8b,0xfd1e,0xfc25,0xfc53, +0xfcb6,0xfdbe,0x0325,0x0258,0x02a8,0xfc50,0xfde9,0xfce2, +0xfd87,0xfd40,0xfc77,0x021c,0x03b7,0x030e,0xfc14,0xfcc7, +0xfd29,0xfdc6,0xfc8c,0xfdab,0x0330,0x03b6,0x024e,0xfd0b, +0xfc53,0xfddc,0xfd76,0xfc8f,0xfd57,0x03bb,0x034f,0x032b, +0xfcea,0xfd0b,0xfd61,0xfc85,0xfd44,0xfd7d,0x0223,0x0373, +0x022c,0xfc4f,0xfdad,0xfc40,0xfdb6,0xfd06,0xfda3,0x028c, +0x0378,0x025c,0xfdcb,0xfcfe,0xfdf4,0xfcc1,0xfcfe,0xfd37, +0x035f,0x0249,0x0357,0xfc26,0xfd2f,0xfc2e,0xfd29,0xfd64, +0xfd35,0x03ff,0x03e5,0x0204,0xfc1b,0xfdfc,0xfc12,0xfc01, +0xfc34,0xfdf8,0x03a4,0x0266,0x0280,0xfdd0,0xfdb9,0xfcff, +0xfcae,0xfd1e,0xfce0,0x0273,0x0234,0x023d,0xfd4d,0xfd42, +0xfd89,0xfcff,0xfd93,0xfd7f,0x036c,0x0384,0x02d4,0xfcfe, +0xfd94,0xfd83,0xfd12,0xfce8,0xfe00,0x0203,0x0359,0x0380, +0xfca1,0xfc7a,0xfd12,0xfdf9,0xfd32,0xfcf0,0x0287,0x03b9, +0x036f,0xfda6,0xfdd5,0xfcce,0xfccf,0xfc88,0xfd0d,0x0326, +0x0356,0x0359,0xfd60,0xfd5d,0xfd35,0xfd86,0xfd38,0xfd32, +0x0221,0x0247,0x0277,0xfd93,0xfd60,0xfd31,0xfdbb,0xfd68, +0xfcf6,0x0291,0x0259,0x02ef,0xfcfc,0xfc3d,0xfc8e,0xfcb5, +0xfd3d,0xfdda,0x02e4,0x0389,0x031b,0xfd72,0xfdc1,0xfd40, +0xfde9,0xfcdf,0xfd96,0x0349,0x03f8,0x0238,0xfcbd,0xfc5a, +0xfdcc,0xfd4d,0xfc0f,0xfd89,0x02eb,0x024d,0x03d7,0xfca3, +0xfd32,0xfdca,0xfddf,0xfd59,0xfc4f,0x036e,0x0265,0x020e, +0xfdf2,0xfc7a,0xfd8a,0xfd0f,0xfd20,0xfde4,0x0360,0x02d3, +0x030b,0xfd9e,0xfd6f,0xfdda,0xfd27,0xfc02,0xfdb0,0x0216, +0x02a2,0x0306,0xfd41,0xfcd8,0xfc05,0xfdd3,0xfc89,0xfdb6, +0x03b6,0x0289,0x03ab,0xfda6,0xfc99,0xfdad,0xfc8f,0xfcc8, +0xfca3,0x024e,0x02bf,0x0383,0xfcd5,0xfdfa,0xfd96,0xfd58, +0xfc3a,0xfcea,0x026a,0x020f,0x0243,0xfd83,0xfd44,0xfdab, +0xfd16,0xfde1,0xfd6f,0x02d5,0x0287,0x03cc,0xfc6b,0xfd4f, +0xfd99,0xfdff,0xfcce,0xfc64,0x0281,0x0287,0x02c3,0xfcd6, +0xfc8b,0xfc83,0xfcdd,0xfccf,0xfc30,0x02da,0x0297,0x0284, +0xfc4e,0xfc68,0xfcbd,0xfdf7,0xfca4,0xfcd4,0x0327,0x023c, +0x0242,0xfc7a,0xfc70,0xfd7a,0xfd83,0xfd81,0xfd73,0x036f, +0x0263,0x0335,0xfdf4,0xfd3f,0xfc2d,0xfd0d,0xfd27,0xfd6e, +0x029b,0x02d9,0x0349,0xfc49,0xfddb,0xfda9,0xfc99,0xfdf9, +0xfd4c,0x030e,0x0249,0x02ef,0xfc81,0xfdc2,0xfca5,0xfdaa, +0xfd62,0xfdd9,0x0322,0x02dd,0x03d0,0xfdc2,0xfd03,0xfd45, +0xfd8c,0xfdf3,0xfc5d,0x0352,0x0367,0x02c4,0xfd2c,0xfdb4, +0xfda6,0xfd3e,0xfd1a,0xfc2d,0x0366,0x02e7,0x02c0,0xfd88, +0xfdaa,0xfc01,0xfd1d,0xfde4,0xfc36,0x03ad,0x0383,0x0249, +0xfcc5,0xfde6,0xfdfe,0xfc9e,0xfcea,0xfd63,0x03af,0x0278, +0x036b,0xfdba,0xfcda,0xfde3,0xfc9b,0xfcf3,0xfd13,0x03ff, +0x02dc,0x027e,0xfd25,0xfd83,0xfc70,0xfc02,0xfdf5,0xfce5, +0x030a,0x02f1,0x028f,0xfdc3,0xfc1b,0xfc3b,0xfdb0,0xfdd6, +0xfcb9,0x034b,0x03b1,0x03b1,0xfcf5,0xfcf5,0xfc97,0xfd4a, +0xfc97,0xfc97,0x03ae,0x03c9,0x023c,0xfc84,0xfdf1,0xfde2, +0xfc9d,0xfc6a,0xfd80,0x03f0,0x022f,0x0356,0xfdd9,0xfcb7, +0xfc5a,0xfc1f,0xfd9c,0xfd38,0x0364,0x02d9,0x0313,0xfd96, +0xfd64,0xfdd0,0xfd1f,0xfdf9,0xfda3,0x03ca,0x02ae,0x0223, +0xfd76,0xfdfa,0xfd23,0xfc69,0xfc69,0xfdb7,0x0217,0x027b, +0x02a2,0xfd68,0xfd3f,0xfcbc,0xfdd0,0xfcec,0xfc89,0x0230, +0x027c,0x033c,0xfd48,0xfc75,0xfdfe,0xfd9b,0xfcea,0xfd62, +0x03e2,0x0250,0x0341,0xfdc1,0xfcd7,0xfc3c,0xfc3a,0xfd52, +0xfd5b,0x0224,0x026d,0x02b6,0xfd67,0xfd19,0xfcb5,0xfdb5, +0xfd0d,0xfc52,0x0226,0x0321,0x03bb,0xfca3,0xfdff,0xfd14, +0xfdb1,0xfd8d,0xfc84,0x0246,0x020a,0x0286,0xfdae,0xfd21, +0xfd6d,0xfd69,0xfdeb,0xfcd1,0x025e,0x0271,0x0332,0xfd1d, +0xfc37,0xfc19,0xfd33,0xfd05,0xfd71,0x026f,0x024f,0x036a, +0xfd30,0xfded,0xfc0e,0xfd0a,0xfd55,0xfd16,0x029d,0x0217, +0x03e9,0xfd44,0xfd72,0xfdf5,0xfc94,0xfdd1,0xfc2d,0x02bd, +0x03aa,0x0250,0xfd7e,0xfcd6,0xfde2,0xfc40,0xfca4,0xfd54, +0x039d,0x0334,0x02e2,0xfd1b,0xfd65,0xfdb0,0xfcbd,0xfd6f, +0xfdeb,0x02df,0x0316,0x0220,0xfdc9,0xfcf3,0xfcb8,0xfdf1, +0xfd9e,0xfdbe,0x023f,0x0314,0x02a2,0xfc8a,0xfd0a,0xfdf9, +0xfd79,0xfda1,0xfc88,0x028f,0x030f,0x0210,0xfc15,0xfd5b, +0xfcd7,0xfcb8,0xfda9,0xfddf,0x020f,0x0201,0x02a5,0xfdef, +0xfd45,0xfd59,0xfde0,0xfdfe,0xfc7f,0x030e,0x0354,0x03ac, +0xfd75,0xfd32,0xfcf1,0xfdab,0xfd3b,0xfca1,0x0242,0x038e, +0x0201,0xfdfe,0xfdbb,0xfc6e,0xfd72,0xfcd7,0xfdfd,0x02b4, +0x0372,0x02de,0xfdac,0xfc1f,0xfd88,0xfc57,0xfd09,0xfdf2, +0x024a,0x02ab,0x02cb,0xfcf2,0xfcce,0xfc46,0xfd62,0xfc71, +0xfc19,0x02e3,0x0261,0x02cd,0xfc90,0xfdfa,0xfcaa,0xfdea, +0xfd2b,0xfc12,0x030a,0x0305,0x02b9,0xfdb4,0xfdee,0xfdf1, +0xfdb0,0xfdb8,0xfc49,0x039a,0x0311,0x032d,0xfd3d,0xfd24, +0xfd90,0xfcc2,0xfda6,0xfd7a,0x02fe,0x028b,0x03d8,0xfc32, +0xfd20,0xfd8e,0xfdc3,0xfcc5,0xfc4e,0x03d2,0x0254,0x0203, +0xfdc7,0xfc28,0xfda8,0xfc5a,0xfd4a,0xfdfa,0x0217,0x02f5, +0x021c,0xfce8,0xfdcb,0xfce1,0xfdd0,0xfdd1,0xfdc5,0x0296, +0x02af,0x024d,0xfc86,0xfd06,0xfce9,0xfca7,0xfc64,0xfd5a, +0x022a,0x0218,0x03d3,0xfdbc,0xfdee,0xfe00,0xfda7,0xfdcf, +0xfc58,0x02d3,0x03d6,0x02b2,0xfd4a,0xfc30,0xfd6a,0xfc02, +0xfc51,0xfc5c,0x03a8,0x03bc,0x020f,0xfc95,0xfc3b,0xfc26, +0xfca8,0xfc82,0xfde1,0x024e,0x03ea,0x0223,0xfdbf,0xfd89, +0xfde8,0xfd58,0xfc2c,0xfdb6,0x0205,0x028d,0x0339,0xfd6c, +0xfcbf,0xfdf2,0xfdf6,0xfcbe,0xfd68,0x0340,0x0250,0x03ce, +0xfc3c,0xfce8,0xfdcc,0xfd5b,0xfd52,0xfc60,0x0200,0x03bd, +0x0387,0xfc43,0xfc79,0xfcb4,0xfe00,0xfc82,0xfce4,0x0277, +0x0221,0x038a,0xfd60,0xfdd2,0xfc3b,0xfcf7,0xfdbb,0xfcde, +0x0202,0x02d0,0x0289,0xfd2d,0xfd74,0xfc6f,0xfdfc,0xfc0c, +0xfcc8,0x0254,0x02a7,0x02b6,0xfcea,0xfcd9,0xfc68,0xfd4b, +0xfc7c,0xfc54,0x0269,0x02e4,0x03d3,0xfc84,0xfdb2,0xfd3c, +0xfd19,0xfde9,0xfc58,0x02c7,0x02ad,0x036d,0xfc48,0xfd9f, +0xfdb5,0xfc25,0xfc6b,0xfd10,0x028f,0x0343,0x0350,0xfdea, +0xfde2,0xfd4d,0xfcba,0xfd57,0xfd42,0x02f2,0x0347,0x02ba, +0xfd96,0xfdfd,0xfdc3,0xfdd4,0xfd50,0xfc46,0x0367,0x0203, +0x0301,0xfc93,0xfd71,0xfcfa,0xfd1a,0xfdfa,0xfdbe,0x03bb, +0x0354,0x023d,0xfce5,0xfde9,0xfc45,0xfc84,0xfd3b,0xfd7d, +0x0280,0x035b,0x024b,0xfde7,0xfd21,0xfc26,0xfcdf,0xfd2f, +0xfd5e,0x0318,0x035f,0x022a,0xfd65,0xfca6,0xfc59,0xfd9c, +0xfd29,0xfda7,0x034b,0x02c4,0x02aa,0xfdb9,0xfdce,0xfc50, +0xfd4a,0xfc2d,0xfc72,0x03cb,0x0300,0x0228,0xfd28,0xfdf4, +0xfcc3,0xfc67,0xfdc0,0xfdac,0x037b,0x0218,0x02b2,0xfc59, +0xfda7,0xfd2c,0xfcf8,0xfdcd,0xfc5d,0x03f8,0x0230,0x0297, +0xfdd4,0xfd6d,0xfd29,0xfc0f,0xfd9a,0xfca4,0x021f,0x0366, +0x02a2,0xfc64,0xfd34,0xfdc3,0xfdbf,0xfd1d,0xfc87,0x0259, +0x03e7,0x0249,0xfdb6,0xfd52,0xfdc5,0xfd3f,0xfc31,0xfd64, +0x03b1,0x03c6,0x0379,0xfc84,0xfccb,0xfcb8,0xfc98,0xfc70, +0xfcfb,0x0211,0x0390,0x0309,0xfc51,0xfcdc,0xfd4c,0xfddd, +0xfcd4,0xfdb2,0x023e,0x03fc,0x02ca,0xfdc4,0xfcdf,0xfd39, +0xfd7d,0xfc08,0xfc1b,0x0261,0x039a,0x03a4,0xfddb,0xfdd5, +0xfcb8,0xfd2b,0xfcc1,0xfcb0,0x0256,0x030a,0x03a1,0xfc73, +0xfde1,0xfd3d,0xfd46,0xfdb0,0xfcb4,0x028b,0x0304,0x02e8, +0xfc2a,0xfc4d,0xfdcf,0xfcc5,0xfdba,0xfde3,0x02b3,0x03bd, +0x02d2,0xfd7a,0xfc30,0xfd5d,0xfc5a,0xfc82,0xfc04,0x02d9, +0x02fe,0x03d8,0xfdde,0xfd43,0xfd20,0xfdf8,0xfdc3,0xfc4f, +0x0223,0x0207,0x0278,0xfdd5,0xfd5d,0xfd80,0xfdb7,0xfdf2, +0xfcf4,0x0247,0x0214,0x039a,0xfda1,0xfdf3,0xfc40,0xfd68, +0xfdd6,0xfcc1,0x0279,0x03e3,0x025b,0xfd99,0xfd17,0xfdb6, +0xfcf1,0xfc38,0xfd3a,0x02a5,0x023b,0x036a,0xfd0b,0xfdbe, +0xfc2f,0xfc80,0xfd82,0xfd15,0x025a,0x0221,0x029a,0xfd7f, +0xfcf1,0xfd3b,0xfd3c,0xfdbc,0xfc9e,0x0273,0x021e,0x036b, +0xfd67,0xfde8,0xfc60,0xfcff,0xfdc1,0xfd14,0x02a0,0x03d7, +0x0256,0xfd7b,0xfcee,0xfdc1,0xfc8e,0xfc50,0xfd44,0x02b4, +0x03d3,0x02da,0xfd6a,0xfc24,0xfd46,0xfc57,0xfc57,0xfdf7, +0x029c,0x027a,0x0368,0xfcc5,0xfdc7,0xfde4,0xfc99,0xfcef, +0xfd1a,0x02c7,0x02c2,0x02a2,0xfc2a,0xfc57,0xfc5d,0xfc24, +0xfc31,0xfc87,0x02e3,0x03d1,0x0253,0xfd3e,0xfca4,0xfdc8, +0xfdea,0xfc5c,0xfd4d,0x02f7,0x0389,0x02fb,0xfd61,0xfdca, +0xfd5d,0xfdcd,0xfce1,0xfdc7,0x02f4,0x0246,0x02fb,0xfca4, +0xfdcd,0xfc9c,0xfdd2,0xfd69,0xfdc8,0x02ec,0x03f5,0x038c, +0xfd1b,0xfd68,0xfc7e,0xfddd,0xfc16,0xfcdb,0x0324,0x03a9, +0x03b6,0xfd20,0xfd16,0xfc9b,0xfd89,0xfca6,0xfc8e,0x0311, +0x021f,0x03e6,0xfcbf,0xfd02,0xfdef,0xfda6,0xfdc0,0xfc33, +0x03e7,0x02ac,0x03ae,0xfd64,0xfc68,0xfd8a,0xfc31,0xfc6d, +0xfc9c,0x0272,0x0279,0x03e4,0xfcfa,0xfd9f,0xfd98,0xfd03, +0xfcf1,0xfc36,0x0272,0x0237,0x0343,0xfd4b,0xfc03,0xfc63, +0xfd03,0xfd8c,0xfd57,0x02e3,0x023b,0x03cd,0xfcc7,0xfd42, +0xfde1,0xfdeb,0xfd83,0xfc63,0x028f,0x0301,0x02c3,0xfc28, +0xfc76,0xfded,0xfcb9,0xfdbf,0xfc2e,0x02be,0x03b8,0x023b, +0xfd73,0xfcef,0xfdec,0xfc3c,0xfc8a,0xfd82,0x02d7,0x02c8, +0x0202,0xfc0c,0xfd26,0xfd35,0xfdfc,0xfc22,0xfdfc,0x02e8, +0x02ae,0x02e5,0xfc1a,0xfde5,0xfc1e,0xfde3,0xfc67,0xfde8, +0x02db,0x0228,0x02ca,0xfceb,0xfc03,0xfcfc,0xfdf6,0xfdac, +0xfc1a,0x0338,0x03df,0x02d6,0xfce2,0xfdb7,0xfd41,0xfd68, +0xfc41,0xfdfd,0x031b,0x0267,0x0220,0xfc45,0xfcb4,0xfd73, +0xfd97,0xfd1e,0xfdbe,0x0366,0x023f,0x0338,0xfc2e,0xfd44, +0xfc62,0xfd1d,0xfd7a,0xfd68,0x0323,0x0340,0x039b,0xfd73, +0xfd2c,0xfd12,0xfd8a,0xfd5b,0xfcc0,0x0333,0x0347,0x0213, +0xfd61,0xfcaf,0xfc99,0xfd71,0xfd50,0xfdda,0x0377,0x0312, +0x0354,0xfd57,0xfd1e,0xfd72,0xfcff,0xfda5,0xfd3b,0x03a5, +0x02fc,0x023a,0xfd48,0xfdf9,0xfcad,0xfcae,0xfdc6,0xfd86, +0x02cc,0x038a,0x028e,0xfd86,0xfc6c,0xfdbd,0xfc15,0xfcde, +0xfcbb,0x0310,0x0324,0x0233,0xfd98,0xfca0,0xfc8b,0xfda7, +0xfd89,0xfd94,0x0306,0x0217,0x036c,0xfcd7,0xfd6a,0xfc6d, +0xfdb7,0xfdd1,0xfd13,0x0327,0x0256,0x0289,0xfc51,0xfc01, +0xfd0a,0xfd84,0xfd45,0xfcca,0x0331,0x02f7,0x02ce,0xfda2, +0xfdc3,0xfdeb,0xfd74,0xfdcd,0xfc10,0x033f,0x03e1,0x034e, +0xfcda,0xfd51,0xfccb,0xfd5d,0xfc3d,0xfd45,0x035a,0x0237, +0x025d,0xfc49,0xfc09,0xfd62,0xfd30,0xfd8c,0xfd34,0x036c, +0x03f4,0x028b,0xfc9e,0xfdd3,0xfd7d,0xfd12,0xfc17,0xfcc5, +0x0354,0x0224,0x0225,0xfc6f,0xfc6e,0xfdb4,0xfd3a,0xfdb5, +0xfdb3,0x037f,0x03f0,0x0367,0xfc8f,0xfd07,0xfca6,0xfcf2, +0xfc1f,0xfd1b,0x037c,0x03e8,0x024f,0xfc98,0xfdfd,0xfdbe, +0xfcf7,0xfc2f,0xfd55,0x03a7,0x0204,0x0344,0xfc50,0xfd04, +0xfcb4,0xfca9,0xfdf7,0xfd56,0x03a3,0x0264,0x0308,0xfdd3, +0xfd3e,0xfc5f,0xfcb1,0xfd23,0xfdb3,0x03c8,0x0266,0x0330, +0xfdbb,0xfcfd,0xfc2c,0xfc6d,0xfd1e,0xfd75,0x020c,0x0309, +0x02cf,0xfce4,0xfd1f,0xfdde,0xfde7,0xfdb2,0xfc0c,0x0225, +0x02b6,0x0312,0xfd18,0xfcb5,0xfdeb,0xfdb3,0xfc53,0xfda5, +0x0372,0x02f2,0x0216,0xfd77,0xfc68,0xfced,0xfd09,0xfdd5, +0xfdd3,0x0255,0x0345,0x02fe,0xfc2f,0xfc81,0xfd8d,0xfd47, +0xfd54,0xfdc2,0x027b,0x03ba,0x02c0,0xfdb0,0xfc97,0xfd70, +0xfcec,0xfc86,0xfc37,0x0323,0x0226,0x031e,0xfca1,0xfd8e, +0xfca6,0xfd8a,0xfdb1,0xfd92,0x02bb,0x028e,0x031e,0xfc82, +0xfddf,0xfc03,0xfc46,0xfcbb,0xfd92,0x039c,0x02ff,0x02e2, +0xfd4b,0xfd66,0xfdd7,0xfcbe,0xfdc1,0xfded,0x03ca,0x02a3, +0x0260,0xfd81,0xfdc0,0xfcdf,0xfc69,0xfc86,0xfd2e,0x0278, +0x02c2,0x02ac,0xfc97,0xfcb4,0xfc50,0xfcf4,0xfc30,0xfc6e, +0x035a,0x02ff,0x0233,0xfd7d,0xfc4f,0xfcb4,0xfd31,0xfdc2, +0xfd94,0x020f,0x02fd,0x02be,0xfcec,0xfd2c,0xfdf3,0xfde1, +0xfdc4,0xfc3c,0x022f,0x039c,0x03eb,0xfc0f,0xfddd,0xfc77, +0xfd9e,0xfcbf,0xfc29,0x026a,0x020c,0x0263,0xfd87,0xfd1e, +0xfd8f,0xfd15,0xfde8,0xfd27,0x03e7,0x03ae,0x03c3,0xfc68, +0xfc54,0xfc8a,0xfc30,0xfc9d,0xfc77,0x0223,0x0359,0x03a7, +0xfc6c,0xfc19,0xfcf1,0xfdb8,0xfd32,0xfcaa,0x02de,0x039e, +0x0239,0xfd67,0xfcce,0xfdfd,0xfdf1,0xfcba,0xfd86,0x03c7, +0x02ea,0x0227,0xfd3f,0xfdf8,0xfcdc,0xfc6f,0xfde0,0xfdaf, +0x0342,0x0279,0x0371,0xfdfd,0xfd32,0xfddf,0xfd59,0xfcf1, +0xfd0a,0x03ad,0x02bd,0x02d7,0xfd7b,0xfd64,0xfc1b,0xfc9f, +0xfc3f,0xfdfc,0x03b1,0x0234,0x027c,0xfdf7,0xfdb5,0xfd43, +0xfc97,0xfd91,0xfcea,0x0200,0x0233,0x0319,0xfdcd,0xfce6, +0xfc97,0xfe00,0xfd95,0xfd99,0x03d8,0x022c,0x023a,0xfdea, +0xfddc,0xfd94,0xfc4f,0xfda4,0xfd84,0x03d8,0x021c,0x02e4, +0xfdf9,0xfd38,0xfcf2,0xfc4e,0xfdc6,0xfde8,0x020f,0x02fc, +0x036a,0xfced,0xfc7b,0xfd74,0xfde1,0xfdc6,0xfd15,0x0212, +0x0298,0x03f6,0xfd50,0xfdf3,0xfd6e,0xfddb,0xfca2,0xfc13, +0x0222,0x0203,0x0209,0xfdda,0xfdd4,0xfdf3,0xfdb8,0xfdf9, +0xfded,0x022a,0x03a6,0x02a0,0xfc0d,0xfd28,0xfd9b,0xfda8, +0xfcac,0xfc8e,0x0256,0x03b1,0x022c,0xfdd8,0xfd76,0xfdff, +0xfd44,0xfc98,0xfda5,0x0273,0x0213,0x02dd,0xfd75,0xfc7d, +0xfd08,0xfcff,0xfdd9,0xfdf3,0x0240,0x03fc,0x03f6,0xfdc2, +0xfdc5,0xfc0d,0xfd76,0xfc08,0xfc13,0x026f,0x039c,0x0252, +0xfdcd,0xfd2c,0xfde7,0xfd09,0xfcbd,0xfd4d,0x02a6,0x038d, +0x025b,0xfda6,0xfce0,0xfde8,0xfc7d,0xfcd9,0xfd38,0x032e, +0x02e8,0x021f,0xfdb0,0xfc9f,0xfcea,0xfd78,0xfde3,0xfdbf}; + +const unsigned short wavtable2[2304]={ +0x0e,0x0e,0x0e,0x14,0x14,0x13,0x15,0x14,0x14,0x0e,0x0e,0x0e, +0x14,0x14,0x14,0x14,0x15,0x15,0x0e,0x0d,0x0e,0x12,0x14,0x13, +0x15,0x12,0x15,0x0d,0x0d,0x0e,0x12,0x13,0x13,0x13,0x12,0x15, +0x0d,0x0e,0x0d,0x13,0x12,0x12,0x13,0x14,0x13,0x0d,0x0e,0x0f, +0x13,0x13,0x14,0x13,0x15,0x16,0x0d,0x0d,0x0d,0x11,0x11,0x12, +0x12,0x13,0x13,0x0c,0x0e,0x0d,0x12,0x11,0x13,0x11,0x14,0x13, +0x0d,0x0d,0x0d,0x12,0x12,0x11,0x13,0x12,0x12,0x0d,0x0d,0x0c, +0x12,0x11,0x11,0x12,0x13,0x11,0x0d,0x0c,0x0d,0x11,0x11,0x10, +0x12,0x11,0x12,0x0c,0x0d,0x0c,0x11,0x10,0x11,0x11,0x13,0x11, +0x0c,0x0d,0x0d,0x10,0x11,0x11,0x11,0x12,0x12,0x0c,0x0d,0x0d, +0x10,0x10,0x11,0x10,0x13,0x12,0x0c,0x0c,0x0d,0x0f,0x10,0x10, +0x10,0x11,0x12,0x0b,0x0d,0x0d,0x0f,0x0f,0x11,0x0f,0x12,0x12, +0x0d,0x0c,0x0d,0x10,0x11,0x11,0x12,0x10,0x13,0x0c,0x0c,0x0c, +0x10,0x10,0x10,0x11,0x10,0x11,0x0d,0x0c,0x0c,0x11,0x11,0x0f, +0x13,0x10,0x10,0x0d,0x0c,0x0b,0x10,0x10,0x0e,0x13,0x10,0x0f, +0x0c,0x0c,0x0c,0x10,0x10,0x10,0x11,0x11,0x11,0x0c,0x0d,0x0b, +0x10,0x0f,0x10,0x11,0x12,0x0f,0x0c,0x0c,0x0b,0x10,0x0e,0x0f, +0x10,0x11,0x0f,0x0b,0x0d,0x0c,0x0f,0x0f,0x10,0x0f,0x12,0x10, +0x0c,0x0c,0x0c,0x0f,0x0f,0x0f,0x10,0x10,0x10,0x0b,0x0c,0x0c, +0x0f,0x0e,0x0f,0x0f,0x10,0x10,0x0b,0x0c,0x0c,0x0f,0x0f,0x10, +0x0f,0x10,0x11,0x0b,0x0c,0x0d,0x0f,0x0f,0x10,0x0e,0x11,0x12, +0x0b,0x0c,0x0b,0x0f,0x0e,0x0f,0x0f,0x11,0x0f,0x0b,0x0c,0x0b, +0x0f,0x0e,0x0f,0x0e,0x11,0x0f,0x0b,0x0d,0x0c,0x0f,0x0e,0x10, +0x0e,0x12,0x11,0x0b,0x0c,0x0c,0x0e,0x0e,0x10,0x0e,0x11,0x11, +0x0c,0x0c,0x0c,0x0f,0x10,0x0f,0x11,0x10,0x11,0x0c,0x0b,0x0c, +0x0f,0x10,0x0f,0x11,0x0f,0x10,0x0c,0x0c,0x0b,0x0f,0x0f,0x0f, +0x11,0x10,0x0f,0x0c,0x0c,0x0b,0x0f,0x0e,0x0e,0x10,0x10,0x0f, +0x0d,0x0b,0x0b,0x0f,0x0f,0x0e,0x12,0x0f,0x0f,0x0c,0x0b,0x0a, +0x0f,0x0e,0x0d,0x11,0x0f,0x0d,0x0b,0x0b,0x0b,0x0e,0x0e,0x0e, +0x0f,0x0f,0x0e,0x0b,0x0b,0x0a,0x0e,0x0d,0x0d,0x0f,0x0f,0x0d, +0x0c,0x0b,0x0c,0x0e,0x0f,0x0f,0x10,0x0f,0x11,0x0b,0x0b,0x0c, +0x0e,0x0f,0x0f,0x0f,0x0f,0x10,0x0b,0x0c,0x0b,0x0e,0x0e,0x0e, +0x0f,0x10,0x0f,0x0b,0x0b,0x0b,0x0e,0x0e,0x0e,0x0e,0x0f,0x0f, +0x0b,0x0b,0x0c,0x0e,0x0e,0x0f,0x0e,0x0f,0x10,0x0b,0x0b,0x0c, +0x0e,0x0e,0x0f,0x0e,0x0f,0x11,0x0b,0x0c,0x0c,0x0e,0x0e,0x0f, +0x0e,0x10,0x10,0x0a,0x0c,0x0c,0x0d,0x0e,0x0f,0x0d,0x10,0x10, +0x0b,0x0c,0x0b,0x0e,0x0d,0x0e,0x0e,0x10,0x0e,0x0b,0x0b,0x0b, +0x0e,0x0d,0x0e,0x0e,0x0f,0x0e,0x0a,0x0c,0x0b,0x0e,0x0d,0x0e, +0x0d,0x11,0x0e,0x0a,0x0c,0x0b,0x0e,0x0d,0x0e,0x0d,0x10,0x0e, +0x0b,0x0b,0x0b,0x0d,0x0d,0x0e,0x0e,0x0f,0x0f,0x0a,0x0b,0x0b, +0x0d,0x0d,0x0e,0x0d,0x0f,0x0f,0x0a,0x0b,0x0c,0x0d,0x0e,0x0e, +0x0d,0x0f,0x10,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x0d,0x0f,0x10, +0x0b,0x0c,0x0b,0x0e,0x0d,0x0f,0x0e,0x10,0x0f,0x0a,0x0c,0x0c, +0x0e,0x0d,0x0f,0x0d,0x11,0x10,0x0a,0x0d,0x0c,0x0e,0x0e,0x10, +0x0d,0x12,0x10,0x0a,0x0c,0x0d,0x0e,0x0e,0x10,0x0d,0x11,0x12, +0x0a,0x0c,0x0b,0x0d,0x0d,0x0f,0x0d,0x10,0x0f,0x0a,0x0c,0x0b, +0x0d,0x0d,0x0f,0x0d,0x10,0x0f,0x0a,0x0c,0x0c,0x0e,0x0d,0x10, +0x0d,0x11,0x10,0x0a,0x0c,0x0c,0x0d,0x0e,0x10,0x0c,0x10,0x11, +0x0c,0x0b,0x0c,0x0f,0x10,0x0e,0x11,0x0e,0x10,0x0c,0x0b,0x0b, +0x0e,0x0f,0x0d,0x11,0x0e,0x0f,0x0b,0x0b,0x0c,0x0e,0x0e,0x0e, +0x0f,0x0e,0x10,0x0b,0x0b,0x0b,0x0d,0x0e,0x0e,0x0e,0x0e,0x0f, +0x0b,0x0a,0x0b,0x0d,0x0e,0x0d,0x0f,0x0d,0x0f,0x0b,0x0a,0x0b, +0x0d,0x0e,0x0d,0x0f,0x0d,0x0f,0x0c,0x0a,0x0a,0x0e,0x0e,0x0c, +0x11,0x0d,0x0d,0x0c,0x0a,0x0a,0x0d,0x0d,0x0b,0x10,0x0d,0x0c, +0x0b,0x0b,0x0b,0x0e,0x0e,0x0d,0x0f,0x0e,0x0e,0x0b,0x0b,0x0a, +0x0d,0x0d,0x0d,0x0f,0x0e,0x0d,0x0b,0x0b,0x0a,0x0e,0x0c,0x0d, +0x0e,0x0f,0x0d,0x0a,0x0c,0x0a,0x0e,0x0c,0x0d,0x0d,0x10,0x0c, +0x0b,0x0b,0x0b,0x0d,0x0e,0x0d,0x0e,0x0e,0x0f,0x0b,0x0b,0x0b, +0x0d,0x0d,0x0d,0x0e,0x0e,0x0e,0x0a,0x0b,0x0b,0x0d,0x0d,0x0e, +0x0d,0x0e,0x0f,0x0a,0x0b,0x0b,0x0c,0x0d,0x0d,0x0d,0x0e,0x0f, +0x0b,0x0a,0x0b,0x0d,0x0d,0x0d,0x0e,0x0d,0x0e,0x0b,0x0b,0x0a, +0x0d,0x0c,0x0d,0x0e,0x0e,0x0d,0x0b,0x0a,0x0a,0x0c,0x0c,0x0c, +0x0e,0x0d,0x0d,0x0a,0x0a,0x0a,0x0c,0x0c,0x0c,0x0d,0x0d,0x0d, +0x0b,0x0b,0x0a,0x0d,0x0c,0x0c,0x0e,0x0e,0x0c,0x0a,0x0b,0x0a, +0x0d,0x0c,0x0c,0x0d,0x0e,0x0c,0x0a,0x0b,0x0a,0x0c,0x0b,0x0c, +0x0d,0x0e,0x0c,0x0a,0x0b,0x0a,0x0c,0x0b,0x0c,0x0c,0x0e,0x0c, +0x0a,0x0a,0x0b,0x0c,0x0d,0x0d,0x0d,0x0d,0x0f,0x0a,0x0a,0x0b, +0x0c,0x0d,0x0d,0x0d,0x0d,0x0e,0x0a,0x0b,0x0b,0x0c,0x0c,0x0d, +0x0c,0x0e,0x0e,0x0a,0x0b,0x0b,0x0c,0x0d,0x0d,0x0c,0x0e,0x0f, +0x0a,0x0a,0x0b,0x0c,0x0c,0x0c,0x0c,0x0d,0x0e,0x0a,0x0a,0x0a, +0x0b,0x0c,0x0c,0x0c,0x0d,0x0d,0x0a,0x0a,0x0b,0x0b,0x0c,0x0c, +0x0c,0x0d,0x0e,0x09,0x0a,0x0b,0x0b,0x0c,0x0d,0x0b,0x0d,0x0e, +0x0b,0x0b,0x0b,0x0d,0x0d,0x0d,0x0e,0x0f,0x0e,0x0a,0x0b,0x0b, +0x0d,0x0c,0x0d,0x0d,0x0f,0x0e,0x0a,0x0b,0x0a,0x0d,0x0c,0x0d, +0x0d,0x0f,0x0d,0x0a,0x0b,0x0b,0x0d,0x0c,0x0d,0x0c,0x0f,0x0e, +0x0a,0x0b,0x0b,0x0d,0x0d,0x0e,0x0d,0x0f,0x0f,0x0a,0x0b,0x0b, +0x0d,0x0d,0x0e,0x0c,0x0f,0x0f,0x0a,0x0b,0x0b,0x0d,0x0d,0x0e, +0x0c,0x0f,0x0f,0x0a,0x0b,0x0c,0x0c,0x0d,0x0f,0x0c,0x0f,0x10, +0x0a,0x0c,0x0b,0x0e,0x0c,0x0e,0x0d,0x10,0x0e,0x0a,0x0c,0x0b, +0x0e,0x0c,0x0f,0x0c,0x11,0x0e,0x0a,0x0c,0x0c,0x0d,0x0d,0x0f, +0x0c,0x10,0x10,0x0a,0x0d,0x0c,0x0e,0x0d,0x10,0x0c,0x12,0x11, +0x0a,0x0c,0x0b,0x0d,0x0c,0x0f,0x0c,0x10,0x0f,0x0a,0x0c,0x0b, +0x0d,0x0c,0x0e,0x0c,0x10,0x0f,0x0a,0x0c,0x0c,0x0d,0x0d,0x0f, +0x0c,0x11,0x10,0x0a,0x0c,0x0c,0x0d,0x0d,0x10,0x0c,0x10,0x11, +0x0a,0x0c,0x0a,0x0d,0x0c,0x0e,0x0c,0x10,0x0d,0x0a,0x0c,0x0b, +0x0d,0x0c,0x0e,0x0c,0x10,0x0e,0x0a,0x0c,0x0a,0x0d,0x0b,0x0d, +0x0c,0x10,0x0d,0x0a,0x0b,0x0b,0x0c,0x0c,0x0e,0x0c,0x0f,0x0e, +0x0a,0x0b,0x0b,0x0c,0x0c,0x0d,0x0c,0x0e,0x0e,0x0a,0x0b,0x0b, +0x0c,0x0c,0x0e,0x0c,0x0f,0x0f,0x09,0x0b,0x0b,0x0c,0x0c,0x0e, +0x0b,0x0f,0x0f,0x09,0x0b,0x0c,0x0c,0x0d,0x0e,0x0b,0x0f,0x10, +0x0a,0x0c,0x0b,0x0d,0x0c,0x0f,0x0c,0x11,0x0e,0x09,0x0c,0x0b, +0x0d,0x0c,0x0f,0x0b,0x11,0x0f,0x09,0x0c,0x0c,0x0d,0x0c,0x0f, +0x0b,0x10,0x10,0x09,0x0c,0x0c,0x0d,0x0d,0x10,0x0b,0x11,0x11, +0x09,0x0c,0x0b,0x0d,0x0c,0x0f,0x0b,0x11,0x0e,0x09,0x0c,0x0c, +0x0d,0x0c,0x10,0x0b,0x11,0x10,0x09,0x0c,0x0c,0x0d,0x0c,0x0f, +0x0b,0x11,0x10,0x09,0x0d,0x0c,0x0d,0x0d,0x10,0x0b,0x12,0x11, +0x0c,0x0a,0x0b,0x0d,0x0e,0x0c,0x10,0x0c,0x0e,0x0b,0x0a,0x0a, +0x0c,0x0d,0x0c,0x0e,0x0c,0x0d,0x0a,0x0a,0x0b,0x0c,0x0d,0x0c, +0x0d,0x0c,0x0f,0x0a,0x0a,0x0a,0x0c,0x0c,0x0c,0x0d,0x0c,0x0d, +0x0b,0x09,0x0a,0x0c,0x0d,0x0b,0x0f,0x0b,0x0d,0x0b,0x0a,0x0a, +0x0c,0x0c,0x0b,0x0e,0x0c,0x0c,0x0a,0x0a,0x09,0x0b,0x0b,0x0b, +0x0d,0x0c,0x0b,0x0a,0x0a,0x09,0x0b,0x0b,0x0a,0x0d,0x0c,0x0a, +0x0a,0x0a,0x0a,0x0c,0x0c,0x0c,0x0d,0x0d,0x0d,0x0a,0x0a,0x0a, +0x0c,0x0b,0x0c,0x0c,0x0d,0x0d,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b, +0x0c,0x0c,0x0d,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c, +0x0a,0x0a,0x0a,0x0c,0x0b,0x0b,0x0c,0x0d,0x0c,0x0a,0x0a,0x09, +0x0b,0x0b,0x0b,0x0c,0x0d,0x0b,0x09,0x0a,0x09,0x0b,0x0a,0x0b, +0x0b,0x0c,0x0b,0x09,0x0a,0x09,0x0b,0x0a,0x0b,0x0b,0x0d,0x0b, +0x0a,0x09,0x0b,0x0b,0x0c,0x0b,0x0d,0x0b,0x0e,0x0a,0x0a,0x0a, +0x0b,0x0c,0x0b,0x0d,0x0c,0x0d,0x0a,0x0a,0x0a,0x0b,0x0c,0x0c, +0x0c,0x0c,0x0d,0x09,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0c,0x0d, +0x0a,0x09,0x0a,0x0b,0x0c,0x0a,0x0d,0x0b,0x0c,0x0a,0x09,0x0a, +0x0b,0x0b,0x0a,0x0c,0x0b,0x0c,0x09,0x0a,0x0a,0x0b,0x0b,0x0b, +0x0b,0x0c,0x0c,0x09,0x09,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0c, +0x09,0x0a,0x0a,0x0b,0x0b,0x0c,0x0b,0x0d,0x0d,0x09,0x0a,0x0a, +0x0b,0x0b,0x0c,0x0b,0x0d,0x0d,0x09,0x0a,0x0b,0x0b,0x0b,0x0c, +0x0b,0x0c,0x0e,0x09,0x0a,0x0b,0x0b,0x0b,0x0c,0x0b,0x0d,0x0e, +0x09,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x0c,0x0c,0x09,0x0a,0x0a, +0x0a,0x0a,0x0b,0x0a,0x0c,0x0d,0x09,0x09,0x0a,0x0a,0x0a,0x0b, +0x0a,0x0b,0x0c,0x09,0x0a,0x0a,0x0a,0x0a,0x0c,0x0a,0x0c,0x0d, +0x0a,0x0b,0x0a,0x0c,0x0c,0x0d,0x0d,0x0e,0x0d,0x0a,0x0b,0x0a, +0x0c,0x0c,0x0d,0x0c,0x0e,0x0d,0x0a,0x0b,0x0a,0x0c,0x0b,0x0d, +0x0c,0x0f,0x0d,0x0a,0x0b,0x0a,0x0c,0x0b,0x0d,0x0c,0x0e,0x0d, +0x0a,0x0a,0x0a,0x0c,0x0b,0x0c,0x0c,0x0d,0x0d,0x0a,0x0a,0x0a, +0x0b,0x0b,0x0c,0x0c,0x0d,0x0d,0x09,0x0b,0x0a,0x0c,0x0b,0x0c, +0x0b,0x0e,0x0d,0x09,0x0b,0x0a,0x0b,0x0b,0x0c,0x0b,0x0e,0x0d, +0x0a,0x0b,0x0b,0x0c,0x0c,0x0d,0x0c,0x0e,0x0e,0x09,0x0b,0x0b, +0x0c,0x0c,0x0d,0x0b,0x0e,0x0e,0x09,0x0b,0x0b,0x0b,0x0c,0x0d, +0x0b,0x0e,0x0f,0x09,0x0b,0x0c,0x0b,0x0c,0x0e,0x0b,0x0e,0x10, +0x09,0x0b,0x0b,0x0c,0x0b,0x0d,0x0b,0x0e,0x0e,0x09,0x0b,0x0b, +0x0c,0x0c,0x0d,0x0b,0x0e,0x0e,0x09,0x0b,0x0b,0x0b,0x0c,0x0d, +0x0b,0x0e,0x0f,0x09,0x0b,0x0c,0x0b,0x0c,0x0e,0x0a,0x0e,0x10, +0x09,0x0b,0x0a,0x0c,0x0b,0x0d,0x0b,0x0f,0x0d,0x09,0x0b,0x0b, +0x0c,0x0b,0x0e,0x0b,0x0f,0x0e,0x09,0x0c,0x0a,0x0c,0x0b,0x0d, +0x0b,0x10,0x0d,0x09,0x0b,0x0b,0x0c,0x0b,0x0e,0x0b,0x0f,0x0e, +0x09,0x0b,0x0b,0x0c,0x0c,0x0e,0x0b,0x0f,0x0f,0x09,0x0b,0x0c, +0x0c,0x0c,0x0f,0x0b,0x0f,0x10,0x09,0x0c,0x0b,0x0c,0x0c,0x0e, +0x0b,0x10,0x0f,0x09,0x0c,0x0c,0x0c,0x0d,0x0f,0x0b,0x10,0x10, +0x09,0x0c,0x0b,0x0d,0x0b,0x0e,0x0b,0x11,0x0e,0x09,0x0c,0x0b, +0x0d,0x0c,0x0f,0x0b,0x11,0x0f,0x09,0x0c,0x0b,0x0c,0x0c,0x0e, +0x0a,0x10,0x0f,0x09,0x0c,0x0c,0x0c,0x0c,0x0f,0x0a,0x10,0x10, +0x09,0x0c,0x0b,0x0d,0x0b,0x0f,0x0a,0x11,0x0e,0x09,0x0d,0x0c, +0x0d,0x0c,0x10,0x0a,0x12,0x10,0x09,0x0d,0x0c,0x0d,0x0c,0x10, +0x0a,0x12,0x10,0x09,0x0c,0x0d,0x0d,0x0d,0x10,0x0a,0x11,0x12, +0x0a,0x0b,0x0a,0x0c,0x0b,0x0c,0x0c,0x0f,0x0c,0x09,0x0b,0x0a, +0x0c,0x0a,0x0c,0x0b,0x0f,0x0c,0x09,0x0a,0x0a,0x0b,0x0b,0x0c, +0x0b,0x0d,0x0c,0x09,0x0a,0x0a,0x0b,0x0a,0x0b,0x0a,0x0d,0x0c, +0x09,0x0b,0x0a,0x0c,0x0b,0x0c,0x0b,0x0e,0x0d,0x09,0x0b,0x0a, +0x0b,0x0b,0x0c,0x0b,0x0e,0x0d,0x09,0x0b,0x0a,0x0c,0x0b,0x0d, +0x0a,0x0f,0x0d,0x09,0x0b,0x0b,0x0c,0x0b,0x0e,0x0a,0x0f,0x0e, +0x09,0x0a,0x0a,0x0b,0x0b,0x0c,0x0a,0x0d,0x0d,0x09,0x0b,0x0a, +0x0b,0x0a,0x0c,0x0a,0x0e,0x0c,0x09,0x0a,0x0a,0x0b,0x0b,0x0c, +0x0a,0x0d,0x0d,0x09,0x0a,0x0b,0x0b,0x0b,0x0d,0x0a,0x0d,0x0e, +0x09,0x0b,0x0b,0x0b,0x0b,0x0d,0x0a,0x0e,0x0e,0x09,0x0b,0x0b, +0x0b,0x0c,0x0e,0x0a,0x0e,0x0f,0x09,0x0b,0x0b,0x0b,0x0b,0x0d, +0x0a,0x0e,0x0e,0x09,0x0b,0x0b,0x0b,0x0b,0x0e,0x0a,0x0e,0x0f, +0x09,0x0c,0x0a,0x0c,0x0b,0x0d,0x0b,0x10,0x0d,0x09,0x0c,0x0a, +0x0c,0x0b,0x0e,0x0a,0x10,0x0d,0x09,0x0b,0x0b,0x0c,0x0b,0x0e, +0x0a,0x0f,0x0e,0x09,0x0b,0x0b,0x0c,0x0c,0x0e,0x0a,0x0f,0x0f, +0x09,0x0c,0x0b,0x0c,0x0b,0x0e,0x0a,0x10,0x0f,0x09,0x0c,0x0c, +0x0c,0x0c,0x0f,0x0a,0x10,0x10,0x09,0x0c,0x0b,0x0d,0x0c,0x0f, +0x0a,0x11,0x0f,0x09,0x0d,0x0c,0x0d,0x0c,0x10,0x0a,0x12,0x11, +0x09,0x0b,0x0a,0x0c,0x0b,0x0d,0x0a,0x0f,0x0d,0x09,0x0c,0x0b, +0x0c,0x0b,0x0e,0x0a,0x10,0x0e,0x09,0x0c,0x0b,0x0c,0x0b,0x0e, +0x0a,0x10,0x0f,0x09,0x0b,0x0c,0x0c,0x0c,0x0f,0x0a,0x0f,0x10, +0x09,0x0c,0x0b,0x0c,0x0b,0x0f,0x0a,0x11,0x0e,0x09,0x0c,0x0c, +0x0c,0x0c,0x10,0x0a,0x11,0x10,0x08,0x0c,0x0b,0x0c,0x0b,0x0e, +0x09,0x10,0x0f,0x08,0x0c,0x0c,0x0c,0x0c,0x0f,0x09,0x11,0x10, +0x0a,0x09,0x09,0x0a,0x0b,0x0a,0x0c,0x0a,0x0b,0x09,0x09,0x09, +0x0a,0x0a,0x09,0x0b,0x0a,0x0a,0x09,0x0a,0x09,0x0a,0x0a,0x0a, +0x0b,0x0c,0x0b,0x09,0x09,0x09,0x0a,0x09,0x0a,0x0a,0x0b,0x0a, +0x09,0x09,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0c,0x09,0x09,0x0a, +0x09,0x0a,0x0a,0x0a,0x0a,0x0c,0x09,0x09,0x09,0x09,0x09,0x0a, +0x0a,0x0b,0x0b,0x08,0x09,0x09,0x09,0x09,0x0a,0x09,0x0b,0x0b, +0x09,0x0a,0x09,0x0a,0x0a,0x0b,0x0a,0x0c,0x0b,0x08,0x0a,0x09, +0x0a,0x09,0x0a,0x09,0x0c,0x0b,0x08,0x0a,0x0a,0x0a,0x09,0x0b, +0x09,0x0c,0x0c,0x08,0x09,0x0a,0x09,0x0a,0x0b,0x09,0x0b,0x0d, +0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x0a,0x0a,0x07,0x08,0x08, +0x07,0x07,0x07,0x07,0x08,0x08,0x08,0x0a,0x09,0x09,0x09,0x0a, +0x08,0x0c,0x0b,0x08,0x09,0x09,0x08,0x08,0x0a,0x08,0x0a,0x0b, +0x09,0x0b,0x0a,0x0b,0x0a,0x0c,0x0a,0x0f,0x0c,0x09,0x0b,0x0a, +0x0b,0x0a,0x0d,0x0a,0x0f,0x0c,0x09,0x0a,0x0a,0x0a,0x0a,0x0c, +0x0a,0x0d,0x0d,0x08,0x0a,0x0b,0x0a,0x0b,0x0d,0x09,0x0d,0x0e, +0x09,0x0b,0x0a,0x0b,0x0a,0x0d,0x0a,0x0f,0x0d,0x09,0x0b,0x0b, +0x0b,0x0b,0x0e,0x0a,0x0f,0x0e,0x08,0x0b,0x0b,0x0b,0x0b,0x0d, +0x09,0x0e,0x0e,0x08,0x0b,0x0c,0x0b,0x0b,0x0e,0x09,0x0f,0x10, +0x08,0x0a,0x09,0x0a,0x09,0x0b,0x09,0x0d,0x0b,0x08,0x0b,0x0a, +0x0b,0x0a,0x0c,0x09,0x0e,0x0d,0x08,0x0b,0x0a,0x0a,0x0a,0x0c, +0x09,0x0e,0x0d,0x08,0x0a,0x0b,0x0a,0x0b,0x0d,0x09,0x0d,0x0e, +0x08,0x0c,0x0b,0x0b,0x0a,0x0e,0x09,0x10,0x0e,0x08,0x0c,0x0b, +0x0b,0x0b,0x0e,0x09,0x10,0x0f,0x08,0x0b,0x0a,0x0a,0x0a,0x0c, +0x09,0x0e,0x0d,0x08,0x0b,0x0a,0x0a,0x0a,0x0d,0x08,0x0e,0x0d}; + +const signed short etable1[5120]={ +0x0026,0xfffc,0x000f,0xfffc,0x000e,0xfff3,0x000c,0xfff5, +0xfffe,0xfffa,0xfffa,0xfff5,0xffd3,0xfff0,0xfff5,0xfff3, +0xfff9,0x0006,0xfff4,0x0004,0xffec,0x0003,0xfff0,0x000c, +0xffff,0x000c,0x002e,0x0018,0x0000,0x0021,0xfffd,0x0009, +0xfff4,0xfff4,0xfff8,0xfff9,0x0011,0xfffa,0x0000,0xfffe, +0x003c,0xfff0,0x0003,0xffea,0x000a,0xffe0,0x0000,0xffe4, +0xffef,0xffee,0xfffd,0xffe7,0xffdb,0xffe9,0xfff6,0x0003, +0x0002,0x0003,0x0000,0x0003,0xfff2,0x0000,0xfff2,0xffff, +0x0000,0x0002,0x0020,0x0009,0xffff,0x0019,0x0007,0x000d, +0xfffb,0x000d,0x0008,0x0001,0x0002,0x0008,0xfff6,0x0006, +0x001b,0xfff4,0x001c,0xfffe,0x0006,0xfff9,0x000f,0x0009, +0xfff5,0x0001,0xfff3,0xfff5,0xffd8,0x0004,0xffe3,0xfff2, +0xffed,0xfffb,0xffe9,0xfff8,0xffe2,0xfff3,0xffef,0x0000, +0xfff2,0x000c,0x0022,0x0014,0xfffe,0x0019,0x0002,0xfff0, +0xfffc,0xfff4,0x000f,0x0010,0x001d,0x0007,0x0018,0x000a, +0x0031,0xffe8,0x0010,0xffec,0x0002,0xffe6,0x0002,0xfff9, +0xffe7,0xfff6,0xfff5,0xffe7,0xffe0,0xfffd,0xffe5,0x0002, +0xfff8,0xfff8,0xfff5,0xfff7,0xffe8,0xffef,0xfff0,0xfff2, +0xfff3,0x0002,0x0014,0x0005,0xfffc,0x0011,0x000e,0xfff4, +0x0003,0x000d,0x0021,0x0019,0x000e,0x0017,0x000f,0x0013, +0x002e,0xfffa,0x0015,0x0008,0xfffe,0xfff0,0xfffb,0xfff8, +0xfff5,0x0004,0x0008,0x000f,0xffe8,0x0004,0xfffe,0xffe6, +0xfffd,0xfff0,0xfff0,0xfff2,0xfff7,0xfffe,0xffff,0x0004, +0x0013,0x0007,0x0024,0x0011,0x0009,0x000d,0x0000,0x001f, +0xfffb,0xfff4,0x0007,0xfff8,0x000b,0xfff1,0xfff3,0xfffc, +0x0044,0xffee,0x0009,0xfff7,0xfffa,0xffdd,0xffee,0xffe7, +0xffe6,0xfff9,0x000a,0x0001,0xfff0,0xfffd,0xffff,0xfff7, +0x0006,0xffed,0xfffc,0xfff1,0xfffc,0xfffa,0x0000,0xfff8, +0x0014,0xfffe,0x0017,0x0002,0x0007,0x0005,0x000c,0x0023, +0x0001,0x000d,0x0018,0x0000,0xfffd,0x0000,0xffea,0x0004, +0x0023,0xfff2,0x0022,0x000a,0xfff6,0xfff6,0xffff,0x000c, +0xffec,0x000c,0x0000,0x000f,0xffee,0x0018,0xffec,0xffe5, +0xfff2,0xffe4,0xffe5,0xffe5,0xffec,0xffed,0xfffe,0xfff8, +0x0005,0x0007,0x0019,0x000d,0x0005,0x0005,0x0006,0x0005, +0x0002,0xfff4,0x001f,0x000f,0x0017,0xffff,0x000c,0x0008, +0x0039,0xffe6,0x0016,0xfff9,0xfff2,0xffe4,0xfff2,0xfffd, +0xffdd,0x0000,0x0003,0x0001,0xfff5,0x0010,0xffee,0xfff6, +0xfffc,0xffe1,0xfff1,0xffe4,0xfff2,0xffe9,0xffff,0xffeb, +0x0007,0xfffe,0x000b,0xffff,0x0003,0xffff,0x0012,0x0009, +0x000a,0x000d,0x0031,0x0018,0x0008,0x000e,0x0002,0x0010, +0x0019,0x000f,0x0016,0x000b,0x0012,0x0004,0x000f,0xffea, +0x0008,0xfffe,0xffef,0xfff7,0xffd0,0xffec,0xffe2,0xffef, +0xfff0,0x000b,0xffff,0x0010,0x0002,0x000a,0xfffb,0x001a, +0xfffe,0xfffc,0x0016,0x0000,0x0002,0x000a,0xfffa,0x000d, +0xfff2,0x000a,0xffe9,0x0000,0x000a,0xfffe,0x0001,0x0000, +0x002f,0x0003,0x000b,0xfffa,0x000f,0xfff3,0x0002,0xffda, +0xfffa,0xfff3,0xfff1,0xffea,0xffd8,0xffe4,0xffe4,0x0000, +0xfffb,0x0008,0x000a,0x000f,0x0007,0x0007,0xfffc,0x000d, +0xffff,0xfff2,0x0009,0xfff2,0x0000,0x0002,0x0004,0x0012, +0xfff9,0x0024,0xfffa,0x0008,0xfffd,0x000d,0xfff9,0x0008, +0x000e,0x0007,0x0024,0x000d,0x000a,0x000a,0x0012,0x0000, +0x0000,0x0005,0xffe7,0xfff8,0xffd5,0x0000,0xffd0,0xffee, +0xffe5,0x0000,0xfff4,0x0003,0xfff9,0xfffa,0xfff9,0x000d, +0xfff1,0xfffb,0x000b,0xfffd,0x0000,0x0002,0x0000,0xfff4, +0xfffa,0x000a,0x0000,0x0017,0x0016,0x000b,0x001a,0x000c, +0x0024,0xfffb,0x0018,0xfffc,0x0007,0xfff9,0x0006,0xffef, +0xfff2,0xfffb,0xffea,0xffea,0xffdd,0xfff8,0xffd2,0xffff, +0xffef,0xfffd,0x0000,0x0002,0xfffe,0xfff6,0xfffb,0x0000, +0xfff2,0xfff1,0xfffe,0xffee,0xfffe,0xfffc,0x000b,0xfff9, +0x0001,0x0024,0x0012,0x0020,0x0007,0x001b,0x0011,0x0014, +0x0021,0x000d,0x001d,0x0018,0x0001,0x0001,0xfffe,0xffee, +0x0000,0x0009,0xfffd,0x0011,0xffe5,0x0000,0xffeb,0xffe2, +0xfff4,0xfff5,0xfffb,0xfffe,0x000c,0x0004,0x0009,0x0013, +0x0012,0xfff7,0x000d,0xfffa,0x000b,0xfff8,0xfffe,0x0023, +0xfff8,0x000a,0xfff9,0xffff,0x0004,0xfff5,0xfff6,0xfffe, +0x0037,0x0001,0x0011,0x0006,0xffff,0xfff0,0xfff1,0xffdd, +0xfff1,0xfffe,0x0000,0x0004,0xffed,0xfff8,0xffec,0xfff3, +0xffff,0xfff2,0x0007,0xfffd,0x0012,0x0000,0x000a,0x0005, +0x0013,0xffed,0x0000,0xffeb,0x0008,0xfff0,0x0009,0x0027, +0x0000,0x0024,0x000a,0x0007,0xfff7,0x0004,0xffec,0x0005, +0x0016,0x0005,0x002a,0x001a,0xfffa,0x0008,0x0001,0x0002, +0xfff7,0x0011,0xfff6,0x0012,0xffeb,0x0013,0xffd9,0xffe1, +0xffe9,0xffe9,0xfff0,0xfff1,0x0002,0xfff4,0x0007,0x0006, +0x0005,0xfff7,0x0001,0xfff6,0x0007,0xfff0,0x0004,0x0009, +0x0000,0x000a,0x0011,0x0016,0x0010,0x0002,0x000e,0x0009, +0x002c,0xfffa,0x001e,0x0008,0xfff7,0xfff6,0xfff5,0xfff2, +0xffe9,0x0005,0xfff8,0x0004,0xfff2,0x000c,0xffdb,0xfff2, +0xfff4,0xffe6,0xfffc,0xfff0,0x0008,0xfff0,0x0009,0xfff9, +0x0006,0xffed,0xfff4,0xffe7,0x0005,0xffe8,0x000f,0x000d, +0x0008,0x0024,0x0022,0x001f,0x0001,0x0012,0x0004,0x0012, +0xfffd,0xfffb,0xfff7,0xfff9,0x000f,0xffff,0x0005,0x000d, +0x0002,0x000c,0x0005,0x0002,0xffeb,0xffe9,0xfffe,0xfff0, +0x0000,0x0005,0xfffa,0x000d,0xffe9,0x0003,0xffe0,0x000a, +0xfff1,0x0008,0x002c,0x001c,0x0009,0x0025,0xfffe,0x000d, +0xfff7,0xfff1,0xfff4,0xffe5,0xfff9,0xfff4,0x0000,0xfff5, +0x0012,0xffef,0xffeb,0xffe7,0x000b,0xffed,0xfffa,0xfffd, +0xfff5,0x0000,0x0007,0xfff5,0xfff3,0xffe1,0xffff,0x0000, +0x0009,0x0001,0x0005,0x000c,0xffee,0x0000,0xffe1,0xfffe, +0xfff3,0xffff,0x001e,0x000e,0x0007,0x001d,0x0009,0x0012, +0xffff,0x000a,0x0004,0xffee,0xffea,0x0003,0xfff6,0xfffe, +0xfff3,0xfff3,0x0003,0xfffb,0x0007,0x0004,0x0009,0x0022, +0xfffb,0x0014,0xfffe,0x0003,0xfff0,0xfffd,0xffec,0xffef, +0xfff5,0xfff9,0xffef,0x0000,0xffde,0xfff3,0xffdf,0xfffe, +0xffe4,0x0008,0x0020,0x0018,0x0005,0x001d,0x0003,0xfff4, +0x0000,0xfff1,0x000b,0xfffd,0x0003,0x0002,0x0018,0x0001, +0x0008,0xffe7,0xfff8,0xffe9,0x0003,0xfff3,0xfffd,0x0011, +0xffec,0x0008,0x0000,0xfff6,0xfff8,0xfff5,0xffee,0x0000, +0xffff,0xfff6,0xfffb,0x0000,0xffe4,0xffef,0xffe0,0xfff1, +0xffe6,0xffff,0x0013,0x0009,0x0003,0x0015,0x000f,0xfff9, +0x0006,0x0009,0x001d,0x0005,0xfff6,0x0011,0x000f,0x0009, +0x0004,0xfffa,0xfffd,0x0005,0xffff,0xfffc,0xfff5,0x0010, +0xfffa,0x0017,0x0013,0x001d,0x0000,0xfffd,0x0006,0xffe2, +0x0003,0xffef,0xfff6,0xfffb,0xfff3,0xfffe,0xffef,0x0003, +0x0005,0x0003,0x0023,0x0015,0x0011,0x0011,0x0002,0x0023, +0xfffe,0xfff1,0x0003,0xffe4,0xfff3,0xffeb,0xfff3,0xfff3, +0x001a,0xffed,0xfff1,0xfff4,0xfffb,0xffea,0xffe8,0x0000, +0xffeb,0x000c,0x0015,0x000f,0x0008,0xfff5,0x0007,0xfff4, +0x000e,0xffec,0x0002,0xfffa,0xfff9,0xfffa,0xfff0,0xfff7, +0x0006,0xfffb,0x0015,0x0007,0x000f,0x000a,0x000d,0x0027, +0x0005,0x000a,0x0014,0xffed,0xffe4,0xfffb,0xffea,0xfffb, +0xfffb,0xfff1,0x0009,0x0007,0xfff7,0x0002,0xfff8,0x0025, +0xfff2,0x001f,0x000b,0x001d,0x0005,0x0010,0xfff5,0xffe2, +0xfff9,0xffe3,0xffeb,0xffee,0xffe9,0xffed,0xffee,0xfff7, +0xfff9,0x0003,0x0017,0x0011,0x000e,0x0009,0x0008,0x0009, +0x0006,0xfff1,0x001b,0xfffc,0xfffe,0xfffa,0x000c,0xffff, +0x0010,0xffe5,0xfffe,0xfff6,0xfff3,0xfff0,0xffec,0x0014, +0xffe3,0x0014,0x000e,0x0010,0x000d,0x0008,0xfff7,0xfff3, +0x0002,0xffdf,0xfff7,0xffed,0xffef,0xffe9,0xffef,0xffea, +0xfffa,0xfffa,0x0009,0x0002,0x000c,0x0002,0x0014,0x000d, +0x000d,0x000a,0x002d,0x0004,0xfff0,0x0008,0x0002,0x0007, +0xfff0,0x000e,0xfffe,0x0008,0x0014,0x0011,0x0009,0x0002, +0x000e,0x0010,0xfffa,0x0005,0xffe8,0xffe4,0xffeb,0xffec, +0xfff8,0x0009,0x0004,0x0019,0xffff,0x000b,0xffea,0x0018, +0xfff1,0xfff8,0x0015,0x0005,0x000b,0x000e,0xfffb,0x0012, +0xfff5,0x0007,0xffe5,0xffec,0xfff2,0xfff9,0x0001,0xfff7, +0x0006,0x0002,0xfff2,0xfff7,0x0010,0xffff,0xfffd,0xfff2, +0x0000,0x0005,0xfffd,0xfff8,0xfff0,0xffdc,0xffed,0xfffd, +0x0001,0x0006,0x0011,0x0018,0x0004,0x0007,0xffeb,0x000b, +0xfff2,0xffee,0x0007,0xfff7,0x0009,0x0007,0x0006,0x0016, +0xfffd,0x0021,0xfff6,0xfff5,0xffe4,0x0007,0xfff9,0x0000, +0xffe6,0x0006,0x000b,0x000a,0x000c,0x0017,0x000c,0x0017, +0x0005,0x0018,0xfff3,0x0005,0xffed,0xfff8,0xffda,0xffeb, +0xffec,0xfffe,0xfffa,0x000c,0xfff5,0xfffb,0xffe9,0x000b, +0xffe3,0xfff7,0x0009,0x0000,0x0007,0x0006,0x0001,0xfff9, +0xfffe,0x0007,0xfffd,0x0003,0xfffe,0x0006,0x001b,0x0003, +0xfffc,0xfffa,0x0000,0xfff9,0x0008,0x0004,0x0000,0x0006, +0xfff7,0x000d,0xfff5,0xfff9,0xfff5,0xfff1,0xffdb,0xfffc, +0xfff7,0xfffb,0x0005,0x000b,0xfffb,0xfff7,0xffea,0xffff, +0xffe5,0xffee,0xfffc,0xfff2,0x0005,0x0000,0x000c,0xfffd, +0x0004,0x0020,0x000e,0x000c,0xffef,0x0016,0x0011,0x000b, +0xfff8,0x000c,0x0003,0x0015,0x0003,0x000e,0xfff8,0x0005, +0x0004,0x001c,0x0007,0x0020,0xfffe,0xfff8,0xfff4,0xffde, +0xfffc,0xfff4,0x0001,0x0006,0x0009,0x0004,0xfff9,0x0011, +0x0004,0xfff3,0x000b,0xffff,0x0013,0xfffc,0x0000,0x0027, +0xfffc,0x0007,0xfff5,0xffeb,0xffec,0xfff0,0xfff6,0xfff5, +0x000d,0x0000,0xfff8,0x0003,0x0000,0xfffc,0xffeb,0xfff5, +0xfff7,0x0010,0x000a,0x0012,0x0005,0xfff0,0xfff6,0xfff0, +0x0005,0xfff1,0x000d,0x0005,0x000f,0x0001,0xfffa,0x0004, +0x0006,0xffe9,0xfffe,0xfff0,0x0011,0xfff4,0x000a,0x002c, +0x0003,0x0021,0x0006,0xfff4,0xffde,0xffff,0xffec,0xfffd, +0xffee,0x0004,0x0011,0x0017,0xfffc,0x0014,0xfffc,0x001a, +0xfffd,0x0024,0x0000,0x0020,0x0002,0x000c,0xffe3,0xffde, +0xfff0,0xffe8,0xfff6,0xfffa,0x0000,0xfff4,0xfff8,0x0004, +0xfff8,0xfff3,0x0000,0xfffa,0x0010,0xfff4,0x0005,0x000d, +0x0003,0x0007,0x000d,0x0003,0xfff8,0xfffe,0x000e,0x0000, +0x0003,0xfff9,0x0005,0x0005,0xfff8,0x0002,0xffef,0x0009, +0xffee,0x0018,0x0002,0x0013,0x000a,0x0004,0xffe4,0xffef, +0xfffb,0xffe4,0x0002,0xfff9,0x0004,0xfff1,0xfff9,0xfff8, +0xfffa,0xffe9,0xfff3,0xffeb,0x000e,0xffec,0x0011,0x0012, +0x000b,0x0021,0x001e,0x000b,0xffe9,0x000d,0x0005,0x0009, +0x003c,0x000a,0x0007,0xffff,0x0009,0xfff8,0x0006,0xfff3, +0x0002,0xfff1,0xffff,0xfff6,0xfff3,0xfff5,0x000f,0x0000, +0x0006,0x0009,0xffff,0x0000,0xfff3,0x0001,0xfff5,0xfffd, +0xfff3,0x0015,0x000d,0x001a,0xfff9,0x001f,0xfff6,0xfff9, +0xfff0,0xffdf,0xffe1,0xfff6,0x0016,0xfff8,0x0001,0xfffe, +0x0052,0xffff,0xfffc,0xffed,0x0006,0xffe5,0xfffa,0xffe3, +0xfff4,0xffe6,0x0001,0xffe8,0xfffb,0xffee,0x0011,0x0011, +0x0011,0x0006,0x000a,0x0000,0xfff9,0xfffe,0xfff7,0xfff0, +0xfff4,0x000b,0x0000,0x000b,0xfff7,0x0017,0x0000,0xfffd, +0xfff8,0xfff8,0xfff3,0xffff,0x0008,0x0007,0xfff9,0x0006, +0x0031,0x0002,0x0015,0x0000,0x0001,0xfffe,0x0009,0x0008, +0xfffa,0xfffa,0xfff8,0xfff6,0xfff8,0x0009,0xfffe,0x0000, +0xfffc,0xfffe,0xfff3,0xfff4,0xffe9,0xfff1,0xfff4,0xfff0, +0xffe6,0x0015,0x0002,0x0015,0xfff5,0x0017,0xfffc,0xffdf, +0xfff9,0xffdf,0xfffa,0x000d,0x0022,0x0005,0x001b,0x000a, +0x0047,0xfff6,0x0009,0xffef,0xffff,0xffec,0xfffd,0xfff8, +0xffeb,0xffee,0xfffa,0xffe8,0x0000,0x0001,0x0000,0x0010, +0x0006,0xfffb,0x0000,0xfff3,0xffef,0xffed,0xfff5,0xffe3, +0xffe7,0x000b,0xfff5,0x0006,0xfff3,0x000f,0x0007,0xffe3, +0x0000,0xfff8,0x000b,0x0016,0x0014,0x0015,0x0011,0x0012, +0x0043,0x0008,0x000e,0x000b,0xfff9,0xfff5,0xfff5,0xfff7, +0xfff9,0xfffd,0x000d,0x0010,0x0008,0x0009,0x0018,0xfff4, +0x000a,0xfff3,0xfffb,0xffef,0xfffe,0xfffc,0x0003,0xfff6, +0x0006,0x0011,0x0004,0x0013,0x0000,0x000b,0xfffa,0x000d, +0xfff7,0xffdf,0xfff2,0xfff6,0x0010,0xffef,0xfff6,0xfffc, +0x005a,0xfffd,0x0002,0xfffa,0xfff6,0xffe3,0xffe8,0xffe6, +0xffeb,0xfff1,0x000f,0x0002,0x0010,0x0001,0x0019,0x0004, +0x0015,0xfff0,0x0006,0xffee,0x0003,0xfff8,0x0005,0xffe8, +0x0008,0x0007,0xfff7,0x0004,0xffff,0x0003,0x0005,0x0012, +0xffff,0xfff9,0x0002,0xffff,0x0002,0xffff,0xffed,0x0003, +0x0039,0x0000,0x001b,0x000d,0xfff2,0xfffb,0xfff9,0x000b, +0xfff1,0x0004,0x0005,0x0010,0x000d,0x001d,0x0006,0xfff3, +0x0000,0xffe7,0xfff0,0xffe1,0xfff4,0xffea,0x0002,0xffe9, +0xfffa,0x0010,0xfff9,0x000e,0xfffe,0x0003,0x0000,0xfff4, +0x0000,0xffdf,0x0009,0x000d,0x001c,0xfffd,0x000e,0x0007, +0x004f,0xfff5,0x000f,0xfffc,0xffee,0xffe9,0xffec,0xfffb, +0xffe2,0xfff9,0x0007,0x0002,0x0015,0x0015,0x0008,0x0003, +0x000a,0xffe4,0xfffc,0xffe1,0xfffa,0xffe7,0x0003,0xffdb, +0xfffc,0x0007,0xffec,0x0000,0xfffc,0xfffc,0x000b,0xfff9, +0x0006,0xfff8,0x001b,0x0016,0x000e,0x000c,0x0005,0x0010, +0x002f,0x001e,0x000f,0x000e,0x000e,0x0009,0x0009,0xffe9, +0x000d,0xfff6,0xfff4,0xfff9,0xfff0,0xfff1,0xfffd,0xfffd, +0xffff,0x000e,0x0009,0x000c,0x0009,0x0008,0x0000,0x000a, +0xfff2,0x0004,0xfff7,0x0002,0xfffb,0x0008,0xfff3,0xfffd, +0xffee,0xfff6,0xffd3,0xfffd,0x0010,0xfffc,0x0004,0x0000, +0x0045,0x0011,0x0003,0xfffd,0x000a,0xfff8,0xfffd,0xffd8, +0xffff,0xffeb,0xfff6,0xffeb,0xfff8,0xffe9,0xffff,0x000d, +0x0008,0x000b,0x0015,0x000b,0x000f,0x0004,0x0000,0xfffe, +0xfff3,0xfffb,0xffe9,0xfff4,0xfff9,0x0000,0xffff,0x0000, +0xfff6,0x000e,0xffe4,0x0005,0x0001,0x000b,0xfffb,0x0007, +0x0024,0x0015,0x001c,0x0010,0x0006,0x0010,0x000c,0xfffe, +0x0004,0xfffe,0xffec,0xfff9,0xfff5,0x0004,0xffec,0xfffc, +0xfff4,0x0002,0xffff,0x0000,0x0000,0xfff8,0xfffe,0xfffe, +0xffe5,0x0004,0xffeb,0xfffe,0xfff7,0x0000,0xfffa,0xffe3, +0xfff7,0xfff6,0xffeb,0x0015,0x001c,0x000a,0x001d,0x000b, +0x003a,0x0009,0x0010,0xffff,0x0002,0xfffe,0x0000,0xffed, +0xfff6,0xfff3,0xffef,0xffeb,0xfffd,0xfffd,0xffed,0x000c, +0xfffe,0x0000,0x000a,0xffff,0x0005,0xfff4,0x0000,0xfff1, +0xffe6,0xfffb,0xffde,0xfff0,0xfff5,0xfff9,0x0004,0xffe7, +0xfffe,0x000e,0xfffd,0x001d,0x000d,0x0019,0x0014,0x0014, +0x0037,0x001c,0x0015,0x001b,0xfffe,0x0007,0xfff8,0xffec, +0x0004,0x0001,0x0001,0x0012,0x0005,0x0004,0x0005,0xfff0, +0x0002,0xfff8,0x0005,0xfffb,0x0013,0x0002,0x000e,0x0003, +0x0006,0x0000,0xffee,0xfffc,0x0002,0xfff5,0xfff8,0x0012, +0xfff5,0xfff6,0xffe3,0xfffd,0x000a,0xfff3,0xfff8,0xfffd, +0x004d,0x0010,0x0009,0x0009,0xfffa,0xfff5,0xffeb,0xffdb, +0xfff6,0xfff6,0x0004,0x0005,0x000d,0xfffd,0x0007,0x0000, +0x000d,0xfff5,0x0011,0xfffa,0x0019,0xffff,0x000f,0xfff7, +0x0007,0xfff7,0xffe0,0xffed,0x0000,0xffee,0x0002,0x0016, +0xfffd,0x000f,0xfff4,0x0005,0xfffc,0x0002,0xffef,0x0005, +0x002c,0x0014,0x0022,0x001d,0xfff6,0x000d,0xfffc,0x0000, +0xfffc,0x0009,0xfffb,0x0013,0x000a,0x0018,0xfff5,0xffef, +0xfff8,0xffec,0xfffb,0xffed,0x0009,0xfff2,0x000c,0xfff7, +0xfffa,0x0000,0xffe2,0xfff7,0x0000,0xffed,0xfffe,0xfff9, +0xfffe,0xfff6,0xfffb,0x0014,0x0015,0x0001,0x0011,0x0009, +0x0042,0x0008,0x0017,0x000b,0xfff2,0xfffb,0xffef,0xfff0, +0xffed,0xfffe,0xfffd,0x0005,0x0012,0x0011,0xfff6,0x0000, +0x0001,0xffe9,0x0006,0xffec,0x000f,0xffee,0x000e,0xffea, +0xfffb,0xfff6,0xffd4,0xffe9,0xfffe,0xffe6,0x0009,0xfffd, +0x0004,0x000e,0x000c,0x001d,0x0007,0x0010,0x0007,0x0012, +0x0012,0x0009,0xffef,0xfffc,0x000b,0x0003,0x0000,0x000b, +0x0007,0x0004,0x000a,0x0003,0x000a,0xffee,0x0018,0xfffd, +0x000e,0x0007,0x0004,0x000a,0xfff0,0x0001,0xffe5,0xfffc, +0xffe5,0x0011,0x000c,0x001e,0x0000,0x0023,0xfff7,0xfffd, +0xfff4,0xffdc,0xffdd,0xffe2,0xfffe,0xfff3,0x0002,0xfff5, +0x0028,0xfffe,0xffe3,0xffea,0x0007,0xfff2,0xfff4,0xfffb, +0xfff9,0xfff9,0x000c,0xfff7,0x0012,0xffe6,0x001a,0x000e, +0x0018,0x0004,0x0010,0x0009,0xfff6,0xfffe,0xffe6,0xffee, +0xffe6,0x0007,0xffff,0x000f,0xffff,0x001b,0x0002,0x0000, +0xfffc,0xfff5,0xffef,0xffeb,0xfff0,0x0001,0xfff9,0xfffd, +0x0008,0x0001,0xfffd,0xfffe,0x0003,0x000a,0x0003,0x0020, +0xffff,0x000c,0x0002,0x0004,0x000f,0x0001,0x0007,0xfffd, +0x0002,0xfffc,0xfffa,0xfffd,0xffe6,0xfff1,0xffe3,0xffef, +0xffd8,0x0011,0x0000,0x001a,0xfffe,0x001b,0xfffe,0xffe3, +0xfffc,0xffdc,0xfff6,0xfffa,0x0009,0x0000,0x001b,0x0000, +0x001e,0xfff5,0xfff1,0xffec,0x0000,0xfff8,0xfff7,0x000f, +0xfff1,0x0000,0x0005,0xfff7,0x0017,0xfffa,0x0008,0x000d, +0x000d,0xfff9,0x0005,0xfffd,0xffec,0xffed,0xffe5,0xffe1, +0xffd9,0x0007,0xfff3,0x000b,0xfffc,0x0013,0x0008,0xffe7, +0x0003,0xfff5,0x0007,0x0002,0xfffc,0x0010,0x0012,0x0009, +0x001a,0x0007,0xfff5,0x0008,0xfffb,0x0001,0xffef,0x000e, +0xffff,0x000f,0x0018,0x001e,0x0020,0x0001,0x0021,0xfff0, +0x0012,0xfff2,0x0000,0xfff8,0xfffa,0xfffc,0xfff4,0xfff4, +0xfffa,0x000d,0x0002,0x0017,0x0008,0x000f,0xfffc,0x0011, +0xfffb,0xffdc,0xffee,0xffe2,0xfff8,0xffea,0xfff6,0xfff2, +0x0030,0xfffc,0xffe9,0xfff7,0xfff7,0xffef,0xffe2,0xfffe, +0xfff0,0x0003,0x001a,0x0010,0x0028,0xfffa,0x0023,0x0001, +0x001c,0xffef,0x000c,0xfff7,0x0000,0xfff8,0xfff5,0xffe7, +0xfffb,0x0003,0xfff6,0x0008,0x0006,0x0007,0x0006,0x0016, +0x0001,0xfff5,0xffff,0xffeb,0xffea,0xfff9,0xffed,0xfffb, +0x000f,0x0000,0x0002,0x000a,0xfff3,0x0007,0xfff2,0x0023, +0xfff6,0x0017,0x0010,0x001f,0x0025,0x0015,0x0010,0xffef, +0x0006,0xffe6,0xfff6,0xffeb,0xfff0,0xffeb,0xfff3,0xffe7, +0xffed,0x000d,0xfff8,0x0013,0x0005,0x0007,0x0001,0xfff8, +0x0002,0xffdc,0x0005,0xfffa,0x0003,0xfff8,0x000f,0xffff, +0x0025,0xfff4,0xfff7,0xfff9,0xffef,0xfff5,0xffe6,0x0012, +0xffe7,0x000c,0x0013,0x0011,0x002d,0x000e,0x0011,0x0000, +0x0011,0xffe2,0x0001,0xffea,0xfff6,0xffe7,0xfff4,0xffda, +0xffee,0x0003,0xffea,0x0004,0x0003,0x0000,0x000d,0xfffd, +0x000a,0xfff5,0x0017,0x0002,0xfff6,0x0007,0x0005,0x0007, +0x0005,0x001d,0xfff7,0x000b,0x000f,0x0016,0x0003,0x0000, +0x0012,0x0008,0xffff,0x0006,0x0007,0xffe9,0x0006,0xfffa, +0x0005,0x000c,0x000f,0x0015,0x0005,0x0008,0xffef,0x0009, +0xffe4,0x0000,0xfff5,0x0006,0x0002,0x000c,0xfff5,0x0000, +0xfff2,0xfff3,0xffcf,0xffea,0xfff8,0xfff7,0x0004,0xfff7, +0x001b,0x0010,0xffeb,0xfffa,0x000c,0x0003,0xfff7,0xfff0, +0x0003,0xfffe,0x0001,0xfff9,0x000f,0xffe1,0x0007,0x000a, +0x0010,0x0009,0x001b,0x0015,0x000b,0x0005,0xfff0,0xfffd, +0xffe6,0xfff7,0xffe8,0xfff9,0x0000,0x0004,0x0000,0x0004, +0xfffa,0x000b,0xffe0,0xfff2,0xffe9,0x0006,0xfffb,0xffff, +0xfffc,0x0014,0x0003,0x000d,0x0008,0x001c,0x0006,0x0015, +0x000a,0x0010,0xfff8,0x0007,0x000c,0xfffd,0xfff5,0xfff9, +0xfffb,0x0000,0x0004,0x0008,0xfffc,0xfff8,0xffee,0xfffd, +0xffd7,0x0000,0xffea,0x0002,0x0000,0x0004,0xfffb,0xffe7, +0xfffa,0xfff2,0xffe7,0x0001,0x0002,0x0004,0x001d,0x0002, +0x0011,0x0008,0xfff8,0xfffc,0x0004,0x000a,0xfffa,0x0005, +0xfffc,0x0005,0xfffa,0xfffa,0x0014,0xfff6,0xfff7,0x0009, +0x0004,0xfffe,0x0010,0x0007,0x0001,0xfff4,0xffef,0xfff0, +0xffd9,0xfff7,0xffdc,0xfff4,0xfffe,0xfffd,0x0006,0xffeb, +0x0001,0x000b,0xfff9,0x000a,0xfff5,0x0014,0x0014,0x000b, +0x000d,0x001b,0xfffd,0x0018,0xffff,0x0013,0xfff2,0x0003, +0x0009,0x0014,0x000c,0x0021,0x001d,0xfffd,0x000f,0xffec, +0x0009,0xfff7,0x000b,0x0003,0x0010,0x0002,0xfffe,0x0002, +0xfff9,0xfffd,0xffec,0x0000,0x000a,0xfff9,0xfff9,0x0016, +0xfff9,0xfff3,0xffdf,0xffe9,0xfff2,0xffee,0xfff9,0xfff4, +0x0023,0x000f,0xfff1,0x0006,0xfffc,0x0001,0xffe5,0xfff4, +0xfffb,0x0008,0x000f,0x0013,0x0025,0xfff5,0x0010,0xfffe, +0x0014,0xfff4,0x0017,0x0002,0x0016,0xffff,0xffff,0xfff5, +0xfffb,0xfff3,0xffde,0xfff2,0x0008,0xfff2,0x0004,0x001a, +0x0000,0x000b,0xfff0,0xfff2,0xffe3,0xfffe,0xffef,0xfffd, +0x0003,0x0013,0x0009,0x001a,0xfff8,0x001a,0xfff6,0x0018, +0x0000,0x001c,0x0005,0x0021,0x0022,0x0011,0xfffe,0xffec, +0xffff,0xffea,0x0000,0xfff6,0x0006,0xfff2,0xfffd,0xfff6, +0xffec,0xfffc,0xffe0,0xfffc,0x0007,0xfff1,0x0000,0xfffd, +0x0000,0xfff3,0xfff7,0x0000,0xfffd,0xfffc,0x0011,0x0000, +0x0019,0x0007,0xfffe,0x0008,0xfff4,0x0007,0xffe9,0x0008, +0xfff3,0x0010,0x0007,0x0014,0x002a,0x0009,0x0000,0xfffd, +0x0009,0xffe7,0x000c,0xfff6,0x000c,0xffee,0xfffe,0xffe8, +0xffed,0xfff3,0xffd2,0xffed,0x0005,0xffea,0x000a,0x0000, +0x0008,0x000b,0x0008,0x0009,0xffef,0x000b,0x0007,0x0008, +0xffe7,0xfff9,0x0002,0xfff8,0x000c,0xfff9,0x0017,0xfff8, +0x000d,0xfff0,0xfff9,0xffec,0xffd6,0xfff7,0x0000,0x0003, +0xfff7,0x0019,0xfff4,0x000a,0xfff4,0x0012,0x0002,0x0018, +0x0013,0x000d,0x002e,0x0013,0xfffb,0x0016,0xfff6,0x0000, +0xfff8,0xfff5,0xfff8,0xfff7,0x0011,0xfff5,0xfff9,0xfff8, +0xfffd,0xffed,0xfff7,0xffe6,0x0008,0xffe6,0x000a,0xffe8, +0x0000,0xffe4,0xfffb,0xffdf,0xffde,0xffef,0x0002,0x0014, +0x0001,0x0016,0x0000,0x000a,0xfffa,0x000e,0x0003,0x000a, +0x0014,0x0004,0x0020,0x0004,0xfff9,0x000f,0x0000,0x0003, +0x0000,0x000d,0x0009,0x0000,0x0003,0x0004,0xffef,0x0000, +0xffdd,0xfff1,0x000f,0xfffa,0x0004,0xffff,0x001b,0x000c, +0x0005,0xfff8,0xfff1,0xffed,0xffdb,0x000b,0xfff0,0x0002, +0xffec,0x000c,0xffe9,0xfffe,0xffea,0x0001,0x0001,0x000b, +0x0005,0x000d,0x0022,0x000e,0xfff8,0x000e,0xfffc,0xffe6, +0x0000,0xfff5,0x0010,0x000e,0x001d,0x0002,0x0011,0x0003, +0xfff3,0xffe5,0x0003,0xffe8,0x0001,0xffed,0x000e,0xfffd, +0xfff7,0xffec,0xfff4,0xffdf,0xffe3,0x0003,0xfff1,0x0014, +0xfff7,0x0009,0xfff5,0xfffd,0xfff0,0xfffe,0x0002,0xfffe, +0x0007,0x0003,0x0014,0x0000,0xfff6,0x0007,0x0007,0xffea, +0x0007,0x000d,0x0021,0x0017,0x000e,0x0012,0x0007,0x000c, +0xffef,0xfff8,0x0008,0x0004,0xfffc,0xfff6,0x0006,0xfffb, +0x0004,0xfffb,0x0006,0x0006,0xffec,0x000a,0x0009,0xfff7, +0xfffc,0x0002,0xfff0,0xfff9,0xffff,0x000c,0x0011,0x0010, +0x0027,0x0009,0x0024,0x000c,0x0002,0x0003,0xfffa,0x0015, +0xffff,0xfff5,0x0007,0xfff6,0x000b,0xffec,0xffec,0xfff5, +0x0004,0xffec,0xfffd,0xfff3,0xfff8,0xffe4,0xfffa,0xffeb, +0xfff6,0xfff0,0x0008,0xfff9,0xfff4,0x0003,0x000b,0x0007, +0x0005,0x0000,0xfffc,0xfff8,0x0004,0x0008,0x0012,0x0003, +0x0029,0x0000,0x0016,0xfffe,0x0000,0xfffc,0x0005,0x0019, +0x0006,0x000e,0x0019,0xffff,0xfffe,0xfffc,0xffe3,0xfffe, +0xffe5,0xfff0,0x0015,0x0006,0xfff4,0xfffd,0x0009,0x0010, +0xfffd,0x0002,0xffff,0x0007,0xfff1,0x001f,0xfff9,0xfff6, +0xfff0,0xfff7,0xffe5,0xffeb,0xfff5,0xfffb,0x0010,0x0003, +0x001a,0x0009,0x0018,0x0007,0x0000,0xfffc,0x0000,0xfffc, +0x0006,0xfff5,0x0020,0x000e,0x0017,0xfffa,0x0005,0x0001, +0xfffb,0xffe3,0x0009,0xfff5,0xfff1,0xffea,0xfffd,0x0000, +0xffee,0xfff8,0x0001,0xfffa,0xfff9,0x0017,0xfffa,0x0006, +0xfffb,0xfff4,0xfff1,0xffeb,0xfffb,0xfff8,0x0011,0xfff7, +0x001c,0x0000,0x000b,0xfffa,0xfffe,0xfff4,0x000b,0x0000, +0x000e,0x000d,0x0031,0x0016,0x0008,0x0009,0xfffc,0x0009, +0xffdb,0x000c,0x0009,0x0007,0x0011,0x000b,0x001a,0xffee, +0x0019,0xfff4,0xffed,0xffef,0xffd3,0xfff2,0xffef,0x0000, +0xffef,0x001e,0xffff,0x0016,0x000a,0x0019,0x000c,0x0026, +0x0012,0xfffd,0x0016,0xfffc,0xfffd,0x0000,0xfff3,0x0003, +0xfff6,0x000b,0xffe9,0xfffe,0x000a,0xfff9,0xfffb,0xfff9, +0xfff1,0x0000,0xfffe,0xfff6,0x000d,0xfff9,0x000e,0xffdd, +0x000a,0xffe9,0xfff0,0xffe1,0xffdb,0xffeb,0xfff0,0x0011, +0xfffa,0x001a,0x000a,0x0015,0x0010,0x0015,0x000d,0x0019, +0x0013,0xfff3,0x0008,0xffed,0xfffb,0xfff9,0xffff,0x0008, +0xfffe,0x0024,0xfffb,0x0006,0xfffd,0x0008,0xfff1,0x0001, +0xffd0,0x0004,0x0017,0x0009,0x0009,0x0011,0x001e,0x0002, +0x0010,0xfffd,0xffe6,0xfff0,0xffd8,0x0006,0xffdd,0xffff, +0xffe4,0x0011,0xfff4,0x0009,0x0000,0x0008,0x000b,0x0019, +0x0005,0xfffd,0x000a,0xfff8,0xfffa,0xfff9,0xfffa,0xffea, +0xffff,0x000b,0x0001,0x0015,0x0016,0x0007,0x0013,0x0005, +0xffe6,0xfff9,0x000b,0xfff8,0x0005,0xffff,0x0011,0xfff2, +0x0001,0xfff1,0xffe8,0xffe2,0xffe0,0xffff,0xffdf,0x0010, +0xffee,0x000e,0x0000,0x0008,0x0006,0x0004,0x000c,0x000c, +0x0006,0xfff3,0xfffe,0xffe9,0xfff8,0xfff1,0x0004,0xffef, +0x0005,0x0024,0x0012,0x001e,0x0008,0x0016,0x000a,0x000e, +0xffe2,0x000b,0x000f,0x0014,0x0000,0x0008,0x0009,0xfff1, +0x000f,0x0000,0xfffb,0x0009,0xffe9,0x0006,0xfff8,0xfff3, +0xfff3,0x0007,0xfffb,0x0003,0x0014,0x0013,0x001b,0x001f, +0x0027,0xfff9,0x000d,0xfff5,0x0004,0xffed,0xfff8,0x0019, +0xfffd,0x000b,0xfff9,0xfffe,0x0004,0xfff0,0xffee,0xfff7, +0xfff8,0xffff,0x0003,0x0002,0xfffd,0xfff6,0xfffd,0xffe0, +0x0001,0xfff4,0xfffe,0xfffc,0xfff1,0xffff,0xfff9,0x0003, +0xfffe,0x0004,0x0006,0x0003,0x001a,0x000f,0x001d,0x0011, +0x0028,0xffef,0x0000,0xffe6,0x0002,0xffe5,0x0002,0x001d, +0x0004,0x0024,0x000a,0x0006,0xfff7,0x0000,0xffe5,0x0000, +0xffd8,0x0002,0x001d,0x0016,0xfff9,0x000e,0x000c,0x0005, +0x0007,0x0007,0xfff4,0x0009,0xffee,0x001a,0xffe6,0xfff2, +0xffe8,0xfffc,0xfff0,0xfff7,0x000a,0x0002,0x001a,0x0012, +0x001a,0xfff9,0x0001,0xfff1,0x0001,0xffe5,0xfffe,0x0000, +0x0004,0x000b,0x0011,0x0015,0x0010,0xffff,0x0007,0x0003, +0xffee,0xfff7,0x0011,0x0004,0xfff5,0xfffd,0x0000,0xfff5, +0xfff9,0xfffc,0xfff6,0xfffd,0xfff6,0x0012,0xffe8,0x0003, +0xfff2,0xfff9,0xfffc,0xfff6,0x0010,0xffff,0x001b,0x0004, +0x001b,0xffef,0xfff4,0xffe2,0x0000,0xffdd,0x0009,0x0003, +0x000c,0x0024,0x0023,0x001e,0x0002,0x000d,0xfffe,0x000b, +0xffbe,0xfff8,0xffe9,0xfff5,0x000e,0x0005,0x0011,0x0010, +0x0013,0x0002,0x0003,0xfffb,0xffee,0xffef,0x000a,0x0000, +0xffff,0x0017,0xfffa,0x0014,0xfff1,0x0012,0xfff2,0x0016, +0x0005,0x000a,0x002c,0x0017,0x0002,0x001a,0xfff7,0x0003, +0xfffc,0xfff2,0xfff4,0xffe3,0xfff9,0xfff0,0xfff9,0xffee, +0xffd4,0xffec,0xffde,0xffe3,0x000a,0xfff3,0x0004,0x0000, +0x0004,0xfff7,0x0005,0xffed,0xfff6,0xffe8,0x000b,0x0011, +0x0008,0x0014,0x0005,0x0013,0xfff7,0x000e,0xfff4,0x0009, +0x0006,0x0000,0x001e,0x0009,0x0000,0x0013,0x0002,0x0007, +0x0002,0x000a,0x0005,0xffec,0xffeb,0xffff,0xffef,0xfff7, +0xffb3,0xfff0,0xfff7,0xfff7,0x0006,0x000b,0x0015,0x0025, +0x000a,0x000a,0xfffc,0xfffb,0xfff3,0x0003,0xfff9,0x0000, +0xfff3,0x000b,0xffef,0x0006,0xffe7,0x0001,0xfff1,0x0009, +0xfff9,0x0009,0x0020,0x0013,0x0000,0x0012,0xfffe,0xffea, +0x0003,0xfff1,0x000c,0xfffb,0x0004,0xfffe,0x0011,0xfffb, +0xffc9,0xffe4,0xffeb,0xffe5,0x0002,0xfff9,0x0008,0x0014, +0xfffc,0xffff,0xffff,0xffee,0xfffb,0xfffc,0xfffb,0x0010, +0xfffe,0x0008,0xfffb,0x0005,0xffed,0xfffe,0xfff2,0xfffd, +0xfffa,0x0000,0x0012,0x0004,0xfffe,0x000b,0x0008,0xffee, +0x000b,0x000a,0x001d,0x0003,0xfff6,0x000d,0x0008,0x0003, +0xffc6,0xfff7,0xfff0,0x0001,0xfffe,0x0002,0x0000,0x0013, +0x000a,0x000d,0x0011,0x0015,0x0003,0x0003,0x0013,0xfff4, +0x0002,0x0000,0xfff6,0x0001,0xfffb,0x000c,0x0000,0x000f, +0x001a,0x0005,0x0022,0x0010,0x000b,0x0007,0xfffc,0x0019, +0x0002,0xfff2,0x0003,0xffe3,0xfff3,0xffe7,0xffec,0xffec, +0xffdc,0xffeb,0xffe4,0xfff0,0xfffa,0xfff0,0xfff4,0x0002, +0xfffc,0x0002,0x0014,0x0007,0x000b,0xfffc,0x0014,0x0004, +0x000c,0xfffe,0x0001,0x0000,0x0000,0x0008,0x0002,0x0002, +0x001b,0xfffc,0x0015,0x0002,0x0009,0x0000,0x0006,0x001d, +0x0009,0x000a,0x0015,0xffeb,0xffe4,0xfff6,0xffe3,0xfff5, +0xffbb,0xffef,0xfffd,0x0003,0xfff6,0x0008,0x0003,0x0028, +0x0001,0x0015,0x000a,0x0015,0x0008,0x0017,0x0001,0xfff3, +0xfff8,0xfff5,0xffeb,0xfff5,0xfff1,0xfffc,0x0000,0x0002, +0x000d,0x0005,0x0017,0x000c,0x0007,0x0000,0x0001,0x0000, +0x000a,0xfff2,0x001c,0xfffb,0xffff,0xfff5,0x0005,0xfff9, +0xffd1,0xffe2,0xfff1,0xfff2,0xfff2,0xfff7,0xfff7,0x0017, +0xfff3,0x000a,0x000c,0x0007,0x0010,0x000f,0x0003,0x0003, +0x0001,0xfff2,0xfff7,0xfff4,0xfff7,0xfff8,0x0000,0xfff6, +0x000e,0xfffc,0x0009,0xfffe,0x0005,0xfff8,0x000d,0x0003, +0x0012,0x000a,0x002d,0x0003,0xfff0,0x0004,0xfffc,0x0000, +0xffb1,0x000b,0xfff1,0x0004,0x0012,0x0017,0x0014,0x0005, +0x001e,0x0007,0xfff9,0xfffe,0xffeb,0xffeb,0xfff8,0xfffd, +0xfff6,0x001c,0x0004,0x001f,0x0006,0x0019,0xfffd,0x0025, +0x0004,0xfff9,0x0014,0x0000,0x0004,0x0004,0xfff5,0x0007, +0xfffa,0x0008,0xffe5,0xffea,0xfff2,0xfff4,0xfffb,0xfff0, +0xffc7,0x0000,0xffe5,0xfff3,0x000e,0x0005,0x0007,0xfff5, +0x000f,0xfffc,0xfffb,0xfff0,0xfff3,0xffe3,0xfffa,0x000d, +0x0000,0x0019,0x0010,0x001f,0x000c,0x0016,0xfffe,0x0017, +0x0006,0xfff0,0x0007,0xfff2,0x0002,0xfffd,0x0000,0x000c, +0x0000,0x0021,0xfff7,0xfff3,0xffe4,0x0003,0xfff2,0xfff9, +0xffa6,0x0003,0xfffe,0x0006,0x000a,0x001d,0x0018,0x001a, +0x0015,0x000f,0xfff1,0xfffe,0xfff0,0xffff,0xffe7,0xfffc, +0xffeb,0x0010,0xfffa,0x0012,0xfffd,0x0008,0xfffb,0x0018, +0xfff8,0xfff9,0x0009,0xfffc,0x0001,0xfffd,0xfffb,0xffee, +0x0001,0x0007,0xfffe,0x0001,0xfffe,0x0001,0x0013,0xfffd, +0xffbd,0xfff8,0xfff2,0xfff5,0x0007,0x000b,0x000b,0x0009, +0x0007,0x0003,0xfff3,0xfff0,0xfff8,0xfff7,0xffe8,0x000c, +0xfff6,0x000d,0x0005,0x0011,0x0002,0x0004,0xfffd,0x000a, +0xfffa,0xffef,0xfffc,0xffed,0x0000,0xfff5,0x0006,0xfff3, +0x0009,0x0021,0x000e,0x000a,0xfff0,0x0011,0x000a,0x0004, +0xffb9,0x000a,0xfff7,0x0011,0x0001,0x0014,0x0003,0x0008, +0x0015,0x0012,0x0006,0x0018,0x0000,0xffff,0x0000,0xfff0, +0xfffa,0x0005,0x0000,0x000d,0x0011,0x0013,0x000b,0x001d, +0x0019,0xfff5,0x000b,0xfffa,0x000d,0xfff1,0xfff9,0x001d, +0x0000,0x0008,0xfff5,0xffea,0xffec,0xffeb,0xffef,0xffee, +0xffcf,0xfffe,0xffeb,0x0000,0xffff,0x0002,0xfff7,0xfff8, +0x0006,0x0006,0x0008,0x000a,0x0008,0xfff7,0x0002,0x0000, +0x0004,0x0002,0x000d,0x000c,0x0017,0x000f,0x000c,0x0010, +0x001a,0xffeb,0xfffe,0xffeb,0x000b,0xffe9,0x0004,0x0021, +0x0007,0x0021,0x0006,0xfff3,0xffde,0xfffb,0xffe5,0xfff6, +0xffae,0x0001,0x0004,0x0013,0xfffa,0x001b,0x0006,0x001d, +0x000c,0x001a,0xffff,0x0018,0x0005,0x0012,0xffef,0xffef, +0xffef,0xfffa,0xfff6,0x0000,0x0007,0x0002,0x0009,0x0010, +0x000c,0xfff5,0x0000,0xfff5,0x0009,0xffe9,0x0000,0x0003, +0x0008,0x0008,0x000d,0x0001,0xfff8,0xfff9,0x0007,0xfffa, +0xffc4,0xfff6,0xfff9,0x0001,0xfff7,0x0008,0xfffa,0x000d, +0xfffe,0x000f,0x0001,0x000a,0x000d,0x000b,0xfff1,0x0000, +0xfffa,0xfff7,0x0001,0x0000,0x000d,0xffff,0x000b,0x0003, +0x000d,0xffeb,0xfff3,0xffe6,0x0007,0xffe1,0x000a,0x0007, +0x0010,0x0021,0x001f,0x000a,0xffea,0x0008,0xffff,0x0002, +0xfffd,0x0007,0xfffb,0xfffb,0x0008,0xfffe,0x0011,0xfff7, +0x0012,0xffe8,0xfffe,0xffed,0xfff6,0xfffc,0x001c,0x0011, +0x0005,0x001c,0xfffe,0x0007,0xfffc,0x000f,0x0007,0x0008, +0x0006,0x0017,0x000d,0x0015,0xfff2,0x0014,0xffef,0xffee, +0xfff5,0xffdf,0xffe2,0xfff5,0x0017,0xfff3,0xfffb,0xfff7, +0x0012,0xfffc,0xffef,0xffe9,0x0004,0xffec,0x0004,0xffe6, +0x0003,0xffdc,0x0000,0xffe0,0xfffe,0xfff4,0x001d,0x0022, +0x0010,0x0018,0x000a,0x0006,0x0000,0x000c,0x0008,0xfffc, +0x0008,0x000d,0x0000,0x0006,0xfff0,0x000c,0xfffb,0xfff3, +0xfffd,0xfff9,0xfff3,0xfffd,0x0008,0x0002,0xfff2,0x0000, +0xfff3,0x0000,0x0008,0xfffd,0x0000,0x0004,0x0015,0x000b, +0x0009,0xfff0,0xfff6,0xffee,0xfffb,0x0010,0x000a,0x0010, +0xfffb,0x000f,0xfff3,0xfffb,0xfff1,0xffff,0x0006,0xfffc, +0xfffa,0x0017,0x0002,0x0010,0xffef,0x000c,0xfff6,0xffd4, +0xfffd,0xffdf,0xfffa,0x000c,0x0022,0x0001,0x0014,0x0003, +0x0008,0xfff4,0xfffd,0xffeb,0xfffd,0xfff2,0x0008,0xfffb, +0xfffc,0xffe4,0xfff9,0xffe0,0x0002,0x0008,0x000c,0x0022, +0x0004,0x000c,0xffff,0xfffa,0xfff7,0xfffc,0x0007,0xffef, +0xfffc,0x000d,0xfff5,0x0001,0xffed,0x0004,0x0000,0xffd9, +0x0004,0xfff9,0x000b,0x0015,0x0014,0x0010,0x000a,0x000b, +0x0004,0x0006,0x0000,0x0007,0xfff8,0xfffc,0x0000,0xfffa, +0x0009,0xfff3,0x000b,0x0007,0x000b,0x000f,0x0025,0x0004, +0x0009,0x0005,0xfffb,0xfff5,0x0005,0x0009,0x0016,0x0001, +0x001b,0x0012,0x0004,0x000e,0xfffb,0x0000,0xfff4,0x0003, +0xfffc,0xffe0,0xfff2,0xfff4,0x0011,0xffea,0xffef,0xfff5, +0x001a,0xfffa,0xfff5,0xfff6,0xfff4,0xffe9,0xfff4,0xffe9, +0xfffb,0xffe8,0x000d,0xfffb,0x0013,0x0008,0x0026,0x0015, +0x0014,0x0002,0x0006,0xfff4,0x000b,0x0005,0x0017,0xfff5, +0x001d,0x0009,0xfff7,0x0000,0xfff9,0xfffa,0xffff,0x0007, +0x0002,0xfff9,0x0003,0xfffd,0x0002,0xfffa,0xffe5,0xfffd, +0xfffa,0xfffe,0x000e,0x0009,0xfff0,0x0001,0x0003,0x000e, +0x0000,0xfffb,0x0003,0x0008,0x0010,0x0024,0x0013,0x0003, +0xffff,0xfffa,0xffef,0xffe8,0xfffc,0xfff9,0x0015,0xfff5, +0x000e,0x0012,0xfff9,0x0009,0xfff7,0xfff9,0xfffa,0xffea, +0x0003,0xffdf,0x000a,0x000b,0x001c,0xfff9,0x0007,0x0000, +0x0010,0xfff2,0x0002,0xfff8,0xffec,0xffef,0xfff7,0xfffe, +0xfff2,0xfff0,0x0006,0xfffb,0x0018,0x001c,0x0015,0x0014, +0x0008,0xfff7,0xfffc,0xffe7,0x0001,0xfff5,0x0016,0xffe8, +0x000f,0x0008,0xffeb,0xfffb,0xfff5,0xfff2,0x0005,0xffee, +0x000b,0xfff9,0x001b,0x0014,0x000e,0x0007,0xffff,0x0009, +0xfff0,0x001b,0x0002,0x000a,0x000d,0x0010,0x0014,0xffec, +0x001d,0xffec,0xfff2,0xfff0,0xfff3,0xfff8,0x0009,0x000d, +0xfffe,0x0021,0x0009,0x0013,0x0011,0x0017,0x0011,0x0016, +0x0006,0x0006,0xfff7,0xfffe,0xfff4,0xfffe,0xffec,0xfff3, +0xfff3,0xfff6,0xffd3,0xfffc,0x0010,0xfff8,0xfffe,0xfff9, +0x0005,0x000f,0xfff7,0xfff9,0x0009,0xfffe,0x0008,0xffdb, +0x000e,0xffe1,0xfff5,0xffe3,0xfffb,0xfff0,0x000b,0x001e, +0x0007,0x001d,0x0015,0x0012,0x0017,0x0013,0x0012,0x0009, +0x0007,0xfffd,0xffe9,0xffef,0xfff2,0xfff7,0xfff8,0xfff7, +0xfffa,0x000f,0xffe5,0x0004,0x0002,0x0006,0xfff4,0x0001, +0xffe6,0x0013,0x000f,0x000c,0x0005,0x0016,0x0018,0x0000, +0x0015,0xfff4,0xffeb,0xfff1,0xfff8,0x000b,0xfff9,0x000c, +0xfff2,0x0014,0xfffe,0x0006,0x0007,0x0006,0x0010,0x0009, +0xfffa,0x0005,0xffeb,0xfff9,0xfff1,0xfff6,0xfff3,0xffd9, +0xfffb,0xfff6,0xffec,0x0013,0x001c,0x0005,0x0016,0x0005, +0xfffc,0x0006,0x0003,0xfffb,0x0001,0x0004,0x000b,0xfff0, +0x0006,0xffe9,0xffed,0xffe3,0x0000,0x0003,0xfffa,0x001e, +0xfffd,0x0011,0x000a,0x0005,0x000d,0x0002,0x0011,0xfffd, +0xfffb,0xfffd,0xffdd,0xffeb,0xffef,0xffef,0xfffe,0xffdd, +0x0002,0x000f,0xfffd,0x001c,0x000d,0x0015,0x000d,0x000d, +0xfff8,0x0019,0x0008,0x0017,0xfffd,0x000d,0x0003,0xffef, +0x0014,0xfff8,0x0000,0x000a,0x0008,0x000b,0x0012,0x0000, +0x0001,0x000a,0x0005,0x0000,0x001c,0x0011,0x0020,0x000f, +0x001a,0x0001,0xffed,0xfff7,0xfffd,0xffeb,0xfff1,0x0007, +0xfffa,0xfff7,0xffe3,0xfffb,0x000a,0xffef,0xfff1,0xfff7, +0x000d,0x000d,0xfffd,0x0005,0xfff9,0xfffc,0xfff7,0xffde, +0x0005,0xffec,0x0002,0xfffd,0x0010,0x0003,0x0014,0x0011, +0x000b,0x0007,0x0011,0x0000,0x0022,0x000d,0x0021,0x0002, +0x001c,0xfff8,0xffe0,0xffe8,0xfffb,0xffe3,0xfffd,0x000c, +0x0000,0x000f,0xfff5,0x0003,0xfffd,0xfffe,0xffe8,0xffff, +0xffee,0x0011,0x0015,0x0019,0xfff5,0x0013,0x0006,0x0003, +0x000b,0x0000,0xfff9,0x000b,0x000d,0x001f,0x0001,0x0000, +0xfff7,0xffff,0xfffb,0xfff4,0x0012,0x0000,0x001f,0x0002, +0x000d,0x0001,0xffe2,0xfff2,0xfff9,0xffe3,0xfff7,0xffee, +0x0001,0xfff6,0xfffc,0x0012,0x0016,0xfffd,0x000a,0x0002, +0x0003,0x0005,0x0009,0x0007,0xfff1,0x0001,0xfffb,0xfff3, +0xfffe,0xfff4,0xfffb,0xfffe,0x0015,0x0017,0x0002,0x0010, +0x0000,0xfffb,0x0006,0xfff3,0x0017,0xfffd,0x0020,0xfff6, +0x000f,0xfff8,0xffd4,0xffe4,0xfff7,0xffdb,0x0002,0xfff3, +0x0009,0x000f,0x000c,0x001b,0x0007,0x000c,0x0000,0x000b, +0xffd4,0x0006,0xffe2,0xfff8,0x0009,0x000a,0x000b,0x000e, +0x0017,0xfffb,0x0008,0xfffc,0x000e,0xfff4,0x0025,0x000e, +0x000c,0x001a,0x0004,0x0010,0xfff8,0x0010,0xfff7,0x0007, +0xfffa,0x0013,0x000c,0x0019,0xfffb,0x0018,0xfff1,0xfff3, +0xfff8,0xffdc,0xffde,0xffe1,0xffff,0xffee,0xfffc,0xffee, +0xffea,0xfffb,0xffd6,0xffe6,0x0006,0xfff8,0xffff,0xfffe, +0x0009,0xffef,0x000a,0xffee,0x0015,0xffed,0x0027,0x001f, +0x0017,0x0017,0x0010,0x000f,0xfffe,0x000c,0xfff9,0xfffa, +0xfffb,0x0009,0xffff,0x000a,0xfff9,0x0010,0xfffc,0xfff7, +0x0000,0xfff6,0xffef,0xffea,0xfff0,0xfffe,0xfff2,0xfff7, +0xffc9,0xffff,0xffef,0xfffa,0x0001,0x0010,0x000f,0x0023, +0x000f,0x0002,0x0000,0xfffc,0x0013,0x0008,0x0014,0x000d, +0x0001,0x000e,0xfff9,0x0003,0xffee,0x0000,0xfff6,0xfffb, +0xffed,0x0013,0x0000,0x0015,0xfff8,0x0010,0xfff7,0xffd9, +0x0000,0xffdc,0xfff6,0xfff9,0x0009,0xfffc,0x0014,0xfffb, +0xffdf,0xfff3,0xffe3,0xffe8,0xffff,0xffff,0x0002,0x0012, +0x0000,0xfff7,0x0003,0xffef,0x001b,0x0000,0x0015,0x001e, +0x000c,0x000b,0x0005,0x0002,0xfff4,0xfffc,0xfff7,0xffed, +0xffee,0x0009,0xfff3,0x0006,0xfff5,0x0008,0x0002,0xffdd, +0x0008,0xfff6,0x0007,0x0001,0xfffc,0x000b,0x000a,0x0002, +0xffdc,0x0005,0xffe8,0x0004,0xfff9,0x0007,0xfffa,0x0011, +0x000e,0x0005,0x0016,0x0016,0x0023,0x0008,0x002e,0x0001, +0x0011,0x0003,0x0000,0xfffe,0x0002,0x000a,0x0005,0x0000, +0x000e,0x000f,0x0002,0x0012,0x0002,0x0004,0xfff5,0x0007, +0xffff,0xffdc,0xffee,0xffe0,0xfff9,0xffe5,0xffef,0xffec, +0xfff2,0xfff9,0xffdc,0xfff3,0xfff6,0xfff6,0xffee,0x0000, +0x0000,0xfffb,0x0019,0x0008,0x002b,0x0000,0x0030,0x0012, +0x001b,0x0000,0x000c,0xfffd,0x0007,0x0006,0x0007,0xfff3, +0x000f,0x0005,0xfff5,0x0003,0x0000,0xfffe,0x0000,0x000c, +0x0006,0xfff6,0x0000,0xffe9,0xffea,0xfff5,0xffe6,0xfff4, +0xffd1,0xfffd,0xfff5,0x0006,0xfff1,0x000d,0xfffe,0x0026, +0x0006,0x000d,0x000f,0x0016,0x0028,0x001c,0x001c,0x0000, +0x0005,0xfff8,0xfff6,0xfff1,0xfff9,0xfff9,0x0004,0xfff3, +0x0001,0x000e,0xfff7,0x000e,0x0000,0xfffe,0xfffc,0xffee, +0x0007,0xffdc,0x0006,0xfff8,0x0003,0xfff3,0x0007,0xfff8, +0xffe7,0xfff1,0xffea,0xfff5,0xffee,0xfffc,0xfff1,0x0016, +0xfff8,0x0002,0x0011,0x0009,0x0030,0x0014,0x001e,0x0011, +0x0010,0xfff5,0x0001,0xfff0,0xfffe,0xfff6,0x0005,0xffe6, +0x0002,0x0004,0xffea,0x0000,0xfffe,0xfff6,0x0006,0xfff3, +0x000e,0xfff6,0x0017,0x0000,0xfff6,0x0002,0xffff,0x0000, +0xffc7,0x001a,0xffea,0x0007,0x000e,0x001c,0x000e,0x0003, +0x0023,0x0000,0xfffd,0xffff,0x000b,0xfff0,0x0012,0x000a, +0x0004,0x001f,0x000f,0x001c,0x000e,0x0017,0x0001,0x0015, +0xfff9,0x0002,0xfff5,0x0001,0xfffd,0x0001,0xffee,0xfff7, +0xfff6,0xfff3,0xffcf,0xffe8,0xfff8,0xfff2,0xfffe,0xfff0, +0xffdd,0x000e,0xffde,0xfff6,0x000a,0x000a,0x0001,0xfff4, +0x0014,0xfff4,0x0000,0xfff1,0x0012,0xffe8,0x0014,0x001b, +0x000e,0x001c,0x001b,0x001b,0x0014,0x0013,0x0002,0x0008, +0xfffb,0xfff9,0xffe7,0xfff3,0xfffb,0xfffb,0xfffa,0xfffb, +0xfffe,0x000c,0xffe1,0xfff1,0xffe9,0x0001,0xfff4,0xfff8, +0xffbc,0x0012,0xfff7,0x0009,0x0006,0x0023,0x0012,0x0019, +0x001a,0x0007,0xfff6,0xffff,0x0010,0x0003,0x0001,0x0009, +0xfffa,0x0013,0x0004,0x000f,0x0004,0x0006,0x0000,0x0008, +0xffec,0x0002,0xffe9,0xfffe,0xfff9,0xfffb,0xfff4,0xffdd, +0xffff,0xfff3,0xffe8,0x0000,0x0003,0x0000,0x0016,0xfffc, +0xffd2,0x0006,0xffeb,0xfff8,0x0002,0x0010,0x0005,0x0008, +0x000b,0xfffc,0xfff8,0xfff1,0x0018,0xfffc,0x0002,0x001a, +0x0003,0x0010,0x0010,0x000e,0x0009,0x0002,0x0001,0xfffc, +0xffed,0xfff9,0xffdc,0xffef,0xfff7,0xfff3,0x0000,0xffe1, +0x0005,0x000c,0xfff9,0x0008,0xfff5,0x000f,0x000d,0x0004, +0xffcf,0x0018,0xfff0,0x0014,0xfffe,0x001a,0xfffe,0x0007, +0x0019,0x000a,0x000b,0x0019,0x0020,0x0003,0x001b,0xfffe, +0x0008,0x0008,0x000b,0x0009,0x0018,0x0011,0x0010,0x000e, +0x000d,0xfffe,0xffec,0xfffb,0x0004,0xffef,0xfff2,0x000c, +0xfffd,0xfff3,0xffdf,0xffe7,0xfff2,0xffe9,0xfff1,0xffed, +0xffe5,0x000c,0xffe4,0x0002,0xfffa,0x0007,0xfff1,0xfff7, +0x000b,0xffff,0x000d,0x000b,0x0028,0xfffc,0x001d,0x000e, +0x0013,0x0005,0x0017,0x0008,0x001e,0x000d,0x0011,0x0000, +0x000e,0xfff4,0xffde,0xffec,0x0002,0xffe7,0xfffe,0x0010, +0x0004,0x000c,0xfff1,0xfff0,0xffe3,0xfff9,0xffe8,0xfff6, +0xffc4,0x0010,0xfffd,0x0016,0xfff6,0x0020,0x0000,0x001c, +0x0011,0x0012,0x0003,0x0019,0x0025,0x0017,0x000a,0xfffd, +0xfffe,0xfffd,0x0000,0xfffd,0x000e,0x0000,0x000e,0x0001, +0x0000,0xfffe,0xffe0,0xfff7,0x0001,0xffe7,0xfff9,0xfff3, +0x0005,0xfff3,0xfff8,0xffff,0xfffe,0xfff8,0x000a,0xfffa, +0xffda,0x0004,0xfff1,0x0004,0xfff2,0x000d,0xfff4,0x000b, +0x0002,0x0006,0x0006,0x000b,0x002d,0x0010,0x000b,0x000d, +0x0007,0xfffa,0x000c,0xfffc,0x0014,0xfffd,0x0010,0xfff4, +0x0001,0xfff4,0xffd2,0xffe8,0x0000,0xffdf,0x0003,0xfff7, +0x000c,0x000c,0x0008,0x0007,0xffef,0x0006,0x0000,0x0002}; + +const signed short etable2[5120]={ +0x0049,0xffe0,0xffc4,0xfff1,0xffe6,0x003b,0x0002,0xffdf, +0x001e,0xfff6,0xfffd,0xffef,0x0008,0x001e,0xffff,0xffe6, +0xfffc,0xffea,0x000a,0x0010,0xffdc,0xfffb,0xfff5,0x0038, +0x0025,0x0006,0xfff6,0xfffb,0xfff3,0xfffd,0x0006,0xfffb, +0x000b,0x0004,0xffed,0xfffb,0xfff0,0x0029,0x0018,0x000d, +0x0004,0xfff5,0xffdb,0x0017,0xfffb,0x002e,0xfffe,0xffe3, +0xfffb,0xffd9,0xffeb,0xfff7,0x0000,0x0031,0x000c,0xfff7, +0xfff0,0xffe6,0x0016,0x000f,0xffd3,0xffec,0xfffb,0x0028, +0x0016,0x0011,0xffe6,0x001f,0xfff2,0x0002,0xfff2,0x000a, +0x001e,0x0014,0xffe5,0xfff7,0xffd9,0x0027,0x0012,0x0005, +0x0022,0xffe7,0xffd0,0xffe4,0xfff5,0x0022,0xfffe,0xffd7, +0x0009,0xfff9,0xffef,0x0015,0x0014,0x0018,0xffef,0xffdf, +0x0000,0xffe8,0x000a,0x002a,0x0003,0xfffb,0x000a,0x002a, +0x000b,0x0008,0xfffd,0x0003,0x0010,0x0009,0x0016,0xfffe, +0x0000,0xffdf,0xfff6,0x0012,0x0007,0x003a,0x000a,0x001c, +0xffde,0xfffc,0xffe7,0x000a,0x0009,0x0015,0xfff9,0xffdc, +0xffe6,0xffdc,0xffdd,0x001c,0x000c,0x002a,0xfffd,0xfff0, +0xfff4,0xffe4,0x0015,0x002a,0xfffb,0xffeb,0x0010,0x001a, +0xfffc,0x0013,0xffed,0x0027,0x000f,0x000f,0x0001,0x000d, +0x0013,0xffef,0xffef,0x000e,0xfff1,0x0037,0x0004,0x0013, +0x001c,0xffec,0xffcd,0xfff2,0xfffa,0x0007,0x0000,0xffe6, +0x001b,0xfffc,0x0012,0xffd8,0xfffa,0x0010,0xffff,0xfff1, +0x0000,0xffc9,0xfffb,0xfff0,0xffed,0x000e,0xfffd,0x0031, +0x000e,0x0001,0xffea,0xffe2,0xfff4,0x0000,0x0018,0x000f, +0x0009,0xffef,0xffd3,0xffe3,0x0004,0x001c,0x0033,0x0023, +0xffd8,0x0000,0xffe4,0x0018,0x000e,0xfffb,0xfffc,0xffeb, +0xfff9,0xffdf,0x0000,0xffe0,0xfff1,0x0023,0x000c,0x0001, +0xfff5,0xffc6,0x0005,0xfff0,0xffe4,0x0000,0x0001,0x0021, +0x0000,0x000b,0xffd9,0x0005,0xfff2,0x0006,0x0003,0x001f, +0x001c,0xffff,0xffcb,0xffdf,0xffed,0x0019,0x002e,0x001a, +0xfff5,0xfff2,0xffd9,0xffe5,0x0009,0xffef,0xfffc,0xffdf, +0x0006,0x0000,0x0004,0xffff,0x0005,0x000a,0xffef,0xffea, +0x0005,0xffc7,0xfffb,0x0009,0x0014,0x000d,0x0012,0x0023, +0xfff5,0x0003,0xfff0,0xffea,0x0011,0x000d,0x0028,0x0013, +0xffff,0xffc9,0xffdd,0xfffb,0x001b,0x002c,0x0025,0x0031, +0xffb0,0x0006,0xfff0,0x000b,0x001e,0xffe2,0xfff7,0xffe4, +0xffe4,0xffe3,0xfff3,0x0006,0xfffe,0x001c,0xfffd,0xfffb, +0xfff9,0xffc4,0x0005,0x0009,0x000b,0xffff,0x0018,0x0013, +0xffe5,0x000d,0xffe0,0x000d,0x000f,0x0013,0x0013,0x0023, +0x0011,0xffd9,0xffd5,0xfff7,0x0004,0x002a,0x0020,0x0029, +0x004e,0xffeb,0xffd5,0x0004,0xffda,0x0011,0x0011,0xfffb, +0x0037,0x0018,0xfff1,0xffdc,0x000e,0x0004,0x0018,0xffe8, +0x000c,0x0005,0x0011,0x001f,0xffca,0xfffb,0xfffe,0x001b, +0x002b,0xfff4,0x0002,0x0009,0xfff7,0xfff1,0x0016,0xfffd, +0x001c,0x0015,0xffec,0x0003,0x0014,0x001c,0x0009,0xfffb, +0x0009,0xffff,0xffec,0x002b,0xffef,0x0003,0x000c,0x0000, +0x0014,0xfffc,0xffdf,0xffe3,0x0006,0x0016,0x0026,0xfff9, +0x0000,0x0001,0x001d,0x001e,0xffc1,0xffeb,0x0003,0x000b, +0x001b,0xffff,0xfff2,0x002d,0xfff6,0xfff7,0x0001,0x000c, +0x002f,0x0025,0xffe4,0x0000,0xfffe,0x001a,0x0004,0xfff3, +0x0027,0xfff2,0xffe2,0xfff8,0xffea,0xfff8,0x000c,0xfff4, +0x0022,0x001b,0xffe3,0x0002,0x001a,0xfffe,0x0008,0xffe1, +0x0010,0x0003,0x0011,0x0039,0xfff2,0xfffa,0x0013,0x000d, +0x0010,0xfff6,0x0008,0x0011,0x0014,0xfffe,0x0026,0x0000, +0x0011,0xfff0,0xfff5,0x001b,0x002c,0x002d,0xfffc,0x0008, +0xffe3,0x0005,0xfff9,0x001e,0xffff,0xffeb,0x0007,0xfff9, +0x0000,0x0000,0xffd1,0x0009,0x0012,0x000f,0x0016,0xfff2, +0x0004,0x0000,0x001c,0x0039,0xffe9,0xffeb,0x0019,0xfffe, +0x0001,0x0000,0xfff9,0x0035,0x0013,0x0003,0x0011,0x000f, +0x0024,0x0000,0xffed,0x0018,0x0015,0x002b,0xfff7,0x0000, +0x0021,0xfff6,0xffde,0x0005,0xffef,0xffdd,0x000f,0x0001, +0x0035,0x001e,0x0006,0xffc5,0x0000,0xfff6,0x0018,0xfff3, +0x0011,0xffe5,0x0001,0xffff,0xffdb,0x000d,0x0004,0x0014, +0x0014,0xffee,0xfff6,0xfff0,0xfff8,0xfff5,0x0027,0x0012, +0x001a,0x0000,0xffd2,0xffec,0x0029,0x000f,0x0025,0x000f, +0xffdd,0x000a,0xfff5,0x002c,0x0003,0xffd0,0x000a,0x0006, +0x0011,0x0002,0xfff5,0xffcd,0xfff8,0x0008,0x0026,0x0003, +0x0004,0xffe1,0x000c,0xfffe,0xffd2,0xffff,0x000a,0x0004, +0x0005,0xfff9,0xffe6,0x0013,0xfff6,0xfffb,0x0012,0x0022, +0x002d,0x000f,0xffca,0xffe8,0x0012,0x000d,0x001f,0x0007, +0xfffb,0xfffd,0xffeb,0xfff9,0xfffe,0xffc4,0x000a,0xfffb, +0x0020,0x0022,0xfff9,0xffec,0x000b,0xfff0,0x0008,0xffec, +0x0015,0xffe3,0x0001,0x0018,0x0002,0x000d,0x001b,0x0006, +0xfffb,0xfff1,0xfffd,0xfff8,0x0015,0x0001,0x0037,0x0015, +0x000f,0xffda,0xffdb,0x0003,0x0041,0x0020,0x0017,0x001e, +0xffb6,0x0011,0x0000,0x001f,0x0012,0xffb7,0x0005,0x0000, +0xfffd,0x0005,0xffe7,0xfff4,0x0003,0x0001,0x0016,0xfffd, +0x0009,0xffdf,0x000c,0x0018,0xfffa,0xfffe,0x0021,0xfff7, +0xffeb,0xfffb,0xffec,0x001b,0x0013,0x0007,0x0022,0x0025, +0x0022,0xffea,0xffd4,0x0000,0x0029,0x001d,0x0011,0x0015, +0x004c,0xffdd,0xffe1,0xffe4,0xffcf,0x002b,0xffd8,0x0000, +0x001d,0xfff2,0x0008,0x0005,0x000a,0x0012,0xffe6,0xffd2, +0x0000,0x0007,0x0006,0x0003,0xffe7,0xfff9,0xfffe,0x0028, +0x001c,0x000e,0x0012,0xfffd,0xffe5,0xffe4,0xfff8,0xffd3, +0xfff3,0x0022,0xfff3,0xffe5,0xfff1,0x001f,0x000c,0x0003, +0x0007,0xfff1,0xfff7,0x0009,0xffe4,0x001d,0xffd3,0x0005, +0xfffa,0xffd5,0xfff7,0x000c,0x0002,0x0024,0xfff4,0xffe2, +0xfff5,0x0003,0x0011,0x0003,0xffde,0xffea,0x0003,0x0018, +0x000c,0x0018,0x0002,0x0020,0xffe4,0xffea,0xffe3,0xffe3, +0x0005,0x0032,0xffeb,0xffe1,0xffda,0x001d,0x0007,0xfffb, +0x0024,0xffe3,0xffed,0xffd7,0xffde,0x0012,0xffd3,0xfffa, +0x0008,0xfff6,0xfffb,0x002b,0x0017,0x000b,0xffd6,0xffcb, +0x0005,0x0005,0x0006,0x001e,0x000e,0xfff8,0x0014,0x001a, +0x0001,0x0010,0x0019,0x0004,0x0003,0xfff1,0x0007,0xffd7, +0xffe9,0xfffd,0xfffc,0xfffd,0x0008,0x0030,0xffff,0x0011, +0xffe0,0xfff8,0x0003,0xfffe,0xfff3,0x0004,0xffce,0xffff, +0xffe5,0xffd9,0xffe9,0x0033,0x000f,0x001e,0xffe5,0xffdb, +0xfff9,0x0001,0x0011,0x001d,0x0005,0xffe9,0x0019,0x000a, +0xfff2,0x001a,0x0008,0x0029,0x0001,0xfff7,0xfff3,0xffe6, +0xfffb,0x000c,0xfff4,0xfff9,0xfff2,0x002d,0xfffa,0x0009, +0x001f,0xffe8,0xffe9,0xffe5,0xffe3,0xfff7,0xffd5,0x0008, +0x001a,0xfff9,0x001e,0xffef,0xfffc,0x0003,0xffe6,0xffdd, +0x0005,0xffe8,0xfff6,0xffe4,0xfff7,0x000c,0x0005,0x0021, +0x0005,0x0008,0x0005,0xffe3,0xffe6,0xffe8,0x0009,0xffe9, +0xfff2,0x000c,0xffd9,0xffcc,0x0005,0x0012,0x0027,0x0018, +0xffdb,0xfffd,0x0000,0x000a,0xfff9,0xffea,0xffd0,0x000c, +0xfff8,0xffdc,0x000c,0xfff7,0xfff4,0x0016,0xfff4,0xffed, +0xfffa,0xffe4,0x0000,0xffe3,0xffee,0xfffd,0x000b,0x0011, +0xfff6,0x0012,0xfff6,0x0007,0xffe5,0xffee,0xfff5,0xfff9, +0x0003,0x001c,0xffd1,0xffc9,0xffee,0x000f,0x0022,0x0010, +0xfff8,0xffef,0xfff6,0xffd8,0xfff3,0xffde,0xffd1,0x0000, +0x0005,0xfffc,0x0010,0x0015,0x0008,0xfffe,0xffd6,0xffd5, +0x000a,0xffe6,0xfff6,0xfffe,0x001f,0x000b,0x001b,0x0013, +0xffeb,0x000a,0x000c,0xffec,0x0003,0xfff5,0x0019,0xffec, +0xffe7,0xffe7,0xffe3,0xffe4,0x001c,0x0022,0x0019,0x0026, +0xffb3,0x0002,0x000b,0xffff,0x0007,0xffd1,0xffcc,0x0005, +0xffe3,0xffdf,0xffff,0x001c,0x0000,0x000f,0xffe4,0xffe6, +0xfffe,0xffe2,0x0000,0xfffe,0x0016,0xfffc,0x0021,0x0003, +0xffdc,0x0015,0xfffd,0x000f,0x0002,0xfffb,0x0004,0xfffc, +0xfffa,0xfff7,0xffdb,0xffe1,0x0005,0x0020,0x0014,0x001e, +0x0051,0xffe7,0xfff2,0xfff8,0xffc3,0x0000,0xffe7,0x001c, +0x0036,0x0014,0xfffd,0xfff2,0x0011,0xfff8,0x0000,0xffd4, +0x0010,0x0023,0x000d,0x0012,0xffd5,0xfff9,0x0006,0x000b, +0x0021,0xfffc,0x001e,0x000b,0xffea,0xffd8,0x0006,0xffd5, +0x0003,0x0032,0xfff2,0xffee,0x0016,0x0012,0xffff,0xfff0, +0x000c,0xfffc,0x0008,0x001d,0xffd9,0xfff4,0xffe2,0x0021, +0x0013,0xfff8,0xffeb,0xfffa,0x0008,0x0009,0x000d,0xffe4, +0x0004,0x001f,0x0018,0x0012,0xffcc,0xffe9,0x000c,0xfffc, +0x0012,0x0005,0x000e,0x002f,0xffe8,0xffde,0xfff2,0xffe5, +0x0016,0x0042,0xffea,0xffea,0xffff,0x0010,0xfffa,0xffe8, +0x0029,0xffee,0xfffe,0xffeb,0xffd3,0xffe8,0xffe2,0x0015, +0x0021,0x0018,0xffef,0x0018,0x001d,0xfff1,0xfff0,0xffcd, +0x0015,0x0021,0x000d,0x002d,0xfffd,0xfff8,0x001c,0xfffe, +0x0007,0xfffe,0x0025,0x0013,0x0007,0xffe5,0x0016,0xffd9, +0xfff9,0x000c,0xfffb,0x0005,0x002d,0x0023,0xfff1,0xffff, +0xffe5,0x0001,0x0014,0x0011,0xffe8,0xffda,0xffdd,0x001a, +0xffff,0xfffc,0xffdd,0x0020,0x0015,0x0003,0xfffe,0xffdd, +0x0008,0x001d,0x0018,0x002c,0xfff4,0xffe8,0x0022,0xffee, +0xfff8,0x0007,0x0015,0x0037,0x0005,0xffeb,0x0002,0xffe9, +0x000b,0x001c,0xfff3,0x0001,0x0016,0x0021,0xffeb,0xfff6, +0x0024,0xfff3,0xfffb,0xfff9,0xffd8,0xffcd,0xffe4,0x0024, +0x0034,0x001b,0x0012,0xffdc,0x0002,0xffea,0x0000,0xffdf, +0x0015,0x0002,0xfffd,0xfff3,0xffe6,0x000b,0x000e,0x0004, +0x000a,0xfff6,0x0012,0xfff2,0xffea,0xffdc,0x0018,0xffeb, +0x0001,0x001c,0xffd8,0xffd6,0x002a,0x0005,0x0019,0x0005, +0xffe0,0x0006,0x0011,0x001f,0xffed,0xffbf,0xffdf,0x0029, +0x0010,0xffff,0x0000,0xffe3,0xfffa,0xfffc,0x000d,0xffef, +0x0009,0xffff,0x0008,0xfff2,0xffdd,0xfffd,0x0013,0xfff5, +0xfffc,0x0000,0x0001,0x0015,0xffe9,0xffe2,0x0003,0xfffb, +0x0014,0x002c,0xffd0,0xffd2,0x0013,0x0003,0x0014,0xfffd, +0xfffd,0xfff9,0x0006,0xffec,0xffe7,0xffb3,0xffe0,0x001d, +0x001f,0x001e,0x0004,0x0002,0x000e,0xffe3,0xfff0,0xffd8, +0x001a,0x0000,0xfffd,0x000c,0x000d,0x000a,0x0024,0xfff7, +0xfff1,0xfff8,0x0018,0xfffa,0x0007,0xffea,0x0028,0xffef, +0xfff8,0xfff7,0xffe1,0xffee,0x0042,0x0016,0x000b,0x0013, +0xffb8,0x000d,0x001d,0x0012,0xfffc,0xffa6,0xffdb,0x0022, +0xfffc,0x0001,0xfff3,0x0009,0x0006,0xfff5,0xfffe,0xffe8, +0x000d,0xfffd,0x0007,0x000b,0x0004,0xfffc,0x002a,0xffe7, +0xffe1,0x0001,0x0008,0x001d,0x0006,0xffef,0x0013,0xfffe, +0x000a,0x0006,0xffda,0xffea,0x002a,0x0013,0x0006,0x000b, +0x0074,0xffec,0xffbc,0xffe2,0xffe4,0x0053,0x001c,0xffee, +0x0020,0xffea,0xfff3,0xffeb,0x0005,0x001c,0x0005,0xfff9, +0xffe8,0xfff8,0xffea,0x0011,0xffe9,0x001e,0xffe7,0x002d, +0x000f,0xfff7,0xfff5,0xffee,0x0016,0xfff6,0x0004,0xfffe, +0x0013,0xfff4,0x0017,0x0003,0xffd5,0x0002,0x000c,0xfffc, +0x002f,0x0000,0xffd3,0x0007,0xfff9,0x0045,0x0017,0xfff3, +0xfffe,0xffcd,0xffe0,0xfff2,0xfffd,0x002f,0x0013,0x0008, +0xffdb,0xfff5,0xfff6,0x0010,0xffe0,0x000f,0xffed,0x001d, +0x0000,0x0001,0xffe4,0x0012,0x0014,0xfffc,0xfff0,0x000d, +0x0026,0x0003,0x000f,0x0000,0xffbe,0x0000,0x0007,0xfff3, +0x004d,0xfff3,0xffc8,0xffd5,0xfff3,0x0039,0x0017,0xffe6, +0x000b,0xffed,0xffe5,0x0010,0x0011,0x0016,0xfff6,0xfff1, +0xffed,0xfff6,0xffea,0x002b,0x0010,0x001e,0xfffe,0x001f, +0xfff5,0xfffa,0xfffb,0xfff7,0x0034,0x0002,0x0014,0x0000, +0x0008,0xffce,0x0021,0x001b,0xffed,0x0013,0xffff,0x0009, +0x0008,0x0006,0xffdf,0xfffc,0x0007,0x002c,0x0012,0xffeb, +0xffe9,0xffd0,0xffd2,0x0018,0x0009,0x0028,0x0003,0x0001, +0xffe0,0xfff3,0xfff5,0x002b,0x0007,0x000e,0x0003,0x000f, +0xffe6,0x0003,0xffeb,0x001a,0x0032,0x0008,0x0000,0x0010, +0x001b,0xffde,0x0019,0x0017,0xffd5,0x0011,0xfffa,0x0001, +0x0047,0xfff7,0xffc5,0xffe3,0xfff8,0x001e,0x001a,0xfff5, +0x001e,0xfff0,0x0008,0xffd4,0xfff7,0x000e,0x0005,0x0002, +0xffed,0xffd8,0xffda,0xfff1,0xfff9,0x0032,0xffef,0x0026, +0xfff9,0xfff2,0xffe8,0xffd5,0x0016,0xfffa,0x0016,0x0013, +0x0011,0xffde,0xfffe,0xffec,0xffe9,0xfff6,0x0027,0x0010, +0x0002,0x000b,0xffdc,0x0009,0x000d,0x0011,0x0015,0xfffa, +0xfffb,0xffd3,0xfff6,0xffdc,0xffee,0x0021,0x0013,0x0013, +0xffe1,0xffd4,0xffe5,0xfff1,0xfff0,0x0022,0xfff5,0x0016, +0xffea,0xfffc,0xffd8,0xfff9,0x0015,0x0000,0x0001,0x0023, +0x0024,0xffee,0xfff6,0xffe8,0xffd2,0xfff4,0x0022,0x0008, +0x0020,0xfffe,0xffd1,0xffd6,0x0007,0x0005,0x0015,0xffee, +0x0009,0xfff4,0xfffb,0xfffb,0x0002,0x0008,0xfff6,0xfffc, +0xfff2,0xffd6,0xffda,0x000a,0x0021,0x0031,0x0005,0x0018, +0xffdf,0xfff4,0xffef,0xffdd,0x0034,0x0006,0x0026,0x0016, +0x0007,0xffb8,0x0007,0x0003,0x0000,0x0006,0x0019,0x001e, +0xffdc,0x0012,0xffe8,0xfffd,0x001c,0xfff9,0x0010,0xfff3, +0xffe6,0xffd7,0xffe8,0x0001,0xfffb,0x001a,0x0003,0x000c, +0xffe5,0xffd2,0xffe5,0x000a,0x0018,0x0022,0x000a,0x0008, +0xffcf,0xfffe,0xffde,0x0000,0x0033,0x000c,0x0011,0x0026, +0x0019,0xffc8,0x0000,0x0000,0xffea,0x0003,0x0014,0x0016, +0x0079,0xfff7,0xffce,0xfff6,0xffd8,0x0028,0x002b,0x0009, +0x003a,0x000c,0xffe7,0xffd7,0x000b,0x0002,0x001f,0xfffb, +0xfff8,0x0013,0xfff1,0x0020,0xffd7,0x001e,0xfff0,0x0010, +0x0014,0xffe4,0x0000,0xfffd,0x001a,0xffea,0x0013,0x0000, +0x0024,0x0004,0x0016,0x000c,0xfffa,0xfff7,0xffff,0xffe8, +0x0034,0x000a,0xffe5,0x001b,0xffee,0x001a,0x0026,0x000e, +0x0017,0xfff0,0xffd4,0xffdf,0x0003,0x0014,0x002d,0x000a, +0xffec,0x000f,0xfffd,0x001f,0xffce,0x000e,0xfff6,0x0000, +0x0005,0xffef,0xfff1,0x0020,0x0018,0xfff0,0xffff,0x000f, +0x0037,0x0014,0x000e,0x0008,0xffe3,0xfff4,0xfff9,0xffe0, +0x0052,0xfffd,0xffda,0xffe9,0xffe8,0x000f,0x0026,0x0002, +0x0025,0x000f,0xffd9,0xfffe,0x0017,0xfffc,0x000f,0xfff4, +0xfffd,0x0011,0xfff1,0x003a,0xffff,0x001d,0x0006,0x0002, +0xfffb,0xffe6,0x0007,0x0004,0x0038,0xfff7,0x0023,0x0003, +0x0019,0xffdf,0x0020,0x0024,0x0011,0x0007,0xfff1,0xfff7, +0x000d,0x0011,0xfff1,0x000f,0xfffd,0x0001,0x0021,0x0007, +0x0001,0xfff4,0xffc6,0x0005,0x000f,0x000d,0x001d,0x0003, +0xfff0,0x000d,0xfffc,0x0039,0xfff6,0x000d,0x000b,0xfff3, +0xffeb,0xfff1,0xfff7,0x0028,0x0037,0xfffd,0x000e,0x0013, +0x002c,0xffef,0x0018,0x0020,0xfffb,0x0004,0xffeb,0xffee, +0x004c,0x0001,0xffd7,0xfff7,0xffed,0xfff4,0x0029,0x0011, +0x0037,0x0012,0xfffd,0xffc1,0xfffd,0xfff4,0x001e,0x0005, +0xfffd,0xfff4,0xffe1,0x0000,0xffe8,0x0031,0xfff8,0x0009, +0xffff,0xffdf,0xfff4,0xffe3,0x001b,0xffee,0x0025,0x0015, +0x0022,0xffef,0xfffd,0xfff5,0x000e,0xffe9,0x0019,0xfffe, +0x0007,0x0016,0xffee,0x001d,0x0001,0xffe7,0x0024,0x0015, +0x0014,0xfff7,0xffea,0xffc8,0xfff5,0x0006,0x002d,0x0015, +0xfff1,0xfff0,0xffec,0xffff,0xffdf,0x0022,0xfffe,0xfffa, +0xffef,0xffe9,0xffe4,0x0006,0x0019,0xfff4,0x0010,0x0025, +0x0035,0xffff,0xfff5,0xfff1,0xfff8,0xffe7,0x0014,0xfff5, +0x0025,0x0008,0xffe3,0xffea,0xfffc,0xffdb,0x0024,0x0009, +0x0022,0x0016,0xffef,0xffe8,0x0008,0xffee,0x000f,0xfffe, +0x0001,0xfff2,0xffe1,0x0019,0x000f,0x0030,0x000d,0xfffc, +0xffe4,0xffe1,0xfffb,0xffeb,0x0039,0xfffc,0x0035,0x0018, +0x0017,0xffc9,0x0006,0x000c,0x0025,0xfffa,0x000b,0x000b, +0xffe1,0x001c,0xfffa,0x0010,0x0010,0xffce,0x001f,0x000e, +0x0000,0xfffa,0xffdc,0xffef,0x0000,0x0000,0x001d,0x000e, +0xfff5,0xffee,0xffec,0x0019,0x0006,0x0021,0x0013,0xffec, +0xffd5,0xffeb,0xffeb,0x000e,0x0037,0x0000,0x0020,0x0028, +0x002a,0xffd9,0xffff,0x0008,0x000e,0xfff8,0x0006,0x0003, +0x0077,0xffe8,0xffd9,0xffd4,0xffcd,0x0042,0xfff2,0x000f, +0x001f,0xffe6,0xffff,0x0000,0x0007,0x0010,0xffed,0xffe4, +0xffed,0x0016,0xffe6,0x0004,0xfff3,0x001c,0xfff0,0x001d, +0x0005,0xffff,0x0010,0xfff0,0x0008,0xffdd,0xfff6,0xffd6, +0xfffc,0x0011,0x001d,0xffed,0xffd6,0xfff9,0x0000,0xfff1, +0x0032,0xfffd,0xfff0,0xfffb,0xffe2,0x0035,0xffed,0x0014, +0xfffd,0xffc9,0xffed,0x0008,0x0000,0x0022,0xfffb,0xfff5, +0xffe0,0x0012,0xfff1,0x0004,0xffea,0x000d,0xfff6,0x000d, +0xfff7,0x0008,0x0000,0x0013,0x0007,0xffe3,0xffe1,0xffe6, +0x000d,0x0021,0x0015,0xffea,0xffbf,0xfff7,0xfffc,0xffe9, +0x004f,0xffef,0xffe5,0xffc8,0xffdc,0x0029,0xffed,0x0008, +0x000a,0xffea,0xfff1,0x0027,0x0014,0x0009,0xffdd,0xffdd, +0xfff1,0x0014,0xffe6,0x001f,0x001a,0x001b,0x0006,0x000f, +0xffec,0x0000,0x0017,0xfff8,0x0026,0xffea,0x0005,0xffda, +0xfff1,0xffec,0x0027,0x0004,0xffee,0x0009,0xfff3,0xffff, +0x000a,0x0003,0xfffc,0xffee,0xfff1,0x001b,0xffe8,0x000d, +0xffe8,0xffcd,0xffde,0x002f,0x000c,0x001c,0xffeb,0xffed, +0xffe5,0x0010,0xfff1,0x001e,0x0011,0x000c,0x000c,0x0000, +0xffdc,0x000a,0x0007,0x001b,0x0025,0xfff0,0xfff1,0xffea, +0x0003,0xfffc,0x001f,0x0001,0xffd6,0x0007,0xffee,0xfff7, +0x004a,0xfff4,0xffe2,0xffd6,0xffe2,0x000e,0xfff0,0x0017, +0x001d,0xffed,0x0014,0xffeb,0xfff9,0x0001,0xffed,0xffef, +0xfff2,0xfff6,0xffd5,0xffe5,0x0003,0x0030,0xfff8,0x0016, +0xfff0,0xfff9,0x0004,0xffd6,0x0009,0xffe1,0x0006,0xffec, +0xfffa,0xfffc,0x0003,0xffd5,0xffea,0xffec,0x001c,0x0005, +0x0005,0x0007,0xfff9,0xfffc,0xfff7,0x0000,0xffeb,0x001c, +0xfffa,0xffd0,0x0002,0xfff2,0xfff1,0x0014,0xfffb,0x0000, +0xffe5,0xfff2,0xffe0,0xffe4,0xfffb,0x0020,0xfffe,0x0006, +0xffe0,0x0003,0xfff4,0xfffb,0x0008,0xffe7,0xfff2,0xfffc, +0x000c,0x000b,0xfffc,0xffd1,0xffd3,0xffea,0x0016,0xfffe, +0x0022,0xfffa,0xffee,0xffc9,0xfff1,0xfff5,0xffeb,0x0010, +0x0008,0xfff0,0x0006,0x0010,0x0005,0xfffc,0xffdd,0xffe8, +0xfff6,0xfff4,0xffd5,0xffff,0x002b,0x002f,0x000e,0x0008, +0xffd5,0xfffb,0x000a,0xffde,0x0027,0xffee,0x0016,0xfff0, +0xffef,0xffd6,0x000d,0xffed,0x0001,0xfffd,0x000e,0x0014, +0xffde,0x000e,0x0004,0xffef,0x0005,0xffe8,0xffe6,0x0014, +0xffe5,0xffd3,0xfff4,0x0018,0xfffe,0x000d,0xffeb,0xfff8, +0xffea,0xfff0,0xffe0,0xfffe,0x0022,0x001f,0x0014,0xfff9, +0xffc6,0x0005,0xfffb,0x0002,0x0026,0xfff4,0x0002,0xffff, +0x0001,0xffe6,0x0005,0xffe9,0xffeb,0xfffa,0x0008,0x000b, +0x007c,0xfff3,0xffeb,0xffe9,0xffc2,0x0017,0x0000,0x002b, +0x0039,0x0008,0xfff3,0xffee,0x000e,0xfff6,0x0006,0xffe6, +0xfffd,0x0031,0xffed,0x0013,0xffe1,0x001b,0xfff9,0x0000, +0x000b,0xffec,0x001d,0xffff,0x000c,0xffd1,0x0004,0xffd9, +0x000b,0x0022,0x001c,0xfff7,0xfffb,0xffed,0xfff3,0xffde, +0x0037,0x0006,0x0001,0x000e,0xffd7,0x000a,0xfffc,0x0030, +0x0016,0xffec,0xffe1,0xfff6,0x0005,0x0007,0x0014,0xfff7, +0xfff0,0x002d,0xfff8,0x0013,0xffd8,0x000c,0xffff,0xfff1, +0xfffc,0xfff6,0x000c,0x0022,0x000b,0xffd7,0xfff0,0xffe8, +0x001e,0x0031,0x0014,0xfff3,0xffe4,0xffea,0xffee,0xffd5, +0x0054,0xfffa,0xfff7,0xffdc,0xffd1,0xffff,0xfffc,0x0024, +0x0024,0x000c,0xffe5,0x0014,0x001a,0xffef,0xfff7,0xffdf, +0x0001,0x002f,0xffed,0x002e,0x0009,0x001b,0x000f,0xfff3, +0xfff1,0xffee,0x0023,0x0006,0x002a,0xffdf,0x0014,0xffdc, +0x0001,0xfffc,0x0026,0x000e,0x0012,0xfffe,0xffe5,0xffec, +0x000f,0x000d,0x000d,0x0001,0xffe6,0xfff2,0xfff7,0x0029, +0x0001,0xfff0,0xffd2,0x001b,0x0012,0x0001,0x0004,0xfff0, +0xfff5,0x002b,0xfff8,0x002d,0x0000,0x000b,0x0015,0xffe3, +0xffe2,0xfff8,0x0013,0x002a,0x0029,0xffe4,0x0000,0xffec, +0x0014,0x000b,0x001e,0x000a,0xfffc,0xfffb,0xffe0,0xffe4, +0x004f,0xfffe,0xfff4,0xffea,0xffd6,0xffe4,0xffff,0x0033, +0x0036,0x000f,0x0008,0xffd7,0x0000,0xffe8,0x0006,0xfff1, +0x0001,0x0011,0xffdc,0xfff4,0xfff2,0x002f,0x0000,0xfffa, +0xfff5,0xffe6,0x0010,0xffe5,0x000d,0xffd5,0x0016,0xffee, +0x000a,0x000c,0x0002,0xffde,0x000f,0xffdf,0x000d,0xfff3, +0x000a,0x0012,0x000a,0x000f,0xffeb,0xffd7,0xfffa,0x0038, +0x0013,0xfff3,0xfff7,0xffdf,0xfff7,0xfffa,0x0014,0x0001, +0xfff5,0x000d,0xffe8,0xfff3,0xffe9,0x0020,0x0006,0xffea, +0xffe6,0xfff1,0x0000,0x0008,0x000c,0xffdb,0x0001,0xfffe, +0x001c,0x001b,0xfffb,0xffdb,0xfff9,0xffdd,0x0008,0xffeb, +0x0027,0x0004,0x0000,0xffdd,0xffe5,0xffcb,0xfffa,0x002c, +0x0021,0x0012,0xfffb,0xfffe,0x000b,0xffe1,0xfff7,0xffea, +0x0006,0x000f,0xffdc,0x000d,0x0019,0x002e,0x0017,0xffec, +0xffdb,0xffe8,0x0017,0xffed,0x002b,0xffe3,0x0026,0xfff2, +0x0000,0xffe6,0x000c,0xfff6,0x0026,0xfff0,0x0000,0x0000, +0xffe3,0x0019,0x0016,0x0002,0xfffa,0xffbd,0xfff5,0x0031, +0xffff,0xfff6,0xffe8,0x0005,0x0003,0xfff3,0x0004,0xfffb, +0xfffa,0x000b,0xffe7,0x000c,0x0010,0x001f,0x001c,0xffdc, +0xffcb,0xfff3,0x0006,0x0010,0x002a,0xffe8,0x0011,0x0001, +0x0012,0xfff6,0x0004,0xfff3,0x000f,0xffee,0xfffb,0xfff9, +0x001d,0xffe7,0xffea,0xfffe,0x0006,0x0043,0x000b,0xffcf, +0x0001,0x000a,0x0018,0xfffb,0xfffd,0x000d,0xfffc,0x0005, +0x0006,0xfff5,0x0019,0xfff4,0xfff0,0xffe1,0xffe4,0x0024, +0x0035,0x000d,0xfffa,0xfff0,0xffd6,0x0018,0xffef,0xffff, +0xffee,0x000a,0xfffc,0x000d,0xfff1,0x0012,0x0005,0x0007, +0xffd9,0xfffc,0x0000,0x0023,0x001b,0x0035,0x0006,0xffd4, +0xffdf,0xffee,0x0005,0x0002,0xfff5,0x001f,0x0009,0x0016, +0xfffa,0xfff1,0x0024,0xfff3,0xffe7,0xffd2,0xffe9,0x0014, +0x0025,0x0018,0xffe9,0x0013,0xffd5,0x001d,0xffda,0x000e, +0x0000,0x001a,0xfff4,0x000a,0xffda,0x0010,0x0000,0x0000, +0xfff6,0xffee,0xfff6,0xfff1,0x0015,0x0029,0x0006,0xffc8, +0xffed,0x000d,0x0009,0x0021,0x0009,0x0006,0xffec,0xffff, +0x000b,0xfff3,0x0018,0x000d,0x0017,0xffe0,0xfffa,0x0016, +0x001a,0x000f,0x0000,0xfff8,0xfff4,0x0025,0xffff,0x0002, +0xffe4,0xffe5,0x0005,0x0025,0x0007,0x0023,0xfff8,0x0015, +0xffb1,0x0002,0x000c,0x0016,0x002a,0x001c,0x0001,0xffcd, +0xffca,0xfff1,0xfff8,0x0029,0x0000,0x0018,0xfffa,0x000f, +0xffff,0xffef,0x0024,0x000c,0x000e,0xffd1,0x0000,0x0006, +0x000b,0x001a,0xfff0,0x001b,0xfff3,0x002b,0xffea,0x0012, +0xfff6,0xfff4,0xfffe,0x0022,0xfff1,0x0021,0xfff3,0x000d, +0xfff1,0xfff3,0xfff3,0xffff,0x001a,0x000e,0x0009,0xffd7, +0xffff,0x0010,0x002e,0xffe5,0xffee,0xffff,0xfffc,0x0010, +0x000b,0xffd5,0x0008,0xffd3,0x0000,0xfff5,0xffeb,0x001d, +0x001e,0x0008,0xffed,0xffd6,0xffd7,0x001c,0x0000,0x0014, +0xffec,0xfff5,0xffe2,0xfff6,0x0004,0x0005,0x0020,0x001c, +0xffac,0x0006,0x0009,0x0024,0x002f,0x0001,0x0004,0xffdc, +0xffdc,0xfff4,0x001b,0xffec,0xffe6,0x0011,0x0009,0x0021, +0xffff,0xffd1,0x0013,0xffd2,0xfff7,0xffe5,0xfff1,0x000d, +0x000f,0x0012,0xffdd,0xfffa,0xffd6,0x0021,0xffec,0x0024, +0xffff,0x0004,0xffda,0xfff2,0xffee,0x0002,0x001b,0x0014, +0xffc9,0xfffa,0xffff,0xfff2,0x0029,0xfff6,0x0004,0xffd0, +0xffea,0x0014,0x001f,0x000a,0xfffb,0xfff9,0xffec,0x0009, +0x0010,0xffd3,0x0008,0xffed,0x0028,0xfff4,0x0001,0x000f, +0x0004,0x000a,0xfff4,0xffde,0xfff5,0x0029,0x0010,0x0018, +0xffe2,0xffcf,0xffec,0x000d,0x001c,0x0016,0x0012,0x002b, +0xff84,0x000d,0x0015,0x0017,0x003e,0xffe9,0x0000,0xffd5, +0xffc7,0xfff8,0x000d,0x0012,0xfff2,0x000a,0xfffa,0x001a, +0x0003,0xffcf,0x0013,0xffed,0x001f,0xffe5,0x0007,0x0000, +0xfff5,0x0014,0xffe3,0x0001,0xfff4,0x002f,0xfffc,0x0027, +0xfff5,0xffde,0xffe4,0x0009,0x0005,0x0013,0x000d,0x0022, +0x0022,0xfff2,0xfffc,0x0011,0xfffb,0x0018,0x001a,0xffec, +0x001b,0x002d,0x000c,0xffe8,0x0002,0xfff3,0x0015,0x0008, +0x0016,0x0010,0x0020,0x0002,0xffde,0xffe1,0xffec,0x0007, +0x003a,0xfffb,0x0005,0xfffe,0xffda,0x000c,0xfffe,0x0001, +0xffff,0x001a,0xfffb,0x0017,0x0015,0x0006,0xfff8,0xfff5, +0xffde,0x0006,0x0012,0x0037,0x000f,0x000b,0x0015,0xfff0, +0xfff8,0x0010,0xfffa,0xfff0,0xfffb,0x0004,0x0023,0x0018, +0x000a,0x000c,0x002b,0x0001,0xffd5,0xffd1,0xfff2,0xfff8, +0x002b,0x0005,0xfff6,0x0022,0xffd9,0x0012,0xffea,0x0010, +0x0011,0x002a,0xfff3,0x0013,0xffff,0x0003,0xfff2,0xffec, +0xfffb,0xfff9,0x0007,0x0004,0x0009,0x0000,0x0015,0xffe4, +0x0006,0x0030,0xfffe,0x000e,0x000f,0xffec,0x0005,0x0000, +0x001b,0x000e,0x0020,0x001c,0x0005,0xffe0,0x0002,0xfffa, +0x0020,0xfffd,0x000c,0x0005,0xfff8,0x0019,0x000e,0x0004, +0xfff4,0xfff5,0x0004,0x002f,0x002d,0x0016,0xffea,0x0002, +0xffb6,0x000c,0x001e,0x002a,0x001e,0xfff2,0x0010,0xffe9, +0xffe3,0x0013,0xffec,0x0015,0x0007,0xffff,0x0013,0x0011, +0x000e,0x000a,0x002b,0x001b,0xfffd,0xffd0,0x0008,0xffea, +0x0010,0x0007,0xfffc,0x002a,0xfff7,0x001f,0xfffa,0x0014, +0x0006,0x0004,0xfffd,0x002b,0x0016,0x0014,0xffe4,0xfffb, +0xfff6,0xfffd,0x0004,0x0012,0x000f,0xffe5,0x0018,0xfff3, +0x0018,0x0033,0x0022,0xffd1,0xfff4,0xffe4,0x0015,0x0013, +0x001b,0xfff0,0x000f,0xffe2,0xffef,0xfff4,0xfff4,0x0000, +0x0024,0xfff6,0xfff9,0xffe5,0xffdb,0x0010,0x000f,0x0016, +0xfffd,0x0004,0xffe1,0xffff,0x002a,0xfff9,0x0012,0x0009, +0xffb1,0x0011,0x001b,0x0038,0x0024,0xffd7,0x0013,0xfff8, +0xfff6,0x0016,0x000f,0xffd9,0xffec,0xfff7,0x0023,0x0023, +0x000f,0xffec,0x001a,0xffe1,0xffe6,0xffe5,0xfffa,0xfff1, +0x0014,0x0000,0xffe9,0x0008,0xffda,0x0016,0xfffb,0x0026, +0x000f,0x0014,0xffd9,0xfffc,0x0012,0xfff7,0x000d,0x0001, +0xffce,0x0003,0x0010,0x0005,0x001e,0xffcb,0x0013,0xffec, +0x0003,0x0037,0x0013,0xfff8,0x0000,0xffde,0x0005,0x000b, +0x0020,0xffee,0x000f,0xfffc,0x0016,0xfff3,0x000a,0xfff3, +0x0009,0xfff8,0x0000,0xffed,0xfff9,0x001d,0x001f,0x001a, +0xfff3,0xffdf,0xffeb,0x0016,0x0041,0x0009,0x0004,0x0017, +0xff89,0x0018,0x0027,0x002c,0x0033,0xffbe,0x000e,0xfff1, +0xffe1,0x001a,0x0001,0x0000,0xfff9,0xfff0,0x0013,0x001c, +0x0013,0xffea,0x001a,0xfffc,0x000d,0xffe4,0x0010,0xffe3, +0xfffb,0x0001,0xfff0,0x0010,0xfff8,0x0023,0x000a,0x002a, +0x0004,0xffef,0xffe3,0x0013,0x002a,0x0007,0x0000,0x000f, +0x001f,0xffe4,0x0006,0xfff0,0xfff0,0x0032,0xffe1,0xfff2, +0x0000,0x0006,0x0024,0x0011,0x0000,0x0000,0xffe3,0xfff2, +0x000b,0x0012,0x0014,0xffe7,0xfffa,0xffdf,0xffed,0x0014, +0x002b,0x0015,0x0015,0xfff2,0xffc9,0x0000,0xffe0,0xffd8, +0xffd6,0x0027,0x0001,0xfff8,0xfff2,0x0008,0xfffa,0xfffd, +0xffdb,0xfff8,0x001d,0x0016,0x0004,0x0025,0xffdc,0xfff7, +0xffde,0xffea,0x0011,0x0018,0xfff8,0x0012,0xfff1,0x0002, +0xffff,0x000e,0x001f,0xffe7,0xfff1,0xffd0,0xfff3,0x0004, +0x001c,0x001f,0x0005,0x0015,0xffc7,0x0004,0xffcb,0xffe8, +0xffe9,0x0037,0xfffa,0xfff4,0xffdb,0x0006,0xfff5,0xfff5, +0xfff9,0xffea,0x0012,0xffe3,0xffff,0x0019,0xffdc,0xffeb, +0xffec,0x0009,0x0016,0x0038,0x000b,0xfffa,0xffd3,0xffeb, +0x000f,0x0010,0x0014,0x0001,0x0021,0xffde,0x0002,0x0006, +0x0011,0x0017,0x001c,0xfffa,0xffe7,0x000c,0xfff0,0xffdb, +0xffcb,0x0001,0x000b,0x000f,0x0008,0x0019,0xffec,0x000b, +0xffb4,0xffff,0x0029,0x0009,0x0013,0x000c,0xffd7,0xffef, +0xffc9,0xffee,0x0003,0x003f,0x0003,0x000c,0xffe2,0xfffb, +0x0003,0x000c,0x001f,0x0000,0x0018,0xffcf,0x0008,0xfff7, +0x0001,0x0021,0x000c,0x001d,0xffe5,0x0012,0xffdb,0xffeb, +0xffde,0x0011,0x0003,0x000b,0xfff2,0x0017,0xffe7,0x0002, +0xfff3,0xffef,0x000f,0xfff1,0x0003,0xffff,0xffdf,0xfff9, +0xffff,0x000c,0x003a,0xfffb,0xfff1,0xfff3,0xffe3,0xfffd, +0x0010,0xfff3,0x0004,0xffc7,0x000a,0xfff3,0xfff5,0x000d, +0x0015,0x000f,0x0009,0xffd8,0xffc9,0x0003,0xfff2,0xffed, +0xffd4,0x0011,0xffe8,0xffe0,0x0005,0xfffc,0x0015,0x0012, +0xffae,0x0003,0x0026,0x0017,0x0018,0xfff1,0xffda,0xfffe, +0xffdb,0xfff1,0x0027,0x0002,0xffe9,0x0004,0xfff1,0x000c, +0x0003,0xffef,0x000f,0xffc6,0x0001,0xffe3,0xfffa,0xfffe, +0x0005,0x001a,0xfff9,0xfffc,0xffc8,0x0009,0xffdd,0xfffd, +0xffe7,0x0021,0xffe0,0xffdc,0xffef,0xfff9,0x000f,0x0009, +0xffcc,0xfff6,0x001b,0xffe5,0x0012,0xffe6,0xffda,0xfff2, +0xffe9,0x0010,0x002c,0x0021,0xfffd,0xffec,0xffd3,0xfff6, +0x0014,0xfff1,0x0003,0xffe1,0x0032,0xfff2,0x000a,0x0000, +0xfffb,0x0011,0x000f,0xffe0,0xffe8,0x0010,0x0001,0xfff1, +0xffc9,0xffec,0xfff2,0xfff8,0x001d,0x000c,0x0007,0x0020, +0xff87,0x0009,0x0032,0x000a,0x0028,0xffd8,0xffd5,0xfff7, +0xffc6,0xfff4,0x0019,0x0029,0xfff5,0xfffe,0xffe1,0x0005, +0x0008,0xffed,0x000f,0xffe0,0x0029,0xffe2,0x0010,0xfff0, +0xffec,0x001c,0x0000,0x0003,0xffe6,0x0016,0xffed,0x0000, +0xffdc,0xfffc,0xffea,0xfff4,0x0006,0x0009,0x0001,0x0018, +0x0024,0xffee,0x0018,0x0003,0xffe4,0x0007,0xfff0,0x000d, +0x001a,0x0029,0x0018,0xffff,0x0005,0xffe6,0xfffd,0xfff4, +0x001b,0x002e,0x001b,0xfff6,0xffe8,0xffde,0xfff6,0xfff8, +0x0031,0x0002,0x0022,0x0000,0xffcd,0xfff4,0xffef,0xffda, +0xffe7,0x0038,0x0000,0x0000,0x0016,0xfffd,0xffec,0xffea, +0xffe0,0x0002,0x002f,0x002a,0xfff9,0xfffb,0xffeb,0x0012, +0xfff7,0x000c,0x0005,0x0005,0xfffe,0xfff8,0x000a,0x0004, +0x000e,0x002a,0x0026,0xfff6,0xffdf,0xffcf,0xfffb,0xffe8, +0x0021,0x000c,0x0011,0x0023,0xffcc,0xfffa,0xffda,0xffea, +0xfff9,0x0048,0xfff9,0xfffd,0x0000,0xfffa,0xffe7,0xffe2, +0xfffe,0xfff5,0x0024,0xfff7,0xfff3,0xffef,0xffeb,0x0006, +0x0005,0x002d,0x000a,0x0024,0x0012,0xffdf,0xffed,0xffed, +0x001f,0x002c,0x001b,0x000f,0x0010,0xffde,0x000b,0xffea, +0x0016,0x0004,0x0028,0x0007,0xffeb,0x0000,0xffff,0xffdd, +0xffdc,0x0012,0x000a,0x0018,0x002e,0x000c,0xffde,0xfff8, +0xffb9,0x0009,0x003b,0x001d,0x0008,0xffe2,0xffe6,0x000b, +0xffe2,0x0010,0xfff8,0x002c,0x0009,0xfff2,0xfffb,0xfffe, +0x0013,0x0028,0x0026,0x000f,0x0007,0xffce,0x0011,0xffda, +0x0007,0x000e,0x0018,0x002b,0xffea,0x0006,0xffea,0xffed, +0xffef,0x0022,0x0002,0x0014,0x0017,0x000a,0xffd9,0xfff0, +0xfff8,0xfffa,0x0021,0x0004,0xfff9,0xffd4,0xffee,0x0015, +0x0017,0x0030,0x002e,0xffe8,0xfff7,0xffd8,0xfffd,0xffff, +0x0020,0x000d,0x000b,0xffd5,0xfff9,0xfff2,0xfffd,0xfff1, +0x001a,0xfffd,0x0015,0xffe6,0xffce,0xfff8,0x0000,0xfff0, +0xffe5,0x0022,0xffe7,0xffe9,0x002b,0xffef,0x0006,0xffff, +0xffb3,0x000d,0x0038,0x002b,0x000d,0xffc7,0xffe9,0x001a, +0xfff5,0x0013,0x001b,0xfff0,0xffef,0xffea,0x000a,0x000f, +0x0013,0x000a,0x0016,0xffd5,0xfff0,0xffe2,0x0002,0xffe1, +0x000b,0x0006,0x0005,0x0009,0xffcc,0xfffe,0xffec,0x0000, +0xfff8,0x0032,0xffdf,0xffe5,0x0013,0xffed,0x0001,0xfff7, +0xffd1,0x0000,0x002d,0xfff9,0x0007,0xffbb,0xffe9,0x000d, +0x0002,0x0033,0x0020,0x000e,0x0003,0xffd1,0xffed,0xfff8, +0x0025,0x000b,0x000a,0xfff0,0x0020,0xfff1,0x0013,0xffe3, +0x0000,0xffff,0x001c,0xffee,0xffec,0x0004,0x0010,0xfff3, +0xffda,0xfffd,0xfff1,0x0000,0x0042,0x0000,0xfff9,0x000d, +0xff8c,0x0014,0x0044,0x001e,0x001c,0xffad,0xffe4,0x0012, +0xffe0,0x0016,0x000d,0x0015,0xfffb,0xffe4,0xfffb,0x0007, +0x0018,0x0008,0x0016,0xffef,0x0017,0xffe2,0x0019,0xffd3, +0xfff1,0x0009,0x000b,0x0012,0xffea,0x000a,0xfffc,0x0002, +0xffed,0x000c,0xffe9,0xfffd,0x002b,0xfffe,0xfff4,0x0004, +0x0048,0xfff3,0xffe3,0xffee,0x0004,0x005a,0x0025,0xffde, +0x0004,0xffff,0x000d,0xfff7,0xfffa,0x000b,0x0002,0x0018, +0xfff3,0x0003,0xfff9,0xfff5,0xfffc,0x0004,0xffd6,0x0019, +0x001f,0xffff,0xfff8,0xffe3,0xfffa,0x0011,0xffed,0x0002, +0xfff6,0xfffa,0x0026,0x0016,0xffd6,0xffed,0xfffa,0xfff5, +0x0003,0x0007,0xfffa,0x0014,0x0019,0x004d,0x0020,0xffe3, +0xffe1,0xffe2,0xfffc,0xfffe,0xfff2,0x001d,0x0010,0x0028, +0xffe6,0x0000,0x0003,0xfff4,0xfff3,0xfff6,0xffdc,0x0009, +0x000f,0x0008,0xffe8,0x0006,0xfff9,0x0016,0xffd8,0x0011, +0x0008,0x0009,0x001f,0x0012,0xffbe,0xffea,0xfff5,0xffed, +0x0020,0xfffa,0xffef,0xffe1,0x0013,0x0041,0x0021,0xffd7, +0xfff0,0x0001,0x0000,0x001d,0x0006,0x0004,0xfff3,0x0011, +0xfff7,0x0001,0xfff8,0x000e,0x0023,0x0003,0xffed,0x000b, +0x0004,0x0000,0xffff,0xffeb,0x0017,0x001e,0xfffd,0x0005, +0xffec,0xffd4,0x0030,0x002e,0xffed,0xfffd,0xffec,0x0003, +0xffdc,0x000d,0x0005,0x0007,0x0028,0x0033,0x001c,0xffdc, +0xffcc,0xffe5,0xffee,0x0024,0xfffe,0x0016,0x0000,0x0021, +0xffeb,0xfffe,0x0003,0x000d,0x001a,0xfff5,0xfff2,0xfffc, +0xfff6,0x000a,0xffee,0x000e,0x0016,0x0024,0xffe8,0x0015, +0xffff,0xffe4,0x0028,0x002a,0xffd6,0xfffb,0xffe7,0xfffb, +0x001b,0xffff,0xffec,0xffef,0x0018,0x0026,0x0023,0xffe6, +0x0001,0x0004,0x0023,0xffe0,0xffeb,0xfffd,0x0002,0x0023, +0xfff8,0xffe3,0xffe8,0xffd4,0x000c,0x0018,0xffde,0x0012, +0x0008,0xfff9,0xffeb,0xffc9,0xfffb,0x0015,0xfffe,0x0017, +0xfff5,0xffe4,0x000d,0xffff,0xffea,0xffdf,0x0015,0x000a, +0xffd7,0x0012,0x0002,0x0015,0x002d,0x0018,0x001e,0xffeb, +0xffdf,0xffe8,0x0011,0xffe8,0xffe3,0x000f,0x0010,0x0033, +0xffeb,0xffdf,0xfff3,0xffd3,0x0003,0x0008,0xffe4,0x0002, +0xfff9,0x0002,0xffdb,0xffed,0xfff9,0x001b,0xffea,0x0027, +0x0007,0xfff4,0x0005,0xfffb,0xffd3,0xffdd,0x000f,0x0001, +0xfff4,0x0004,0xfff8,0xffe3,0x0027,0x000c,0x001e,0xffdf, +0xffed,0x0008,0x0015,0x0006,0xfff8,0xfff7,0xfff3,0x001c, +0xfffc,0xffe1,0xffe8,0xffee,0x0034,0x0017,0xfff4,0x0004, +0xffee,0xfffb,0xfff2,0xffd1,0x0018,0x0022,0x000e,0x001b, +0xffea,0xffbe,0x0016,0x0016,0x0001,0xfff0,0x0006,0x0018, +0xffaf,0x0019,0x000e,0x0008,0x003d,0x0000,0x0019,0xffe4, +0xffca,0xffec,0x0003,0x000e,0xffef,0x0008,0x0000,0x002c, +0xfff0,0xffdd,0xfff3,0xffee,0x002b,0x0007,0xfffa,0xfff5, +0xffdf,0x0004,0xffe2,0xfff5,0x0016,0x0028,0xfffa,0x002b, +0xfffd,0xffce,0x000e,0x0012,0xffea,0xffee,0x0001,0x0010, +0x004d,0xfffe,0xfff5,0x0001,0xfff9,0x002f,0x0034,0xfffb, +0x001d,0x0021,0x0001,0xffe4,0x0000,0xfff1,0x001c,0x001a, +0x0002,0x001e,0x0000,0x0002,0xffea,0x0004,0xffdf,0xfffd, +0x0024,0xffeb,0x0003,0xfff1,0xfffe,0x0005,0xfffc,0x0004, +0x0006,0x0009,0x0025,0x001f,0xfffb,0xffe0,0xffec,0xffe2, +0x0008,0x0011,0x000a,0x0028,0x000d,0x0022,0x002f,0x0000, +0xfffb,0x0004,0xfff0,0xffeb,0xfff8,0x0002,0x002a,0x002b, +0xfff6,0x001a,0x000a,0x0002,0xffe1,0xfff5,0xffe5,0xffed, +0x0015,0xfff6,0xfff4,0x0014,0xfffd,0x000b,0xffe7,0x0014, +0x0019,0x0019,0x001d,0x001c,0xffe4,0xffde,0xffe7,0xffda, +0x0025,0x0003,0x0000,0xfff6,0x0007,0x0016,0x0030,0xfff4, +0x0008,0x0024,0xfff4,0x0009,0x000c,0xffea,0x000c,0x0013, +0x0006,0x001c,0x0000,0x001d,0x0012,0x0003,0xfff5,0xffef, +0x000a,0xffee,0x000a,0xfff9,0x001b,0x0012,0x000b,0x0007, +0xfffd,0xffe4,0x002f,0x0037,0x0012,0xfff1,0xffde,0xfff0, +0xffe1,0x0018,0x0017,0x001b,0x001d,0x0009,0x002b,0xfff8, +0xffe6,0x0007,0xffe2,0x0011,0x0004,0xfffd,0x001a,0x0023, +0xfffb,0x0018,0x000a,0x001c,0x0009,0xfff4,0xfffb,0xffdf, +0xfffb,0xfff8,0xfffb,0x001d,0x001a,0x0018,0xfff7,0x0017, +0x000e,0xfff4,0x0027,0x0034,0xfffb,0xffee,0xffd9,0xffe8, +0x0020,0x0008,0xfffd,0x0002,0x000d,0xfffc,0x0032,0x0001, +0x001b,0x0027,0x0017,0xffcd,0xfff1,0xffe2,0x001b,0x0025, +0x0007,0xffff,0xffef,0xffe3,0xfffb,0x0017,0xffe7,0xfff6, +0x000e,0xffe6,0xfff8,0xffd7,0xffff,0x0009,0x000d,0x001a, +0x0005,0xfff4,0x000c,0x0007,0x000e,0xffd3,0x0006,0xfff7, +0xffdc,0x001d,0x0013,0x0029,0x0022,0xffee,0x002d,0x0006, +0xfff8,0x000a,0x0005,0xffd5,0xffe9,0xfff5,0x002a,0x0035, +0xfffb,0xfffb,0xfffa,0xffe2,0xfff2,0x0008,0xffec,0xffe6, +0xffff,0xfff0,0xffe7,0xfffc,0xfffd,0x000f,0xfff9,0x0029, +0x0017,0x0003,0x0004,0x0003,0xfff8,0xffd0,0x0001,0xffef, +0xfff9,0x000f,0x0009,0xfff7,0x001c,0xffe3,0x002d,0xfffb, +0x0006,0x002b,0x0009,0xfff4,0xfffe,0xffdc,0x000c,0x001e, +0x000b,0xfffd,0xffef,0xfffd,0x0022,0x0016,0xfffd,0xffe8, +0xfff4,0xffe8,0xfffe,0xffe0,0x001c,0x0016,0x001d,0x001d, +0xfffb,0xffce,0x0015,0x001f,0x0026,0xffe3,0xfff9,0x0005, +0xffb4,0x0023,0x001f,0x001c,0x0031,0xffd5,0x0028,0x0000, +0xffe3,0x000e,0xfff8,0xfffb,0xfff6,0xffee,0x001a,0x002e, +0x0000,0xfff9,0xfffa,0xfffd,0x0019,0x0007,0x0002,0xffd8, +0xffe4,0xfff2,0xffee,0x0003,0x001b,0x001c,0x0008,0x002d, +0x000d,0xffde,0x000d,0x001b,0x000f,0xffe1,0xfff4,0xfffd, +0x004a,0xffef,0x0000,0xffe1,0xffee,0x0049,0xfffb,0x0000, +0x0003,0xfffb,0x0019,0x000c,0xfffd,0xffff,0xffea,0x0003, +0xfff7,0x0021,0xfff4,0xffe8,0x0006,0x0002,0xffdf,0x0009, +0x0015,0x0005,0x0014,0xffe5,0xffed,0xfff9,0xffde,0xffdb, +0xffde,0x0016,0x002c,0x0000,0xffd7,0xffe3,0xffef,0xffeb, +0x0005,0x0003,0x0015,0x0007,0x0002,0x003c,0xfff6,0x0005, +0xffe0,0xffde,0x0007,0x0014,0xfff5,0x0010,0xfff8,0x0014, +0xffeb,0x001d,0xffff,0xffe8,0xfffe,0xfff3,0xffe5,0xfffa, +0x0005,0x000f,0x0003,0x0008,0xffeb,0xffff,0xffc9,0xffeb, +0xfff1,0x0026,0x0025,0xfffd,0xffbf,0xffe0,0xffe9,0xffe2, +0x0023,0xfff6,0x000b,0xffd4,0xfffd,0x0030,0xfff6,0xfffa, +0xffef,0xfffe,0x000b,0x0033,0x0008,0xfff8,0xffda,0xfffd, +0xfffc,0x001f,0xfff4,0x0002,0x002e,0x0001,0xfff6,0xfffc, +0xfffb,0x0007,0x001a,0xffed,0x000a,0x0005,0xffee,0xffde, +0xffd3,0xfff1,0x0036,0x0018,0xffee,0xfff3,0xffe1,0xfff9, +0xffdf,0x000a,0x0022,0xfffb,0x0011,0x0023,0xfff1,0xffff, +0xffcb,0xffe2,0xfffa,0x003b,0x0000,0x000a,0xffe8,0x000d, +0xffef,0x001b,0xffff,0x0001,0x0025,0xfff3,0xfffc,0xffec, +0xffec,0x0012,0x000a,0x0010,0x0008,0x000b,0xffd9,0xffee, +0xffe6,0x0000,0x002e,0x0014,0xffd7,0xfff1,0xffdb,0xfff1, +0x001d,0xfffb,0x0007,0xffe2,0x0001,0x0015,0xfff9,0x0007, +0x0000,0x0000,0x002f,0xfff7,0xffee,0xfff1,0xffea,0x000e, +0xfffc,0x0000,0xffe4,0xffc7,0x0017,0x0015,0xffe7,0x0002, +0xffff,0x0000,0x0007,0xffcb,0xffed,0xfffd,0xffef,0xfff1, +0xffdc,0x0000,0x0013,0xffe8,0xffeb,0xffd5,0x0009,0x0000, +0xffd9,0x000e,0x001e,0x0008,0x0016,0x0008,0xfff4,0x000c, +0xffde,0xffe5,0x001d,0xfffe,0xffe6,0x0002,0xfff8,0x001f, +0xfff0,0xfffd,0xffef,0xffc7,0x000e,0x0006,0xffed,0xfff3, +0xfff0,0x000a,0xfff8,0xffef,0xffec,0x0002,0xffda,0x0000, +0xffef,0x0010,0x000b,0xffe5,0xffd4,0xffd3,0x0004,0xfff8, +0xfff7,0x0001,0x0014,0xffd5,0x0011,0xfffd,0xfff4,0x0000, +0xffec,0x0004,0x0021,0x001d,0xfffa,0xffea,0xffda,0x0007, +0x0000,0xffff,0xffe3,0xffe2,0x003f,0x0015,0xfffd,0xfff5, +0xffe5,0x0001,0x000e,0xffd3,0x000a,0x0009,0xffff,0xfff4, +0xffd1,0xffdb,0x001c,0x0000,0x0002,0xffe6,0xfffc,0x000d, +0xffb2,0x0015,0x002b,0xfffc,0x0026,0xffef,0xffef,0x0005, +0xffc9,0xffe8,0x000f,0x0024,0xfff2,0xfffc,0xffe8,0x0018, +0xfff4,0xfffb,0xffef,0xffe1,0x0036,0x0005,0x0002,0xffe5, +0xffd5,0x000c,0xfffe,0xfff7,0x0009,0x000f,0xffea,0x0003, +0xffe4,0xffeb,0x0014,0xfffd,0xffec,0xffe4,0xfff7,0x0005, +0x0050,0xfffa,0x0010,0xfff5,0xffe2,0x001e,0x0009,0x001c, +0x001c,0x001d,0x000d,0xfffa,0x0002,0xffe4,0x0003,0x0005, +0x0007,0x003c,0xfffb,0xfff7,0xfff5,0x0001,0xffe8,0xffed, +0x001b,0xfff3,0x0020,0xfff3,0xfff1,0xffed,0xffed,0xffdd, +0xffef,0x0027,0x002b,0x0009,0xfffc,0xffd6,0xffe0,0xffd7, +0x000b,0x000e,0x0027,0x001b,0xfff7,0x0011,0x0004,0x0021, +0xfffa,0x0000,0xfffc,0x0001,0xfffb,0xfff6,0x0011,0x0016, +0xfffb,0x0039,0x0005,0xfff7,0xffec,0xfff3,0xffee,0xffdd, +0x000b,0xfffd,0x0010,0x0016,0xffef,0xfff3,0xffd8,0xffed, +0x0001,0x0037,0x0023,0x0005,0xffe5,0xffd4,0xffdb,0xffcf, +0x0028,0x0000,0x001c,0xffe8,0xfff2,0x0005,0x0004,0x0015, +0x0007,0x0021,0x0000,0x0020,0x000f,0xffdd,0xfff4,0xffff, +0x000b,0x003a,0xfffb,0x0010,0x001c,0x0000,0xffff,0xffdf, +0x0000,0xfff5,0x0027,0xfffb,0x000e,0xfffa,0xfffd,0xffe1, +0xffe4,0x0001,0x0035,0x0021,0x0013,0xffe7,0xffd2,0xffe6, +0xffe4,0x0014,0x0033,0x000e,0x0006,0xfff9,0x0000,0x001a, +0xffe5,0x0004,0xffee,0x0028,0x0006,0xfff0,0x0001,0x000f, +0x0000,0x0037,0x0005,0x0010,0x0013,0xfff2,0x0003,0xffcf, +0xfff2,0xffff,0x0016,0x001e,0x000c,0x0000,0xffe8,0xfff1, +0xfff7,0x0011,0x002d,0x001d,0xfffc,0xffe4,0xffcd,0xffdd, +0x0022,0x0004,0x0019,0xfff6,0xfff7,0xffeb,0x0007,0x0024, +0x001a,0x0024,0x0023,0xffe4,0xfff4,0xffd6,0x0003,0x0010, +0x000c,0x001c,0xffeb,0xffd6,0x0005,0x0015,0xfff0,0xffe6, +0x0004,0xffed,0x0013,0xffd9,0xfff1,0xfff1,0xffff,0xfff3, +0xffed,0x0011,0x0011,0xfff2,0x000f,0xffc9,0xfffc,0xffed, +0xffde,0x0019,0x0030,0x001c,0x000b,0xffde,0x0002,0x0029, +0xfff7,0x0007,0x0011,0xffeb,0xffec,0xffe8,0x0011,0x0021, +0x0000,0x0018,0xfff6,0xffd6,0xfffd,0x0005,0xfff6,0xffd6, +0xfff5,0xfff8,0x0003,0xfffd,0xfff0,0xfff7,0xffea,0x0002, +0x0000,0x0021,0x000a,0xffee,0xfff9,0xffc6,0xfff6,0xffe4, +0xfffc,0x000b,0x0025,0xffe9,0x0005,0xffd2,0x0002,0x001d, +0x0005,0x0027,0x0015,0x0009,0x0000,0xffcf,0xfff4,0x0009, +0x0010,0x001a,0xffea,0xfff1,0x002d,0x0014,0x0005,0xffd8, +0xffea,0xffef,0x001a,0xffe1,0x000e,0xfffe,0x000e,0xfff6, +0xffe2,0xffec,0x001b,0x0009,0x0027,0xffd9,0xffee,0xfffb, +0xffb7,0x0020,0x003c,0x000f,0x001a,0xffc5,0xfffe,0x0021, +0xffe2,0x000a,0x0003,0x0011,0xfff8,0xffe2,0x0001,0x001a, +0x0004,0x0016,0xfff6,0xfff0,0x0024,0x0005,0x000b,0xffc8, +0xffdb,0xfffa,0x000a,0x0005,0x000d,0x0003,0xfffa,0x0005, +0xfff5,0xfffc,0x0013,0x0005,0x0010,0xffd7,0xffe8,0xfff3}; + +const unsigned long ftable1[128]={ +0x4cc9f,0x482af,0x47bd8,0x44700,0x5238b,0x47377,0x4898a,0x411fd, +0x4f8b7,0x4a7d5,0x4bd1b,0x47feb,0x5554b,0x49414,0x4c9d4,0x4403c, +0x4fa57,0x550c5,0x4ea1c,0x54c6e,0x51f27,0x4ff8f,0x4cab5,0x4bbb6, +0x53e58,0x5a5e8,0x5551f,0x5d6ff,0x56499,0x540f7,0x528e8,0x51740, +0x4cdba,0x459db,0x4a644,0x4445b,0x4e123,0x423bc,0x480ed,0x3ed60, +0x5292b,0x49d33,0x51d8c,0x49f1d,0x53cc4,0x45a9d,0x4e88c,0x43073, +0x4d3a1,0x4e583,0x4f702,0x5182e,0x4b81f,0x47291,0x49dc4,0x46541, +0x5434b,0x55bc1,0x5a27e,0x5d510,0x51ba0,0x4c587,0x51f83,0x4d45f, +0x4d45f,0x51f83,0x4c587,0x51ba0,0x5d510,0x5a27e,0x55bc1,0x5434b, +0x46541,0x49dc4,0x47291,0x4b81f,0x5182e,0x4f702,0x4e583,0x4d3a1, +0x43073,0x4e88c,0x45a9d,0x53cc4,0x49f1d,0x51d8c,0x49d33,0x5292b, +0x3ed60,0x480ed,0x423bc,0x4e123,0x4445b,0x4a644,0x459db,0x4cdba, +0x51740,0x528e8,0x540f7,0x56499,0x5d6ff,0x5551f,0x5a5e8,0x53e58, +0x4bbb6,0x4cab5,0x4ff8f,0x51f27,0x54c6e,0x4ea1c,0x550c5,0x4fa57, +0x4403c,0x4c9d4,0x49414,0x5554b,0x47feb,0x4bd1b,0x4a7d5,0x4f8b7, +0x411fd,0x4898a,0x47377,0x5238b,0x44700,0x47bd8,0x482af,0x4cc9f}; + +const unsigned long ftable2[128]={ +0x2f8e9,0x3444d,0x3637b,0x3608d,0x3372e,0x33ab9,0x33946,0x2f157, +0x307a1,0x36a4d,0x380c9,0x39279,0x332c0,0x34673,0x33a8a,0x2fec4, +0x2ecea,0x36011,0x34bb0,0x37829,0x36353,0x39c4a,0x35f32,0x33352, +0x2cb99,0x33db5,0x3221f,0x3595c,0x31b84,0x35804,0x31d79,0x3075f, +0x27f6f,0x2f99d,0x2d6c9,0x3369b,0x2df25,0x34928,0x3018c,0x32129, +0x28cb2,0x31e5c,0x2eebd,0x36c4e,0x2e2a3,0x3601f,0x30a58,0x33aa8, +0x28cee,0x336a2,0x2e69d,0x37dcd,0x323b6,0x3fa08,0x34b2d,0x3acd3, +0x27abc,0x3214b,0x2cff6,0x3695f,0x2f09d,0x3ae92,0x315ba,0x37761, +0x37761,0x315ba,0x3ae92,0x2f09d,0x3695f,0x2cff6,0x3214b,0x27abc, +0x3acd3,0x34b2d,0x3fa08,0x323b6,0x37dcd,0x2e69d,0x336a2,0x28cee, +0x33aa8,0x30a58,0x3601f,0x2e2a3,0x36c4e,0x2eebd,0x31e5c,0x28cb2, +0x32129,0x3018c,0x34928,0x2df25,0x3369b,0x2d6c9,0x2f99d,0x27f6f, +0x3075f,0x31d79,0x35804,0x31b84,0x3595c,0x3221f,0x33db5,0x2cb99, +0x33352,0x35f32,0x39c4a,0x36353,0x37829,0x34bb0,0x36011,0x2ecea, +0x2fec4,0x33a8a,0x34673,0x332c0,0x39279,0x380c9,0x36a4d,0x307a1, +0x2f157,0x33946,0x33ab9,0x3372e,0x3608d,0x3637b,0x3444d,0x2f8e9}; + +static const short decodetable1[63]={ +0x0000,0x0006,0x0010,0x0012,0x0014,0x0017,0x0019,0x001d, +0x0020,0x0024,0x0029,0x002e,0x0033,0x0039,0x0041,0x0049, +0x0051,0x005b,0x0067,0x0073,0x0081,0x0091,0x00a3,0x00b7, +0x00cd,0x00e6,0x0103,0x0122,0x0146,0x016d,0x019a,0x01cc, +0x0204,0x0243,0x028a,0x02da,0x0333,0x0397,0x0407,0x0485, +0x0512,0x05b0,0x0662,0x0729,0x0809,0x0904,0x0a1e,0x0b5a, +0x0cbd,0x0e4b,0x1009,0x11fe,0x1430,0x16a7,0x196b,0x1c85, +0x2000,0x23e7,0x2849,0x2d33,0x32b7,0x38e7,0x3fd9}; + +static const short decodetable2[127]={ +0xf037,0xf043,0xf04e,0xf058,0xf062,0xf06c,0xf077,0xf082, +0xf08e,0xf09a,0xf0a6,0xf0b2,0xf0be,0xf0cc,0xf0d9,0xf0e6, +0xf0f4,0xf101,0xf10f,0xf11e,0xf12d,0xf13d,0xf14c,0xf15c, +0xf16d,0xf17d,0xf18d,0xf19d,0xf1ae,0xf1bf,0xf1d1,0xf1e3, +0xf1f6,0xf20a,0xf21d,0xf232,0xf247,0xf25d,0xf274,0xf28c, +0xf2a4,0xf2bc,0xf2d4,0xf2ee,0xf307,0xf321,0xf33c,0xf358, +0xf374,0xf391,0xf3af,0xf3ce,0xf3ee,0xf410,0xf433,0xf459, +0xf480,0xf4a9,0xf4d1,0xf4ff,0xf52c,0xf55c,0xf58c,0xf5c4, +0xf5fb,0xf637,0xf673,0xf6ad,0xf6e8,0xf727,0xf766,0xf7a7, +0xf7e8,0xf82a,0xf86b,0xf8ae,0xf8f0,0xf93a,0xf984,0xf9d0, +0xfa1c,0xfa6c,0xfabc,0xfb0d,0xfb5f,0xfbbe,0xfc1e,0xfc80, +0xfce2,0xfd45,0xfda8,0xfe19,0xfe8a,0xff0e,0xff92,0x0015, +0x0098,0x012c,0x01bf,0x0248,0x02d0,0x0353,0x03d6,0x0451, +0x04cd,0x053e,0x05b0,0x0621,0x0692,0x0707,0x077c,0x07e7, +0x0852,0x08c2,0x0931,0x09aa,0x0a23,0x0aa4,0x0b25,0x0baa, +0x0c2e,0x0ca8,0x0d23,0x0d93,0x0e04,0x0e75,0x0ee6}; + +static const short decodetable3[63]={ +0xf3ed,0xf54d,0xf6ae,0xf7af,0xf8b1,0xf990,0xfa6f,0xfb39, +0xfc03,0xfcbd,0xfd77,0xfe1d,0xfec4,0xff58,0xffec,0x007b, +0x010b,0x0196,0x0220,0x02a5,0x032a,0x03a9,0x0429,0x04a1, +0x0519,0x058c,0x05fe,0x066d,0x06dc,0x0747,0x07b2,0x0817, +0x087b,0x08d9,0x0937,0x0990,0x09e8,0x0a3a,0x0a8c,0x0ad9, +0x0b26,0x0b6d,0x0bb4,0x0bf8,0x0c3d,0x0c7e,0x0cbf,0x0cfc, +0x0d3a,0x0d72,0x0dab,0x0ddf,0x0e13,0x0e44,0x0e75,0x0ea1, +0x0ecd,0x0ef5,0x0f1e,0x0f44,0x0f6b,0x0f8f,0x0fb4}; + +static const short decodetable4[63]={ +0xf23b,0xf2ae,0xf321,0xf38c,0xf3f7,0xf457,0xf4b6,0xf517, +0xf578,0xf5d5,0xf631,0xf68d,0xf6e8,0xf742,0xf79b,0xf7f0, +0xf845,0xf896,0xf8e7,0xf937,0xf986,0xf9d6,0xfa26,0xfa74, +0xfac3,0xfb0f,0xfb5c,0xfbaa,0xfbf8,0xfc46,0xfc94,0xfce2, +0xfd2f,0xfd7f,0xfdcf,0xfe22,0xfe76,0xfec9,0xff1c,0xff73, +0xffca,0x0020,0x0077,0x00d0,0x0128,0x0186,0x01e4,0x0248, +0x02ab,0x0315,0x037f,0x03f1,0x0463,0x04e0,0x055d,0x05e8, +0x0673,0x0710,0x07ad,0x0872,0x0938,0x0a2f,0x0b26}; + +static const short decodetable5[31]={ +0xf8cb,0xfa55,0xfbdf,0xfcea,0xfdf6,0xfed4,0xffb3,0x006f, +0x012d,0x01da,0x0287,0x032b,0x03cf,0x046a,0x0505,0x059a, +0x062e,0x06bf,0x0751,0x07e2,0x0873,0x0904,0x0994,0x0a22, +0x0aaf,0x0b3c,0x0bc9,0x0c56,0x0ce3,0x0d6a,0x0df1}; + +static const short decodetable6[31]={ +0xf57d,0xf679,0xf775,0xf83d,0xf904,0xf9b5,0xfa65,0xfb04, +0xfba2,0xfc2f,0xfcbb,0xfd40,0xfdc5,0xfe44,0xfec4,0xff44, +0xffc5,0x0047,0x00c9,0x0150,0x01d6,0x0266,0x02f7,0x0396, +0x0435,0x04f3,0x05b1,0x0692,0x0774,0x0899,0x09bf}; + +static const short decodetable7[15]={ +0xfaa4,0xfc65,0xfe26,0xff56,0x0085,0x017f,0x0278,0x0362, +0x044c,0x0537,0x0623,0x071f,0x081b,0x0946,0x0a70}; + +static const short decodetable8[15]={ +0xf6ab,0xf7d8,0xf905,0xfa1b,0xfb31,0xfc32,0xfd33,0xfe22, +0xff11,0xfffe,0x00ea,0x01f6,0x0302,0x0462,0x05c2}; + +static const short decodetable9[15]={ +0xf9df,0xfb3f,0xfca0,0xfdbc,0xfed8,0xffd1,0x00c8,0x01b3, +0x029e,0x038f,0x047f,0x0596,0x06ad,0x07ff,0x0951}; + +static const short decodetable10[15]={ +0xf768,0xf890,0xf9b8,0xfac9,0xfbda,0xfcd0,0xfdc7,0xfea8, +0xff88,0x006c,0x0152,0x0258,0x035f,0x04da,0x0655}; + +static const short decodetable11[7]={ +0xfd97,0xff2b,0x00be,0x01f0,0x0322,0x0476,0x05cb}; + +const short *decodetable[11]={ +decodetable1,decodetable2,decodetable3,decodetable4,decodetable5, +decodetable6,decodetable7,decodetable8,decodetable9,decodetable10, +decodetable11}; + + +static int ra144_decode_init(AVCodecContext * avctx) +{ + Real144_internal *glob=avctx->priv_data; + + memset(glob,0,sizeof(Real144_internal)); + glob->resetflag=1; + glob->swapbuf1=glob->swapb1a; + glob->swapbuf2=glob->swapb2a; + glob->swapbuf1alt=glob->swapb1b; + glob->swapbuf2alt=glob->swapb2b; + + memcpy(glob->wavtable1,wavtable1,sizeof(wavtable1)); + memcpy(glob->wavtable2,wavtable2,sizeof(wavtable2)); + + return 0; +} + +static void final(Real144_internal *glob, short *i1, short *i2, void *out, int *statbuf, int len); +static void add_wav(Real144_internal *glob, int n, int f, int m1, int m2, int m3, short *s1, short *s2, short *s3, short *dest); +static int irms(short *data, int factor); +static void rotate_block(short *source, short *target, int offset); +/* lookup square roots in table */ +static int t_sqrt(unsigned int x) +{ + int s=0; + while (x>0xfff) { s++; x=x>>2; } + return (sqrt_table[x]<0) { + ptr=b2+x; + for (y=0;y<=x-1;y++) + b1[y]=(((*a1)*(*(--ptr)))>>12)+b2[y]; + } + tmp=b1; + b1=b2; + b2=tmp; + a1++; + } + ptr=a2+10; + while (ptr>a2) (*a2++)>>=4; +} + + +/* do quarter-block output */ +static void do_output_subblock(Real144_internal *glob, int x) +{ + int a,b,c,d,e,f,g; + + if (x==1) memset(glob->buffer,0,20); + if ((*glob->iptr)==0) a=0; + else a=(*glob->iptr)+HALFBLOCK-1; + glob->iptr++; + b=*(glob->iptr++); + c=*(glob->iptr++); + d=*(glob->iptr++); + if (a) rotate_block(glob->buffer_2,glob->buffer_a,a); + memcpy(glob->buffer_b,etable1+b*BLOCKSIZE,BLOCKSIZE*2); + e=((ftable1[b]>>4)*glob->gval)>>8; + memcpy(glob->buffer_c,etable2+c*BLOCKSIZE,BLOCKSIZE*2); + f=((ftable2[c]>>4)*glob->gval)>>8; + if (a) g=irms(glob->buffer_a,glob->gval)>>12; + else g=0; + add_wav(glob,d,a,g,e,f,glob->buffer_a,glob->buffer_b,glob->buffer_c,glob->buffer_d); + memmove(glob->buffer_2,glob->buffer_2+BLOCKSIZE,(BUFFERSIZE-BLOCKSIZE)*2); + memcpy(glob->buffer_2+BUFFERSIZE-BLOCKSIZE,glob->buffer_d,BLOCKSIZE*2); + final(glob,glob->gsp,glob->buffer_d,glob->output_buffer,glob->buffer,BLOCKSIZE); +} + +/* rotate block */ +static void rotate_block(short *source, short *target, int offset) +{ + short *end; + short *ptr1; + short *ptr2; + short *ptr3; + ptr2=source+BUFFERSIZE; + ptr3=ptr1=ptr2-offset; + end=target+BLOCKSIZE; + while (targetp1;p1++) sum+=(*p1)*(*p1); + if (sum==0) return 0; /* OOPS - division by zero */ + return (0x20000000/(t_sqrt(sum)>>8))*factor; +} + +/* multiply/add wavetable */ +static void add_wav(Real144_internal *glob, int n, int f, int m1, int m2, int m3, short *s1, short *s2, short *s3, short *dest) +{ + int a,b,c; + int x; + short *ptr,*ptr2; + + ptr=glob->wavtable1+n*9; + ptr2=glob->wavtable2+n*9; + if (f!=0) { + a=((*ptr)*m1)>>((*ptr2)+1); + } else { + a=0; + } + ptr++;ptr2++; + b=((*ptr)*m2)>>((*ptr2)+1); + ptr++;ptr2++; + c=((*ptr)*m3)>>((*ptr2)+1); + ptr2=(ptr=dest)+BLOCKSIZE; + if (f!=0) + while (ptr>12; + else + while (ptr>12; +} + + +static void final(Real144_internal *glob, short *i1, short *i2, void *out, int *statbuf, int len) +{ + int x,sum; + int buffer[10]; + short *ptr; + short *ptr2; + + memcpy(glob->work,statbuf,20); + memcpy(glob->work+10,i2,len*2); + + buffer[9]=i1[0]; + buffer[8]=i1[1]; + buffer[7]=i1[2]; + buffer[6]=i1[3]; + buffer[5]=i1[4]; + buffer[4]=i1[5]; + buffer[3]=i1[6]; + buffer[2]=i1[7]; + buffer[1]=i1[8]; + buffer[0]=i1[9]; + + ptr2=(ptr=glob->work)+len; + while (ptr>12; + x=ptr[10]-sum; + if (x<-32768 || x>32767) + { + memset(out,0,len*2); + memset(statbuf,0,20); + return; + } + ptr[10]=x; + ptr++; + } + memcpy(out,ptr+10-len,len*2); + memcpy(statbuf,ptr,20); +} + +/* Decode 20-byte input */ +static void unpack_input(unsigned char *input, unsigned int *output) +{ + unsigned int outbuffer[28]; + unsigned short inbuffer[10]; + unsigned int x; + unsigned int *ptr; + + /* fix endianness */ + for (x=0;x<20;x+=2) + inbuffer[x/2]=(input[x]<<8)+input[x+1]; + + /* unpack */ + ptr=outbuffer; + *(ptr++)=27; + *(ptr++)=(inbuffer[0]>>10)&0x3f; + *(ptr++)=(inbuffer[0]>>5)&0x1f; + *(ptr++)=inbuffer[0]&0x1f; + *(ptr++)=(inbuffer[1]>>12)&0xf; + *(ptr++)=(inbuffer[1]>>8)&0xf; + *(ptr++)=(inbuffer[1]>>5)&7; + *(ptr++)=(inbuffer[1]>>2)&7; + *(ptr++)=((inbuffer[1]<<1)&6)|((inbuffer[2]>>15)&1); + *(ptr++)=(inbuffer[2]>>12)&7; + *(ptr++)=(inbuffer[2]>>10)&3; + *(ptr++)=(inbuffer[2]>>5)&0x1f; + *(ptr++)=((inbuffer[2]<<2)&0x7c)|((inbuffer[3]>>14)&3); + *(ptr++)=(inbuffer[3]>>6)&0xff; + *(ptr++)=((inbuffer[3]<<1)&0x7e)|((inbuffer[4]>>15)&1); + *(ptr++)=(inbuffer[4]>>8)&0x7f; + *(ptr++)=(inbuffer[4]>>1)&0x7f; + *(ptr++)=((inbuffer[4]<<7)&0x80)|((inbuffer[5]>>9)&0x7f); + *(ptr++)=(inbuffer[5]>>2)&0x7f; + *(ptr++)=((inbuffer[5]<<5)&0x60)|((inbuffer[6]>>11)&0x1f); + *(ptr++)=(inbuffer[6]>>4)&0x7f; + *(ptr++)=((inbuffer[6]<<4)&0xf0)|((inbuffer[7]>>12)&0xf); + *(ptr++)=(inbuffer[7]>>5)&0x7f; + *(ptr++)=((inbuffer[7]<<2)&0x7c)|((inbuffer[8]>>14)&3); + *(ptr++)=(inbuffer[8]>>7)&0x7f; + *(ptr++)=((inbuffer[8]<<1)&0xfe)|((inbuffer[9]>>15)&1); + *(ptr++)=(inbuffer[9]>>8)&0x7f; + *(ptr++)=(inbuffer[9]>>1)&0x7f; + + *(output++)=outbuffer[11]; + for (x=1;x<11;*(output++)=outbuffer[x++]); + ptr=outbuffer+12; + for (x=0;x<16;x+=4) + { + *(output++)=ptr[x]; + *(output++)=ptr[x+2]; + *(output++)=ptr[x+3]; + *(output++)=ptr[x+1]; + } +} + +static unsigned int rms(int *data, int f) +{ + int *c; + int x; + int d; + unsigned int res; + int b; + + c=data; + b=0; + res=0x10000; + for (x=0;x<10;x++) + { + res=(((0x1000000-(*c)*(*c))>>12)*res)>>12; + if (res==0) return 0; + if (res<=0x3fff) + { + while (res<=0x3fff) + { + b++; + res<<=2; + } + } else { + if (res>0x10000) + return 0; /* We're screwed, might as well go out with a bang. :P */ + } + c++; + } + if (res>0) res=t_sqrt(res); + + res>>=(b+10); + res=(res*f)>>10; + return res; +} + +static void dec1(Real144_internal *glob, int *data, int *inp, int n, int f) +{ + short *ptr,*end; + + *(glob->decptr++)=rms(data,f); + glob->decptr++; + end=(ptr=glob->decsp)+(n*10); + while (ptrbuffer1; + bp2=glob->buffer2; + ptr2=(ptr3=glob->buffer2)+9; + sptr=in; + while (ptr2>=ptr3) + *(ptr3++)=*(sptr++); + + target+=9; + a=bp2[9]; + *target=a; + if (a+0x1000>0x1fff) + return 0; /* We're screwed, might as well go out with a bang. :P */ + c=8;u=a; + while (c>=0) + { + if (u==0x1000) u++; + if (u==0xfffff000) u--; + b=0x1000-((u*u)>>12); + if (b==0) b++; + ptr2=bp1; + ptr1=(ptr3=bp2)+c; + for (u=0;u<=c;u++) + *(ptr2++)=((*(ptr3++)-(((*target)*(*(ptr1--)))>>12))*(0x1000000/b))>>12; + *(--target)=u=bp1[(c--)]; + if ((u+0x1000)>0x1fff) retval=1; + temp=bp2; + bp2=bp1; + bp1=temp; + } + return retval; +} + +static void dec2(Real144_internal *glob, int *data, int *inp, int n, int f, int *inp2, int l) +{ + unsigned int *ptr1,*ptr2; + int work[10]; + int a,b; + int x; + int result; + + if(l+1decsp=glob->sptr=glob->gbuf2; + glob->decptr=glob->gbuf1; + } + ptr1=inp; + ptr2=inp2; + for (x=0;x<10*n;x++) + *(glob->sptr++)=(a*(*ptr1++)+b*(*ptr2++))>>2; + result=eq(glob,glob->decsp,work); + if (result==1) + { + dec1(glob,data,inp,n,f); + } else { + *(glob->decptr++)=rms(work,f); + glob->decptr++; + } + glob->decsp+=n*10; +} + +/* Uncompress one block (20 bytes -> 160*2 bytes) */ +static int ra144_decode_frame(AVCodecContext * avctx, + void *data, int *data_size, + uint8_t * buf, int buf_size) +{ + unsigned int a,b,c; + long s; + signed short *shptr; + unsigned int *lptr,*temp; + const short **dptr; + void *datao; + Real144_internal *glob=avctx->priv_data; + + datao = data; + unpack_input(buf,glob->unpacked); + + glob->iptr=glob->unpacked; + glob->val=decodetable[0][(*(glob->iptr++))<<1]; + + dptr=decodetable+1; + lptr=glob->swapbuf1; + while (lptrswapbuf1+10) + *(lptr++)=(*(dptr++))[(*(glob->iptr++))<<1]; + + do_voice(glob->swapbuf1,glob->swapbuf2); + + a=t_sqrt(glob->val*glob->oldval)>>12; + + for (c=0;cswapbuf1,glob->swapbuf2,3,glob->val); + } else { + if (c*2==(NBLOCKS-2)) { + if (glob->oldvalval) { + dec2(glob,glob->swapbuf1,glob->swapbuf2,3,a,glob->swapbuf2alt,c); + } else { + dec2(glob,glob->swapbuf1alt,glob->swapbuf2alt,3,a,glob->swapbuf2,c); + } + } else { + if (c*2<(NBLOCKS-2)) { + dec2(glob,glob->swapbuf1alt,glob->swapbuf2alt,3,glob->oldval,glob->swapbuf2,c); + } else { + dec2(glob,glob->swapbuf1,glob->swapbuf2,3,glob->val,glob->swapbuf2alt,c); + } + } + } + } + + /* do output */ + for (b=0,c=0;c<4;c++) { + glob->gval=glob->gbuf1[c*2]; + glob->gsp=glob->gbuf2+b; + do_output_subblock(glob,glob->resetflag); + glob->resetflag=0; + + shptr=glob->output_buffer; + while (shptroutput_buffer+BLOCKSIZE) { + s=*(shptr++)<<2; + *((int16_t *)data)=s; + if (s>32767) *((int16_t *)data)=32767; + if (s<-32767) *((int16_t *)data)=-32768; + ((int16_t *)data)++; + } + b+=30; + } + + glob->oldval=glob->val; + temp=glob->swapbuf1alt; + glob->swapbuf1alt=glob->swapbuf1; + glob->swapbuf1=temp; + temp=glob->swapbuf2alt; + glob->swapbuf2alt=glob->swapbuf2; + glob->swapbuf2=temp; + *data_size=data-datao; + return 20; +} + + +AVCodec ra_144_decoder = +{ + "real_144", + CODEC_TYPE_AUDIO, + CODEC_ID_RA_144, + sizeof(Real144_internal), + ra144_decode_init, + NULL, + NULL, + ra144_decode_frame, +}; diff --git a/mythtv/libs/libavcodec/ra288.c b/mythtv/libs/libavcodec/ra288.c new file mode 100644 index 00000000000..7b6df3bf5f8 --- /dev/null +++ b/mythtv/libs/libavcodec/ra288.c @@ -0,0 +1,458 @@ +/* + * RealAudio 2.0 (28.8K) + * Copyright (c) 2003 the ffmpeg project + * + * This 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 of the License, or (at your option) any later version. + * + * This 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 this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "avcodec.h" + +typedef struct { + float history[8]; + float output[40]; + float pr1[36]; + float pr2[10]; + int phase, phasep; + + float st1a[111],st1b[37],st1[37]; + float st2a[38],st2b[11],st2[11]; + float sb[41]; + float lhist[10]; +} Real288_internal; + +const float amptable[8]={ 0.515625, 0.90234375, 1.57910156, 2.76342773, + -0.515625,-0.90234375,-1.57910156,-2.76342773 }; + +const float codetable[640]={ + 0.326171875, -1.4404296875, -0.6123046875, -0.8740234375, -1.24658203125, + -2.45703125, -2.23486328125, -0.51025390625, 1.419921875, 1.6201171875, + -1.37646484375, -1.30712890625, -0.462890625, -1.37939453125, -2.1728515625, + -3.26123046875, -0.166015625, 0.7236328125, -0.623046875, 0.6162109375, + -0.2744140625, -3.29931640625, 0.62548828125, 0.08740234375, -0.6220703125, + -1.2265625, -3.4814453125, -2.40478515625, 3.37548828125, 1.17724609375, + -1.2099609375, -0.076171875, 2.28662109375, -1.89111328125, 0, + -4.0078125, 1.044921875, -0.2333984375, -1.35986328125, 0.26025390625, + 0.92236328125, 1.34716796875, 0.67431640625, -3.39599609375, -2.88720703125, + 2.4814453125, -1.201171875, -2.8212890625, 0.87744140625, 0.27734375, + -1.078125, -1.61572265625, -2.20849609375, -3.044921875, -3.66455078125, + -1.32763671875, 2.1279296875, -1.458984375, -0.56103515625, 1.30078125, + 0.61474609375, 0.48583984375, 1.32373046875, -1.203125, -5.0732421875, + 0.8408203125, -3.69580078125, -1.3388671875, 1.06005859375, -1.13720703125, + 0.50390625, 0.36474609375, -0.4189453125, -3.8798828125, -6.27099609375, + 1.5166015625, 2.37109375, -2.04736328125, -1.24072265625, 0.50537109375, + 0.9091796875, -0.46875, -3.236328125, 0.2001953125, 2.8720703125, + -1.21728515625, -1.283203125, -1.953125, -0.029296875, 3.5166015625, + -1.3046875, 0.7060546875, 0.75, -1.87060546875, 0.60205078125, + -2.5888671875, 3.375, 0.77587890625, -2.04443359375, 1.78955078125, + -1.6875, -3.9892578125, -3.76416015625, 0.67578125, 2.2939453125, + -2.29443359375, -3.03173828125, -5.45703125, 3.95703125, 8.2177734375, + 0.4541015625, 3.419921875, 0.61962890625, -4.38330078125, 1.25341796875, + 2.27001953125, 5.763671875, 1.68017578125, -2.76220703125, 0.58544921875, + 1.2412109375, -0.08935546875, -4.32568359375, -3.89453125, 1.5771484375, + -1.40234375, -0.98193359375, -4.74267578125, -4.09423828125, 6.33935546875, + 1.5068359375, 1.044921875, -1.796875, -4.70849609375, -1.4140625, + -3.71533203125, 3.18115234375, -1.11474609375, -1.2314453125, 3.091796875, + -1.62744140625, -2.744140625, -4.4580078125, -5.43505859375, 2.70654296875, + -0.19873046875, -3.28173828125, -8.5283203125, -1.41064453125, 5.6484375, + 1.802734375, 3.318359375, -0.1279296875, -5.2958984375, -0.90625, + 3.55224609375, 6.544921875, -1.45947265625, -5.17333984375, 2.41015625, + 0.119140625, -1.08349609375, 1.296875, 1.84375, -2.642578125, + -1.97412109375, -2.8974609375, 1.04052734375, 0.42138671875, -1.3994140625, + -1.6123046875, 0.85107421875, -0.9794921875, -0.0625, -1.001953125, + -3.10595703125, 1.6318359375, -0.77294921875, -0.01025390625, 0.5576171875, + -1.87353515625, -0.89404296875, 3.12353515625, 1.24267578125, -1.390625, + -4.556640625, -3.1875, 2.59228515625, 0.9697265625, -1.09619140625, + -2.1923828125, 0.365234375, 0.94482421875, -1.47802734375, -0.24072265625, + -4.51904296875, 2.6201171875, 1.55908203125, -2.19384765625, 0.87109375, + 2.3359375, -0.1806640625, 0.9111328125, 0.51611328125, -0.92236328125, + 3.5849609375, -1.3134765625, -1.25830078125, 0.330078125, -0.29833984375, + -0.2451171875, 1.09130859375, -0.9033203125, -0.86767578125, -1.00048828125, + 0.49365234375, 1.89453125, -1.20361328125, 1.07861328125, -0.07421875, + 1.265625, 1.38134765625, 2.728515625, 1.38623046875, -3.5673828125, + -1.48876953125, -2.4013671875, 2.90771484375, 4.49267578125, -2.17138671875, + 0.34033203125, 1.908203125, 2.8310546875, -2.17333984375, -2.267578125, + -1.03564453125, 2.658203125, -1.2548828125, 0.15673828125, -0.5869140625, + 1.3896484375, -1.0185546875, 1.724609375, 0.2763671875, -0.345703125, + -2.08935546875, 0.4638671875, 2.431640625, 1.83056640625, 0.220703125, + -1.212890625, 1.7099609375, 0.83935546875, -0.0830078125, 0.1162109375, + -1.67724609375, 0.12841796875, 1.0322265625, -0.97900390625, 1.15283203125, + -3.5830078125, -0.58984375, 4.56396484375, -0.59375, -1.95947265625, + -6.5908203125, -0.21435546875, 3.919921875, -2.06640625, 0.17626953125, + -1.82080078125, 2.65283203125, 0.978515625, -2.30810546875, -0.61474609375, + -1.9462890625, 3.78076171875, 4.11572265625, -1.80224609375, -0.48193359375, + 2.5380859375, -0.20654296875, 0.5615234375, -0.62548828125, 0.3984375, + 3.61767578125, 2.00634765625, -1.92822265625, 1.3134765625, 0.0146484384313, + 0.6083984375, 1.49169921875, -0.01708984375, -0.6689453125, -0.1201171875, + -0.72705078125, 2.75146484375, -0.3310546875, -1.28271484375, 1.5478515625, + 2.3583984375, -2.23876953125, 0.98046875, -0.5185546875, 0.39013671875, + -0.06298828125, 0.35009765625, 2.2431640625, 7.29345703125, 5.2275390625, + 0.20361328125, 1.34716796875, 0.9033203125, -2.46923828125, -0.56298828125, + -1.89794921875, 3.59423828125, -2.81640625, 2.09228515625, 0.3251953125, + 0.70458984375, -0.4580078125, 0.009765625, -1.03466796875, -0.82861328125, + -1.8125, -1.6611328125, -1.080078125, 0.0537109375, 1.04296875, + -1.44140625, 0.005859375, -0.765625, -1.708984375, -0.90576171875, + -0.64208984375, -0.84521484375, 0.56640625, -0.2724609375, 0.83447265625, + 0.04296875, -2.23095703125, 0.0947265625, -0.2216796875, -1.44384765625, + -1.38623046875, -0.8134765625, -0.13330078125, 1.017578125, -0.07568359375, + -0.09228515625, -1.16015625, 0.81201171875, -0.5078125, -1.19580078125, + -1.3876953125, -0.66845703125, 0.310546875, -0.12109375, -1.30712890625, + 0.74072265625, 0.03857421875, -1.47119140625, -1.79150390625, -0.47509765625, + 0.93408203125, -1.21728515625, -2.59375, -0.36572265625, 0.62060546875, + -1.41748046875, -1.623046875, -1.833984375, -1.8017578125, -0.89306640625, + -1.42236328125, -0.75537109375, -1.34765625, -0.6865234375, 0.548828125, + 0.900390625, -0.8955078125, 0.22265625, 0.3447265625, -2.0859375, + 0.22802734375, -2.078125, -0.93212890625, 0.74267578125, 0.5537109375, + -0.06201171875, -0.4853515625, -0.31103515625, -0.72802734375, -3.1708984375, + 0.42626953125, -0.99853515625, -1.869140625, -1.36328125, -0.2822265625, + 1.12841796875, -0.88720703125, 1.28515625, -1.490234375, 0.9609375, + 0.31298828125, 0.5830078125, 0.92431640625, 2.00537109375, 3.0966796875, + -0.02197265625, 0.5849609375, 1.0546875, -0.70751953125, 1.07568359375, + -0.978515625, 0.83642578125, 1.7177734375, 1.294921875, 2.07568359375, + 1.43359375, -1.9375, 0.625, 0.06396484375, -0.720703125, + 1.38037109375, 0.00390625, -0.94140625, 1.2978515625, 1.71533203125, + 1.56201171875, -0.3984375, 1.31201171875, -0.85009765625, -0.68701171875, + 1.439453125, 1.96728515625, 0.1923828125, -0.12353515625, 0.6337890625, + 2.0927734375, 0.02490234375, -2.20068359375, -0.015625, -0.32177734375, + 1.90576171875, 2.7568359375, -2.728515625, -1.265625, 2.78662109375, + -0.2958984375, 0.6025390625, -0.78466796875, -2.53271484375, 0.32421875, + -0.25634765625, 1.767578125, -1.0703125, -1.23388671875, 0.83349609375, + 2.09814453125, -1.58740234375, -1.11474609375, 0.396484375, -1.10546875, + 2.81494140625, 0.2578125, -1.60498046875, 0.66015625, 0.81640625, + 1.33544921875, 0.60595703125, -0.53857421875, -1.59814453125, -1.66357421875, + 1.96923828125, 0.8046875, -1.44775390625, -0.5732421875, 0.705078125, + 0.0361328125, 0.4482421875, 0.97607421875, 0.44677734375, -0.5009765625, + -1.21875, -0.78369140625, 0.9931640625, 1.4404296875, 0.11181640625, + -1.05859375, 0.99462890625, 0.00732421921566,-0.6171875, -0.1015625, + -1.734375, 0.7470703125, 0.28369140625, 0.72802734375, 0.4697265625, + -1.27587890625, -1.1416015625, 1.76806640625, -0.7265625, -1.06689453125, + -0.85302734375, 0.03955078125, 2.7041015625, 0.69921875, -1.10205078125, + -0.49755859375, 0.42333984375, 0.1044921875, -1.115234375, -0.7373046875, + -0.822265625, 1.375, -0.11181640625, 1.24560546875, -0.67822265625, + 1.32177734375, 0.24609375, 0.23388671875, 1.35888671875, -0.49267578125, + 1.22900390625, -0.72607421875, -0.779296875, 0.30322265625, 0.94189453125, + -0.072265625, 1.0771484375, -2.09375, 0.630859375, -0.68408203125, + -0.25732421875, 0.60693359375, -1.33349609375, 0.93212890625, 0.625, + 1.04931640625, -0.73291015625, 1.80078125, 0.2978515625, -2.24169921875, + 1.6142578125, -1.64501953125, 0.91552734375, 1.775390625, -0.59423828125, + 1.2568359375, 1.22705078125, 0.70751953125, -1.5009765625, -2.43115234375, + 0.3974609375, 0.8916015625, -1.21923828125, 2.0673828125, -1.99072265625, + 0.8125, -0.107421875, 1.6689453125, 0.4892578125, 0.54443359375, + 0.38134765625, 0.8095703125, 1.91357421875, 2.9931640625, 1.533203125, + 0.560546875, 1.98486328125, 0.740234375, 0.39794921875, 0.09716796875, + 0.58154296875, 1.21533203125, 1.25048828125, 1.18212890625, 1.19287109375, + 0.3759765625, -2.88818359375, 2.69287109375, -0.1796875, -1.56201171875, + 0.5810546875, 0.51123046875, 1.8271484375, 3.38232421875, -1.02001953125, + 0.142578125, 1.51318359375, 2.103515625, -0.3701171875, -1.19873046875, + 0.25537109375, 1.91455078125, 1.974609375, 0.6767578125, 0.04150390625, + 2.13232421875, 0.4912109375, -0.611328125, -0.7158203125, -0.67529296875, + 1.880859375, 0.77099609375, -0.03759765625, 1.0078125, 0.423828125, + 2.49462890625, 1.42529296875, -0.0986328125, 0.17529296875, -0.24853515625, + 1.7822265625, 1.5654296875, 1.12451171875, 0.82666015625, 0.6328125, + 1.41845703125, -1.90771484375, 0.11181640625, -0.583984375, -1.138671875, + 2.91845703125, -1.75048828125, 0.39306640625, 1.86767578125, -1.5322265625, + 1.8291015625, -0.2958984375, 0.02587890625, -0.13134765625, -1.61181640625, + 0.2958984375, 0.9853515625, -0.642578125, 1.984375, 0.1943359375 +}; + +const float table1[111]={ + 0.576690972, 0.580838025, 0.585013986, 0.589219987, 0.59345597, 0.597723007, + 0.602020264, 0.606384277, 0.610748291, 0.615142822, 0.619598389, 0.624084473, + 0.628570557, 0.633117676, 0.637695313, 0.642272949, 0.646911621, 0.651580811, + 0.656280518, 0.66104126, 0.665802002, 0.670593262, 0.675445557, 0.680328369, + 0.685241699, 0.690185547, 0.695159912, 0.700164795, 0.705230713, 0.710327148, + 0.715454102, 0.720611572, 0.725830078, 0.731048584, 0.736328125, 0.741638184, + 0.747009277, 0.752380371, 0.7578125, 0.763305664, 0.768798828, 0.774353027, + 0.779937744, 0.785583496, 0.791229248, 0.796936035, 0.802703857, 0.808502197, + 0.814331055, 0.820220947, 0.826141357, 0.832092285, 0.838104248, 0.844146729, + 0.850250244, 0.856384277, 0.862548828, 0.868774414, 0.875061035, 0.881378174, + 0.88772583, 0.894134521, 0.900604248, 0.907104492, 0.913635254, 0.920227051, + 0.926879883, 0.933563232, 0.940307617, 0.94708252, 0.953918457, 0.96081543, + 0.96774292, 0.974731445, 0.981781006, 0.988861084, 0.994842529, 0.998565674, + 0.999969482, 0.99911499, 0.996002197, 0.990600586, 0.982910156, 0.973022461, + 0.960876465, 0.946533203, 0.930053711, 0.911437988, 0.89074707, 0.868041992, + 0.843322754, 0.816680908, 0.788208008, 0.757904053, 0.725891113, 0.692199707, + 0.656921387, 0.620178223, 0.582000732, 0.542480469, 0.501739502, 0.459838867, + 0.416900635, 0.373016357, 0.328277588, 0.282775879, 0.236663818, 0.189971924, + 0.142852783, 0.0954284668, 0.0477600098 +}; + +const float table2[38]={ + 0.505699992, 0.524200022, 0.54339999, 0.563300014, 0.583953857, 0.60534668, + 0.627502441, 0.650482178, 0.674316406, 0.699005127, 0.724578857, 0.75112915, + 0.778625488, 0.807128906, 0.836669922, 0.86730957, 0.899078369, 0.932006836, + 0.961486816, 0.982757568, 0.995635986, 1, 0.995819092, 0.983154297, + 0.96206665, 0.932769775, 0.895507813, 0.850585938, 0.798400879, 0.739379883, + 0.674072266, 0.602996826, 0.526763916, 0.446014404, 0.361480713, 0.273834229, + 0.183868408, 0.0923461914 +}; + +const float table1a[36]={ + 0.98828125, 0.976699829, 0.965254128, 0.953942537, 0.942763507, 0.931715488, + 0.920796931, 0.910006344, 0.899342179, 0.888803005, 0.878387332, 0.868093729, + 0.857920766, 0.847867012, 0.837931097, 0.828111589, 0.818407178, 0.808816493, + 0.799338162, 0.789970934, 0.780713439, 0.771564424, 0.762522638, 0.753586829, + 0.744755745, 0.736028135, 0.727402806, 0.718878567, 0.710454226, 0.702128589, + 0.693900526, 0.685768902, 0.677732527, 0.669790328, 0.66194123, 0.654184103 +}; + +const float table2a[10]={ + 0.90625, 0.821289063, 0.74432373, 0.674499512, 0.61126709, + 0.553955078, 0.50201416, 0.454956055, 0.41229248, 0.373657227 +}; + + +static int ra288_decode_init(AVCodecContext * avctx) +{ + Real288_internal *glob=avctx->priv_data; + memset(glob,0,sizeof(Real288_internal)); + return 0; +} + +static void prodsum(float *tgt, float *src, int len, int n); +static void co(int n, int i, int j, float *in, float *out, float *st1, float *st2, const float *table); +static int pred(float *in, float *tgt, int n); +static void colmult(float *tgt, float *m1, const float *m2, int n); + + +/* initial decode */ +static void unpack(unsigned short *tgt, unsigned char *src, int len) +{ + int x,y,z; + int n,temp; + int buffer[len]; + + for (x=0;x>(8-n); + tgt[y]+=temp<>n; + z=8-n; + } else z+=8; + } +} + +static void update(Real288_internal *glob) +{ + int x,y; + float buffer1[40],temp1[37]; + float buffer2[8],temp2[11]; + + for (x=0,y=glob->phasep+5;x<40;buffer1[x++]=glob->output[(y++)%40]); + co(36,40,35,buffer1,temp1,glob->st1a,glob->st1b,table1); + if (pred(temp1,glob->st1,36)) + colmult(glob->pr1,glob->st1,table1a,36); + + for (x=0,y=glob->phase+1;x<8;buffer2[x++]=glob->history[(y++)%8]); + co(10,8,20,buffer2,temp2,glob->st2a,glob->st2b,table2); + if (pred(temp2,glob->st2,10)) + colmult(glob->pr2,glob->st2,table2a,10); +} + +/* Decode and produce output */ +static void decode(Real288_internal *glob, unsigned int input) +{ + unsigned int x,y; + float f; + double sum,sumsum; + float *p1,*p2; + float buffer[5]; + const float *table; + + for (x=36;x--;glob->sb[x+5]=glob->sb[x]); + for (x=5;x--;) { + p1=glob->sb+x;p2=glob->pr1; + for (sum=0,y=36;y--;sum-=(*(++p1))*(*(p2++))); + glob->sb[x]=sum; + } + + f=amptable[input&7]; + table=codetable+(input>>3)*5; + + /* convert log and do rms */ + for (sum=32,x=10;x--;sum-=glob->pr2[x]*glob->lhist[x]); + if (sum<0) sum=0; else if (sum>60) sum=60; + + sumsum=exp(sum*0.1151292546497)*f; /* pow(10.0,sum/20)*f */ + for (sum=0,x=5;x--;) { buffer[x]=table[x]*sumsum; sum+=buffer[x]*buffer[x]; } + if ((sum/=5)<1) sum=1; + + /* shift and store */ + for (x=10;--x;glob->lhist[x]=glob->lhist[x-1]); + *glob->lhist=glob->history[glob->phase]=10*log10(sum)-32; + + for (x=1;x<5;x++) for (y=x;y--;buffer[x]-=glob->pr1[x-y-1]*buffer[y]); + + /* output */ + for (x=0;x<5;x++) { + f=glob->sb[4-x]+buffer[x]; + if (f>4095) f=4095; else if (f<-4095) f=-4095; + glob->output[glob->phasep+x]=glob->sb[4-x]=f; + } +} + +/* column multiply */ +static void colmult(float *tgt, float *m1, const float *m2, int n) +{ + while (n--) + *(tgt++)=(*(m1++))*(*(m2++)); +} + +static int pred(float *in, float *tgt, int n) +{ + int x,y; + float *p1,*p2; + double f0,f1,f2; + float temp; + + if (in[n]==0) return 0; + if ((f0=*in)<=0) return 0; + + for (x=1;;x++) { + if (n>1;y--;) { + temp=*p2+*p1*f2; + *(p1--)+=*p2*f2; + *(p2++)=temp; + } + if ((f0+=f1*f2)<0) return 0; + } +} + +static void co(int n, int i, int j, float *in, float *out, float *st1, float *st2, const float *table) +{ + int a,b,c; + unsigned int x; + float *fp,*fp2; + float buffer1[37]; + float buffer2[37]; + float work[111]; + + /* rotate and multiply */ + c=(b=(a=n+i)+j)-i; + fp=st1+i; + for (x=0;x=0) + { + p1=(p2=src)-n; + for (sum=0,x=len;x--;sum+=(*p1++)*(*p2++)); + tgt[n--]=sum; + } +} + +void * decode_block(AVCodecContext * avctx, unsigned char *in, signed short int *out,unsigned len) +{ + int x,y; + Real288_internal *glob=avctx->priv_data; + unsigned short int buffer[len]; + + unpack(buffer,in,len); + for (x=0;x<32;x++) + { + glob->phasep=(glob->phase=x&7)*5; + decode(glob,buffer[x]); + for (y=0;y<5;*(out++)=8*glob->output[glob->phasep+(y++)]); + if (glob->phase==3) update(glob); + } + return out; +} + +/* Decode a block (celp) */ +static int ra288_decode_frame(AVCodecContext * avctx, + void *data, int *data_size, + uint8_t * buf, int buf_size) +{ + if(avctx->extradata_size>=6) + { +//((short*)(avctx->extradata))[0]; /* subpacket size */ +//((short*)(avctx->extradata))[1]; /* subpacket height */ +//((short*)(avctx->extradata))[2]; /* subpacket flavour */ +//((short*)(avctx->extradata))[3]; /* coded frame size */ +//((short*)(avctx->extradata))[4]; /* codec's data length */ +//((short*)(avctx->extradata))[5...] /* codec's data */ + int bret; + void *datao; + int w=avctx->block_align; /* 228 */ + int h=((short*)(avctx->extradata))[1]; /* 12 */ + int cfs=((short*)(avctx->extradata))[3]; /* coded frame size 38 */ + int i,j; + if(buf_sizeidct_put = idct_put; c->idct_add = idct_add; + c->idct = idct_sh4; c->idct_permutation_type= FF_NO_IDCT_PERM; //FF_SIMPLE_IDCT_PERM; //FF_LIBMPEG2_IDCT_PERM; } } diff --git a/mythtv/libs/libavcodec/svq3.c b/mythtv/libs/libavcodec/svq3.c index d15bb980346..24762f8b1e2 100644 --- a/mythtv/libs/libavcodec/svq3.c +++ b/mythtv/libs/libavcodec/svq3.c @@ -262,8 +262,12 @@ static inline int svq3_decode_block (GetBitContext *gb, DCTELEM *block, return 0; } -static inline void svq3_mc_dir_part (MpegEncContext *s, int x, int y, - int width, int height, int mx, int my, int dxy, int thirdpel) { +static inline void svq3_mc_dir_part (MpegEncContext *s, + int x, int y, int width, int height, + int mx, int my, int dxy, + int thirdpel, int dir, int avg) { + + const Picture *pic = (dir == 0) ? &s->last_picture : &s->next_picture; uint8_t *src, *dest; int i, emu = 0; int blocksize= 2 - (width>>3); //16->0, 8->1, 4->2 @@ -284,17 +288,17 @@ static inline void svq3_mc_dir_part (MpegEncContext *s, int x, int y, /* form component predictions */ dest = s->current_picture.data[0] + x + y*s->linesize; - src = s->last_picture.data[0] + mx + my*s->linesize; + src = pic->data[0] + mx + my*s->linesize; if (emu) { - ff_emulated_edge_mc (s, src, s->linesize, (width + 1), (height + 1), + ff_emulated_edge_mc (s->edge_emu_buffer, src, s->linesize, (width + 1), (height + 1), mx, my, s->h_edge_pos, s->v_edge_pos); src = s->edge_emu_buffer; } if(thirdpel) - s->dsp.put_tpel_pixels_tab[dxy](dest, src, s->linesize, width, height); + (avg ? s->dsp.avg_tpel_pixels_tab : s->dsp.put_tpel_pixels_tab)[dxy](dest, src, s->linesize, width, height); else - s->dsp.put_pixels_tab[blocksize][dxy](dest, src, s->linesize, height); + (avg ? s->dsp.avg_pixels_tab : s->dsp.put_pixels_tab)[blocksize][dxy](dest, src, s->linesize, height); if (!(s->flags & CODEC_FLAG_GRAY)) { mx = (mx + (mx < (int) x)) >> 1; @@ -305,17 +309,17 @@ static inline void svq3_mc_dir_part (MpegEncContext *s, int x, int y, for (i=1; i < 3; i++) { dest = s->current_picture.data[i] + (x >> 1) + (y >> 1)*s->uvlinesize; - src = s->last_picture.data[i] + mx + my*s->uvlinesize; + src = pic->data[i] + mx + my*s->uvlinesize; if (emu) { - ff_emulated_edge_mc (s, src, s->uvlinesize, (width + 1), (height + 1), + ff_emulated_edge_mc (s->edge_emu_buffer, src, s->uvlinesize, (width + 1), (height + 1), mx, my, (s->h_edge_pos >> 1), (s->v_edge_pos >> 1)); - src = s->edge_emu_buffer; + src = s->edge_emu_buffer; } if(thirdpel) - s->dsp.put_tpel_pixels_tab[dxy](dest, src, s->uvlinesize, width, height); + (avg ? s->dsp.avg_tpel_pixels_tab : s->dsp.put_tpel_pixels_tab)[dxy](dest, src, s->uvlinesize, width, height); else - s->dsp.put_pixels_tab[blocksize][dxy](dest, src, s->uvlinesize, height); + (avg ? s->dsp.avg_pixels_tab : s->dsp.put_pixels_tab)[blocksize][dxy](dest, src, s->uvlinesize, height); } } } @@ -334,11 +338,52 @@ static int svq3_decode_mb (H264Context *h, unsigned int mb_type) { h->topright_samples_available = 0xFFFF; if (mb_type == 0) { /* SKIP */ - svq3_mc_dir_part (s, 16*s->mb_x, 16*s->mb_y, 16, 16, 0, 0, 0, 0); + if (s->pict_type == P_TYPE) { + svq3_mc_dir_part (s, 16*s->mb_x, 16*s->mb_y, 16, 16, 0, 0, 0, 0, 0, 0); + + cbp = 0; + mb_type = MB_TYPE_SKIP; + } else { + for (dir=0; dir < 2; dir++) { + for (i=0; i < 4; i++) { + for (j=0; j < 4; j++) { + int dxy; + x = 16*s->mb_x + 4*j; + y = 16*s->mb_y + 4*i; + + mx = 2*s->next_picture.motion_val[0][b_xy + j + i*h->b_stride][0]; + my = 2*s->next_picture.motion_val[0][b_xy + j + i*h->b_stride][1]; + + if (dir == 0) { + mx = (mx * h->frame_num_offset) / h->prev_frame_num_offset; + my = (my * h->frame_num_offset) / h->prev_frame_num_offset; + } else { + mx = (mx * (h->frame_num_offset - h->prev_frame_num_offset)) / h->prev_frame_num_offset; + my = (my * (h->frame_num_offset - h->prev_frame_num_offset)) / h->prev_frame_num_offset; + } + + mx = ((unsigned)(mx + 3 + 0x6000))/6 - 0x1000; + my = ((unsigned)(my + 3 + 0x6000))/6 - 0x1000; + dxy= (mx&1) + 2*(my&1); + + /* update mv_cache */ + s->current_picture.motion_val[dir][b_xy + j + i*h->b_stride][0] = 3*mx; + s->current_picture.motion_val[dir][b_xy + j + i*h->b_stride][1] = 3*my; + + svq3_mc_dir_part (s, x, y, 4, 4, mx>>1, my>>1, dxy, 0, dir, (dir == 1)); + } + } + } - cbp = 0; - mb_type = MB_TYPE_SKIP; + if ((vlc = svq3_get_ue_golomb (&s->gb)) >= 48) + return -1; + + cbp = golomb_to_inter_cbp[vlc]; + mb_type = MB_TYPE_16x16; + } } else if (mb_type < 8) { /* INTER */ + int dir0, dir1; + if (h->thirdpel_flag && h->halfpel_flag == !get_bits (&s->gb, 1)) { mode = THIRDPEL_MODE; } else if (h->halfpel_flag && h->thirdpel_flag == !get_bits (&s->gb, 1)) { @@ -348,7 +393,7 @@ static int svq3_decode_mb (H264Context *h, unsigned int mb_type) { } /* fill caches */ - /* note ref_cache[0] should contain here: + /* note ref_cache should contain here: ???????? ???11111 N??11111 @@ -357,44 +402,62 @@ static int svq3_decode_mb (H264Context *h, unsigned int mb_type) { N */ - if (s->mb_x > 0) { - for (i=0; i < 4; i++) { - *(uint32_t *) h->mv_cache[0][scan8[0] - 1 + i*8] = *(uint32_t *) s->current_picture.motion_val[0][b_xy - 1 + i*h->b_stride]; - } - } else { - for (i=0; i < 4; i++) { - *(uint32_t *) h->mv_cache[0][scan8[0] - 1 + i*8] = 0; + for (m=0; m < 2; m++) { + if (s->mb_x > 0 && h->intra4x4_pred_mode[mb_xy - 1][0] != -1) { + for (i=0; i < 4; i++) { + *(uint32_t *) h->mv_cache[m][scan8[0] - 1 + i*8] = *(uint32_t *) s->current_picture.motion_val[m][b_xy - 1 + i*h->b_stride]; + } + } else { + for (i=0; i < 4; i++) { + *(uint32_t *) h->mv_cache[m][scan8[0] - 1 + i*8] = 0; + } } - } - if (s->mb_y > 0) { - memcpy (h->mv_cache[0][scan8[0] - 1*8], s->current_picture.motion_val[0][b_xy - h->b_stride], 4*2*sizeof(int16_t)); - memset (&h->ref_cache[0][scan8[0] - 1*8], 1, 4); - - if (s->mb_x < (s->mb_width - 1)) { - *(uint32_t *) h->mv_cache[0][scan8[0] + 4 - 1*8] = *(uint32_t *) s->current_picture.motion_val[0][b_xy - h->b_stride + 4]; - h->ref_cache[0][scan8[0] + 4 - 1*8] = 1; - }else - h->ref_cache[0][scan8[0] + 4 - 1*8] = PART_NOT_AVAILABLE; - if (s->mb_x > 0) { - *(uint32_t *) h->mv_cache[0][scan8[0] - 1 - 1*8] = *(uint32_t *) s->current_picture.motion_val[0][b_xy - h->b_stride - 1]; - h->ref_cache[0][scan8[0] - 1 - 1*8] = 1; + if (s->mb_y > 0) { + memcpy (h->mv_cache[m][scan8[0] - 1*8], s->current_picture.motion_val[m][b_xy - h->b_stride], 4*2*sizeof(int16_t)); + memset (&h->ref_cache[m][scan8[0] - 1*8], (h->intra4x4_pred_mode[mb_xy - s->mb_stride][4] == -1) ? PART_NOT_AVAILABLE : 1, 4); + + if (s->mb_x < (s->mb_width - 1)) { + *(uint32_t *) h->mv_cache[m][scan8[0] + 4 - 1*8] = *(uint32_t *) s->current_picture.motion_val[m][b_xy - h->b_stride + 4]; + h->ref_cache[m][scan8[0] + 4 - 1*8] = + (h->intra4x4_pred_mode[mb_xy - s->mb_stride + 1][0] == -1 || + h->intra4x4_pred_mode[mb_xy - s->mb_stride][4] == -1) ? PART_NOT_AVAILABLE : 1; + }else + h->ref_cache[m][scan8[0] + 4 - 1*8] = PART_NOT_AVAILABLE; + if (s->mb_x > 0) { + *(uint32_t *) h->mv_cache[0][scan8[0] - 1 - 1*8] = *(uint32_t *) s->current_picture.motion_val[m][b_xy - h->b_stride - 1]; + h->ref_cache[m][scan8[0] - 1 - 1*8] = (h->intra4x4_pred_mode[mb_xy - s->mb_stride - 1][3] == -1) ? PART_NOT_AVAILABLE : 1; + }else + h->ref_cache[m][scan8[0] - 1 - 1*8] = PART_NOT_AVAILABLE; }else - h->ref_cache[0][scan8[0] - 1 - 1*8] = PART_NOT_AVAILABLE; - }else - memset (&h->ref_cache[0][scan8[0] - 1*8 - 1], PART_NOT_AVAILABLE, 8); + memset (&h->ref_cache[m][scan8[0] - 1*8 - 1], PART_NOT_AVAILABLE, 8); + + if (s->pict_type != B_TYPE) + break; + } /* decode motion vector(s) and form prediction(s) */ - part_width = ((mb_type & 5) == 5) ? 4 : 8 << (mb_type & 1); - part_height = 16 >> ((unsigned) mb_type / 3); + if (s->pict_type == P_TYPE) { + part_width = ((mb_type & 5) == 5) ? 4 : 8 << (mb_type & 1); + part_height = 16 >> ((unsigned) mb_type / 3); + dir0 = 0; + dir1 = 0; + } else { /* B_TYPE */ + part_width = 16; + part_height = 16; + dir0 = (mb_type == 2) ? 1 : 0; + dir1 = (mb_type == 1) ? 0 : 1; + } + for (dir=dir0; dir <= dir1; dir++) { for (i=0; i < 16; i+=part_height) { for (j=0; j < 16; j+=part_width) { - int dxy; + int avg=(dir == 1 && dir0 != dir1); + int dxy; x = 16*s->mb_x + j; y = 16*s->mb_y + i; k = ((j>>2)&1) + ((i>>1)&2) + ((j>>1)&4) + (i&8); - pred_motion (h, k, (part_width >> 2), 0, 1, &mx, &my); + pred_motion (h, k, (part_width >> 2), dir, 1, &mx, &my); /* clip motion vector prediction to frame border */ mx = clip (mx, -6*x, 6*(s->h_edge_pos - part_width - x)); @@ -416,7 +479,7 @@ static int svq3_decode_mb (H264Context *h, unsigned int mb_type) { fy= ((unsigned)(my + 0x3000))/3 - 0x1000; dxy= (mx - 3*fx) + 4*(my - 3*fy); - svq3_mc_dir_part (s, x, y, part_width, part_height, fx, fy, dxy, 1); + svq3_mc_dir_part (s, x, y, part_width, part_height, fx, fy, dxy, 1, dir, avg); mx += mx; my += my; } else if (mode == HALFPEL_MODE) { @@ -424,7 +487,7 @@ static int svq3_decode_mb (H264Context *h, unsigned int mb_type) { my = ((unsigned)(my + 1 + 0x3000))/3 + dy - 0x1000; dxy= (mx&1) + 2*(my&1); - svq3_mc_dir_part (s, x, y, part_width, part_height, mx>>1, my>>1, dxy, 0); + svq3_mc_dir_part (s, x, y, part_width, part_height, mx>>1, my>>1, dxy, 0, dir, avg); mx *= 3; my *= 3; } else { @@ -432,18 +495,37 @@ static int svq3_decode_mb (H264Context *h, unsigned int mb_type) { mx = ((unsigned)(mx + 3 + 0x6000))/6 + dx - 0x1000; my = ((unsigned)(my + 3 + 0x6000))/6 + dy - 0x1000; - svq3_mc_dir_part (s, x, y, part_width, part_height, mx, my, 0, 0); + svq3_mc_dir_part (s, x, y, part_width, part_height, mx, my, 0, 0, dir, avg); mx *= 6; my *= 6; } /* update mv_cache */ - fill_rectangle(h->mv_cache[0][scan8[k]], part_width>>2, part_height>>2, 8, pack16to32(mx,my), 4); + fill_rectangle(h->mv_cache[dir][scan8[k]], part_width>>2, part_height>>2, 8, pack16to32(mx,my), 4); } } + } - for (i=0; i < 4; i++) { - memcpy (s->current_picture.motion_val[0][b_xy + i*h->b_stride], h->mv_cache[0][scan8[0] + 8*i], 4*2*sizeof(int16_t)); + /* write back or clear motion vectors */ + if (s->pict_type == P_TYPE || mb_type != 2) { + for (i=0; i < 4; i++) { + memcpy (s->current_picture.motion_val[0][b_xy + i*h->b_stride], h->mv_cache[0][scan8[0] + 8*i], 4*2*sizeof(int16_t)); + } + } else { + for (i=0; i < 4; i++) { + memset (s->current_picture.motion_val[0][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t)); + } + } + if (s->pict_type == B_TYPE) { + if (mb_type != 1) { + for (i=0; i < 4; i++) { + memcpy (s->current_picture.motion_val[1][b_xy + i*h->b_stride], h->mv_cache[1][scan8[0] + 8*i], 4*2*sizeof(int16_t)); + } + } else { + for (i=0; i < 4; i++) { + memset (s->current_picture.motion_val[1][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t)); + } + } } if ((vlc = svq3_get_ue_golomb (&s->gb)) >= 48) @@ -451,40 +533,67 @@ static int svq3_decode_mb (H264Context *h, unsigned int mb_type) { cbp = golomb_to_inter_cbp[vlc]; mb_type = MB_TYPE_16x16; - } else if (mb_type == 8) { /* INTRA4x4 */ + } else if (mb_type == 8 || mb_type == 33) { /* INTRA4x4 */ memset (h->intra4x4_pred_mode_cache, -1, 8*5*sizeof(int8_t)); - if (s->mb_x > 0) { - for (i=0; i < 4; i++) { - h->intra4x4_pred_mode_cache[scan8[0] - 1 + i*8] = h->intra4x4_pred_mode[mb_xy - 1][i]; + if (mb_type == 8) { + if (s->mb_x > 0) { + for (i=0; i < 4; i++) { + h->intra4x4_pred_mode_cache[scan8[0] - 1 + i*8] = h->intra4x4_pred_mode[mb_xy - 1][i]; + } + if (h->intra4x4_pred_mode_cache[scan8[0] - 1] == -1) { + h->left_samples_available = 0x5F5F; + } + } + if (s->mb_y > 0) { + h->intra4x4_pred_mode_cache[4+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][4]; + h->intra4x4_pred_mode_cache[5+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][5]; + h->intra4x4_pred_mode_cache[6+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][6]; + h->intra4x4_pred_mode_cache[7+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][3]; + + if (h->intra4x4_pred_mode_cache[4+8*0] == -1) { + h->top_samples_available = 0x33FF; + } } - } - if (s->mb_y > 0) { - h->intra4x4_pred_mode_cache[4+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][4]; - h->intra4x4_pred_mode_cache[5+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][5]; - h->intra4x4_pred_mode_cache[6+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][6]; - h->intra4x4_pred_mode_cache[7+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][3]; - } - /* decode prediction codes for luma blocks */ - for (i=0; i < 16; i+=2) { - vlc = svq3_get_ue_golomb (&s->gb); + /* decode prediction codes for luma blocks */ + for (i=0; i < 16; i+=2) { + vlc = svq3_get_ue_golomb (&s->gb); - if (vlc >= 25) - return -1; + if (vlc >= 25) + return -1; - left = &h->intra4x4_pred_mode_cache[scan8[i] - 1]; - top = &h->intra4x4_pred_mode_cache[scan8[i] - 8]; + left = &h->intra4x4_pred_mode_cache[scan8[i] - 1]; + top = &h->intra4x4_pred_mode_cache[scan8[i] - 8]; - left[1] = svq3_pred_1[top[0] + 1][left[0] + 1][svq3_pred_0[vlc][0]]; - left[2] = svq3_pred_1[top[1] + 1][left[1] + 1][svq3_pred_0[vlc][1]]; + left[1] = svq3_pred_1[top[0] + 1][left[0] + 1][svq3_pred_0[vlc][0]]; + left[2] = svq3_pred_1[top[1] + 1][left[1] + 1][svq3_pred_0[vlc][1]]; - if (left[1] == -1 || left[2] == -1) - return -1; + if (left[1] == -1 || left[2] == -1) + return -1; + } + } else { + /* DC_128_PRED block type */ + for (i=0; i < 4; i++) { + memset (&h->intra4x4_pred_mode_cache[scan8[0] + 8*i], DC_PRED, 4); + } } write_back_intra_pred_mode (h); - check_intra4x4_pred_mode (h); + + if (mb_type == 8) { + check_intra4x4_pred_mode (h); + + h->top_samples_available = (s->mb_y == 0) ? 0x33FF : 0xFFFF; + h->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF; + } else { + for (i=0; i < 4; i++) { + memset (&h->intra4x4_pred_mode_cache[scan8[0] + 8*i], DC_128_PRED, 4); + } + + h->top_samples_available = 0x33FF; + h->left_samples_available = 0x5F5F; + } if ((vlc = svq3_get_ue_golomb (&s->gb)) >= 48) return -1; @@ -506,6 +615,11 @@ static int svq3_decode_mb (H264Context *h, unsigned int mb_type) { for (i=0; i < 4; i++) { memset (s->current_picture.motion_val[0][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t)); } + if (s->pict_type == B_TYPE) { + for (i=0; i < 4; i++) { + memset (s->current_picture.motion_val[1][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t)); + } + } } if (!IS_INTRA4x4(mb_type)) { memset (h->intra4x4_pred_mode[mb_xy], DC_PRED, 8); @@ -568,12 +682,89 @@ static int svq3_decode_mb (H264Context *h, unsigned int mb_type) { return 0; } +static int svq3_decode_slice_header (H264Context *h) { + MpegEncContext *const s = (MpegEncContext *) h; + const int mb_xy = s->mb_x + s->mb_y*s->mb_stride; + int i, header; + + header = get_bits (&s->gb, 8); + + if (((header & 0x9F) != 1 && (header & 0x9F) != 2) || (header & 0x60) == 0) { + /* TODO: what? */ + fprintf (stderr, "unsupported slice header (%02X)\n", header); + return -1; + } else { + int length = (header >> 5) & 3; + + h->next_slice_index = s->gb.index + 8*show_bits (&s->gb, 8*length) + 8*length; + + if (h->next_slice_index > s->gb.size_in_bits) + return -1; + + s->gb.size_in_bits = h->next_slice_index - 8*(length - 1); + s->gb.index += 8; + + if (length > 0) { + memcpy ((uint8_t *) &s->gb.buffer[s->gb.index >> 3], + &s->gb.buffer[s->gb.size_in_bits >> 3], (length - 1)); + } + } + + if ((i = svq3_get_ue_golomb (&s->gb)) == INVALID_VLC || i >= 3) + return -1; + + h->slice_type = golomb_to_pict_type[i]; + + if ((header & 0x9F) == 2) { + i = (s->mb_num < 64) ? 6 : (1 + av_log2 (s->mb_num - 1)); + s->mb_skip_run = get_bits (&s->gb, i) - (s->mb_x + (s->mb_y * s->mb_width)); + } else { + get_bits1 (&s->gb); + s->mb_skip_run = 0; + } + + h->slice_num = get_bits (&s->gb, 8); + s->qscale = get_bits (&s->gb, 5); + s->adaptive_quant = get_bits1 (&s->gb); + + /* unknown fields */ + get_bits1 (&s->gb); + + if (h->unknown_svq3_flag) { + get_bits1 (&s->gb); + } + + get_bits1 (&s->gb); + get_bits (&s->gb, 2); + + while (get_bits1 (&s->gb)) { + get_bits (&s->gb, 8); + } + + /* reset intra predictors and invalidate motion vector references */ + if (s->mb_x > 0) { + memset (h->intra4x4_pred_mode[mb_xy - 1], -1, 4*sizeof(int8_t)); + memset (h->intra4x4_pred_mode[mb_xy - s->mb_x], -1, 8*sizeof(int8_t)*s->mb_x); + } + if (s->mb_y > 0) { + memset (h->intra4x4_pred_mode[mb_xy - s->mb_stride], -1, 8*sizeof(int8_t)*(s->mb_width - s->mb_x)); + + if (s->mb_x > 0) { + h->intra4x4_pred_mode[mb_xy - s->mb_stride - 1][3] = -1; + } + } + + return 0; +} + static int svq3_decode_frame (AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size) { MpegEncContext *const s = avctx->priv_data; H264Context *const h = avctx->priv_data; - int i; + int m, mb_type; + + *data_size = 0; s->flags = avctx->flags; @@ -584,6 +775,7 @@ static int svq3_decode_frame (AVCodecContext *avctx, h->pred16x16[PLANE_PRED8x8] = pred16x16_plane_svq3_c; h->halfpel_flag = 1; h->thirdpel_flag = 1; + h->unknown_svq3_flag = 0; h->chroma_qp = 4; if (MPV_common_init (s) < 0) @@ -592,67 +784,63 @@ static int svq3_decode_frame (AVCodecContext *avctx, h->b_stride = 4*s->mb_width; alloc_tables (h); - } - - s->low_delay= 1; - - if (avctx->extradata && avctx->extradata_size >= 0x63 - && !memcmp (avctx->extradata, "SVQ3", 4)) { - uint8_t *stsd = (uint8_t *) avctx->extradata + 0x62; + if (avctx->extradata && avctx->extradata_size >= 0x64 + && !memcmp (avctx->extradata, "SVQ3", 4)) { + + GetBitContext gb; - if ((*stsd >> 5) != 7 || avctx->extradata_size >= 0x66) { + init_get_bits (&gb, (uint8_t *) avctx->extradata + 0x62, + 8*(avctx->extradata_size - 0x62)); - if ((*stsd >> 5) == 7) { - stsd += 3; /* skip width, height (12 bits each) */ + /* 'frame size code' and optional 'width, height' */ + if (get_bits (&gb, 3) == 7) { + get_bits (&gb, 12); + get_bits (&gb, 12); } - h->halfpel_flag = (*stsd >> 4) & 1; - h->thirdpel_flag = (*stsd >> 3) & 1; - } - } + h->halfpel_flag = get_bits1 (&gb); + h->thirdpel_flag = get_bits1 (&gb); - if ((buf[0] & 0x9F) != 1) { - /* TODO: what? */ - fprintf (stderr, "unsupported header (%02X)\n", buf[0]); - return -1; - } else { - int length = (buf[0] >> 5) & 3; - int offset = 0; + /* unknown fields */ + get_bits1 (&gb); + get_bits1 (&gb); + get_bits1 (&gb); + get_bits1 (&gb); - for (i=0; i < length; i++) { - offset = (offset << 8) | buf[i + 1]; - } + s->low_delay = get_bits1 (&gb); - if (buf_size < (offset + length + 1) || length == 0) - return -1; + /* unknown field */ + get_bits1 (&gb); - memcpy (&buf[2], &buf[offset + 2], (length - 1)); - } + while (get_bits1 (&gb)) { + get_bits (&gb, 8); + } - init_get_bits (&s->gb, &buf[2], 8*(buf_size - 2)); + h->unknown_svq3_flag = get_bits1 (&gb); + avctx->has_b_frames = !s->low_delay; + } + } - if ((i = svq3_get_ue_golomb (&s->gb)) == INVALID_VLC || i >= 3) - return -1; + /* special case for last picture */ + if (buf_size == 0) { + if (s->next_picture_ptr && !s->low_delay) { + *(AVFrame *) data = *(AVFrame *) &s->next_picture; + *data_size = sizeof(AVFrame); + } + return 0; + } - s->pict_type = golomb_to_pict_type[i]; + init_get_bits (&s->gb, buf, 8*buf_size); - /* unknown fields */ - get_bits (&s->gb, 1); - get_bits (&s->gb, 8); + s->mb_x = s->mb_y = 0; - s->qscale = get_bits (&s->gb, 5); - s->adaptive_quant = get_bits (&s->gb, 1); + if (svq3_decode_slice_header (h)) + return -1; - /* unknown fields */ - get_bits (&s->gb, 1); - get_bits (&s->gb, 1); - get_bits (&s->gb, 2); + s->pict_type = h->slice_type; + s->picture_number = h->slice_num; - while (get_bits (&s->gb, 1)) { - get_bits (&s->gb, 8); - } - if(avctx->debug&FF_DEBUG_PICT_INFO){ printf("%c hpel:%d, tpel:%d aqp:%d qp:%d\n", av_get_pict_type_char(s->pict_type), h->halfpel_flag, h->thirdpel_flag, @@ -660,27 +848,79 @@ static int svq3_decode_frame (AVCodecContext *avctx, ); } - /* B-frames are not supported */ - if (s->pict_type == B_TYPE/* && avctx->hurry_up*/) - return buf_size; + /* for hurry_up==5 */ + s->current_picture.pict_type = s->pict_type; + s->current_picture.key_frame = (s->pict_type == I_TYPE); + + /* skip b frames if we dont have reference frames */ + if (s->last_picture_ptr == NULL && s->pict_type == B_TYPE) return 0; + /* skip b frames if we are in a hurry */ + if (avctx->hurry_up && s->pict_type == B_TYPE) return 0; + /* skip everything if we are in a hurry >= 5 */ + if (avctx->hurry_up >= 5) return 0; + + if (s->next_p_frame_damaged) { + if (s->pict_type == B_TYPE) + return 0; + else + s->next_p_frame_damaged = 0; + } frame_start (h); - for(i=0; i<4; i++){ - int j; - for(j=-1; j<4; j++) - h->ref_cache[0][scan8[0] + 8*i + j]= 1; - h->ref_cache[0][scan8[0] + 8*i + j]= PART_NOT_AVAILABLE; + if (s->pict_type == B_TYPE) { + h->frame_num_offset = (h->slice_num - h->prev_frame_num); + + if (h->frame_num_offset < 0) { + h->frame_num_offset += 256; + } + if (h->frame_num_offset == 0 || h->frame_num_offset >= h->prev_frame_num_offset) { + printf ("error in B-frame picture id\n"); + return -1; + } + } else { + h->prev_frame_num = h->frame_num; + h->frame_num = h->slice_num; + h->prev_frame_num_offset = (h->frame_num - h->prev_frame_num); + + if (h->prev_frame_num_offset < 0) { + h->prev_frame_num_offset += 256; + } + } + + for(m=0; m<2; m++){ + int i; + for(i=0; i<4; i++){ + int j; + for(j=-1; j<4; j++) + h->ref_cache[m][scan8[0] + 8*i + j]= 1; + h->ref_cache[m][scan8[0] + 8*i + j]= PART_NOT_AVAILABLE; + } } for (s->mb_y=0; s->mb_y < s->mb_height; s->mb_y++) { for (s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) { - int mb_type = svq3_get_ue_golomb (&s->gb); + + if ( (s->gb.index + 7) >= s->gb.size_in_bits && + ((s->gb.index & 7) == 0 || show_bits (&s->gb, (-s->gb.index & 7)) == 0)) { + + s->gb.index = h->next_slice_index; + s->gb.size_in_bits = 8*buf_size; + + if (svq3_decode_slice_header (h)) + return -1; + + /* TODO: support s->mb_skip_run */ + } + + mb_type = svq3_get_ue_golomb (&s->gb); if (s->pict_type == I_TYPE) { mb_type += 8; + } else if (s->pict_type == B_TYPE && mb_type >= 4) { + mb_type += 4; } - if (mb_type > 32 || svq3_decode_mb (h, mb_type)) { + if (mb_type > 33 || svq3_decode_mb (h, mb_type)) { fprintf (stderr, "error while decoding MB %d %d\n", s->mb_x, s->mb_y); return -1; } @@ -693,11 +933,21 @@ static int svq3_decode_frame (AVCodecContext *avctx, ff_draw_horiz_band(s, 16*s->mb_y, 16); } - *(AVFrame *) data = *(AVFrame *) &s->current_picture; - *data_size = sizeof(AVFrame); - MPV_frame_end(s); - + + if (s->pict_type == B_TYPE || s->low_delay) { + *(AVFrame *) data = *(AVFrame *) &s->current_picture; + } else { + *(AVFrame *) data = *(AVFrame *) &s->last_picture; + } + + avctx->frame_number = s->picture_number - 1; + + /* dont output the last pic after seeking */ + if (s->last_picture_ptr || s->low_delay) { + *data_size = sizeof(AVFrame); + } + return buf_size; } diff --git a/mythtv/libs/libavcodec/wmadec.c b/mythtv/libs/libavcodec/wmadec.c index ab02feb7284..8d3763213b5 100644 --- a/mythtv/libs/libavcodec/wmadec.c +++ b/mythtv/libs/libavcodec/wmadec.c @@ -199,7 +199,7 @@ static void dump_floats(const char *name, int prec, const float *tab, int n) #else -#define trace(fmt, ...) +#define trace(fmt, args...) #endif diff --git a/mythtv/libs/libavcodec/wmv2.c b/mythtv/libs/libavcodec/wmv2.c index ccac9fe7770..ea4f407eb8c 100644 --- a/mythtv/libs/libavcodec/wmv2.c +++ b/mythtv/libs/libavcodec/wmv2.c @@ -650,7 +650,7 @@ void ff_mspel_motion(MpegEncContext *s, if(s->flags&CODEC_FLAG_EMU_EDGE){ if(src_x<1 || src_y<1 || src_x + 17 >= s->h_edge_pos || src_y + h+1 >= v_edge_pos){ - ff_emulated_edge_mc(s, ptr - 1 - s->linesize, s->linesize, 19, 19, + ff_emulated_edge_mc(s->edge_emu_buffer, ptr - 1 - s->linesize, s->linesize, 19, 19, src_x-1, src_y-1, s->h_edge_pos, s->v_edge_pos); ptr= s->edge_emu_buffer + 1 + s->linesize; emu=1; @@ -691,7 +691,7 @@ void ff_mspel_motion(MpegEncContext *s, offset = (src_y * uvlinesize) + src_x; ptr = ref_picture[1] + offset; if(emu){ - ff_emulated_edge_mc(s, ptr, s->uvlinesize, 9, 9, + ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1); ptr= s->edge_emu_buffer; } @@ -699,7 +699,7 @@ void ff_mspel_motion(MpegEncContext *s, ptr = ref_picture[2] + offset; if(emu){ - ff_emulated_edge_mc(s, ptr, s->uvlinesize, 9, 9, + ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1); ptr= s->edge_emu_buffer; } diff --git a/mythtv/libs/libavformat/4xm.c b/mythtv/libs/libavformat/4xm.c index edefbdd7f30..62f9da583de 100644 --- a/mythtv/libs/libavformat/4xm.c +++ b/mythtv/libs/libavformat/4xm.c @@ -71,6 +71,7 @@ typedef struct AudioTrack { int bits; int channels; int stream_index; + int adpcm; } AudioTrack; typedef struct FourxmDemuxContext { @@ -172,9 +173,11 @@ static int fourxm_read_header(AVFormatContext *s, return AVERROR_NOMEM; } } + fourxm->tracks[current_track].adpcm = LE_32(&header[i + 12]); fourxm->tracks[current_track].channels = LE_32(&header[i + 36]); fourxm->tracks[current_track].sample_rate = LE_32(&header[i + 40]); fourxm->tracks[current_track].bits = LE_32(&header[i + 44]); + printf("bps:%d\n", fourxm->tracks[current_track].bits); i += 8 + size; /* allocate a new AVStream */ @@ -192,7 +195,9 @@ static int fourxm_read_header(AVFormatContext *s, st->codec.bit_rate = st->codec.channels * st->codec.sample_rate * st->codec.bits_per_sample; st->codec.block_align = st->codec.channels * st->codec.bits_per_sample; - if (st->codec.bits_per_sample == 8) + if (fourxm->tracks[current_track].adpcm) + st->codec.codec_id = CODEC_ID_ADPCM_4XM; + else if (st->codec.bits_per_sample == 8) st->codec.codec_id = CODEC_ID_PCM_U8; else st->codec.codec_id = CODEC_ID_PCM_S16LE; @@ -224,7 +229,7 @@ static int fourxm_read_packet(AVFormatContext *s, FourxmDemuxContext *fourxm = s->priv_data; ByteIOContext *pb = &s->pb; unsigned int fourcc_tag; - unsigned int size; + unsigned int size, out_size; int ret = 0; int track_number; int packet_read = 0; @@ -237,10 +242,9 @@ static int fourxm_read_packet(AVFormatContext *s, return ret; fourcc_tag = LE_32(&header[0]); size = LE_32(&header[4]); - +//printf(" %8X %c%c%c%c %d\n", fourcc_tag, fourcc_tag, fourcc_tag>>8, fourcc_tag>>16, fourcc_tag>>24, size); if (url_feof(pb)) return -EIO; - switch (fourcc_tag) { case LIST_TAG: @@ -277,7 +281,7 @@ if (fourcc_tag == cfrm_TAG) { id = LE_32(&pkt->data[12]); whole = LE_32(&pkt->data[16]); stats[id] += size - 12; -printf(" cfrm chunk id:%d size:%d whole:%d until now:%d\n", id, size, whole, stats[id]); +//printf(" cfrm chunk id:%d size:%d whole:%d until now:%d\n", id, size, whole, stats[id]); } if (ret < 0) @@ -290,7 +294,9 @@ printf(" cfrm chunk id:%d size:%d whole:%d until now:%d\n", id, size, whole, sta case snd__TAG: printf (" snd_ chunk, "); track_number = get_le32(pb); - size = get_le32(pb); + out_size= get_le32(pb); + size-=8; + if (track_number == fourxm->selected_track) { printf ("correct track, dispatching...\n"); if (av_new_packet(pkt, size, 0)) @@ -321,7 +327,6 @@ printf ("wrong track, skipping...\n"); break; } } - return ret; } diff --git a/mythtv/libs/libavformat/avformat.h b/mythtv/libs/libavformat/avformat.h index 88d1441314a..7b78e951c52 100644 --- a/mythtv/libs/libavformat/avformat.h +++ b/mythtv/libs/libavformat/avformat.h @@ -314,6 +314,9 @@ int gif_init(void); /* au.c */ int au_init(void); +/* amr.c */ +int amr_init(void); + /* wav.c */ int wav_init(void); @@ -329,13 +332,13 @@ int dv_init(void); /* ffm.c */ int ffm_init(void); -/* 4xm.c */ -int fourxm_init(void); - /* rtsp.c */ extern AVInputFormat redir_demux; int redir_open(AVFormatContext **ic_ptr, ByteIOContext *f); +/* 4xm.c */ +int fourxm_init(void); + /* yuv4mpeg.c */ extern AVOutputFormat yuv4mpegpipe_oformat; @@ -425,6 +428,16 @@ int stristart(const char *str, const char *val, const char **ptr); void pstrcpy(char *buf, int buf_size, const char *str); char *pstrcat(char *buf, int buf_size, const char *s); +void __dynarray_add(unsigned long **tab_ptr, int *nb_ptr, unsigned long elem); + +#define dynarray_add(tab, nb_ptr, elem)\ +do {\ + typeof(tab) _tab = (tab);\ + typeof(elem) _elem = (elem);\ + (void)sizeof(**_tab == _elem); /* check that types are compatible */\ + __dynarray_add((unsigned long **)_tab, nb_ptr, (unsigned long)_elem);\ +} while(0) + struct in_addr; int resolve_host(struct in_addr *sin_addr, const char *hostname); diff --git a/mythtv/libs/libavformat/avidec.c b/mythtv/libs/libavformat/avidec.c index 5d3bb8ac183..2a95ecfbdb6 100644 --- a/mythtv/libs/libavformat/avidec.c +++ b/mythtv/libs/libavformat/avidec.c @@ -296,9 +296,17 @@ static int avi_read_packet(AVFormatContext *s, AVPacket *pkt) int n, d[8], size, i; memset(d, -1, sizeof(int)*8); - - if (avi->type == 1 && avi->stream_index) - goto pkt_init; + + if (avi->type == 1 && avi->stream_index) { + /* duplicate DV packet */ + av_init_packet(pkt); + pkt->data = avi->buf; + pkt->size = avi->buf_size; + pkt->destruct = __destruct_pkt; + pkt->stream_index = avi->stream_index; + avi->stream_index = !avi->stream_index; + return 0; + } for(i=url_ftell(pb); !url_feof(pb); i++) { int j; @@ -346,31 +354,29 @@ static int avi_read_packet(AVFormatContext *s, AVPacket *pkt) && n < s->nb_streams && i + size <= avi->movi_end) { - uint8_t *tbuf = av_realloc(avi->buf, size + FF_INPUT_BUFFER_PADDING_SIZE); - if (!tbuf) - return -1; - avi->buf = tbuf; - avi->buf_size = size; - get_buffer(pb, avi->buf, size); - if (size & 1) - get_byte(pb); - if (avi->type != 1) - avi->stream_index = n; - goto pkt_init; + if (avi->type == 1) { + uint8_t *tbuf = av_realloc(avi->buf, size + FF_INPUT_BUFFER_PADDING_SIZE); + if (!tbuf) + return -1; + avi->buf = tbuf; + avi->buf_size = size; + av_init_packet(pkt); + pkt->data = avi->buf; + pkt->size = avi->buf_size; + pkt->destruct = __destruct_pkt; + avi->stream_index = n; + } else { + av_new_packet(pkt, size, 0); + } + get_buffer(pb, pkt->data, size); + if (size & 1) + get_byte(pb); + pkt->stream_index = n; + pkt->flags |= PKT_FLAG_KEY; // FIXME: We really should read index for that + return 0; } } - return -1; - -pkt_init: - av_init_packet(pkt); - pkt->data = avi->buf; - pkt->size = avi->buf_size; - pkt->destruct = __destruct_pkt; - pkt->stream_index = avi->stream_index; - pkt->flags |= PKT_FLAG_KEY; // FIXME: We really should read index for that - avi->stream_index = !avi->stream_index; - return 0; } static int avi_read_close(AVFormatContext *s) diff --git a/mythtv/libs/libavformat/avienc.c b/mythtv/libs/libavformat/avienc.c index c7c15f9e720..cf9042ed5af 100644 --- a/mythtv/libs/libavformat/avienc.c +++ b/mythtv/libs/libavformat/avienc.c @@ -83,7 +83,6 @@ const CodecTag codec_bmp_tags[] = { { CODEC_ID_H263P, MKTAG('h', '2', '6', '3') }, { CODEC_ID_H263P, MKTAG('v', 'i', 'v', '1') }, - { CODEC_ID_MJPEG, MKTAG('M', 'J', 'P', 'G') }, { CODEC_ID_MPEG4, MKTAG('D', 'I', 'V', 'X'), .invalid_asf = 1 }, { CODEC_ID_MPEG4, MKTAG('d', 'i', 'v', 'x'), .invalid_asf = 1 }, { CODEC_ID_MPEG4, MKTAG('D', 'X', '5', '0'), .invalid_asf = 1 }, @@ -152,6 +151,9 @@ const CodecTag codec_bmp_tags[] = { { CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'g', '2') }, { CODEC_ID_MPEG1VIDEO, MKTAG('P', 'I', 'M', '1') }, { CODEC_ID_MJPEG, MKTAG('M', 'J', 'P', 'G') }, + { CODEC_ID_MJPEG, MKTAG('m', 'j', 'p', 'g') }, + { CODEC_ID_MJPEG, MKTAG('L', 'J', 'P', 'G') }, + { CODEC_ID_MJPEG, MKTAG('J', 'P', 'G', 'L') }, /* Pegasus lossless JPEG */ { CODEC_ID_HUFFYUV, MKTAG('H', 'F', 'Y', 'U') }, { CODEC_ID_HUFFYUV, MKTAG('h', 'f', 'y', 'u') }, { CODEC_ID_CYUV, MKTAG('C', 'Y', 'U', 'V') }, @@ -164,6 +166,7 @@ const CodecTag codec_bmp_tags[] = { { CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '2') }, { CODEC_ID_VP3, MKTAG('V', 'P', '3', '1') }, { CODEC_ID_ASV1, MKTAG('A', 'S', 'V', '1') }, + { CODEC_ID_FFV1, MKTAG('F', 'F', 'V', '1') }, { 0, 0 }, }; diff --git a/mythtv/libs/libavformat/cutils.c b/mythtv/libs/libavformat/cutils.c index 3e46533c6b4..28f40b0e2f2 100644 --- a/mythtv/libs/libavformat/cutils.c +++ b/mythtv/libs/libavformat/cutils.c @@ -108,3 +108,24 @@ char *pstrcat(char *buf, int buf_size, const char *s) } #endif + +/* add one element to a dynamic array */ +void __dynarray_add(unsigned long **tab_ptr, int *nb_ptr, unsigned long elem) +{ + int nb, nb_alloc; + unsigned long *tab; + + nb = *nb_ptr; + tab = *tab_ptr; + if ((nb & (nb - 1)) == 0) { + if (nb == 0) + nb_alloc = 1; + else + nb_alloc = nb * 2; + tab = av_realloc(tab, nb_alloc * sizeof(unsigned long)); + *tab_ptr = tab; + } + tab[nb++] = elem; + *nb_ptr = nb; +} + diff --git a/mythtv/libs/libavformat/libavformat.pro b/mythtv/libs/libavformat/libavformat.pro index f9e5a06a7b0..e7872cb49cc 100644 --- a/mythtv/libs/libavformat/libavformat.pro +++ b/mythtv/libs/libavformat/libavformat.pro @@ -14,4 +14,4 @@ QMAKE_CFLAGS_DEBUG = -g -DHAVE_AV_CONFIG_H -I.. -D_FILE_OFFSET_BITS=64 -D_LARGEF HEADERS += avformat.h avi.h avio.h SOURCES += 4xm.c allformats.c asf.c avidec.c avienc.c avio.c aviobuf.c cutils.c -SOURCES += file.c mov.c mpeg.c mpegts.c mpjpeg.c rm.c utils.c wav.c +SOURCES += file.c mov.c mpeg.c mpegts.c mpegtsenc.c mpjpeg.c rm.c utils.c wav.c diff --git a/mythtv/libs/libavformat/mov.c b/mythtv/libs/libavformat/mov.c index 6ba924bed87..176232bbe83 100644 --- a/mythtv/libs/libavformat/mov.c +++ b/mythtv/libs/libavformat/mov.c @@ -59,6 +59,10 @@ /* in case you can't read a file, try commenting */ #define MOV_SPLIT_CHUNKS +/* Special handling for movies created with Minolta Dimaxe Xi*/ +/* this fix should not interfere with other .mov files, but just in case*/ +#define MOV_MINOLTA_FIX + /* some streams in QT (and in MP4 mostly) aren't either video nor audio */ /* so we first list them as this, then clean up the list of streams we give back, */ /* getting rid of these */ @@ -651,7 +655,6 @@ static int mov_read_smi(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom) st->codec.extradata = (uint8_t*) av_mallocz(st->codec.extradata_size); if (st->codec.extradata) { - int i; strcpy(st->codec.extradata, "SVQ3"); // fake get_buffer(pb, st->codec.extradata + 0x5a, atom.size); //printf("Reading SMI %Ld %s\n", atom.size, (char*)st->codec.extradata + 0x5a); @@ -768,9 +771,10 @@ static int mov_read_stsd(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom) st->codec.bits_per_sample = get_be16(pb); /* depth */ st->codec.color_table_id = get_be16(pb); /* colortable id */ +/* These are set in mov_read_stts and might already be set! st->codec.frame_rate = 25; st->codec.frame_rate_base = 1; - +*/ size -= (16+8*4+2+32+2*2); #if 0 while (size >= 8) { @@ -878,7 +882,7 @@ static int mov_read_stsd(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom) get_byte(pb); //frames_per_sample #ifdef DEBUG - printf("Audio: damr_type=%c%c%c%c damr_size=%Ld damr_vendor=%c%c%c%c\n", + printf("Audio: damr_type=%c%c%c%c damr_size=%d damr_vendor=%c%c%c%c\n", (damr_type >> 24) & 0xff, (damr_type >> 16) & 0xff, (damr_type >> 8) & 0xff, @@ -890,7 +894,7 @@ static int mov_read_stsd(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom) (damr_vendor >> 0) & 0xff ); #endif - + st->time_length=0;//Not possible to get from this info, must count number of AMR frames st->codec.sample_rate=8000; st->codec.channels=1; @@ -898,9 +902,20 @@ static int mov_read_stsd(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom) st->codec.bit_rate=0; /*It is not possible to tell this before we have an audio frame and even then every frame can be different*/ } - else - { - get_be16(pb); /* version */ + else if( st->codec.codec_tag == MKTAG( 'm', 'p', '4', 's' )) + { + //This is some stuff for the hint track, lets ignore it! + //Do some mp4 auto detect. + c->mp4=1; + size-=(16); + url_fskip(pb, size); /* The mp4s atom also contians a esds atom that we can skip*/ + } + else if(size>=(16+20)) + {//16 bytes read, reading atleast 20 more +#ifdef DEBUG + printf("audio size=0x%X\n",size); +#endif + uint16_t version = get_be16(pb); /* version */ get_be16(pb); /* revision level */ get_be32(pb); /* vendor */ @@ -925,14 +940,51 @@ static int mov_read_stsd(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom) default: ; } - get_be32(pb); /* samples per packet */ - get_be32(pb); /* bytes per packet */ - get_be32(pb); /* bytes per frame */ - get_be32(pb); /* bytes per sample */ - { - MOV_atom_t a = { format, url_ftell(pb), size - (16 + 20 + 16 + 8) }; - mov_read_default(c, pb, a); - } + + //Read QT version 1 fields. In version 0 theese dont exist +#ifdef DEBUG + printf("version =%d mp4=%d\n",version,c->mp4); + printf("size-(16+20+16)=%d\n",size-(16+20+16)); +#endif + if((version==1) && size>=(16+20+16)) + { + get_be32(pb); /* samples per packet */ + get_be32(pb); /* bytes per packet */ + get_be32(pb); /* bytes per frame */ + get_be32(pb); /* bytes per sample */ + if(size>(16+20+16)) + { + //Optional, additional atom-based fields +#ifdef DEBUG + printf("offest=0x%X, sizeleft=%d=0x%x,format=%c%c%c%c\n",(int)url_ftell(pb),size - (16 + 20 + 16 ),size - (16 + 20 + 16 ), + (format >> 0) & 0xff, + (format >> 8) & 0xff, + (format >> 16) & 0xff, + (format >> 24) & 0xff); +#endif + MOV_atom_t a = { format, url_ftell(pb), size - (16 + 20 + 16 + 8) }; + mov_read_default(c, pb, a); + } + } + else + { + //We should be down to 0 bytes here, but lets make sure. + size-=(16+20); +#ifdef DEBUG + if(size>0) + printf("skipping 0x%X bytes\n",size-(16+20)); +#endif + url_fskip(pb, size); + } + } + else + { + size-=16; + //Unknown size, but lets do our best and skip the rest. +#ifdef DEBUG + printf("Strange size, skipping 0x%X bytes\n",size); +#endif + url_fskip(pb, size); } } } @@ -1043,16 +1095,43 @@ printf("track[%i].stts.entries = %i\n", c->fc->nb_streams-1, entries); #endif } - if(st->codec.codec_type==CODEC_TYPE_VIDEO) +#define MAX(a,b) a>b?a:b +#define MIN(a,b) a>b?b:a + /*The stsd atom which contain codec type sometimes comes after the stts so we cannot check for codec_type*/ + if(duration>0) { + //Find greatest common divisor to avoid overflow using the Euclidean Algorithm... + uint32_t max=MAX(duration,total_sample_count); + uint32_t min=MIN(duration,total_sample_count); + uint32_t spare=max%min; + + while(spare!=0) + { + max=min; + min=spare; + spare=max%min; + } + + duration/=min; + total_sample_count/=min; + //Only support constant frame rate. But lets calculate the average. Needed by .mp4-files created with nec e606 3g phone. - //Hmm, lets set base to 1 - st->codec.frame_rate_base=1; - st->codec.frame_rate = st->codec.frame_rate_base * c->streams[c->total_streams]->time_scale * total_sample_count / duration; + //To get better precision, we use the duration as frame_rate_base + + st->codec.frame_rate_base=duration; + st->codec.frame_rate = c->streams[c->total_streams]->time_scale * total_sample_count; + #ifdef DEBUG - printf("VIDEO FRAME RATE average= %i (tot sample count= %i ,tot dur= %i)\n", st->codec.frame_rate,total_sample_count,duration); + printf("FRAME RATE average (video or audio)= %f (tot sample count= %i ,tot dur= %i timescale=%d)\n", (float)st->codec.frame_rate/st->codec.frame_rate_base,total_sample_count,duration,c->streams[c->total_streams]->time_scale); #endif } + else + { + st->codec.frame_rate_base = 1; + st->codec.frame_rate = c->streams[c->total_streams]->time_scale; + } +#undef MAX +#undef MIN return 0; } @@ -1330,10 +1409,11 @@ static int mov_probe(AVProbeData *p) case MKTAG( 'f', 'r', 'e', 'e' ): case MKTAG( 'm', 'd', 'a', 't' ): case MKTAG( 'p', 'n', 'o', 't' ): /* detect movs with preview pics like ew.mov and april.mov */ + case MKTAG( 'u', 'd', 't', 'a' ): /* Packet Video PVAuthor adds this and a lot of more junk */ return AVPROBE_SCORE_MAX; case MKTAG( 'f', 't', 'y', 'p' ): case MKTAG( 's', 'k', 'i', 'p' ): - offset = to_be32(p->buf) + offset; + offset = to_be32(p->buf+offset) + offset; break; default: /* unrecognized tag */ @@ -1362,8 +1442,6 @@ static int mov_read_header(AVFormatContext *s, AVFormatParameters *ap) else atom.size = 0x7FFFFFFFFFFFFFFFLL; - if (atom.size == 0) - atom.size = 0x7FFFFFFFFFFFFFFFLL; #ifdef DEBUG printf("filesz=%Ld\n", atom.size); #endif @@ -1488,6 +1566,33 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt) && ((msc->chunk_offsets[msc->next_chunk] - offset) < size)) size = msc->chunk_offsets[msc->next_chunk] - offset; } + +#ifdef MOV_MINOLTA_FIX + //Make sure that size is according to sample_size (Needed by .mov files + //created on a Minolta Dimage Xi where audio chunks contains waste data in the end) + //Maybe we should really not only check sc->sample_size, but also sc->sample_sizes + //but I have no such movies + if (sc->sample_size > 0) { + int foundsize=0; + for(i=0; i<(sc->sample_to_chunk_sz); i++) { + if( (sc->sample_to_chunk[i].first)<=(sc->next_chunk) && (sc->sample_size>0) ) + { + foundsize=sc->sample_to_chunk[i].count*sc->sample_size; + } +#ifdef DEBUG + /*printf("sample_to_chunk first=%ld count=%ld, id=%ld\n", sc->sample_to_chunk[i].first, sc->sample_to_chunk[i].count, sc->sample_to_chunk[i].id);*/ +#endif + } + if( (foundsize>0) && (foundsizesample_size == 0) { @@ -1519,7 +1624,6 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt) //printf("READCHUNK hlen: %d %d off: %Ld pos:%Ld\n", size, sc->header_len, offset, url_ftell(&s->pb)); if (sc->header_len > 0) { - // XXX av_new_packet(pkt, size + sc->header_len, 0); memcpy(pkt->data, sc->header_data, sc->header_len); get_buffer(&s->pb, pkt->data + sc->header_len, size); @@ -1527,7 +1631,6 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt) av_freep(&sc->header_data); sc->header_len = 0; } else { - // XXX av_new_packet(pkt, size, 0); get_buffer(&s->pb, pkt->data, pkt->size); } diff --git a/mythtv/libs/libavformat/mpegts.c b/mythtv/libs/libavformat/mpegts.c index 674a932690c..d10dbd45bec 100644 --- a/mythtv/libs/libavformat/mpegts.c +++ b/mythtv/libs/libavformat/mpegts.c @@ -1,6 +1,6 @@ /* * MPEG2 transport stream (aka DVB) demux - * Copyright (c) 2002 Fabrice Bellard. + * Copyright (c) 2002-2003 Fabrice Bellard. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,42 +18,193 @@ */ #include "avformat.h" -#define TS_FEC_PACKET_SIZE 204 -#define TS_PACKET_SIZE 188 -#define NB_PID_MAX 8192 +#include "mpegts.h" -enum MpegTSState { - MPEGTS_HEADER = 0, - MPEGTS_PESHEADER_FILL, - MPEGTS_PESHEADER_FLAGS, - MPEGTS_PESHEADER_SIZE, - MPEGTS_PESHEADER_READ, - MPEGTS_PAYLOAD, - MPEGTS_SKIP, +//#define DEBUG_SI + +/* 1.0 second at 24Mbit/s */ +#define MAX_SCAN_PACKETS 16000 + +static int add_pes_stream(AVFormatContext *s, int pid); + +enum MpegTSFilterType { + MPEGTS_PES, + MPEGTS_SECTION, }; -/* enough for PES header + length */ -#define MAX_HEADER_SIZE 6 +/* XXX: suppress 'pkt' parameter */ +typedef void PESCallback(void *opaque, const uint8_t *buf, int len, int is_start); -typedef struct MpegTSStream { +typedef struct MpegTSPESFilter { + PESCallback *pes_cb; + void *opaque; +} MpegTSPESFilter; + +typedef void SectionCallback(void *opaque, const uint8_t *buf, int len); + +typedef void SetServiceCallback(void *opaque, int ret); + +typedef struct MpegTSSectionFilter { + int section_index; + int section_h_size; + uint8_t *section_buf; + int check_crc:1; + int end_of_section_reached:1; + SectionCallback *section_cb; + void *opaque; +} MpegTSSectionFilter; + +typedef struct MpegTSFilter { int pid; - enum MpegTSState state; int last_cc; /* last cc code (-1 if first packet) */ - /* used to get the format */ - int header_size; - int payload_size; - int pes_header_size; - AVStream *st; - unsigned char header[MAX_HEADER_SIZE]; -} MpegTSStream; + enum MpegTSFilterType type; + union { + MpegTSPESFilter pes_filter; + MpegTSSectionFilter section_filter; + } u; +} MpegTSFilter; + +typedef struct MpegTSService { + int running:1; + int sid; + char *provider_name; + char *name; +} MpegTSService; typedef struct MpegTSContext { + /* user data */ + AVFormatContext *stream; int raw_packet_size; /* raw packet size, including FEC if present */ - MpegTSStream *pids[NB_PID_MAX]; + int auto_guess; /* if true, all pids are analized to find streams */ + int set_service_ret; + + /* data needed to handle file based ts */ + int stop_parse; /* stop parsing loop */ + AVPacket *pkt; /* packet containing av data */ + + /******************************************/ + /* private mpegts data */ + /* scan context */ + MpegTSFilter *sdt_filter; + int nb_services; + MpegTSService **services; + + /* set service context (XXX: allocated it ?) */ + SetServiceCallback *set_service_cb; + void *set_service_opaque; + MpegTSFilter *pat_filter; + MpegTSFilter *pmt_filter; + int req_sid; + + MpegTSFilter *pids[NB_PID_MAX]; } MpegTSContext; +static void write_section_data(AVFormatContext *s, MpegTSFilter *tss1, + const uint8_t *buf, int buf_size, int is_start) +{ + MpegTSSectionFilter *tss = &tss1->u.section_filter; + int len; + unsigned int crc; + + if (is_start) { + memcpy(tss->section_buf, buf, buf_size); + tss->section_index = buf_size; + tss->section_h_size = -1; + tss->end_of_section_reached = 0; + } else { + if (tss->end_of_section_reached) + return; + len = 4096 - tss->section_index; + if (buf_size < len) + len = buf_size; + memcpy(tss->section_buf + tss->section_index, buf, len); + tss->section_index += len; + } + + /* compute section length if possible */ + if (tss->section_h_size == -1 && tss->section_index >= 3) { + len = (((tss->section_buf[1] & 0xf) << 8) | tss->section_buf[2]) + 3; + if (len > 4096) + return; + tss->section_h_size = len; + } + + if (tss->section_h_size != -1 && tss->section_index >= tss->section_h_size) { + if (tss->check_crc) { + crc = mpegts_crc32(tss->section_buf, tss->section_h_size); + if (crc != 0) + goto invalid_crc; + } + tss->section_cb(tss->opaque, tss->section_buf, tss->section_h_size); + invalid_crc: + tss->end_of_section_reached = 1; + } +} + +MpegTSFilter *mpegts_open_section_filter(MpegTSContext *ts, unsigned int pid, + SectionCallback *section_cb, void *opaque, + int check_crc) + +{ + MpegTSFilter *filter; + MpegTSSectionFilter *sec; + + if (pid >= NB_PID_MAX || ts->pids[pid]) + return NULL; + filter = av_mallocz(sizeof(MpegTSFilter)); + if (!filter) + return NULL; + ts->pids[pid] = filter; + filter->type = MPEGTS_SECTION; + filter->pid = pid; + filter->last_cc = -1; + sec = &filter->u.section_filter; + sec->section_cb = section_cb; + sec->opaque = opaque; + sec->section_buf = av_malloc(MAX_SECTION_SIZE); + sec->check_crc = check_crc; + if (!sec->section_buf) { + av_free(filter); + return NULL; + } + return filter; +} + +MpegTSFilter *mpegts_open_pes_filter(MpegTSContext *ts, unsigned int pid, + PESCallback *pes_cb, + void *opaque) +{ + MpegTSFilter *filter; + MpegTSPESFilter *pes; + + if (pid >= NB_PID_MAX || ts->pids[pid]) + return NULL; + filter = av_mallocz(sizeof(MpegTSFilter)); + if (!filter) + return NULL; + ts->pids[pid] = filter; + filter->type = MPEGTS_PES; + filter->pid = pid; + filter->last_cc = -1; + pes = &filter->u.pes_filter; + pes->pes_cb = pes_cb; + pes->opaque = opaque; + return filter; +} + +void mpegts_close_filter(MpegTSContext *ts, MpegTSFilter *filter) +{ + int pid; + + pid = filter->pid; + if (filter->type == MPEGTS_SECTION) + av_freep(&filter->u.section_filter.section_buf); + av_free(filter); + ts->pids[pid] = NULL; +} + /* autodetect fec presence. Must have at least 1024 bytes */ -static int get_packet_size(const unsigned char *buf, int size) +static int get_packet_size(const uint8_t *buf, int size) { int i; @@ -72,78 +223,400 @@ static int get_packet_size(const unsigned char *buf, int size) return TS_FEC_PACKET_SIZE; } -static int mpegts_probe(AVProbeData *p) +typedef struct SectionHeader { + uint8_t tid; + uint16_t id; + uint8_t version; + uint8_t sec_num; + uint8_t last_sec_num; +} SectionHeader; + +static inline int get8(const uint8_t **pp, const uint8_t *p_end) { - int size; - size = get_packet_size(p->buf, p->buf_size); - if (size < 0) - return 0; - return AVPROBE_SCORE_MAX - 1; + const uint8_t *p; + int c; + + p = *pp; + if (p >= p_end) + return -1; + c = *p++; + *pp = p; + return c; } -static int mpegts_read_header(AVFormatContext *s, - AVFormatParameters *ap) +static inline int get16(const uint8_t **pp, const uint8_t *p_end) +{ + const uint8_t *p; + int c; + + p = *pp; + if ((p + 1) >= p_end) + return -1; + c = (p[0] << 8) | p[1]; + p += 2; + *pp = p; + return c; +} + +/* read and allocate a DVB string preceeded by its length */ +static char *getstr8(const uint8_t **pp, const uint8_t *p_end) { - MpegTSContext *ts = s->priv_data; - ByteIOContext *pb = &s->pb; - unsigned char buf[1024]; int len; - int64_t pos; + const uint8_t *p; + char *str; - /* read the first 1024 bytes to get packet size */ - pos = url_ftell(pb); - len = get_buffer(pb, buf, sizeof(buf)); - if (len != sizeof(buf)) - goto fail; - ts->raw_packet_size = get_packet_size(buf, sizeof(buf)); - if (ts->raw_packet_size <= 0) - goto fail; - /* go again to the start */ - url_fseek(pb, pos, SEEK_SET); + p = *pp; + len = get8(&p, p_end); + if (len < 0) + return NULL; + if ((p + len) > p_end) + return NULL; + str = av_malloc(len + 1); + if (!str) + return NULL; + memcpy(str, p, len); + str[len] = '\0'; + p += len; + *pp = p; + return str; +} + +static int parse_section_header(SectionHeader *h, + const uint8_t **pp, const uint8_t *p_end) +{ + int val; + + val = get8(pp, p_end); + if (val < 0) + return -1; + h->tid = val; + *pp += 2; + val = get16(pp, p_end); + if (val < 0) + return -1; + h->id = val; + val = get8(pp, p_end); + if (val < 0) + return -1; + h->version = (val >> 1) & 0x1f; + val = get8(pp, p_end); + if (val < 0) + return -1; + h->sec_num = val; + val = get8(pp, p_end); + if (val < 0) + return -1; + h->last_sec_num = val; return 0; - fail: - return -1; +} + +static MpegTSService *new_service(MpegTSContext *ts, int sid, + char *provider_name, char *name) +{ + MpegTSService *service; + +#ifdef DEBUG_SI + printf("new_service: sid=0x%04x provider='%s' name='%s'\n", + sid, provider_name, name); +#endif + + service = av_mallocz(sizeof(MpegTSService)); + if (!service) + return NULL; + service->sid = sid; + service->provider_name = provider_name; + service->name = name; + dynarray_add(&ts->services, &ts->nb_services, service); + return service; +} + +static void pmt_cb(void *opaque, const uint8_t *section, int section_len) +{ + MpegTSContext *ts = opaque; + SectionHeader h1, *h = &h1; + const uint8_t *p, *p_end; + int program_info_length, pcr_pid, pid, stream_type, desc_length; + +#ifdef DEBUG_SI + printf("PMT:\n"); + av_hex_dump((uint8_t *)section, section_len); +#endif + p_end = section + section_len - 4; + p = section; + if (parse_section_header(h, &p, p_end) < 0) + return; +#ifdef DEBUG_SI + printf("sid=0x%x sec_num=%d/%d\n", h->id, h->sec_num, h->last_sec_num); +#endif + if (h->tid != PMT_TID || h->id != ts->req_sid) + return; + + pcr_pid = get16(&p, p_end) & 0x1fff; + if (pcr_pid < 0) + return; +#ifdef DEBUG_SI + printf("pcr_pid=0x%x\n", pcr_pid); +#endif + program_info_length = get16(&p, p_end) & 0xfff; + if (program_info_length < 0) + return; + p += program_info_length; + if (p >= p_end) + return; + for(;;) { + stream_type = get8(&p, p_end); + if (stream_type < 0) + break; + pid = get16(&p, p_end) & 0x1fff; + if (pid < 0) + break; + desc_length = get16(&p, p_end) & 0xfff; + if (desc_length < 0) + break; + p += desc_length; + if (p > p_end) + return; + +#ifdef DEBUG_SI + printf("stream_type=%d pid=0x%x\n", stream_type, pid); +#endif + + /* now create ffmpeg stream */ + switch(stream_type) { + case STREAM_TYPE_AUDIO: + case STREAM_TYPE_VIDEO: + add_pes_stream(ts->stream, pid); + break; + default: + /* we ignore the other streams */ + break; + } + } + /* all parameters are there */ + ts->set_service_cb(ts->set_service_opaque, 0); + mpegts_close_filter(ts, ts->pmt_filter); + ts->pmt_filter = NULL; +} + +static void pat_cb(void *opaque, const uint8_t *section, int section_len) +{ + MpegTSContext *ts = opaque; + SectionHeader h1, *h = &h1; + const uint8_t *p, *p_end; + int sid, pmt_pid; + +#ifdef DEBUG_SI + printf("PAT:\n"); + av_hex_dump((uint8_t *)section, section_len); +#endif + p_end = section + section_len - 4; + p = section; + if (parse_section_header(h, &p, p_end) < 0) + return; + if (h->tid != PAT_TID) + return; + + for(;;) { + sid = get16(&p, p_end); + if (sid < 0) + break; + pmt_pid = get16(&p, p_end) & 0x1fff; + if (pmt_pid < 0) + break; +#ifdef DEBUG_SI + printf("sid=0x%x pid=0x%x\n", sid, pmt_pid); +#endif + if (sid == 0x0000) { + /* NIT info */ + } else { + if (ts->req_sid == sid) { + ts->pmt_filter = mpegts_open_section_filter(ts, pmt_pid, + pmt_cb, ts, 1); + goto found; + } + } + } + /* not found */ + ts->set_service_cb(ts->set_service_opaque, -1); + + found: + mpegts_close_filter(ts, ts->pat_filter); + ts->pat_filter = NULL; +} + +void mpegts_set_service(MpegTSContext *ts, int sid, + SetServiceCallback *set_service_cb, void *opaque) +{ + ts->set_service_cb = set_service_cb; + ts->set_service_opaque = opaque; + ts->req_sid = sid; + ts->pat_filter = mpegts_open_section_filter(ts, PAT_PID, + pat_cb, ts, 1); +} + +static void sdt_cb(void *opaque, const uint8_t *section, int section_len) +{ + MpegTSContext *ts = opaque; + SectionHeader h1, *h = &h1; + const uint8_t *p, *p_end, *desc_list_end, *desc_end; + int onid, val, sid, desc_list_len, desc_tag, desc_len, service_type; + char *name, *provider_name; + +#ifdef DEBUG_SI + printf("SDT:\n"); + av_hex_dump((uint8_t *)section, section_len); +#endif + + p_end = section + section_len - 4; + p = section; + if (parse_section_header(h, &p, p_end) < 0) + return; + if (h->tid != SDT_TID) + return; + onid = get16(&p, p_end); + if (onid < 0) + return; + val = get8(&p, p_end); + if (val < 0) + return; + for(;;) { + sid = get16(&p, p_end); + if (sid < 0) + break; + val = get8(&p, p_end); + if (val < 0) + break; + desc_list_len = get16(&p, p_end) & 0xfff; + if (desc_list_len < 0) + break; + desc_list_end = p + desc_list_len; + if (desc_list_end > p_end) + break; + for(;;) { + desc_tag = get8(&p, desc_list_end); + if (desc_tag < 0) + break; + desc_len = get8(&p, desc_list_end); + desc_end = p + desc_len; + if (desc_end > desc_list_end) + break; +#ifdef DEBUG_SI + printf("tag: 0x%02x len=%d\n", desc_tag, desc_len); +#endif + switch(desc_tag) { + case 0x48: + service_type = get8(&p, p_end); + if (service_type < 0) + break; + provider_name = getstr8(&p, p_end); + if (!provider_name) + break; + name = getstr8(&p, p_end); + if (!name) + break; + new_service(ts, sid, provider_name, name); + break; + default: + break; + } + p = desc_end; + } + p = desc_list_end; + } + ts->stop_parse = 1; + + /* remove filter */ + mpegts_close_filter(ts, ts->sdt_filter); + ts->sdt_filter = NULL; +} + +/* scan services an a transport stream by looking at the sdt */ +void mpegts_scan_sdt(MpegTSContext *ts) +{ + ts->sdt_filter = mpegts_open_section_filter(ts, SDT_PID, + sdt_cb, ts, 1); +} + + +/* TS stream handling */ + +enum MpegTSState { + MPEGTS_HEADER = 0, + MPEGTS_PESHEADER_FILL, + MPEGTS_PAYLOAD, + MPEGTS_SKIP, +}; + +/* enough for PES header + length */ +#define PES_START_SIZE 9 +#define MAX_PES_HEADER_SIZE (9 + 255) + +typedef struct PESContext { + int pid; + AVFormatContext *stream; + AVStream *st; + enum MpegTSState state; + /* used to get the format */ + int data_index; + int total_size; + int pes_header_size; + int64_t pts, dts; + uint8_t header[MAX_PES_HEADER_SIZE]; +} PESContext; + +static int64_t get_pts(const uint8_t *p) +{ + int64_t pts; + int val; + + pts = (int64_t)((p[0] >> 1) & 0x07) << 30; + val = (p[1] << 8) | p[2]; + pts |= (int64_t)(val >> 1) << 15; + val = (p[3] << 8) | p[4]; + pts |= (int64_t)(val >> 1); + return pts; } /* return non zero if a packet could be constructed */ -static int mpegts_push_data(AVFormatContext *s, MpegTSStream *tss, - AVPacket *pkt, - const unsigned char *buf, int buf_size, int is_start) +static void mpegts_push_data(void *opaque, + const uint8_t *buf, int buf_size, int is_start) { + PESContext *pes = opaque; + MpegTSContext *ts = pes->stream->priv_data; AVStream *st; - const unsigned char *p; + const uint8_t *p; int len, code, codec_type, codec_id; - + if (is_start) { - tss->state = MPEGTS_HEADER; - tss->header_size = 0; + pes->state = MPEGTS_HEADER; + pes->data_index = 0; } p = buf; while (buf_size > 0) { - len = buf_size; - switch(tss->state) { + switch(pes->state) { case MPEGTS_HEADER: - if (len > MAX_HEADER_SIZE - tss->header_size) - len = MAX_HEADER_SIZE - tss->header_size; - memcpy(tss->header, p, len); - tss->header_size += len; + len = PES_START_SIZE - pes->data_index; + if (len > buf_size) + len = buf_size; + memcpy(pes->header + pes->data_index, p, len); + pes->data_index += len; p += len; buf_size -= len; - if (tss->header_size == MAX_HEADER_SIZE) { + if (pes->data_index == PES_START_SIZE) { /* we got all the PES or section header. We can now decide */ #if 0 - av_hex_dump(tss->header, tss->header_size); + av_hex_dump(pes->header, pes->data_index); #endif - if (tss->header[0] == 0x00 && tss->header[1] == 0x00 && - tss->header[2] == 0x01) { + if (pes->header[0] == 0x00 && pes->header[1] == 0x00 && + pes->header[2] == 0x01) { /* it must be an mpeg2 PES stream */ /* XXX: add AC3 support */ - code = tss->header[3] | 0x100; + code = pes->header[3] | 0x100; if (!((code >= 0x1c0 && code <= 0x1df) || (code >= 0x1e0 && code <= 0x1ef))) goto skip; - if (!tss->st) { + if (!pes->st) { /* allocate stream */ if (code >= 0x1c0 && code <= 0x1df) { codec_type = CODEC_TYPE_AUDIO; @@ -152,23 +625,26 @@ static int mpegts_push_data(AVFormatContext *s, MpegTSStream *tss, codec_type = CODEC_TYPE_VIDEO; codec_id = CODEC_ID_MPEG1VIDEO; } - st = av_new_stream(s, tss->pid); + st = av_new_stream(pes->stream, pes->pid); if (st) { - st->priv_data = tss; + st->priv_data = pes; st->codec.codec_type = codec_type; st->codec.codec_id = codec_id; - tss->st = st; + pes->st = st; } } - tss->state = MPEGTS_PESHEADER_FILL; - tss->payload_size = (tss->header[4] << 8) | tss->header[5]; - if (tss->payload_size == 0) - tss->payload_size = 65536; + pes->state = MPEGTS_PESHEADER_FILL; + pes->total_size = (pes->header[4] << 8) | pes->header[5]; + /* NOTE: a zero total size means the PES size is + unbounded */ + if (pes->total_size) + pes->total_size += 6; + pes->pes_header_size = pes->header[8] + 9; } else { /* otherwise, it should be a table */ /* skip packet */ skip: - tss->state = MPEGTS_SKIP; + pes->state = MPEGTS_SKIP; continue; } } @@ -176,50 +652,54 @@ static int mpegts_push_data(AVFormatContext *s, MpegTSStream *tss, /**********************************************/ /* PES packing parsing */ case MPEGTS_PESHEADER_FILL: - /* skip filling */ - code = *p++; - buf_size--; - tss->payload_size--; - if (code != 0xff) { - if ((code & 0xc0) != 0x80) - goto skip; - tss->state = MPEGTS_PESHEADER_FLAGS; - } - break; - case MPEGTS_PESHEADER_FLAGS: - code = *p++; - buf_size--; - tss->payload_size--; - tss->state = MPEGTS_PESHEADER_SIZE; - break; - case MPEGTS_PESHEADER_SIZE: - tss->pes_header_size = *p++; - buf_size--; - tss->payload_size--; - tss->state = MPEGTS_PESHEADER_READ; - break; - case MPEGTS_PESHEADER_READ: - /* currently we do nothing except skipping */ - if (len > tss->pes_header_size) - len = tss->pes_header_size; + len = pes->pes_header_size - pes->data_index; + if (len > buf_size) + len = buf_size; + memcpy(pes->header + pes->data_index, p, len); + pes->data_index += len; p += len; buf_size -= len; - tss->pes_header_size -= len; - tss->payload_size -= len; - if (tss->pes_header_size == 0) - tss->state = MPEGTS_PAYLOAD; + if (pes->data_index == pes->pes_header_size) { + const uint8_t *r; + unsigned int flags; + + flags = pes->header[7]; + r = pes->header + 9; + pes->pts = AV_NOPTS_VALUE; + pes->dts = AV_NOPTS_VALUE; + if ((flags & 0xc0) == 0x80) { + pes->pts = get_pts(r); + r += 5; + } else if ((flags & 0xc0) == 0xc0) { + pes->pts = get_pts(r); + r += 5; + pes->dts = get_pts(r); + r += 5; + } + /* we got the full header. We parse it and get the payload */ + pes->state = MPEGTS_PAYLOAD; + } break; case MPEGTS_PAYLOAD: - if (len > tss->payload_size) - len = tss->payload_size; + if (pes->total_size) { + len = pes->total_size - pes->data_index; + if (len > buf_size) + len = buf_size; + } else { + len = buf_size; + } if (len > 0) { - // XXX - if (tss->st && av_new_packet(pkt, buf_size, 0) == 0) { - memcpy(pkt->data, p, buf_size); - pkt->stream_index = tss->st->index; - return 1; + AVPacket *pkt = ts->pkt; + if (pes->st && av_new_packet(pkt, len, 0) == 0) { + memcpy(pkt->data, p, len); + pkt->stream_index = pes->st->index; + pkt->pts = pes->pts; + /* reset pts values */ + pes->pts = AV_NOPTS_VALUE; + pes->dts = AV_NOPTS_VALUE; + ts->stop_parse = 1; + return; } - tss->payload_size -= len; } buf_size = 0; break; @@ -228,20 +708,110 @@ static int mpegts_push_data(AVFormatContext *s, MpegTSStream *tss, break; } } +} + +static int add_pes_stream(AVFormatContext *s, int pid) +{ + MpegTSContext *ts = s->priv_data; + MpegTSFilter *tss; + PESContext *pes; + + /* if no pid found, then add a pid context */ + pes = av_mallocz(sizeof(PESContext)); + if (!pes) + return -1; + pes->stream = s; + pes->pid = pid; + tss = mpegts_open_pes_filter(ts, pid, mpegts_push_data, pes); + if (!tss) { + av_free(pes); + return -1; + } return 0; } -static int mpegts_read_packet(AVFormatContext *s, - AVPacket *pkt) +/* handle one TS packet */ +static void handle_packet(AVFormatContext *s, uint8_t *packet) { MpegTSContext *ts = s->priv_data; - MpegTSStream *tss; - ByteIOContext *pb = &s->pb; - unsigned char packet[TS_FEC_PACKET_SIZE]; - int len, pid, cc, cc_ok, afc; - const unsigned char *p; + MpegTSFilter *tss; + int len, pid, cc, cc_ok, afc, is_start; + const uint8_t *p, *p_end; + + pid = ((packet[1] & 0x1f) << 8) | packet[2]; + is_start = packet[1] & 0x40; + tss = ts->pids[pid]; + if (ts->auto_guess && tss == NULL && is_start) { + add_pes_stream(s, pid); + tss = ts->pids[pid]; + } + if (!tss) + return; + + /* continuity check (currently not used) */ + cc = (packet[3] & 0xf); + cc_ok = (tss->last_cc < 0) || ((((tss->last_cc + 1) & 0x0f) == cc)); + tss->last_cc = cc; + /* skip adaptation field */ + afc = (packet[3] >> 4) & 3; + p = packet + 4; + if (afc == 0) /* reserved value */ + return; + if (afc == 2) /* adaptation field only */ + return; + if (afc == 3) { + /* skip adapation field */ + p += p[0] + 1; + } + /* if past the end of packet, ignore */ + p_end = packet + TS_PACKET_SIZE; + if (p >= p_end) + return; + + if (tss->type == MPEGTS_SECTION) { + if (is_start) { + /* pointer field present */ + len = *p++; + if (p + len > p_end) + return; + if (len && cc_ok) { + /* write remaning section bytes */ + write_section_data(s, tss, + p, len, 0); + } + p += len; + if (p < p_end) { + write_section_data(s, tss, + p, p_end - p, 1); + } + } else { + if (cc_ok) { + write_section_data(s, tss, + p, p_end - p, 0); + } + } + } else { + tss->u.pes_filter.pes_cb(tss->u.pes_filter.opaque, + p, p_end - p, is_start); + } +} + +static int handle_packets(AVFormatContext *s, int nb_packets) +{ + MpegTSContext *ts = s->priv_data; + ByteIOContext *pb = &s->pb; + uint8_t packet[TS_FEC_PACKET_SIZE]; + int packet_num, len; + + ts->stop_parse = 0; + packet_num = 0; for(;;) { + if (ts->stop_parse) + break; + packet_num++; + if (nb_packets != 0 && packet_num >= nb_packets) + break; len = get_buffer(pb, packet, ts->raw_packet_size); if (len != ts->raw_packet_size) return AVERROR_IO; @@ -249,45 +819,93 @@ static int mpegts_read_packet(AVFormatContext *s, /* XXX: accept to resync ? */ if (packet[0] != 0x47) return AVERROR_INVALIDDATA; - - pid = ((packet[1] & 0x1f) << 8) | packet[2]; - tss = ts->pids[pid]; - if (tss == NULL) { - /* if no pid found, then add a pid context */ - tss = av_mallocz(sizeof(MpegTSStream)); - if (!tss) - continue; - ts->pids[pid] = tss; - tss->pid = pid; - tss->last_cc = -1; - // printf("new pid=0x%x\n", pid); - } + handle_packet(s, packet); + } + return 0; +} - /* continuity check (currently not used) */ - cc = (packet[3] & 0xf); - cc_ok = (tss->last_cc < 0) || ((((tss->last_cc + 1) & 0x0f) == cc)); - tss->last_cc = cc; - - /* skip adaptation field */ - afc = (packet[3] >> 4) & 3; - p = packet + 4; - if (afc == 0) /* reserved value */ - continue; - if (afc == 2) /* adaptation field only */ - continue; - if (afc == 3) { - /* skip adapation field */ - p += p[0] + 1; - } - /* if past the end of packet, ignore */ - if (p >= packet + TS_PACKET_SIZE) - continue; +static int mpegts_probe(AVProbeData *p) +{ + int size; + size = get_packet_size(p->buf, p->buf_size); + if (size < 0) + return 0; + return AVPROBE_SCORE_MAX - 1; +} + +void set_service_cb(void *opaque, int ret) +{ + MpegTSContext *ts = opaque; + ts->set_service_ret = ret; + ts->stop_parse = 1; +} + +static int mpegts_read_header(AVFormatContext *s, + AVFormatParameters *ap) +{ + MpegTSContext *ts = s->priv_data; + ByteIOContext *pb = &s->pb; + uint8_t buf[1024]; + int len; + int64_t pos; + MpegTSService *service; - if (mpegts_push_data(s, tss, pkt, p, TS_PACKET_SIZE - (p - packet), - packet[1] & 0x40)) - break; + /* read the first 1024 bytes to get packet size */ + pos = url_ftell(pb); + len = get_buffer(pb, buf, sizeof(buf)); + if (len != sizeof(buf)) + goto fail; + ts->raw_packet_size = get_packet_size(buf, sizeof(buf)); + if (ts->raw_packet_size <= 0) + goto fail; + ts->auto_guess = 0; + + if (!ts->auto_guess) { + + /* first do a scaning to get all the services */ + url_fseek(pb, pos, SEEK_SET); + mpegts_scan_sdt(ts); + + handle_packets(s, MAX_SCAN_PACKETS); + + /* if no service found, no need to do anything */ + if (ts->nb_services <= 0) + return -1; + + /* now find the info for the first service */ + + url_fseek(pb, pos, SEEK_SET); + service = ts->services[0]; +#ifdef DEBUG_SI + printf("tuning to '%s'\n", service->name); +#endif + /* tune to first service found */ + ts->stream = s; + mpegts_set_service(ts, service->sid, set_service_cb, ts); + + handle_packets(s, MAX_SCAN_PACKETS); + + /* if could not find service, exit */ + if (ts->set_service_ret != 0) + return -1; + +#ifdef DEBUG_SI + printf("tuning done\n"); +#endif } + + url_fseek(pb, pos, SEEK_SET); return 0; + fail: + return -1; +} + +static int mpegts_read_packet(AVFormatContext *s, + AVPacket *pkt) +{ + MpegTSContext *ts = s->priv_data; + ts->pkt = pkt; + return handle_packets(s, 0); } static int mpegts_read_close(AVFormatContext *s) @@ -313,5 +931,6 @@ AVInputFormat mpegts_demux = { int mpegts_init(void) { av_register_input_format(&mpegts_demux); + av_register_output_format(&mpegts_mux); return 0; } diff --git a/mythtv/libs/libavformat/mpegts.h b/mythtv/libs/libavformat/mpegts.h new file mode 100644 index 00000000000..df0b6de2166 --- /dev/null +++ b/mythtv/libs/libavformat/mpegts.h @@ -0,0 +1,40 @@ +/* + * MPEG2 transport stream defines + * Copyright (c) 2003 Fabrice Bellard. + * + * This 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 of the License, or (at your option) any later version. + * + * This 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 this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#define TS_FEC_PACKET_SIZE 204 +#define TS_PACKET_SIZE 188 +#define NB_PID_MAX 8192 +#define MAX_SECTION_SIZE 4096 + +/* pids */ +#define PAT_PID 0x0000 +#define SDT_PID 0x0011 + +/* table ids */ +#define PAT_TID 0x00 +#define PMT_TID 0x02 +#define SDT_TID 0x42 + +#define STREAM_TYPE_VIDEO 0x02 +#define STREAM_TYPE_AUDIO 0x03 +#define STREAM_TYPE_PRIVATE_SECTION 0x05 +#define STREAM_TYPE_PRIVATE_DATA 0x06 + +unsigned int mpegts_crc32(const uint8_t *data, int len); +extern AVOutputFormat mpegts_mux; diff --git a/mythtv/libs/libavformat/mpegtsenc.c b/mythtv/libs/libavformat/mpegtsenc.c new file mode 100644 index 00000000000..079f4c724cd --- /dev/null +++ b/mythtv/libs/libavformat/mpegtsenc.c @@ -0,0 +1,582 @@ +/* + * MPEG2 transport stream (aka DVB) mux + * Copyright (c) 2003 Fabrice Bellard. + * + * This 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 of the License, or (at your option) any later version. + * + * This 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 this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include "avformat.h" + +#include "mpegts.h" + +/* write DVB SI sections */ + +static uint32_t crc_table[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 +}; + +unsigned int mpegts_crc32(const uint8_t *data, int len) +{ + register int i; + unsigned int crc = 0xffffffff; + + for (i=0; i> 24) ^ *data++) & 0xff]; + + return crc; +} + +/*********************************************/ +/* mpegts section writer */ + +typedef struct MpegTSSection { + int pid; + int cc; + void (*write_packet)(struct MpegTSSection *s, const uint8_t *packet); + void *opaque; +} MpegTSSection; + +/* NOTE: 4 bytes must be left at the end for the crc32 */ +void mpegts_write_section(MpegTSSection *s, uint8_t *buf, int len) +{ + unsigned int crc; + unsigned char packet[TS_PACKET_SIZE]; + const unsigned char *buf_ptr; + unsigned char *q; + int first, b, len1, left; + + crc = mpegts_crc32(buf, len - 4); + buf[len - 4] = (crc >> 24) & 0xff; + buf[len - 3] = (crc >> 16) & 0xff; + buf[len - 2] = (crc >> 8) & 0xff; + buf[len - 1] = (crc) & 0xff; + + /* send each packet */ + buf_ptr = buf; + while (len > 0) { + first = (buf == buf_ptr); + q = packet; + *q++ = 0x47; + b = (s->pid >> 8); + if (first) + b |= 0x40; + *q++ = b; + *q++ = s->pid; + s->cc = (s->cc + 1) & 0xf; + *q++ = 0x10 | s->cc; + if (first) + *q++ = 0; /* 0 offset */ + len1 = TS_PACKET_SIZE - (q - packet); + if (len1 > len) + len1 = len; + memcpy(q, buf_ptr, len1); + q += len1; + /* add known padding data */ + left = TS_PACKET_SIZE - (q - packet); + if (left > 0) + memset(q, 0xff, left); + + s->write_packet(s, packet); + + buf_ptr += len1; + len -= len1; + } +} + +static inline void put16(uint8_t **q_ptr, int val) +{ + uint8_t *q; + q = *q_ptr; + *q++ = val >> 8; + *q++ = val; + *q_ptr = q; +} + +int mpegts_write_section1(MpegTSSection *s, int tid, int id, + int version, int sec_num, int last_sec_num, + uint8_t *buf, int len) +{ + uint8_t section[1024], *q; + unsigned int tot_len; + + tot_len = 3 + 5 + len + 4; + /* check if not too big */ + if (tot_len > 1024) + return -1; + + q = section; + *q++ = tid; + put16(&q, 0xb000 | (len + 5 + 4)); /* 5 byte header + 4 byte CRC */ + put16(&q, id); + *q++ = 0xc1 | (version << 1); /* current_next_indicator = 1 */ + *q++ = sec_num; + *q++ = last_sec_num; + memcpy(q, buf, len); + + mpegts_write_section(s, section, tot_len); + return 0; +} + +/*********************************************/ +/* mpegts writer */ + +#define DEFAULT_PMT_START_PID 0x1000 +#define DEFAULT_START_PID 0x0100 +#define DEFAULT_PROVIDER_NAME "FFmpeg" +#define DEFAULT_SERVICE_NAME "Service01" + +/* default network id, transport stream and service identifiers */ +#define DEFAULT_ONID 0x0001 +#define DEFAULT_TSID 0x0001 +#define DEFAULT_SID 0x0001 + +/* a PES packet header is generated every DEFAULT_PES_HEADER_FREQ packets */ +#define DEFAULT_PES_HEADER_FREQ 16 + +/* we retransmit the SI info at this rate */ +#define SDT_RETRANS_TIME 500 +#define PAT_RETRANS_TIME 100 + +typedef struct MpegTSWriteStream { + int pid; /* stream associated pid */ + int cc; + int packet_index; + int pes_packet_count; + uint8_t packet[TS_PACKET_SIZE]; +} MpegTSWriteStream; + +typedef struct MpegTSService { + MpegTSSection pmt; /* MPEG2 pmt table context */ + int pcr_pid; + int sid; /* service ID */ + char *name; + char *provider_name; +} MpegTSService; + +typedef struct MpegTSWrite { + MpegTSSection pat; /* MPEG2 pat table */ + MpegTSSection sdt; /* MPEG2 sdt table context */ + MpegTSService **services; + int sdt_packet_count; + int sdt_packet_freq; + int pat_packet_count; + int pat_packet_freq; + int nb_services; + int onid; + int tsid; +} MpegTSWrite; + +static void mpegts_write_pat(AVFormatContext *s) +{ + MpegTSWrite *ts = s->priv_data; + MpegTSService *service; + uint8_t data[1012], *q; + int i; + + q = data; + for(i = 0; i < ts->nb_services; i++) { + service = ts->services[i]; + put16(&q, service->sid); + put16(&q, 0xe000 | service->pmt.pid); + } + mpegts_write_section1(&ts->pat, PAT_TID, ts->tsid, 0, 0, 0, + data, q - data); +} + +static void mpegts_write_pmt(AVFormatContext *s, MpegTSService *service) +{ + // MpegTSWrite *ts = s->priv_data; + uint8_t data[1012], *q, *desc_length_ptr, *program_info_length_ptr; + int val, stream_type, i; + + q = data; + put16(&q, 0xe000 | service->pcr_pid); + + program_info_length_ptr = q; + q += 2; /* patched after */ + + /* put program info here */ + + val = 0xf000 | (q - program_info_length_ptr - 2); + program_info_length_ptr[0] = val >> 8; + program_info_length_ptr[1] = val; + + for(i = 0; i < s->nb_streams; i++) { + AVStream *st = s->streams[i]; + MpegTSWriteStream *ts_st = st->priv_data; + switch(st->codec.codec_type) { + case CODEC_TYPE_VIDEO: + stream_type = STREAM_TYPE_VIDEO; + break; + case CODEC_TYPE_AUDIO: + stream_type = STREAM_TYPE_AUDIO; + break; + default: + stream_type = STREAM_TYPE_PRIVATE_DATA; + break; + } + *q++ = stream_type; + put16(&q, 0xe000 | ts_st->pid); + desc_length_ptr = q; + q += 2; /* patched after */ + + /* write optional descriptors here */ + + val = 0xf000 | (q - desc_length_ptr - 2); + desc_length_ptr[0] = val >> 8; + desc_length_ptr[1] = val; + } + mpegts_write_section1(&service->pmt, PMT_TID, service->sid, 0, 0, 0, + data, q - data); +} + +/* NOTE: str == NULL is accepted for an empty string */ +static void putstr8(uint8_t **q_ptr, const char *str) +{ + uint8_t *q; + int len; + + q = *q_ptr; + if (!str) + len = 0; + else + len = strlen(str); + *q++ = len; + memcpy(q, str, len); + q += len; + *q_ptr = q; +} + +static void mpegts_write_sdt(AVFormatContext *s) +{ + MpegTSWrite *ts = s->priv_data; + MpegTSService *service; + uint8_t data[1012], *q, *desc_list_len_ptr, *desc_len_ptr; + int i, running_status, free_ca_mode, val; + + q = data; + put16(&q, ts->onid); + *q++ = 0xff; + for(i = 0; i < ts->nb_services; i++) { + service = ts->services[i]; + put16(&q, service->sid); + *q++ = 0xfc | 0x00; /* currently no EIT info */ + desc_list_len_ptr = q; + q += 2; + running_status = 4; /* running */ + free_ca_mode = 0; + + /* write only one descriptor for the service name and provider */ + *q++ = 0x48; + desc_len_ptr = q; + q++; + *q++ = 0x01; /* digital television service */ + putstr8(&q, service->provider_name); + putstr8(&q, service->name); + desc_len_ptr[0] = q - desc_len_ptr - 1; + + /* fill descriptor length */ + val = (running_status << 13) | (free_ca_mode << 12) | + (q - desc_list_len_ptr - 2); + desc_list_len_ptr[0] = val >> 8; + desc_list_len_ptr[1] = val; + } + mpegts_write_section1(&ts->sdt, SDT_TID, ts->tsid, 0, 0, 0, + data, q - data); +} + +static MpegTSService *mpegts_add_service(MpegTSWrite *ts, + int sid, + const char *provider_name, + const char *name) +{ + MpegTSService *service; + + service = av_mallocz(sizeof(MpegTSService)); + if (!service) + return NULL; + service->pmt.pid = DEFAULT_PMT_START_PID + ts->nb_services - 1; + service->sid = sid; + service->provider_name = av_strdup(provider_name); + service->name = av_strdup(name); + service->pcr_pid = 0x1fff; + dynarray_add(&ts->services, &ts->nb_services, service); + return service; +} + +static void section_write_packet(MpegTSSection *s, const uint8_t *packet) +{ + AVFormatContext *ctx = s->opaque; + put_buffer(&ctx->pb, packet, TS_PACKET_SIZE); +} + +static int mpegts_write_header(AVFormatContext *s) +{ + MpegTSWrite *ts = s->priv_data; + MpegTSWriteStream *ts_st; + MpegTSService *service; + AVStream *st; + int i, total_bit_rate; + + ts->tsid = DEFAULT_TSID; + ts->onid = DEFAULT_ONID; + /* allocate a single DVB service */ + service = mpegts_add_service(ts, DEFAULT_SID, + DEFAULT_PROVIDER_NAME, DEFAULT_SERVICE_NAME); + service->pmt.write_packet = section_write_packet; + service->pmt.opaque = s; + + ts->pat.pid = PAT_PID; + ts->pat.cc = 0; + ts->pat.write_packet = section_write_packet; + ts->pat.opaque = s; + + ts->sdt.pid = SDT_PID; + ts->sdt.cc = 0; + ts->sdt.write_packet = section_write_packet; + ts->sdt.opaque = s; + + /* assign pids to each stream */ + total_bit_rate = 0; + for(i = 0;i < s->nb_streams; i++) { + st = s->streams[i]; + ts_st = av_mallocz(sizeof(MpegTSWriteStream)); + if (!ts_st) + goto fail; + st->priv_data = ts_st; + ts_st->pid = DEFAULT_START_PID + i; + /* update PCR pid if needed */ + if (st->codec.codec_type == CODEC_TYPE_VIDEO && + service->pcr_pid == 0x1fff) + service->pcr_pid = ts_st->pid; + total_bit_rate += st->codec.bit_rate; + } + if (total_bit_rate <= 8 * 1024) + total_bit_rate = 8 * 1024; + ts->sdt_packet_freq = (total_bit_rate * SDT_RETRANS_TIME) / + (TS_PACKET_SIZE * 8 * 1000); + ts->pat_packet_freq = (total_bit_rate * PAT_RETRANS_TIME) / + (TS_PACKET_SIZE * 8 * 1000); +#if 0 + printf("%d %d %d\n", + total_bit_rate, ts->sdt_packet_freq, ts->pat_packet_freq); +#endif + + /* write info at the start of the file, so that it will be fast to + find them */ + mpegts_write_sdt(s); + mpegts_write_pat(s); + for(i = 0; i < ts->nb_services; i++) { + mpegts_write_pmt(s, ts->services[i]); + } + put_flush_packet(&s->pb); + + return 0; + + fail: + for(i = 0;i < s->nb_streams; i++) { + st = s->streams[i]; + av_free(st->priv_data); + } + return -1; +} + +/* send SDT, PAT and PMT tables regulary */ +static void retransmit_si_info(AVFormatContext *s) +{ + MpegTSWrite *ts = s->priv_data; + int i; + + if (++ts->sdt_packet_count == ts->sdt_packet_freq) { + ts->sdt_packet_count = 0; + mpegts_write_sdt(s); + } + if (++ts->pat_packet_count == ts->pat_packet_freq) { + ts->pat_packet_count = 0; + mpegts_write_pat(s); + for(i = 0; i < ts->nb_services; i++) { + mpegts_write_pmt(s, ts->services[i]); + } + } +} + +static int mpegts_write_packet(AVFormatContext *s, int stream_index, + uint8_t *buf, int size, int pts1) +{ + AVStream *st = s->streams[stream_index]; + MpegTSWriteStream *ts_st = st->priv_data; + uint8_t *q; + int val, write_pts, is_start, len; + int64_t pts; + + while (size > 0) { + if (ts_st->packet_index == 0) { + retransmit_si_info(s); + + /* new PES header ? */ + is_start = 0; + if (++ts_st->pes_packet_count == DEFAULT_PES_HEADER_FREQ) { + ts_st->pes_packet_count = 0; + is_start = 1; + } + /* prepare packet header */ + q = ts_st->packet; + *q++ = 0x47; + val = (ts_st->pid >> 8); + if (is_start) + val |= 0x40; + *q++ = val; + *q++ = ts_st->pid; + *q++ = 0x10 | ts_st->cc; + ts_st->cc = (ts_st->cc + 1) & 0xf; + if (is_start) { + /* write PES header */ + *q++ = 0x00; + *q++ = 0x00; + *q++ = 0x01; + if (st->codec.codec_type == CODEC_TYPE_VIDEO) + *q++ = 0xe0; + else + *q++ = 0xc0; + *q++ = 0; /* unbounded size */ + *q++ = 0; + *q++ = 0x80; + write_pts = 0; /* XXX: enable it */ + if (write_pts) { + *q++ = 0x80; /* PTS only */ + *q++ = 0x05; /* header len */ + pts = pts1; + val = (0x02 << 4) | + (((pts >> 30) & 0x07) << 1) | 1; + *q++ = val; + val = (((pts >> 15) & 0x7fff) << 1) | 1; + *q++ = val >> 8; + *q++ = val; + val = (((pts) & 0x7fff) << 1) | 1; + *q++ = val >> 8; + *q++ = val; + } else { + *q++ = 0x00; + *q++ = 0x00; + } + } + ts_st->packet_index = q - ts_st->packet; + } + len = TS_PACKET_SIZE - ts_st->packet_index; + if (len == 0) { + put_buffer(&s->pb, ts_st->packet, TS_PACKET_SIZE); + ts_st->packet_index = 0; + } else { + if (len > size) + len = size; + memcpy(ts_st->packet + ts_st->packet_index, buf, len); + size -= len; + buf += len; + ts_st->packet_index += len; + } + } + put_flush_packet(&s->pb); + return 0; +} + +static int mpegts_write_end(AVFormatContext *s) +{ + MpegTSWrite *ts = s->priv_data; + MpegTSWriteStream *ts_st; + MpegTSService *service; + AVStream *st; + int i; + + /* flush current packets */ + for(i = 0; i < s->nb_streams; i++) { + st = s->streams[i]; + ts_st = st->priv_data; + if (ts_st->packet_index != 0) { + /* put a known value at the end */ + memset(ts_st->packet + ts_st->packet_index, 0xff, + TS_PACKET_SIZE - ts_st->packet_index); + put_buffer(&s->pb, ts_st->packet, TS_PACKET_SIZE); + } + } + put_flush_packet(&s->pb); + + for(i = 0; i < ts->nb_services; i++) { + service = ts->services[i]; + av_freep(&service->provider_name); + av_freep(&service->name); + av_free(service); + } + av_free(ts->services); + + for(i = 0; i < s->nb_streams; i++) { + st = s->streams[i]; + av_free(st->priv_data); + } + return 0; +} + +AVOutputFormat mpegts_mux = { + "mpegts", + "MPEG2 transport stream format", + "video/x-mpegts", + "ts", + sizeof(MpegTSWrite), + CODEC_ID_MP2, + CODEC_ID_MPEG1VIDEO, + mpegts_write_header, + mpegts_write_packet, + mpegts_write_end, +};