* qatar/master: (29 commits) sbrdsp.asm: convert all instructions to float/SSE ones. dv: cosmetics. dv: check buffer size before reading profile. Revert "AAC SBR: group some writes." udp: Print an error message if bind fails cook: extend channel uncoupling tables so the full bit range is covered. roqvideo: cosmetics. roqvideo: convert to bytestream2 API. dca: don't use av_clip_uintp2(). wmall: fix build with -DDEBUG enabled. smc: port to bytestream2 API. AAC SBR: group some writes. dsputil: remove shift parameter from scalarproduct_int16 SBR DSP: unroll sum_square rv34: remove dead code in intra availability check rv34: clean a bit availability checks. v4l2: update documentation tgq: convert to bytestream2 API. parser: remove forward declaration of MpegEncContext dca: prevent accessing static arrays with invalid indexes. ... Conflicts: doc/indevs.texi libavcodec/Makefile libavcodec/dca.c libavcodec/dvdata.c libavcodec/eatgq.c libavcodec/mmvideo.c libavcodec/roqvideodec.c libavcodec/smc.c libswscale/output.c Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n0.11
| @@ -504,9 +504,9 @@ command: | |||
| ffmpeg -f sndio -i /dev/audio0 /tmp/oss.wav | |||
| @end example | |||
| @section video4linux and video4linux2 | |||
| @section video4linux2 | |||
| Video4Linux and Video4Linux2 input video devices. | |||
| Video4Linux2 input video device. | |||
| The name of the device to grab is a file device node, usually Linux | |||
| systems tend to automatically create such nodes when the device | |||
| @@ -514,36 +514,21 @@ systems tend to automatically create such nodes when the device | |||
| kind @file{/dev/video@var{N}}, where @var{N} is a number associated to | |||
| the device. | |||
| Video4Linux and Video4Linux2 devices only support a limited set of | |||
| Video4Linux2 devices usually support a limited set of | |||
| @var{width}x@var{height} sizes and framerates. You can check which are | |||
| supported for example with the command @command{dov4l} for Video4Linux | |||
| devices and using @command{-list_formats all} for Video4Linux2 devices. | |||
| supported using @command{-list_formats all} for Video4Linux2 devices. | |||
| If the size for the device is set to 0x0, the input device will | |||
| try to auto-detect the size to use. | |||
| Only for the video4linux2 device, if the frame rate is set to 0/0 the | |||
| input device will use the frame rate value already set in the driver. | |||
| Video4Linux support is deprecated since Linux 2.6.30, and will be | |||
| dropped in later versions. | |||
| Some usage examples of the video4linux2 devices with ffmpeg and ffplay: | |||
| Note that if FFmpeg is build with v4l-utils support ("--enable-libv4l2" | |||
| option), it will always be used. | |||
| Follow some usage examples of the video4linux devices with the ff* | |||
| tools. | |||
| @example | |||
| # Grab and show the input of a video4linux device, frame rate is set | |||
| # to the default of 25/1. | |||
| ffplay -s 320x240 -f video4linux /dev/video0 | |||
| # Grab and show the input of a video4linux2 device, auto-adjust size. | |||
| ffplay -f video4linux2 /dev/video0 | |||
| # Grab and show the input of a video4linux2 device. | |||
| ffplay -f video4linux2 -framerate 30 -video_size hd720 /dev/video0 | |||
| # Grab and record the input of a video4linux2 device, auto-adjust size, | |||
| # frame rate value defaults to 0/0 so it is read from the video4linux2 | |||
| # driver. | |||
| ffmpeg -f video4linux2 -i /dev/video0 out.mpeg | |||
| # Grab and record the input of a video4linux2 device, leave the | |||
| framerate and size as previously set. | |||
| ffmpeg -f video4linux2 -input_format mjpeg -i /dev/video0 out.mpeg | |||
| @end example | |||
| "v4l" and "v4l2" can be used as aliases for the respective "video4linux" and | |||
| @@ -100,8 +100,8 @@ OBJS-$(CONFIG_AYUV_ENCODER) += v408enc.o | |||
| OBJS-$(CONFIG_BETHSOFTVID_DECODER) += bethsoftvideo.o | |||
| OBJS-$(CONFIG_BFI_DECODER) += bfi.o | |||
| OBJS-$(CONFIG_BINK_DECODER) += bink.o binkdsp.o | |||
| OBJS-$(CONFIG_BINKAUDIO_DCT_DECODER) += binkaudio.o wma.o | |||
| OBJS-$(CONFIG_BINKAUDIO_RDFT_DECODER) += binkaudio.o wma.o | |||
| OBJS-$(CONFIG_BINKAUDIO_DCT_DECODER) += binkaudio.o wma.o wma_common.o | |||
| OBJS-$(CONFIG_BINKAUDIO_RDFT_DECODER) += binkaudio.o wma.o wma_common.o | |||
| OBJS-$(CONFIG_BINTEXT_DECODER) += bintext.o cga_data.o | |||
| OBJS-$(CONFIG_BMP_DECODER) += bmp.o msrledec.o | |||
| OBJS-$(CONFIG_BMP_ENCODER) += bmpenc.o | |||
| @@ -460,12 +460,12 @@ OBJS-$(CONFIG_VP6_DECODER) += vp6.o vp56.o vp56data.o vp56dsp.o \ | |||
| OBJS-$(CONFIG_VP8_DECODER) += vp8.o vp8dsp.o vp56rac.o | |||
| OBJS-$(CONFIG_VQA_DECODER) += vqavideo.o | |||
| OBJS-$(CONFIG_WAVPACK_DECODER) += wavpack.o | |||
| OBJS-$(CONFIG_WMALOSSLESS_DECODER) += wmalosslessdec.o wma.o | |||
| OBJS-$(CONFIG_WMAPRO_DECODER) += wmaprodec.o wma.o | |||
| OBJS-$(CONFIG_WMAV1_DECODER) += wmadec.o wma.o aactab.o | |||
| OBJS-$(CONFIG_WMAV1_ENCODER) += wmaenc.o wma.o aactab.o | |||
| OBJS-$(CONFIG_WMAV2_DECODER) += wmadec.o wma.o aactab.o | |||
| OBJS-$(CONFIG_WMAV2_ENCODER) += wmaenc.o wma.o aactab.o | |||
| OBJS-$(CONFIG_WMALOSSLESS_DECODER) += wmalosslessdec.o wma_common.o | |||
| OBJS-$(CONFIG_WMAPRO_DECODER) += wmaprodec.o wma.o wma_common.o | |||
| OBJS-$(CONFIG_WMAV1_DECODER) += wmadec.o wma.o wma_common.o aactab.o | |||
| OBJS-$(CONFIG_WMAV1_ENCODER) += wmaenc.o wma.o wma_common.o aactab.o | |||
| OBJS-$(CONFIG_WMAV2_DECODER) += wmadec.o wma.o wma_common.o aactab.o | |||
| OBJS-$(CONFIG_WMAV2_ENCODER) += wmaenc.o wma.o wma_common.o aactab.o | |||
| OBJS-$(CONFIG_WMAVOICE_DECODER) += wmavoice.o \ | |||
| celp_math.o celp_filters.o \ | |||
| acelp_vectors.o acelp_filters.o | |||
| @@ -116,7 +116,7 @@ int16_t ff_acelp_decode_gain_code( | |||
| ); | |||
| #else | |||
| mr_energy = gain_corr_factor * exp(M_LN10 / (20 << 23) * mr_energy) / | |||
| sqrt(dsp->scalarproduct_int16(fc_v, fc_v, subframe_size, 0)); | |||
| sqrt(dsp->scalarproduct_int16(fc_v, fc_v, subframe_size)); | |||
| return mr_energy >> 12; | |||
| #endif | |||
| } | |||
| @@ -171,8 +171,7 @@ void ff_vector_clip_int32_neon(int32_t *dst, const int32_t *src, int32_t min, | |||
| void ff_vorbis_inverse_coupling_neon(float *mag, float *ang, int blocksize); | |||
| int32_t ff_scalarproduct_int16_neon(const int16_t *v1, const int16_t *v2, int len, | |||
| int shift); | |||
| int32_t ff_scalarproduct_int16_neon(const int16_t *v1, const int16_t *v2, int len); | |||
| int32_t ff_scalarproduct_and_madd_int16_neon(int16_t *v1, const int16_t *v2, | |||
| const int16_t *v3, int len, int mul); | |||
| @@ -29,31 +29,7 @@ function ff_scalarproduct_int16_neon, export=1 | |||
| vmov.i16 q1, #0 | |||
| vmov.i16 q2, #0 | |||
| vmov.i16 q3, #0 | |||
| negs r3, r3 | |||
| beq 2f | |||
| vdup.s32 q12, r3 | |||
| 1: vld1.16 {d16-d17}, [r0]! | |||
| vld1.16 {d20-d21}, [r1,:128]! | |||
| vmull.s16 q12, d16, d20 | |||
| vld1.16 {d18-d19}, [r0]! | |||
| vmull.s16 q13, d17, d21 | |||
| vld1.16 {d22-d23}, [r1,:128]! | |||
| vmull.s16 q14, d18, d22 | |||
| vmull.s16 q15, d19, d23 | |||
| vshl.s32 q8, q12, q12 | |||
| vshl.s32 q9, q13, q12 | |||
| vadd.s32 q0, q0, q8 | |||
| vshl.s32 q10, q14, q12 | |||
| vadd.s32 q1, q1, q9 | |||
| vshl.s32 q11, q15, q12 | |||
| vadd.s32 q2, q2, q10 | |||
| vadd.s32 q3, q3, q11 | |||
| subs r2, r2, #16 | |||
| bne 1b | |||
| b 3f | |||
| 2: vld1.16 {d16-d17}, [r0]! | |||
| vld1.16 {d20-d21}, [r1,:128]! | |||
| vmlal.s16 q0, d16, d20 | |||
| vld1.16 {d18-d19}, [r0]! | |||
| @@ -62,9 +38,9 @@ function ff_scalarproduct_int16_neon, export=1 | |||
| vmlal.s16 q2, d18, d22 | |||
| vmlal.s16 q3, d19, d23 | |||
| subs r2, r2, #16 | |||
| bne 2b | |||
| bne 1b | |||
| 3: vpadd.s32 d16, d0, d1 | |||
| vpadd.s32 d16, d0, d1 | |||
| vpadd.s32 d17, d2, d3 | |||
| vpadd.s32 d10, d4, d5 | |||
| vpadd.s32 d11, d6, d7 | |||
| @@ -855,8 +855,8 @@ static int joint_decode(COOKContext *q, COOKSubpacket *p, float *mlt_buffer1, | |||
| cpl_tmp = cplband[i]; | |||
| idx -= decouple_tab[cpl_tmp]; | |||
| cplscale = q->cplscales[p->js_vlc_bits - 2]; // choose decoupler table | |||
| f1 = cplscale[decouple_tab[cpl_tmp]]; | |||
| f2 = cplscale[idx - 1]; | |||
| f1 = cplscale[decouple_tab[cpl_tmp] + 1]; | |||
| f2 = cplscale[idx]; | |||
| q->decouple(q, p, i, f1, f2, decode_buffer, mlt_buffer1, mlt_buffer2); | |||
| idx = (1 << p->js_vlc_bits) - 1; | |||
| } | |||
| @@ -510,23 +510,37 @@ static const int cplband[51] = { | |||
| 19, | |||
| }; | |||
| static const float cplscale2[3] = { | |||
| // The 1 and 0 at the beginning/end are to prevent overflows with | |||
| // bitstream-read indexes. E.g. if n_bits=5, we can access any | |||
| // index from [1, (1<<n_bits)] for the first decoupling coeff, | |||
| // and (1<<n_bits)-coeff1 as index for coeff2, i.e.: | |||
| // coeff1_idx = [1, 32], and coeff2_idx = [0, 31]. | |||
| // These values aren't part of the tables in the original binary. | |||
| static const float cplscale2[5] = { | |||
| 1, | |||
| 0.953020632266998,0.70710676908493,0.302905440330505, | |||
| 0, | |||
| }; | |||
| static const float cplscale3[7] = { | |||
| static const float cplscale3[9] = { | |||
| 1, | |||
| 0.981279790401459,0.936997592449188,0.875934481620789,0.70710676908493, | |||
| 0.482430040836334,0.349335819482803,0.192587479948997, | |||
| 0, | |||
| }; | |||
| static const float cplscale4[15] = { | |||
| static const float cplscale4[17] = { | |||
| 1, | |||
| 0.991486728191376,0.973249018192291,0.953020632266998,0.930133521556854, | |||
| 0.903453230857849,0.870746195316315,0.826180458068848,0.70710676908493, | |||
| 0.563405573368073,0.491732746362686,0.428686618804932,0.367221474647522, | |||
| 0.302905440330505,0.229752898216248,0.130207896232605, | |||
| 0, | |||
| }; | |||
| static const float cplscale5[31] = { | |||
| static const float cplscale5[33] = { | |||
| 1, | |||
| 0.995926380157471,0.987517595291138,0.978726446628571,0.969505727291107, | |||
| 0.95979779958725,0.949531257152557,0.938616216182709,0.926936149597168, | |||
| 0.914336204528809,0.900602877140045,0.885426938533783,0.868331849575043, | |||
| @@ -535,9 +549,11 @@ static const float cplscale5[31] = { | |||
| 0.464778542518616,0.434642940759659,0.404955863952637,0.375219136476517, | |||
| 0.344963222742081,0.313672333955765,0.280692428350449,0.245068684220314, | |||
| 0.205169528722763,0.157508864998817,0.0901700109243393, | |||
| 0, | |||
| }; | |||
| static const float cplscale6[63] = { | |||
| static const float cplscale6[65] = { | |||
| 1, | |||
| 0.998005926609039,0.993956744670868,0.989822506904602,0.985598564147949, | |||
| 0.981279790401459,0.976860702037811,0.972335040569305,0.967696130275726, | |||
| 0.962936460971832,0.958047747612000,0.953020632266998,0.947844684123993, | |||
| @@ -554,6 +570,7 @@ static const float cplscale6[63] = { | |||
| 0.302905440330505,0.286608695983887,0.269728302955627,0.252119421958923, | |||
| 0.233590632677078,0.213876649737358,0.192587479948997,0.169101938605309, | |||
| 0.142307326197624,0.109772264957428,0.0631198287010193, | |||
| 0, | |||
| }; | |||
| static const float* const cplscales[5] = { | |||
| @@ -639,13 +639,20 @@ static int dca_parse_frame_header(DCAContext *s) | |||
| } | |||
| static inline int get_scale(GetBitContext *gb, int level, int value) | |||
| static inline int get_scale(GetBitContext *gb, int level, int value, int log2range) | |||
| { | |||
| if (level < 5) { | |||
| /* huffman encoded */ | |||
| value += get_bitalloc(gb, &dca_scalefactor, level); | |||
| } else if (level < 8) | |||
| value = get_bits(gb, level + 1); | |||
| value = av_clip(value, 0, (1 << log2range) - 1); | |||
| } else if (level < 8) { | |||
| if (level + 1 > log2range) { | |||
| skip_bits(gb, level + 1 - log2range); | |||
| value = get_bits(gb, log2range); | |||
| } else { | |||
| value = get_bits(gb, level + 1); | |||
| } | |||
| } | |||
| return value; | |||
| } | |||
| @@ -718,18 +725,17 @@ static int dca_subframe_header(DCAContext *s, int base_channel, int block_index) | |||
| for (j = base_channel; j < s->prim_channels; j++) { | |||
| const uint32_t *scale_table; | |||
| unsigned int scale_max; | |||
| int scale_sum; | |||
| int scale_sum, log_size; | |||
| memset(s->scale_factor[j], 0, | |||
| s->subband_activity[j] * sizeof(s->scale_factor[0][0][0]) * 2); | |||
| if (s->scalefactor_huffman[j] == 6) { | |||
| scale_table = scale_factor_quant7; | |||
| scale_max = 127; | |||
| log_size = 7; | |||
| } else { | |||
| scale_table = scale_factor_quant6; | |||
| scale_max = 63; | |||
| log_size = 6; | |||
| } | |||
| /* When huffman coded, only the difference is encoded */ | |||
| @@ -737,21 +743,13 @@ static int dca_subframe_header(DCAContext *s, int base_channel, int block_index) | |||
| for (k = 0; k < s->subband_activity[j]; k++) { | |||
| if (k >= s->vq_start_subband[j] || s->bitalloc[j][k] > 0) { | |||
| scale_sum = get_scale(&s->gb, s->scalefactor_huffman[j], scale_sum); | |||
| if (scale_sum > scale_max) { | |||
| av_log(s->avctx, AV_LOG_ERROR, "scale_sum out of range\n"); | |||
| return AVERROR_INVALIDDATA; | |||
| } | |||
| scale_sum = get_scale(&s->gb, s->scalefactor_huffman[j], scale_sum, log_size); | |||
| s->scale_factor[j][k][0] = scale_table[scale_sum]; | |||
| } | |||
| if (k < s->vq_start_subband[j] && s->transition_mode[j][k]) { | |||
| /* Get second scale factor */ | |||
| scale_sum = get_scale(&s->gb, s->scalefactor_huffman[j], scale_sum); | |||
| if (scale_sum > scale_max) { | |||
| av_log(s->avctx, AV_LOG_ERROR, "scale_sum out of range\n"); | |||
| return AVERROR_INVALIDDATA; | |||
| } | |||
| scale_sum = get_scale(&s->gb, s->scalefactor_huffman[j], scale_sum, log_size); | |||
| s->scale_factor[j][k][1] = scale_table[scale_sum]; | |||
| } | |||
| } | |||
| @@ -780,8 +778,7 @@ static int dca_subframe_header(DCAContext *s, int base_channel, int block_index) | |||
| * (is this valid as well for joint scales ???) */ | |||
| for (k = s->subband_activity[j]; k < s->subband_activity[source_channel]; k++) { | |||
| scale = get_scale(&s->gb, s->joint_huff[j], 0); | |||
| scale += 64; /* bias */ | |||
| scale = get_scale(&s->gb, s->joint_huff[j], 64 /* bias */, 7); | |||
| s->joint_scale_factor[j][k] = scale; /*joint_scale_table[scale]; */ | |||
| } | |||
| @@ -802,14 +799,15 @@ static int dca_subframe_header(DCAContext *s, int base_channel, int block_index) | |||
| } | |||
| } else { | |||
| int am = s->amode & DCA_CHANNEL_MASK; | |||
| if (am < 16) { | |||
| if (am >= FF_ARRAY_ELEMS(dca_default_coeffs)) { | |||
| av_log(s->avctx, AV_LOG_ERROR, | |||
| "Invalid channel mode %d\n", am); | |||
| return AVERROR_INVALIDDATA; | |||
| } | |||
| for (j = base_channel; j < s->prim_channels; j++) { | |||
| s->downmix_coef[j][0] = dca_default_coeffs[am][j][0]; | |||
| s->downmix_coef[j][1] = dca_default_coeffs[am][j][1]; | |||
| } | |||
| } else { | |||
| av_log(s->avctx, AV_LOG_WARNING, "amode > 15 default downmix_coef unsupported\n"); | |||
| } | |||
| } | |||
| } | |||
| @@ -7528,7 +7528,7 @@ static const float dca_downmix_coeffs[65] = { | |||
| 0.001412537544623, 0.001000000000000, 0.000501187233627, 0.000251188643151, 0.000000000000000, | |||
| }; | |||
| static const uint8_t dca_default_coeffs[16][5][2] = { | |||
| static const uint8_t dca_default_coeffs[10][5][2] = { | |||
| { { 13, 13 }, }, | |||
| { { 0, 64 }, { 64, 0 }, }, | |||
| { { 0, 64 }, { 64, 0 }, }, | |||
| @@ -2605,12 +2605,12 @@ static void vector_clipf_c(float *dst, const float *src, float min, float max, i | |||
| } | |||
| } | |||
| static int32_t scalarproduct_int16_c(const int16_t * v1, const int16_t * v2, int order, int shift) | |||
| static int32_t scalarproduct_int16_c(const int16_t * v1, const int16_t * v2, int order) | |||
| { | |||
| int res = 0; | |||
| while (order--) | |||
| res += (*v1++ * *v2++) >> shift; | |||
| res += *v1++ * *v2++; | |||
| return res; | |||
| } | |||
| @@ -537,9 +537,8 @@ typedef struct DSPContext { | |||
| /** | |||
| * Calculate scalar product of two vectors. | |||
| * @param len length of vectors, should be multiple of 16 | |||
| * @param shift number of bits to discard from product | |||
| */ | |||
| int32_t (*scalarproduct_int16)(const int16_t *v1, const int16_t *v2/*align 16*/, int len, int shift); | |||
| int32_t (*scalarproduct_int16)(const int16_t *v1, const int16_t *v2/*align 16*/, int len); | |||
| /* ape functions */ | |||
| /** | |||
| * Calculate scalar product of v1 and v2, | |||
| @@ -287,31 +287,31 @@ static const DVprofile dv_profiles[] = { | |||
| const DVprofile* avpriv_dv_frame_profile2(AVCodecContext* codec, const DVprofile *sys, | |||
| const uint8_t* frame, unsigned buf_size) | |||
| { | |||
| int i, dsf, stype; | |||
| int i, dsf, stype; | |||
| if(buf_size < DV_PROFILE_BYTES) | |||
| return NULL; | |||
| if(buf_size < DV_PROFILE_BYTES) | |||
| return NULL; | |||
| dsf = (frame[3] & 0x80) >> 7; | |||
| stype = frame[80*5 + 48 + 3] & 0x1f; | |||
| dsf = (frame[3] & 0x80) >> 7; | |||
| stype = frame[80 * 5 + 48 + 3] & 0x1f; | |||
| /* 576i50 25Mbps 4:1:1 is a special case */ | |||
| if (dsf == 1 && stype == 0 && frame[4] & 0x07 /* the APT field */) { | |||
| return &dv_profiles[2]; | |||
| } | |||
| /* 576i50 25Mbps 4:1:1 is a special case */ | |||
| if (dsf == 1 && stype == 0 && frame[4] & 0x07 /* the APT field */) { | |||
| return &dv_profiles[2]; | |||
| } | |||
| if(codec && codec->codec_tag==AV_RL32("dvsd") && codec->width==720 && codec->height==576) | |||
| return &dv_profiles[1]; | |||
| if(codec && codec->codec_tag==AV_RL32("dvsd") && codec->width==720 && codec->height==576) | |||
| return &dv_profiles[1]; | |||
| for (i=0; i<FF_ARRAY_ELEMS(dv_profiles); i++) | |||
| if (dsf == dv_profiles[i].dsf && stype == dv_profiles[i].video_stype) | |||
| return &dv_profiles[i]; | |||
| for (i = 0; i < FF_ARRAY_ELEMS(dv_profiles); i++) | |||
| if (dsf == dv_profiles[i].dsf && stype == dv_profiles[i].video_stype) | |||
| return &dv_profiles[i]; | |||
| /* check if old sys matches and assumes corrupted input */ | |||
| if (sys && buf_size == sys->frame_size) | |||
| return sys; | |||
| /* check if old sys matches and assumes corrupted input */ | |||
| if (sys && buf_size == sys->frame_size) | |||
| return sys; | |||
| return NULL; | |||
| return NULL; | |||
| } | |||
| const DVprofile* avpriv_dv_frame_profile(const DVprofile *sys, | |||
| @@ -43,6 +43,7 @@ typedef struct TgqContext { | |||
| ScanTable scantable; | |||
| int qtable[64]; | |||
| DECLARE_ALIGNED(16, DCTELEM, block)[6][64]; | |||
| GetByteContext gb; | |||
| } TgqContext; | |||
| static av_cold int tgq_decode_init(AVCodecContext *avctx){ | |||
| @@ -141,41 +142,36 @@ static void tgq_idct_put_mb_dconly(TgqContext *s, int mb_x, int mb_y, const int8 | |||
| } | |||
| } | |||
| static int tgq_decode_mb(TgqContext *s, int mb_y, int mb_x, const uint8_t **bs, const uint8_t *buf_end){ | |||
| static void tgq_decode_mb(TgqContext *s, int mb_y, int mb_x){ | |||
| int mode; | |||
| int i; | |||
| int8_t dc[6]; | |||
| mode = bytestream_get_byte(bs); | |||
| if (mode>buf_end-*bs) { | |||
| av_log(s->avctx, AV_LOG_ERROR, "truncated macroblock\n"); | |||
| return AVERROR_INVALIDDATA; | |||
| } | |||
| mode = bytestream2_get_byte(&s->gb); | |||
| if (mode>12) { | |||
| GetBitContext gb; | |||
| init_get_bits(&gb, *bs, mode*8); | |||
| init_get_bits(&gb, s->gb.buffer, FFMIN(s->gb.buffer_end - s->gb.buffer, mode) * 8); | |||
| for(i=0; i<6; i++) | |||
| tgq_decode_block(s, s->block[i], &gb); | |||
| tgq_idct_put_mb(s, s->block, mb_x, mb_y); | |||
| bytestream2_skip(&s->gb, mode); | |||
| }else{ | |||
| if (mode==3) { | |||
| memset(dc, (*bs)[0], 4); | |||
| dc[4] = (*bs)[1]; | |||
| dc[5] = (*bs)[2]; | |||
| memset(dc, bytestream2_get_byte(&s->gb), 4); | |||
| dc[4] = bytestream2_get_byte(&s->gb); | |||
| dc[5] = bytestream2_get_byte(&s->gb); | |||
| }else if (mode==6) { | |||
| memcpy(dc, *bs, 6); | |||
| bytestream2_get_buffer(&s->gb, dc, 6); | |||
| }else if (mode==12) { | |||
| for(i=0; i<6; i++) | |||
| dc[i] = (*bs)[i*2]; | |||
| for (i = 0; i < 6; i++) { | |||
| dc[i] = bytestream2_get_byte(&s->gb); | |||
| bytestream2_skip(&s->gb, 1); | |||
| } | |||
| }else{ | |||
| av_log(s->avctx, AV_LOG_ERROR, "unsupported mb mode %i\n", mode); | |||
| } | |||
| tgq_idct_put_mb_dconly(s, mb_x, mb_y, dc); | |||
| } | |||
| *bs += mode; | |||
| return 0; | |||
| } | |||
| static void tgq_calculate_qtable(TgqContext *s, int quant){ | |||
| @@ -195,28 +191,30 @@ static int tgq_decode_frame(AVCodecContext *avctx, | |||
| AVPacket *avpkt){ | |||
| const uint8_t *buf = avpkt->data; | |||
| int buf_size = avpkt->size; | |||
| const uint8_t *buf_start = buf; | |||
| const uint8_t *buf_end = buf + buf_size; | |||
| TgqContext *s = avctx->priv_data; | |||
| int x,y, ret; | |||
| int big_endian = AV_RL32(&buf[4]) > 0x000FFFFF; | |||
| buf += 8; | |||
| if(8>buf_end-buf) { | |||
| if (buf_size < 16) { | |||
| av_log(avctx, AV_LOG_WARNING, "truncated header\n"); | |||
| return -1; | |||
| } | |||
| s->width = big_endian ? AV_RB16(&buf[0]) : AV_RL16(&buf[0]); | |||
| s->height = big_endian ? AV_RB16(&buf[2]) : AV_RL16(&buf[2]); | |||
| bytestream2_init(&s->gb, buf + 8, buf_size - 8); | |||
| if (big_endian) { | |||
| s->width = bytestream2_get_be16u(&s->gb); | |||
| s->height = bytestream2_get_be16u(&s->gb); | |||
| } else { | |||
| s->width = bytestream2_get_le16u(&s->gb); | |||
| s->height = bytestream2_get_le16u(&s->gb); | |||
| } | |||
| if (s->avctx->width!=s->width || s->avctx->height!=s->height) { | |||
| avcodec_set_dimensions(s->avctx, s->width, s->height); | |||
| if (s->frame.data[0]) | |||
| avctx->release_buffer(avctx, &s->frame); | |||
| } | |||
| tgq_calculate_qtable(s, buf[4]); | |||
| buf += 8; | |||
| tgq_calculate_qtable(s, bytestream2_get_byteu(&s->gb)); | |||
| bytestream2_skip(&s->gb, 3); | |||
| if (!s->frame.data[0]) { | |||
| s->frame.key_frame = 1; | |||
| @@ -228,15 +226,14 @@ static int tgq_decode_frame(AVCodecContext *avctx, | |||
| } | |||
| } | |||
| for (y=0; y<(avctx->height+15)/16; y++) | |||
| for (x=0; x<(avctx->width+15)/16; x++) | |||
| if ((ret=tgq_decode_mb(s, y, x, &buf, buf_end)) < 0) | |||
| return ret; | |||
| for (y = 0; y < FFALIGN(avctx->height, 16) >> 4; y++) | |||
| for (x = 0; x < FFALIGN(avctx->width, 16) >> 4; x++) | |||
| tgq_decode_mb(s, y, x); | |||
| *data_size = sizeof(AVFrame); | |||
| *(AVFrame*)data = s->frame; | |||
| return buf-buf_start; | |||
| return avpkt->size; | |||
| } | |||
| static av_cold int tgq_decode_end(AVCodecContext *avctx){ | |||
| @@ -163,7 +163,7 @@ static int16_t long_term_filter(DSPContext *dsp, int pitch_delay_int, | |||
| ener = dsp->scalarproduct_int16(sig_scaled + RES_PREV_DATA_SIZE, | |||
| sig_scaled + RES_PREV_DATA_SIZE, | |||
| subframe_size, 0); | |||
| subframe_size); | |||
| if (ener) { | |||
| sh_ener = FFMAX(av_log2(ener) - 14, 0); | |||
| ener >>= sh_ener; | |||
| @@ -192,7 +192,7 @@ static int16_t long_term_filter(DSPContext *dsp, int pitch_delay_int, | |||
| for (i = pitch_delay_int - 1; i <= pitch_delay_int + 1; i++) { | |||
| sum = dsp->scalarproduct_int16(sig_scaled + RES_PREV_DATA_SIZE, | |||
| sig_scaled + RES_PREV_DATA_SIZE - i, | |||
| subframe_size, 0); | |||
| subframe_size); | |||
| if (sum > corr_int_num) { | |||
| corr_int_num = sum; | |||
| best_delay_int = i; | |||
| @@ -202,7 +202,7 @@ static int16_t long_term_filter(DSPContext *dsp, int pitch_delay_int, | |||
| /* Compute denominator of pseudo-normalized correlation R'(0). */ | |||
| corr_int_den = dsp->scalarproduct_int16(sig_scaled - best_delay_int + RES_PREV_DATA_SIZE, | |||
| sig_scaled - best_delay_int + RES_PREV_DATA_SIZE, | |||
| subframe_size, 0); | |||
| subframe_size); | |||
| /* Compute signals with non-integer delay k (with 1/8 precision), | |||
| where k is in [0;6] range. | |||
| @@ -229,7 +229,7 @@ static int16_t long_term_filter(DSPContext *dsp, int pitch_delay_int, | |||
| for (k = 0; k < ANALYZED_FRAC_DELAYS; k++) { | |||
| sum = dsp->scalarproduct_int16(&delayed_signal[k][1], | |||
| &delayed_signal[k][1], | |||
| subframe_size - 1, 0); | |||
| subframe_size - 1); | |||
| corr_den[k][0] = sum + delayed_signal[k][0 ] * delayed_signal[k][0 ]; | |||
| corr_den[k][1] = sum + delayed_signal[k][subframe_size] * delayed_signal[k][subframe_size]; | |||
| @@ -257,7 +257,7 @@ static int16_t long_term_filter(DSPContext *dsp, int pitch_delay_int, | |||
| correlation R'(k). */ | |||
| sum = dsp->scalarproduct_int16(&delayed_signal[k][i], | |||
| sig_scaled + RES_PREV_DATA_SIZE, | |||
| subframe_size, 0); | |||
| subframe_size); | |||
| gain_num_short = FFMAX(sum >> sh_gain_num, 0); | |||
| /* | |||
| @@ -314,7 +314,7 @@ static int16_t long_term_filter(DSPContext *dsp, int pitch_delay_int, | |||
| /* Compute R'(k) correlation's numerator. */ | |||
| sum = dsp->scalarproduct_int16(residual_filt, | |||
| sig_scaled + RES_PREV_DATA_SIZE, | |||
| subframe_size, 0); | |||
| subframe_size); | |||
| if (sum < 0) { | |||
| gain_long_num = 0; | |||
| @@ -327,7 +327,7 @@ static int16_t long_term_filter(DSPContext *dsp, int pitch_delay_int, | |||
| } | |||
| /* Compute R'(k) correlation's denominator. */ | |||
| sum = dsp->scalarproduct_int16(residual_filt, residual_filt, subframe_size, 0); | |||
| sum = dsp->scalarproduct_int16(residual_filt, residual_filt, subframe_size); | |||
| tmp = FFMAX(av_log2(sum) - 14, 0); | |||
| sum >>= tmp; | |||
| @@ -437,8 +437,8 @@ static int16_t get_tilt_comp(DSPContext *dsp, int16_t *lp_gn, | |||
| /* Now lp_gn (starting with 10) contains impulse response | |||
| of A(z/FORMANT_PP_FACTOR_NUM)/A(z/FORMANT_PP_FACTOR_DEN) filter. */ | |||
| rh0 = dsp->scalarproduct_int16(lp_gn + 10, lp_gn + 10, 20, 0); | |||
| rh1 = dsp->scalarproduct_int16(lp_gn + 10, lp_gn + 11, 20, 0); | |||
| rh0 = dsp->scalarproduct_int16(lp_gn + 10, lp_gn + 10, 20); | |||
| rh1 = dsp->scalarproduct_int16(lp_gn + 10, lp_gn + 11, 20); | |||
| /* downscale to avoid overflow */ | |||
| temp = av_log2(rh0) - 14; | |||
| @@ -33,6 +33,7 @@ | |||
| #include "libavutil/intreadwrite.h" | |||
| #include "avcodec.h" | |||
| #include "bytestream.h" | |||
| #define MM_PREAMBLE_SIZE 6 | |||
| @@ -48,6 +49,7 @@ typedef struct MmContext { | |||
| AVCodecContext *avctx; | |||
| AVFrame frame; | |||
| int palette[AVPALETTE_COUNT]; | |||
| GetByteContext gb; | |||
| } MmContext; | |||
| static av_cold int mm_decode_init(AVCodecContext *avctx) | |||
| @@ -64,40 +66,40 @@ static av_cold int mm_decode_init(AVCodecContext *avctx) | |||
| return 0; | |||
| } | |||
| static void mm_decode_pal(MmContext *s, const uint8_t *buf, const uint8_t *buf_end) | |||
| static int mm_decode_pal(MmContext *s) | |||
| { | |||
| int i; | |||
| buf += 4; | |||
| for (i=0; i<128 && buf+2<buf_end; i++) { | |||
| s->palette[i] = 0xFF << 24 | AV_RB24(buf); | |||
| bytestream2_skip(&s->gb, 4); | |||
| for (i = 0; i < 128; i++) { | |||
| s->palette[i] = 0xFF << 24 | bytestream2_get_be24(&s->gb); | |||
| s->palette[i+128] = s->palette[i]<<2; | |||
| buf += 3; | |||
| } | |||
| return 0; | |||
| } | |||
| /** | |||
| * @param half_horiz Half horizontal resolution (0 or 1) | |||
| * @param half_vert Half vertical resolution (0 or 1) | |||
| */ | |||
| static void mm_decode_intra(MmContext * s, int half_horiz, int half_vert, const uint8_t *buf, int buf_size) | |||
| static int mm_decode_intra(MmContext * s, int half_horiz, int half_vert) | |||
| { | |||
| int i, x, y; | |||
| i=0; x=0; y=0; | |||
| while(i<buf_size) { | |||
| while (bytestream2_get_bytes_left(&s->gb) > 0) { | |||
| int run_length, color; | |||
| if (y >= s->avctx->height) | |||
| return; | |||
| return 0; | |||
| if (buf[i] & 0x80) { | |||
| color = bytestream2_get_byte(&s->gb); | |||
| if (color & 0x80) { | |||
| run_length = 1; | |||
| color = buf[i]; | |||
| i++; | |||
| }else{ | |||
| run_length = (buf[i] & 0x7f) + 2; | |||
| color = buf[i+1]; | |||
| i+=2; | |||
| run_length = (color & 0x7f) + 2; | |||
| color = bytestream2_get_byte(&s->gb); | |||
| } | |||
| if (half_horiz) | |||
| @@ -115,49 +117,43 @@ static void mm_decode_intra(MmContext * s, int half_horiz, int half_vert, const | |||
| y += 1 + half_vert; | |||
| } | |||
| } | |||
| return 0; | |||
| } | |||
| /* | |||
| * @param half_horiz Half horizontal resolution (0 or 1) | |||
| * @param half_vert Half vertical resolution (0 or 1) | |||
| */ | |||
| static void mm_decode_inter(MmContext * s, int half_horiz, int half_vert, const uint8_t *buf, int buf_size) | |||
| static int mm_decode_inter(MmContext * s, int half_horiz, int half_vert) | |||
| { | |||
| int data_ptr; | |||
| int d, r, y; | |||
| int data_off = bytestream2_get_le16(&s->gb), y; | |||
| GetByteContext data_ptr; | |||
| if(buf_size < 2) { | |||
| av_log(s->avctx, AV_LOG_ERROR, "1 or less byte inter frame\n"); | |||
| return; | |||
| } | |||
| if (bytestream2_get_bytes_left(&s->gb) < data_off) | |||
| return AVERROR_INVALIDDATA; | |||
| data_ptr = 2 + AV_RL16(&buf[0]); | |||
| d = data_ptr; r = 2; y = 0; | |||
| while(r + 1 < data_ptr) { | |||
| bytestream2_init(&data_ptr, s->gb.buffer + data_off, bytestream2_get_bytes_left(&s->gb) - data_off); | |||
| while (s->gb.buffer < data_ptr.buffer_start) { | |||
| int i, j; | |||
| int length = buf[r] & 0x7f; | |||
| int x = buf[r+1] + ((buf[r] & 0x80) << 1); | |||
| r += 2; | |||
| int length = bytestream2_get_byte(&s->gb); | |||
| int x = bytestream2_get_byte(&s->gb) + ((length & 0x80) << 1); | |||
| length &= 0x7F; | |||
| if (length==0) { | |||
| y += x; | |||
| continue; | |||
| } | |||
| if (y + half_vert >= s->avctx->height || r+length > buf_size) | |||
| return; | |||
| if (y + half_vert >= s->avctx->height) | |||
| return 0; | |||
| for(i=0; i<length; i++) { | |||
| int replace_array = bytestream2_get_byte(&s->gb); | |||
| for(j=0; j<8; j++) { | |||
| int replace = (buf[r+i] >> (7-j)) & 1; | |||
| int replace = (replace_array >> (7-j)) & 1; | |||
| if (replace) { | |||
| int color; | |||
| if (d >= buf_size) { | |||
| av_log(s->avctx, AV_LOG_ERROR, "overread buf\n"); | |||
| return; | |||
| } | |||
| color = buf[d]; | |||
| int color = bytestream2_get_byte(&data_ptr); | |||
| s->frame.data[0][y*s->frame.linesize[0] + x] = color; | |||
| if (half_horiz) | |||
| s->frame.data[0][y*s->frame.linesize[0] + x + 1] = color; | |||
| @@ -166,15 +162,15 @@ static void mm_decode_inter(MmContext * s, int half_horiz, int half_vert, const | |||
| if (half_horiz) | |||
| s->frame.data[0][(y+1)*s->frame.linesize[0] + x + 1] = color; | |||
| } | |||
| d++; | |||
| } | |||
| x += 1 + half_horiz; | |||
| } | |||
| } | |||
| r += length; | |||
| y += 1 + half_vert; | |||
| } | |||
| return 0; | |||
| } | |||
| static int mm_decode_frame(AVCodecContext *avctx, | |||
| @@ -184,12 +180,14 @@ static int mm_decode_frame(AVCodecContext *avctx, | |||
| const uint8_t *buf = avpkt->data; | |||
| int buf_size = avpkt->size; | |||
| MmContext *s = avctx->priv_data; | |||
| const uint8_t *buf_end = buf+buf_size; | |||
| int type; | |||
| int type, res; | |||
| if (buf_size < MM_PREAMBLE_SIZE) | |||
| return AVERROR_INVALIDDATA; | |||
| type = AV_RL16(&buf[0]); | |||
| buf += MM_PREAMBLE_SIZE; | |||
| buf_size -= MM_PREAMBLE_SIZE; | |||
| bytestream2_init(&s->gb, buf, buf_size); | |||
| if (avctx->reget_buffer(avctx, &s->frame) < 0) { | |||
| av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n"); | |||
| @@ -197,16 +195,19 @@ static int mm_decode_frame(AVCodecContext *avctx, | |||
| } | |||
| switch(type) { | |||
| case MM_TYPE_PALETTE : mm_decode_pal(s, buf, buf_end); return buf_size; | |||
| case MM_TYPE_INTRA : mm_decode_intra(s, 0, 0, buf, buf_size); break; | |||
| case MM_TYPE_INTRA_HH : mm_decode_intra(s, 1, 0, buf, buf_size); break; | |||
| case MM_TYPE_INTRA_HHV : mm_decode_intra(s, 1, 1, buf, buf_size); break; | |||
| case MM_TYPE_INTER : mm_decode_inter(s, 0, 0, buf, buf_size); break; | |||
| case MM_TYPE_INTER_HH : mm_decode_inter(s, 1, 0, buf, buf_size); break; | |||
| case MM_TYPE_INTER_HHV : mm_decode_inter(s, 1, 1, buf, buf_size); break; | |||
| default : | |||
| return -1; | |||
| case MM_TYPE_PALETTE : res = mm_decode_pal(s); return buf_size; | |||
| case MM_TYPE_INTRA : res = mm_decode_intra(s, 0, 0); break; | |||
| case MM_TYPE_INTRA_HH : res = mm_decode_intra(s, 1, 0); break; | |||
| case MM_TYPE_INTRA_HHV : res = mm_decode_intra(s, 1, 1); break; | |||
| case MM_TYPE_INTER : res = mm_decode_inter(s, 0, 0); break; | |||
| case MM_TYPE_INTER_HH : res = mm_decode_inter(s, 1, 0); break; | |||
| case MM_TYPE_INTER_HHV : res = mm_decode_inter(s, 1, 1); break; | |||
| default: | |||
| res = AVERROR_INVALIDDATA; | |||
| break; | |||
| } | |||
| if (res < 0) | |||
| return res; | |||
| memcpy(s->frame.data[1], s->palette, AVPALETTE_SIZE); | |||
| @@ -37,8 +37,6 @@ typedef struct ParseContext{ | |||
| uint64_t state64; ///< contains the last 8 bytes in MSB order | |||
| } ParseContext; | |||
| struct MpegEncContext; | |||
| #define END_NOT_FOUND (-100) | |||
| int ff_combine_frame(ParseContext *pc, int next, const uint8_t **buf, int *buf_size); | |||
| @@ -158,7 +158,7 @@ static int pcm_bluray_decode_frame(AVCodecContext *avctx, void *data, | |||
| /* There's always an even number of channels in the source */ | |||
| num_source_channels = FFALIGN(avctx->channels, 2); | |||
| sample_size = (num_source_channels * avctx->bits_per_coded_sample) >> 3; | |||
| sample_size = (num_source_channels * (avctx->sample_fmt == AV_SAMPLE_FMT_S16 ? 16 : 24)) >> 3; | |||
| samples = buf_size / sample_size; | |||
| /* get output buffer */ | |||
| @@ -155,6 +155,9 @@ static int raw_decode(AVCodecContext *avctx, | |||
| frame->top_field_first = context->tff; | |||
| } | |||
| if(buf_size < context->length - (avctx->pix_fmt==PIX_FMT_PAL8 ? 256*4 : 0)) | |||
| return -1; | |||
| //2bpp and 4bpp raw in avi and mov (yes this is ugly ...) | |||
| if (context->buffer) { | |||
| int i; | |||
| @@ -182,9 +185,6 @@ static int raw_decode(AVCodecContext *avctx, | |||
| avctx->codec_tag == MKTAG('A', 'V', 'u', 'p')) | |||
| buf += buf_size - context->length; | |||
| if(buf_size < context->length - (avctx->pix_fmt==PIX_FMT_PAL8 ? 256*4 : 0)) | |||
| return -1; | |||
| avpicture_fill(picture, buf, avctx->pix_fmt, avctx->width, avctx->height); | |||
| if((avctx->pix_fmt==PIX_FMT_PAL8 && buf_size < context->length) || | |||
| (av_pix_fmt_descriptors[avctx->pix_fmt].flags & PIX_FMT_PSEUDOPAL)) { | |||
| @@ -24,6 +24,7 @@ | |||
| #include "libavutil/lfg.h" | |||
| #include "avcodec.h" | |||
| #include "bytestream.h" | |||
| #include "dsputil.h" | |||
| typedef struct { | |||
| @@ -53,8 +54,7 @@ typedef struct RoqContext { | |||
| roq_cell cb2x2[256]; | |||
| roq_qcell cb4x4[256]; | |||
| const unsigned char *buf; | |||
| int size; | |||
| GetByteContext gb; | |||
| int width, height; | |||
| /* Encoder only data */ | |||
| @@ -38,16 +38,15 @@ static void roqvideo_decode_frame(RoqContext *ri) | |||
| unsigned int chunk_id = 0, chunk_arg = 0; | |||
| unsigned long chunk_size = 0; | |||
| int i, j, k, nv1, nv2, vqflg = 0, vqflg_pos = -1; | |||
| int vqid, bpos, xpos, ypos, xp, yp, x, y, mx, my; | |||
| int vqid, xpos, ypos, xp, yp, x, y, mx, my; | |||
| int frame_stats[2][4] = {{0},{0}}; | |||
| roq_qcell *qcell; | |||
| const unsigned char *buf = ri->buf; | |||
| const unsigned char *buf_end = ri->buf + ri->size; | |||
| int64_t chunk_start; | |||
| while (buf + 8 <= buf_end) { | |||
| chunk_id = bytestream_get_le16(&buf); | |||
| chunk_size = bytestream_get_le32(&buf); | |||
| chunk_arg = bytestream_get_le16(&buf); | |||
| while (bytestream2_get_bytes_left(&ri->gb) >= 8) { | |||
| chunk_id = bytestream2_get_le16(&ri->gb); | |||
| chunk_size = bytestream2_get_le32(&ri->gb); | |||
| chunk_arg = bytestream2_get_le16(&ri->gb); | |||
| if(chunk_id == RoQ_QUAD_VQ) | |||
| break; | |||
| @@ -57,33 +56,36 @@ static void roqvideo_decode_frame(RoqContext *ri) | |||
| if((nv2 = chunk_arg & 0xff) == 0 && nv1 * 6 < chunk_size) | |||
| nv2 = 256; | |||
| for(i = 0; i < nv1; i++) { | |||
| ri->cb2x2[i].y[0] = *buf++; | |||
| ri->cb2x2[i].y[1] = *buf++; | |||
| ri->cb2x2[i].y[2] = *buf++; | |||
| ri->cb2x2[i].y[3] = *buf++; | |||
| ri->cb2x2[i].u = *buf++; | |||
| ri->cb2x2[i].v = *buf++; | |||
| ri->cb2x2[i].y[0] = bytestream2_get_byte(&ri->gb); | |||
| ri->cb2x2[i].y[1] = bytestream2_get_byte(&ri->gb); | |||
| ri->cb2x2[i].y[2] = bytestream2_get_byte(&ri->gb); | |||
| ri->cb2x2[i].y[3] = bytestream2_get_byte(&ri->gb); | |||
| ri->cb2x2[i].u = bytestream2_get_byte(&ri->gb); | |||
| ri->cb2x2[i].v = bytestream2_get_byte(&ri->gb); | |||
| } | |||
| for(i = 0; i < nv2; i++) | |||
| for(j = 0; j < 4; j++) | |||
| ri->cb4x4[i].idx[j] = *buf++; | |||
| ri->cb4x4[i].idx[j] = bytestream2_get_byte(&ri->gb); | |||
| } | |||
| } | |||
| bpos = xpos = ypos = 0; | |||
| if (chunk_size > buf_end - buf) { | |||
| chunk_start = bytestream2_tell(&ri->gb); | |||
| xpos = ypos = 0; | |||
| if (chunk_size > bytestream2_get_bytes_left(&ri->gb)) { | |||
| av_log(ri->avctx, AV_LOG_ERROR, "Chunk does not fit in input buffer\n"); | |||
| chunk_size = buf_end - buf; | |||
| chunk_size = bytestream2_get_bytes_left(&ri->gb); | |||
| } | |||
| while(bpos < chunk_size) { | |||
| while (bytestream2_tell(&ri->gb) < chunk_start + chunk_size) { | |||
| for (yp = ypos; yp < ypos + 16; yp += 8) | |||
| for (xp = xpos; xp < xpos + 16; xp += 8) { | |||
| if (bpos >= chunk_size) { | |||
| if (bytestream2_tell(&ri->gb) >= chunk_start + chunk_size) { | |||
| av_log(ri->avctx, AV_LOG_ERROR, "Input buffer too small\n"); | |||
| return; | |||
| } | |||
| if (vqflg_pos < 0) { | |||
| vqflg = buf[bpos++]; vqflg |= (buf[bpos++] << 8); | |||
| vqflg = bytestream2_get_le16(&ri->gb); | |||
| vqflg_pos = 7; | |||
| } | |||
| vqid = (vqflg >> (vqflg_pos * 2)) & 0x3; | |||
| @@ -93,17 +95,19 @@ static void roqvideo_decode_frame(RoqContext *ri) | |||
| switch(vqid) { | |||
| case RoQ_ID_MOT: | |||
| break; | |||
| case RoQ_ID_FCC: | |||
| mx = 8 - (buf[bpos] >> 4) - ((signed char) (chunk_arg >> 8)); | |||
| my = 8 - (buf[bpos++] & 0xf) - ((signed char) chunk_arg); | |||
| case RoQ_ID_FCC: { | |||
| int byte = bytestream2_get_byte(&ri->gb); | |||
| mx = 8 - (byte >> 4) - ((signed char) (chunk_arg >> 8)); | |||
| my = 8 - (byte & 0xf) - ((signed char) chunk_arg); | |||
| ff_apply_motion_8x8(ri, xp, yp, mx, my); | |||
| break; | |||
| } | |||
| case RoQ_ID_SLD: | |||
| qcell = ri->cb4x4 + buf[bpos++]; | |||
| ff_apply_vector_4x4(ri, xp, yp, ri->cb2x2 + qcell->idx[0]); | |||
| ff_apply_vector_4x4(ri, xp+4, yp, ri->cb2x2 + qcell->idx[1]); | |||
| ff_apply_vector_4x4(ri, xp, yp+4, ri->cb2x2 + qcell->idx[2]); | |||
| ff_apply_vector_4x4(ri, xp+4, yp+4, ri->cb2x2 + qcell->idx[3]); | |||
| qcell = ri->cb4x4 + bytestream2_get_byte(&ri->gb); | |||
| ff_apply_vector_4x4(ri, xp, yp, ri->cb2x2 + qcell->idx[0]); | |||
| ff_apply_vector_4x4(ri, xp + 4, yp, ri->cb2x2 + qcell->idx[1]); | |||
| ff_apply_vector_4x4(ri, xp, yp + 4, ri->cb2x2 + qcell->idx[2]); | |||
| ff_apply_vector_4x4(ri, xp + 4, yp + 4, ri->cb2x2 + qcell->idx[3]); | |||
| break; | |||
| case RoQ_ID_CCC: | |||
| for (k = 0; k < 4; k++) { | |||
| @@ -111,13 +115,12 @@ static void roqvideo_decode_frame(RoqContext *ri) | |||
| if(k & 0x01) x += 4; | |||
| if(k & 0x02) y += 4; | |||
| if (bpos >= chunk_size) { | |||
| if (bytestream2_tell(&ri->gb) >= chunk_start + chunk_size) { | |||
| av_log(ri->avctx, AV_LOG_ERROR, "Input buffer too small\n"); | |||
| return; | |||
| } | |||
| if (vqflg_pos < 0) { | |||
| vqflg = buf[bpos++]; | |||
| vqflg |= (buf[bpos++] << 8); | |||
| vqflg = bytestream2_get_le16(&ri->gb); | |||
| vqflg_pos = 7; | |||
| } | |||
| vqid = (vqflg >> (vqflg_pos * 2)) & 0x3; | |||
| @@ -126,24 +129,25 @@ static void roqvideo_decode_frame(RoqContext *ri) | |||
| switch(vqid) { | |||
| case RoQ_ID_MOT: | |||
| break; | |||
| case RoQ_ID_FCC: | |||
| mx = 8 - (buf[bpos] >> 4) - ((signed char) (chunk_arg >> 8)); | |||
| my = 8 - (buf[bpos++] & 0xf) - ((signed char) chunk_arg); | |||
| case RoQ_ID_FCC: { | |||
| int byte = bytestream2_get_byte(&ri->gb); | |||
| mx = 8 - (byte >> 4) - ((signed char) (chunk_arg >> 8)); | |||
| my = 8 - (byte & 0xf) - ((signed char) chunk_arg); | |||
| ff_apply_motion_4x4(ri, x, y, mx, my); | |||
| break; | |||
| } | |||
| case RoQ_ID_SLD: | |||
| qcell = ri->cb4x4 + buf[bpos++]; | |||
| ff_apply_vector_2x2(ri, x, y, ri->cb2x2 + qcell->idx[0]); | |||
| ff_apply_vector_2x2(ri, x+2, y, ri->cb2x2 + qcell->idx[1]); | |||
| ff_apply_vector_2x2(ri, x, y+2, ri->cb2x2 + qcell->idx[2]); | |||
| ff_apply_vector_2x2(ri, x+2, y+2, ri->cb2x2 + qcell->idx[3]); | |||
| qcell = ri->cb4x4 + bytestream2_get_byte(&ri->gb); | |||
| ff_apply_vector_2x2(ri, x, y, ri->cb2x2 + qcell->idx[0]); | |||
| ff_apply_vector_2x2(ri, x + 2, y, ri->cb2x2 + qcell->idx[1]); | |||
| ff_apply_vector_2x2(ri, x, y + 2, ri->cb2x2 + qcell->idx[2]); | |||
| ff_apply_vector_2x2(ri, x + 2, y + 2, ri->cb2x2 + qcell->idx[3]); | |||
| break; | |||
| case RoQ_ID_CCC: | |||
| ff_apply_vector_2x2(ri, x, y, ri->cb2x2 + buf[bpos]); | |||
| ff_apply_vector_2x2(ri, x+2, y, ri->cb2x2 + buf[bpos+1]); | |||
| ff_apply_vector_2x2(ri, x, y+2, ri->cb2x2 + buf[bpos+2]); | |||
| ff_apply_vector_2x2(ri, x+2, y+2, ri->cb2x2 + buf[bpos+3]); | |||
| bpos += 4; | |||
| ff_apply_vector_2x2(ri, x, y, ri->cb2x2 + bytestream2_get_byte(&ri->gb)); | |||
| ff_apply_vector_2x2(ri, x + 2, y, ri->cb2x2 + bytestream2_get_byte(&ri->gb)); | |||
| ff_apply_vector_2x2(ri, x, y + 2, ri->cb2x2 + bytestream2_get_byte(&ri->gb)); | |||
| ff_apply_vector_2x2(ri, x + 2, y + 2, ri->cb2x2 + bytestream2_get_byte(&ri->gb)); | |||
| break; | |||
| } | |||
| } | |||
| @@ -199,8 +203,7 @@ static int roq_decode_frame(AVCodecContext *avctx, | |||
| av_picture_copy((AVPicture*)s->current_frame, (AVPicture*)s->last_frame, | |||
| avctx->pix_fmt, avctx->width, avctx->height); | |||
| s->buf = buf; | |||
| s->size = buf_size; | |||
| bytestream2_init(&s->gb, buf, buf_size); | |||
| roqvideo_decode_frame(s); | |||
| *data_size = sizeof(AVFrame); | |||
| @@ -472,26 +472,26 @@ static void rv34_pred_mv(RV34DecContext *r, int block_type, int subblock_no, int | |||
| int A[2] = {0}, B[2], C[2]; | |||
| int i, j; | |||
| int mx, my; | |||
| int avail_index = avail_indexes[subblock_no]; | |||
| int* avail = r->avail_cache + avail_indexes[subblock_no]; | |||
| int c_off = part_sizes_w[block_type]; | |||
| mv_pos += (subblock_no & 1) + (subblock_no >> 1)*s->b8_stride; | |||
| if(subblock_no == 3) | |||
| c_off = -1; | |||
| if(r->avail_cache[avail_index - 1]){ | |||
| if(avail[-1]){ | |||
| A[0] = s->current_picture_ptr->f.motion_val[0][mv_pos-1][0]; | |||
| A[1] = s->current_picture_ptr->f.motion_val[0][mv_pos-1][1]; | |||
| } | |||
| if(r->avail_cache[avail_index - 4]){ | |||
| if(avail[-4]){ | |||
| B[0] = s->current_picture_ptr->f.motion_val[0][mv_pos-s->b8_stride][0]; | |||
| B[1] = s->current_picture_ptr->f.motion_val[0][mv_pos-s->b8_stride][1]; | |||
| }else{ | |||
| B[0] = A[0]; | |||
| B[1] = A[1]; | |||
| } | |||
| if(!r->avail_cache[avail_index - 4 + c_off]){ | |||
| if(r->avail_cache[avail_index - 4] && (r->avail_cache[avail_index - 1] || r->rv30)){ | |||
| if(!avail[c_off-4]){ | |||
| if(avail[-4] && (avail[-1] || r->rv30)){ | |||
| C[0] = s->current_picture_ptr->f.motion_val[0][mv_pos-s->b8_stride-1][0]; | |||
| C[1] = s->current_picture_ptr->f.motion_val[0][mv_pos-s->b8_stride-1][1]; | |||
| }else{ | |||
| @@ -611,21 +611,21 @@ static void rv34_pred_mv_rv3(RV34DecContext *r, int block_type, int dir) | |||
| int A[2] = {0}, B[2], C[2]; | |||
| int i, j, k; | |||
| int mx, my; | |||
| int avail_index = avail_indexes[0]; | |||
| int* avail = r->avail_cache + avail_indexes[0]; | |||
| if(r->avail_cache[avail_index - 1]){ | |||
| if(avail[-1]){ | |||
| A[0] = s->current_picture_ptr->f.motion_val[0][mv_pos - 1][0]; | |||
| A[1] = s->current_picture_ptr->f.motion_val[0][mv_pos - 1][1]; | |||
| } | |||
| if(r->avail_cache[avail_index - 4]){ | |||
| if(avail[-4]){ | |||
| B[0] = s->current_picture_ptr->f.motion_val[0][mv_pos - s->b8_stride][0]; | |||
| B[1] = s->current_picture_ptr->f.motion_val[0][mv_pos - s->b8_stride][1]; | |||
| }else{ | |||
| B[0] = A[0]; | |||
| B[1] = A[1]; | |||
| } | |||
| if(!r->avail_cache[avail_index - 4 + 2]){ | |||
| if(r->avail_cache[avail_index - 4] && (r->avail_cache[avail_index - 1])){ | |||
| if(!avail[-4 + 2]){ | |||
| if(avail[-4] && (avail[-1])){ | |||
| C[0] = s->current_picture_ptr->f.motion_val[0][mv_pos - s->b8_stride - 1][0]; | |||
| C[1] = s->current_picture_ptr->f.motion_val[0][mv_pos - s->b8_stride - 1][1]; | |||
| }else{ | |||
| @@ -1022,25 +1022,10 @@ static void rv34_output_i16x16(RV34DecContext *r, int8_t *intra_types, int cbp) | |||
| q_ac = rv34_qscale_tab[s->qscale]; | |||
| uint8_t *dst = s->dest[0]; | |||
| DCTELEM *ptr = s->block[0]; | |||
| int avail[6*8] = {0}; | |||
| int i, j, itype, has_ac; | |||
| memset(block16, 0, 16 * sizeof(*block16)); | |||
| // Set neighbour information. | |||
| if(r->avail_cache[1]) | |||
| avail[0] = 1; | |||
| if(r->avail_cache[2]) | |||
| avail[1] = avail[2] = 1; | |||
| if(r->avail_cache[3]) | |||
| avail[3] = avail[4] = 1; | |||
| if(r->avail_cache[4]) | |||
| avail[5] = 1; | |||
| if(r->avail_cache[5]) | |||
| avail[8] = avail[16] = 1; | |||
| if(r->avail_cache[9]) | |||
| avail[24] = avail[32] = 1; | |||
| has_ac = rv34_decode_block(block16, gb, r->cur_vlcs, 3, 0, q_dc, q_dc, q_ac); | |||
| if(has_ac) | |||
| r->rdsp.rv34_inv_transform(block16); | |||
| @@ -35,13 +35,18 @@ static void sbr_sum64x5_c(float *z) | |||
| static float sbr_sum_square_c(float (*x)[2], int n) | |||
| { | |||
| float sum = 0.0f; | |||
| float sum0 = 0.0f, sum1 = 0.0f; | |||
| int i; | |||
| for (i = 0; i < n; i++) | |||
| sum += x[i][0] * x[i][0] + x[i][1] * x[i][1]; | |||
| for (i = 0; i < n; i += 2) | |||
| { | |||
| sum0 += x[i + 0][0] * x[i + 0][0]; | |||
| sum1 += x[i + 0][1] * x[i + 0][1]; | |||
| sum0 += x[i + 1][0] * x[i + 1][0]; | |||
| sum1 += x[i + 1][1] * x[i + 1][1]; | |||
| } | |||
| return sum; | |||
| return sum0 + sum1; | |||
| } | |||
| static void sbr_neg_odd_64_c(float *x) | |||
| @@ -34,6 +34,7 @@ | |||
| #include "libavutil/intreadwrite.h" | |||
| #include "avcodec.h" | |||
| #include "bytestream.h" | |||
| #define CPAIR 2 | |||
| #define CQUAD 4 | |||
| @@ -46,8 +47,7 @@ typedef struct SmcContext { | |||
| AVCodecContext *avctx; | |||
| AVFrame frame; | |||
| const unsigned char *buf; | |||
| int size; | |||
| GetByteContext gb; | |||
| /* SMC color tables */ | |||
| unsigned char color_pairs[COLORS_PER_TABLE * CPAIR]; | |||
| @@ -58,7 +58,7 @@ typedef struct SmcContext { | |||
| } SmcContext; | |||
| #define GET_BLOCK_COUNT() \ | |||
| (opcode & 0x10) ? (1 + s->buf[stream_ptr++]) : 1 + (opcode & 0x0F); | |||
| (opcode & 0x10) ? (1 + bytestream2_get_byte(&s->gb)) : 1 + (opcode & 0x0F); | |||
| #define ADVANCE_BLOCK() \ | |||
| { \ | |||
| @@ -82,8 +82,8 @@ static void smc_decode_stream(SmcContext *s) | |||
| int height = s->avctx->height; | |||
| int stride = s->frame.linesize[0]; | |||
| int i; | |||
| int stream_ptr = 0; | |||
| int chunk_size; | |||
| int buf_size = (int) (s->gb.buffer_end - s->gb.buffer_start); | |||
| unsigned char opcode; | |||
| int n_blocks; | |||
| unsigned int color_flags; | |||
| @@ -113,24 +113,18 @@ static void smc_decode_stream(SmcContext *s) | |||
| /* make the palette available */ | |||
| memcpy(s->frame.data[1], s->pal, AVPALETTE_SIZE); | |||
| chunk_size = AV_RB32(&s->buf[stream_ptr]) & 0x00FFFFFF; | |||
| stream_ptr += 4; | |||
| if (chunk_size != s->size) | |||
| bytestream2_skip(&s->gb, 1); | |||
| chunk_size = bytestream2_get_be24(&s->gb); | |||
| if (chunk_size != buf_size) | |||
| av_log(s->avctx, AV_LOG_INFO, "warning: MOV chunk size != encoded chunk size (%d != %d); using MOV chunk size\n", | |||
| chunk_size, s->size); | |||
| chunk_size, buf_size); | |||
| chunk_size = s->size; | |||
| chunk_size = buf_size; | |||
| total_blocks = ((s->avctx->width + 3) / 4) * ((s->avctx->height + 3) / 4); | |||
| /* traverse through the blocks */ | |||
| while (total_blocks) { | |||
| /* sanity checks */ | |||
| /* make sure stream ptr hasn't gone out of bounds */ | |||
| if (stream_ptr > chunk_size) { | |||
| av_log(s->avctx, AV_LOG_INFO, "SMC decoder just went out of bounds (stream ptr = %d, chunk size = %d)\n", | |||
| stream_ptr, chunk_size); | |||
| return; | |||
| } | |||
| /* make sure the row pointer hasn't gone wild */ | |||
| if (row_ptr >= image_size) { | |||
| av_log(s->avctx, AV_LOG_INFO, "SMC decoder just went out of bounds (row ptr = %d, height = %d)\n", | |||
| @@ -138,7 +132,7 @@ static void smc_decode_stream(SmcContext *s) | |||
| return; | |||
| } | |||
| opcode = s->buf[stream_ptr++]; | |||
| opcode = bytestream2_get_byte(&s->gb); | |||
| switch (opcode & 0xF0) { | |||
| /* skip n blocks */ | |||
| case 0x00: | |||
| @@ -158,7 +152,7 @@ static void smc_decode_stream(SmcContext *s) | |||
| if ((row_ptr == 0) && (pixel_ptr == 0)) { | |||
| av_log(s->avctx, AV_LOG_INFO, "encountered repeat block opcode (%02X) but no blocks rendered yet\n", | |||
| opcode & 0xF0); | |||
| break; | |||
| return; | |||
| } | |||
| /* figure out where the previous block started */ | |||
| @@ -192,7 +186,7 @@ static void smc_decode_stream(SmcContext *s) | |||
| if ((row_ptr == 0) && (pixel_ptr < 2 * 4)) { | |||
| av_log(s->avctx, AV_LOG_INFO, "encountered repeat block opcode (%02X) but not enough blocks rendered yet\n", | |||
| opcode & 0xF0); | |||
| break; | |||
| return; | |||
| } | |||
| /* figure out where the previous 2 blocks started */ | |||
| @@ -233,7 +227,7 @@ static void smc_decode_stream(SmcContext *s) | |||
| case 0x60: | |||
| case 0x70: | |||
| n_blocks = GET_BLOCK_COUNT(); | |||
| pixel = s->buf[stream_ptr++]; | |||
| pixel = bytestream2_get_byte(&s->gb); | |||
| while (n_blocks--) { | |||
| block_ptr = row_ptr + pixel_ptr; | |||
| @@ -257,7 +251,7 @@ static void smc_decode_stream(SmcContext *s) | |||
| /* fetch the next 2 colors from bytestream and store in next | |||
| * available entry in the color pair table */ | |||
| for (i = 0; i < CPAIR; i++) { | |||
| pixel = s->buf[stream_ptr++]; | |||
| pixel = bytestream2_get_byte(&s->gb); | |||
| color_table_index = CPAIR * color_pair_index + i; | |||
| s->color_pairs[color_table_index] = pixel; | |||
| } | |||
| @@ -268,11 +262,10 @@ static void smc_decode_stream(SmcContext *s) | |||
| if (color_pair_index == COLORS_PER_TABLE) | |||
| color_pair_index = 0; | |||
| } else | |||
| color_table_index = CPAIR * s->buf[stream_ptr++]; | |||
| color_table_index = CPAIR * bytestream2_get_byte(&s->gb); | |||
| while (n_blocks--) { | |||
| color_flags = AV_RB16(&s->buf[stream_ptr]); | |||
| stream_ptr += 2; | |||
| color_flags = bytestream2_get_be16(&s->gb); | |||
| flag_mask = 0x8000; | |||
| block_ptr = row_ptr + pixel_ptr; | |||
| for (pixel_y = 0; pixel_y < 4; pixel_y++) { | |||
| @@ -300,7 +293,7 @@ static void smc_decode_stream(SmcContext *s) | |||
| /* fetch the next 4 colors from bytestream and store in next | |||
| * available entry in the color quad table */ | |||
| for (i = 0; i < CQUAD; i++) { | |||
| pixel = s->buf[stream_ptr++]; | |||
| pixel = bytestream2_get_byte(&s->gb); | |||
| color_table_index = CQUAD * color_quad_index + i; | |||
| s->color_quads[color_table_index] = pixel; | |||
| } | |||
| @@ -311,11 +304,10 @@ static void smc_decode_stream(SmcContext *s) | |||
| if (color_quad_index == COLORS_PER_TABLE) | |||
| color_quad_index = 0; | |||
| } else | |||
| color_table_index = CQUAD * s->buf[stream_ptr++]; | |||
| color_table_index = CQUAD * bytestream2_get_byte(&s->gb); | |||
| while (n_blocks-- && stream_ptr + 3 < s->size) { | |||
| color_flags = AV_RB32(&s->buf[stream_ptr]); | |||
| stream_ptr += 4; | |||
| while (n_blocks--) { | |||
| color_flags = bytestream2_get_be32(&s->gb); | |||
| /* flag mask actually acts as a bit shift count here */ | |||
| flag_mask = 30; | |||
| block_ptr = row_ptr + pixel_ptr; | |||
| @@ -342,7 +334,7 @@ static void smc_decode_stream(SmcContext *s) | |||
| /* fetch the next 8 colors from bytestream and store in next | |||
| * available entry in the color octet table */ | |||
| for (i = 0; i < COCTET; i++) { | |||
| pixel = s->buf[stream_ptr++]; | |||
| pixel = bytestream2_get_byte(&s->gb); | |||
| color_table_index = COCTET * color_octet_index + i; | |||
| s->color_octets[color_table_index] = pixel; | |||
| } | |||
| @@ -353,7 +345,7 @@ static void smc_decode_stream(SmcContext *s) | |||
| if (color_octet_index == COLORS_PER_TABLE) | |||
| color_octet_index = 0; | |||
| } else | |||
| color_table_index = COCTET * s->buf[stream_ptr++]; | |||
| color_table_index = COCTET * bytestream2_get_byte(&s->gb); | |||
| while (n_blocks--) { | |||
| /* | |||
| @@ -363,15 +355,12 @@ static void smc_decode_stream(SmcContext *s) | |||
| flags_a = xx012456, flags_b = xx89A37B | |||
| */ | |||
| /* build the color flags */ | |||
| color_flags_a = | |||
| ((AV_RB16(s->buf + stream_ptr ) & 0xFFF0) << 8) | | |||
| (AV_RB16(s->buf + stream_ptr + 2) >> 4); | |||
| color_flags_b = | |||
| ((AV_RB16(s->buf + stream_ptr + 4) & 0xFFF0) << 8) | | |||
| ((s->buf[stream_ptr + 1] & 0x0F) << 8) | | |||
| ((s->buf[stream_ptr + 3] & 0x0F) << 4) | | |||
| (s->buf[stream_ptr + 5] & 0x0F); | |||
| stream_ptr += 6; | |||
| int val1 = bytestream2_get_be16(&s->gb); | |||
| int val2 = bytestream2_get_be16(&s->gb); | |||
| int val3 = bytestream2_get_be16(&s->gb); | |||
| color_flags_a = ((val1 & 0xFFF0) << 8) | (val2 >> 4); | |||
| color_flags_b = ((val3 & 0xFFF0) << 8) | | |||
| ((val1 & 0x0F) << 8) | ((val2 & 0x0F) << 4) | (val3 & 0x0F); | |||
| color_flags = color_flags_a; | |||
| /* flag mask actually acts as a bit shift count here */ | |||
| @@ -403,7 +392,7 @@ static void smc_decode_stream(SmcContext *s) | |||
| block_ptr = row_ptr + pixel_ptr; | |||
| for (pixel_y = 0; pixel_y < 4; pixel_y++) { | |||
| for (pixel_x = 0; pixel_x < 4; pixel_x++) { | |||
| pixels[block_ptr++] = s->buf[stream_ptr++]; | |||
| pixels[block_ptr++] = bytestream2_get_byte(&s->gb); | |||
| } | |||
| block_ptr += row_inc; | |||
| } | |||
| @@ -412,10 +401,12 @@ static void smc_decode_stream(SmcContext *s) | |||
| break; | |||
| case 0xF0: | |||
| av_log(s->avctx, AV_LOG_INFO, "0xF0 opcode seen in SMC chunk (contact the developers)\n"); | |||
| av_log_missing_feature(s->avctx, "0xF0 opcode", 1); | |||
| break; | |||
| } | |||
| } | |||
| return; | |||
| } | |||
| static av_cold int smc_decode_init(AVCodecContext *avctx) | |||
| @@ -440,8 +431,7 @@ static int smc_decode_frame(AVCodecContext *avctx, | |||
| SmcContext *s = avctx->priv_data; | |||
| const uint8_t *pal = av_packet_get_side_data(avpkt, AV_PKT_DATA_PALETTE, NULL); | |||
| s->buf = buf; | |||
| s->size = buf_size; | |||
| bytestream2_init(&s->gb, buf, buf_size); | |||
| s->frame.reference = 3; | |||
| s->frame.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE | | |||
| @@ -1248,3 +1248,365 @@ int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb) | |||
| } | |||
| return 0; | |||
| } | |||
| static const uint32_t vc1_ac_tables[AC_MODES][186][2] = { | |||
| { | |||
| { 0x0001, 2}, { 0x0005, 3}, { 0x000D, 4}, { 0x0012, 5}, { 0x000E, 6}, { 0x0015, 7}, | |||
| { 0x0013, 8}, { 0x003F, 8}, { 0x004B, 9}, { 0x011F, 9}, { 0x00B8, 10}, { 0x03E3, 10}, | |||
| { 0x0172, 11}, { 0x024D, 12}, { 0x03DA, 12}, { 0x02DD, 13}, { 0x1F55, 13}, { 0x05B9, 14}, | |||
| { 0x3EAE, 14}, { 0x0000, 4}, { 0x0010, 5}, { 0x0008, 7}, { 0x0020, 8}, { 0x0029, 9}, | |||
| { 0x01F4, 9}, { 0x0233, 10}, { 0x01E0, 11}, { 0x012A, 12}, { 0x03DD, 12}, { 0x050A, 13}, | |||
| { 0x1F29, 13}, { 0x0A42, 14}, { 0x1272, 15}, { 0x1737, 15}, { 0x0003, 5}, { 0x0011, 7}, | |||
| { 0x00C4, 8}, { 0x004B, 10}, { 0x00B4, 11}, { 0x07D4, 11}, { 0x0345, 12}, { 0x02D7, 13}, | |||
| { 0x07BF, 13}, { 0x0938, 14}, { 0x0BBB, 14}, { 0x095E, 15}, { 0x0013, 5}, { 0x0078, 7}, | |||
| { 0x0069, 9}, { 0x0232, 10}, { 0x0461, 11}, { 0x03EC, 12}, { 0x0520, 13}, { 0x1F2A, 13}, | |||
| { 0x3E50, 14}, { 0x3E51, 14}, { 0x1486, 15}, { 0x000C, 6}, { 0x0024, 9}, { 0x0094, 11}, | |||
| { 0x08C0, 12}, { 0x0F09, 14}, { 0x1EF0, 15}, { 0x003D, 6}, { 0x0053, 9}, { 0x01A0, 11}, | |||
| { 0x02D6, 13}, { 0x0F08, 14}, { 0x0013, 7}, { 0x007C, 9}, { 0x07C1, 11}, { 0x04AC, 14}, | |||
| { 0x001B, 7}, { 0x00A0, 10}, { 0x0344, 12}, { 0x0F79, 14}, { 0x0079, 7}, { 0x03E1, 10}, | |||
| { 0x02D4, 13}, { 0x2306, 14}, { 0x0021, 8}, { 0x023C, 10}, { 0x0FAE, 12}, { 0x23DE, 14}, | |||
| { 0x0035, 8}, { 0x0175, 11}, { 0x07B3, 13}, { 0x00C5, 8}, { 0x0174, 11}, { 0x0785, 13}, | |||
| { 0x0048, 9}, { 0x01A3, 11}, { 0x049E, 13}, { 0x002C, 9}, { 0x00FA, 10}, { 0x07D6, 11}, | |||
| { 0x0092, 10}, { 0x05CC, 13}, { 0x1EF1, 15}, { 0x00A3, 10}, { 0x03ED, 12}, { 0x093E, 14}, | |||
| { 0x01E2, 11}, { 0x1273, 15}, { 0x07C4, 11}, { 0x1487, 15}, { 0x0291, 12}, { 0x0293, 12}, | |||
| { 0x0F8A, 12}, { 0x0509, 13}, { 0x0508, 13}, { 0x078D, 13}, { 0x07BE, 13}, { 0x078C, 13}, | |||
| { 0x04AE, 14}, { 0x0BBA, 14}, { 0x2307, 14}, { 0x0B9A, 14}, { 0x1736, 15}, { 0x000E, 4}, | |||
| { 0x0045, 7}, { 0x01F3, 9}, { 0x047A, 11}, { 0x05DC, 13}, { 0x23DF, 14}, { 0x0019, 5}, | |||
| { 0x0028, 9}, { 0x0176, 11}, { 0x049D, 13}, { 0x23DD, 14}, { 0x0030, 6}, { 0x00A2, 10}, | |||
| { 0x02EF, 12}, { 0x05B8, 14}, { 0x003F, 6}, { 0x00A5, 10}, { 0x03DB, 12}, { 0x093F, 14}, | |||
| { 0x0044, 7}, { 0x07CB, 11}, { 0x095F, 15}, { 0x0063, 7}, { 0x03C3, 12}, { 0x0015, 8}, | |||
| { 0x08F6, 12}, { 0x0017, 8}, { 0x0498, 13}, { 0x002C, 8}, { 0x07B2, 13}, { 0x002F, 8}, | |||
| { 0x1F54, 13}, { 0x008D, 8}, { 0x07BD, 13}, { 0x008E, 8}, { 0x1182, 13}, { 0x00FB, 8}, | |||
| { 0x050B, 13}, { 0x002D, 8}, { 0x07C0, 11}, { 0x0079, 9}, { 0x1F5F, 13}, { 0x007A, 9}, | |||
| { 0x1F56, 13}, { 0x0231, 10}, { 0x03E4, 10}, { 0x01A1, 11}, { 0x0143, 11}, { 0x01F7, 11}, | |||
| { 0x016F, 12}, { 0x0292, 12}, { 0x02E7, 12}, { 0x016C, 12}, { 0x016D, 12}, { 0x03DC, 12}, | |||
| { 0x0F8B, 12}, { 0x0499, 13}, { 0x03D8, 12}, { 0x078E, 13}, { 0x02D5, 13}, { 0x1F5E, 13}, | |||
| { 0x1F2B, 13}, { 0x078F, 13}, { 0x04AD, 14}, { 0x3EAF, 14}, { 0x23DC, 14}, { 0x004A, 9} | |||
| }, | |||
| { | |||
| { 0x0000, 3}, { 0x0003, 4}, { 0x000B, 5}, { 0x0014, 6}, { 0x003F, 6}, { 0x005D, 7}, | |||
| { 0x00A2, 8}, { 0x00AC, 9}, { 0x016E, 9}, { 0x020A, 10}, { 0x02E2, 10}, { 0x0432, 11}, | |||
| { 0x05C9, 11}, { 0x0827, 12}, { 0x0B54, 12}, { 0x04E6, 13}, { 0x105F, 13}, { 0x172A, 13}, | |||
| { 0x20B2, 14}, { 0x2D4E, 14}, { 0x39F0, 14}, { 0x4175, 15}, { 0x5A9E, 15}, { 0x0004, 4}, | |||
| { 0x001E, 5}, { 0x0042, 7}, { 0x00B6, 8}, { 0x0173, 9}, { 0x0395, 10}, { 0x072E, 11}, | |||
| { 0x0B94, 12}, { 0x16A4, 13}, { 0x20B3, 14}, { 0x2E45, 14}, { 0x0005, 5}, { 0x0040, 7}, | |||
| { 0x0049, 9}, { 0x028F, 10}, { 0x05CB, 11}, { 0x048A, 13}, { 0x09DD, 14}, { 0x73E2, 15}, | |||
| { 0x0018, 5}, { 0x0025, 8}, { 0x008A, 10}, { 0x051B, 11}, { 0x0E5F, 12}, { 0x09C9, 14}, | |||
| { 0x139C, 15}, { 0x0029, 6}, { 0x004F, 9}, { 0x0412, 11}, { 0x048D, 13}, { 0x2E41, 14}, | |||
| { 0x0038, 6}, { 0x010E, 9}, { 0x05A8, 11}, { 0x105C, 13}, { 0x39F2, 14}, { 0x0058, 7}, | |||
| { 0x021F, 10}, { 0x0E7E, 12}, { 0x39FF, 14}, { 0x0023, 8}, { 0x02E3, 10}, { 0x04E5, 13}, | |||
| { 0x2E40, 14}, { 0x00A1, 8}, { 0x05BE, 11}, { 0x09C8, 14}, { 0x0083, 8}, { 0x013A, 11}, | |||
| { 0x1721, 13}, { 0x0044, 9}, { 0x0276, 12}, { 0x39F6, 14}, { 0x008B, 10}, { 0x04EF, 13}, | |||
| { 0x5A9B, 15}, { 0x0208, 10}, { 0x1CFE, 13}, { 0x0399, 10}, { 0x1CB4, 13}, { 0x039E, 10}, | |||
| { 0x39F3, 14}, { 0x05AB, 11}, { 0x73E3, 15}, { 0x0737, 11}, { 0x5A9F, 15}, { 0x082D, 12}, | |||
| { 0x0E69, 12}, { 0x0E68, 12}, { 0x0433, 11}, { 0x0B7B, 12}, { 0x2DF8, 14}, { 0x2E56, 14}, | |||
| { 0x2E57, 14}, { 0x39F7, 14}, { 0x51A5, 15}, { 0x0003, 3}, { 0x002A, 6}, { 0x00E4, 8}, | |||
| { 0x028E, 10}, { 0x0735, 11}, { 0x1058, 13}, { 0x1CFA, 13}, { 0x2DF9, 14}, { 0x4174, 15}, | |||
| { 0x0009, 4}, { 0x0054, 8}, { 0x0398, 10}, { 0x048B, 13}, { 0x139D, 15}, { 0x000D, 4}, | |||
| { 0x00AD, 9}, { 0x0826, 12}, { 0x2D4C, 14}, { 0x0011, 5}, { 0x016B, 9}, { 0x0B7F, 12}, | |||
| { 0x51A4, 15}, { 0x0019, 5}, { 0x021B, 10}, { 0x16FD, 13}, { 0x001D, 5}, { 0x0394, 10}, | |||
| { 0x28D3, 14}, { 0x002B, 6}, { 0x05BC, 11}, { 0x5A9A, 15}, { 0x002F, 6}, { 0x0247, 12}, | |||
| { 0x0010, 7}, { 0x0A35, 12}, { 0x003E, 6}, { 0x0B7A, 12}, { 0x0059, 7}, { 0x105E, 13}, | |||
| { 0x0026, 8}, { 0x09CF, 14}, { 0x0055, 8}, { 0x1CB5, 13}, { 0x0057, 8}, { 0x0E5B, 12}, | |||
| { 0x00A0, 8}, { 0x1468, 13}, { 0x0170, 9}, { 0x0090, 10}, { 0x01CE, 9}, { 0x021A, 10}, | |||
| { 0x0218, 10}, { 0x0168, 9}, { 0x021E, 10}, { 0x0244, 12}, { 0x0736, 11}, { 0x0138, 11}, | |||
| { 0x0519, 11}, { 0x0E5E, 12}, { 0x072C, 11}, { 0x0B55, 12}, { 0x09DC, 14}, { 0x20BB, 14}, | |||
| { 0x048C, 13}, { 0x1723, 13}, { 0x2E44, 14}, { 0x16A5, 13}, { 0x0518, 11}, { 0x39FE, 14}, | |||
| { 0x0169, 9} | |||
| }, | |||
| { | |||
| { 0x0001, 2}, { 0x0006, 3}, { 0x000F, 4}, { 0x0016, 5}, { 0x0020, 6}, { 0x0018, 7}, | |||
| { 0x0008, 8}, { 0x009A, 8}, { 0x0056, 9}, { 0x013E, 9}, { 0x00F0, 10}, { 0x03A5, 10}, | |||
| { 0x0077, 11}, { 0x01EF, 11}, { 0x009A, 12}, { 0x005D, 13}, { 0x0001, 4}, { 0x0011, 5}, | |||
| { 0x0002, 7}, { 0x000B, 8}, { 0x0012, 9}, { 0x01D6, 9}, { 0x027E, 10}, { 0x0191, 11}, | |||
| { 0x00EA, 12}, { 0x03DC, 12}, { 0x013B, 13}, { 0x0004, 5}, { 0x0014, 7}, { 0x009E, 8}, | |||
| { 0x0009, 10}, { 0x01AC, 11}, { 0x01E2, 11}, { 0x03CA, 12}, { 0x005F, 13}, { 0x0017, 5}, | |||
| { 0x004E, 7}, { 0x005E, 9}, { 0x00F3, 10}, { 0x01AD, 11}, { 0x00EC, 12}, { 0x05F0, 13}, | |||
| { 0x000E, 6}, { 0x00E1, 8}, { 0x03A4, 10}, { 0x009C, 12}, { 0x013D, 13}, { 0x003B, 6}, | |||
| { 0x001C, 9}, { 0x0014, 11}, { 0x09BE, 12}, { 0x0006, 7}, { 0x007A, 9}, { 0x0190, 11}, | |||
| { 0x0137, 13}, { 0x001B, 7}, { 0x0008, 10}, { 0x075C, 11}, { 0x0071, 7}, { 0x00D7, 10}, | |||
| { 0x09BF, 12}, { 0x0007, 8}, { 0x00AF, 10}, { 0x04CC, 11}, { 0x0034, 8}, { 0x0265, 10}, | |||
| { 0x009F, 12}, { 0x00E0, 8}, { 0x0016, 11}, { 0x0327, 12}, { 0x0015, 9}, { 0x017D, 11}, | |||
| { 0x0EBB, 12}, { 0x0014, 9}, { 0x00F6, 10}, { 0x01E4, 11}, { 0x00CB, 10}, { 0x099D, 12}, | |||
| { 0x00CA, 10}, { 0x02FC, 12}, { 0x017F, 11}, { 0x04CD, 11}, { 0x02FD, 12}, { 0x04FE, 11}, | |||
| { 0x013A, 13}, { 0x000A, 4}, { 0x0042, 7}, { 0x01D3, 9}, { 0x04DD, 11}, { 0x0012, 5}, | |||
| { 0x00E8, 8}, { 0x004C, 11}, { 0x0136, 13}, { 0x0039, 6}, { 0x0264, 10}, { 0x0EBA, 12}, | |||
| { 0x0000, 7}, { 0x00AE, 10}, { 0x099C, 12}, { 0x001F, 7}, { 0x04DE, 11}, { 0x0043, 7}, | |||
| { 0x04DC, 11}, { 0x0003, 8}, { 0x03CB, 12}, { 0x0006, 8}, { 0x099E, 12}, { 0x002A, 8}, | |||
| { 0x05F1, 13}, { 0x000F, 8}, { 0x09FE, 12}, { 0x0033, 8}, { 0x09FF, 12}, { 0x0098, 8}, | |||
| { 0x099F, 12}, { 0x00EA, 8}, { 0x013C, 13}, { 0x002E, 8}, { 0x0192, 11}, { 0x0136, 9}, | |||
| { 0x006A, 9}, { 0x0015, 11}, { 0x03AF, 10}, { 0x01E3, 11}, { 0x0074, 11}, { 0x00EB, 12}, | |||
| { 0x02F9, 12}, { 0x005C, 13}, { 0x00ED, 12}, { 0x03DD, 12}, { 0x0326, 12}, { 0x005E, 13}, | |||
| { 0x0016, 7} | |||
| }, | |||
| { | |||
| { 0x0004, 3}, { 0x0014, 5}, { 0x0017, 7}, { 0x007F, 8}, { 0x0154, 9}, { 0x01F2, 10}, | |||
| { 0x00BF, 11}, { 0x0065, 12}, { 0x0AAA, 12}, { 0x0630, 13}, { 0x1597, 13}, { 0x03B7, 14}, | |||
| { 0x2B22, 14}, { 0x0BE6, 15}, { 0x000B, 4}, { 0x0037, 7}, { 0x0062, 9}, { 0x0007, 11}, | |||
| { 0x0166, 12}, { 0x00CE, 13}, { 0x1590, 13}, { 0x05F6, 14}, { 0x0BE7, 15}, { 0x0007, 5}, | |||
| { 0x006D, 8}, { 0x0003, 11}, { 0x031F, 12}, { 0x05F2, 14}, { 0x0002, 6}, { 0x0061, 9}, | |||
| { 0x0055, 12}, { 0x01DF, 14}, { 0x001A, 6}, { 0x001E, 10}, { 0x0AC9, 12}, { 0x2B23, 14}, | |||
| { 0x001E, 6}, { 0x001F, 10}, { 0x0AC3, 12}, { 0x2B2B, 14}, { 0x0006, 7}, { 0x0004, 11}, | |||
| { 0x02F8, 13}, { 0x0019, 7}, { 0x0006, 11}, { 0x063D, 13}, { 0x0057, 7}, { 0x0182, 11}, | |||
| { 0x2AA2, 14}, { 0x0004, 8}, { 0x0180, 11}, { 0x059C, 14}, { 0x007D, 8}, { 0x0164, 12}, | |||
| { 0x076D, 15}, { 0x0002, 9}, { 0x018D, 11}, { 0x1581, 13}, { 0x00AD, 8}, { 0x0060, 12}, | |||
| { 0x0C67, 14}, { 0x001C, 9}, { 0x00EE, 13}, { 0x0003, 9}, { 0x02CF, 13}, { 0x00D9, 9}, | |||
| { 0x1580, 13}, { 0x0002, 11}, { 0x0183, 11}, { 0x0057, 12}, { 0x0061, 12}, { 0x0031, 11}, | |||
| { 0x0066, 12}, { 0x0631, 13}, { 0x0632, 13}, { 0x00AC, 13}, { 0x031D, 12}, { 0x0076, 12}, | |||
| { 0x003A, 11}, { 0x0165, 12}, { 0x0C66, 14}, { 0x0003, 2}, { 0x0054, 7}, { 0x02AB, 10}, | |||
| { 0x0016, 13}, { 0x05F7, 14}, { 0x0005, 4}, { 0x00F8, 9}, { 0x0AA9, 12}, { 0x005F, 15}, | |||
| { 0x0004, 4}, { 0x001C, 10}, { 0x1550, 13}, { 0x0004, 5}, { 0x0077, 11}, { 0x076C, 15}, | |||
| { 0x000E, 5}, { 0x000A, 12}, { 0x000C, 5}, { 0x0562, 11}, { 0x0004, 6}, { 0x031C, 12}, | |||
| { 0x0006, 6}, { 0x00C8, 13}, { 0x000D, 6}, { 0x01DA, 13}, { 0x0007, 6}, { 0x00C9, 13}, | |||
| { 0x0001, 7}, { 0x002E, 14}, { 0x0014, 7}, { 0x1596, 13}, { 0x000A, 7}, { 0x0AC2, 12}, | |||
| { 0x0016, 7}, { 0x015B, 14}, { 0x0015, 7}, { 0x015A, 14}, { 0x000F, 8}, { 0x005E, 15}, | |||
| { 0x007E, 8}, { 0x00AB, 8}, { 0x002D, 9}, { 0x00D8, 9}, { 0x000B, 9}, { 0x0014, 10}, | |||
| { 0x02B3, 10}, { 0x01F3, 10}, { 0x003A, 10}, { 0x0000, 10}, { 0x0058, 10}, { 0x002E, 9}, | |||
| { 0x005E, 10}, { 0x0563, 11}, { 0x00EC, 12}, { 0x0054, 12}, { 0x0AC1, 12}, { 0x1556, 13}, | |||
| { 0x02FA, 13}, { 0x0181, 11}, { 0x1557, 13}, { 0x059D, 14}, { 0x2AA3, 14}, { 0x2B2A, 14}, | |||
| { 0x01DE, 14}, { 0x063C, 13}, { 0x00CF, 13}, { 0x1594, 13}, { 0x000D, 9} | |||
| }, | |||
| { | |||
| { 0x0002, 2}, { 0x0006, 3}, { 0x000F, 4}, { 0x000D, 5}, { 0x000C, 5}, { 0x0015, 6}, | |||
| { 0x0013, 6}, { 0x0012, 6}, { 0x0017, 7}, { 0x001F, 8}, { 0x001E, 8}, { 0x001D, 8}, | |||
| { 0x0025, 9}, { 0x0024, 9}, { 0x0023, 9}, { 0x0021, 9}, { 0x0021, 10}, { 0x0020, 10}, | |||
| { 0x000F, 10}, { 0x000E, 10}, { 0x0007, 11}, { 0x0006, 11}, { 0x0020, 11}, { 0x0021, 11}, | |||
| { 0x0050, 12}, { 0x0051, 12}, { 0x0052, 12}, { 0x000E, 4}, { 0x0014, 6}, { 0x0016, 7}, | |||
| { 0x001C, 8}, { 0x0020, 9}, { 0x001F, 9}, { 0x000D, 10}, { 0x0022, 11}, { 0x0053, 12}, | |||
| { 0x0055, 12}, { 0x000B, 5}, { 0x0015, 7}, { 0x001E, 9}, { 0x000C, 10}, { 0x0056, 12}, | |||
| { 0x0011, 6}, { 0x001B, 8}, { 0x001D, 9}, { 0x000B, 10}, { 0x0010, 6}, { 0x0022, 9}, | |||
| { 0x000A, 10}, { 0x000D, 6}, { 0x001C, 9}, { 0x0008, 10}, { 0x0012, 7}, { 0x001B, 9}, | |||
| { 0x0054, 12}, { 0x0014, 7}, { 0x001A, 9}, { 0x0057, 12}, { 0x0019, 8}, { 0x0009, 10}, | |||
| { 0x0018, 8}, { 0x0023, 11}, { 0x0017, 8}, { 0x0019, 9}, { 0x0018, 9}, { 0x0007, 10}, | |||
| { 0x0058, 12}, { 0x0007, 4}, { 0x000C, 6}, { 0x0016, 8}, { 0x0017, 9}, { 0x0006, 10}, | |||
| { 0x0005, 11}, { 0x0004, 11}, { 0x0059, 12}, { 0x000F, 6}, { 0x0016, 9}, { 0x0005, 10}, | |||
| { 0x000E, 6}, { 0x0004, 10}, { 0x0011, 7}, { 0x0024, 11}, { 0x0010, 7}, { 0x0025, 11}, | |||
| { 0x0013, 7}, { 0x005A, 12}, { 0x0015, 8}, { 0x005B, 12}, { 0x0014, 8}, { 0x0013, 8}, | |||
| { 0x001A, 8}, { 0x0015, 9}, { 0x0014, 9}, { 0x0013, 9}, { 0x0012, 9}, { 0x0011, 9}, | |||
| { 0x0026, 11}, { 0x0027, 11}, { 0x005C, 12}, { 0x005D, 12}, { 0x005E, 12}, { 0x005F, 12}, | |||
| { 0x0003, 7} | |||
| }, | |||
| { | |||
| { 0x0002, 2}, { 0x000F, 4}, { 0x0015, 6}, { 0x0017, 7}, { 0x001F, 8}, { 0x0025, 9}, | |||
| { 0x0024, 9}, { 0x0021, 10}, { 0x0020, 10}, { 0x0007, 11}, { 0x0006, 11}, { 0x0020, 11}, | |||
| { 0x0006, 3}, { 0x0014, 6}, { 0x001E, 8}, { 0x000F, 10}, { 0x0021, 11}, { 0x0050, 12}, | |||
| { 0x000E, 4}, { 0x001D, 8}, { 0x000E, 10}, { 0x0051, 12}, { 0x000D, 5}, { 0x0023, 9}, | |||
| { 0x000D, 10}, { 0x000C, 5}, { 0x0022, 9}, { 0x0052, 12}, { 0x000B, 5}, { 0x000C, 10}, | |||
| { 0x0053, 12}, { 0x0013, 6}, { 0x000B, 10}, { 0x0054, 12}, { 0x0012, 6}, { 0x000A, 10}, | |||
| { 0x0011, 6}, { 0x0009, 10}, { 0x0010, 6}, { 0x0008, 10}, { 0x0016, 7}, { 0x0055, 12}, | |||
| { 0x0015, 7}, { 0x0014, 7}, { 0x001C, 8}, { 0x001B, 8}, { 0x0021, 9}, { 0x0020, 9}, | |||
| { 0x001F, 9}, { 0x001E, 9}, { 0x001D, 9}, { 0x001C, 9}, { 0x001B, 9}, { 0x001A, 9}, | |||
| { 0x0022, 11}, { 0x0023, 11}, { 0x0056, 12}, { 0x0057, 12}, { 0x0007, 4}, { 0x0019, 9}, | |||
| { 0x0005, 11}, { 0x000F, 6}, { 0x0004, 11}, { 0x000E, 6}, { 0x000D, 6}, { 0x000C, 6}, | |||
| { 0x0013, 7}, { 0x0012, 7}, { 0x0011, 7}, { 0x0010, 7}, { 0x001A, 8}, { 0x0019, 8}, | |||
| { 0x0018, 8}, { 0x0017, 8}, { 0x0016, 8}, { 0x0015, 8}, { 0x0014, 8}, { 0x0013, 8}, | |||
| { 0x0018, 9}, { 0x0017, 9}, { 0x0016, 9}, { 0x0015, 9}, { 0x0014, 9}, { 0x0013, 9}, | |||
| { 0x0012, 9}, { 0x0011, 9}, { 0x0007, 10}, { 0x0006, 10}, { 0x0005, 10}, { 0x0004, 10}, | |||
| { 0x0024, 11}, { 0x0025, 11}, { 0x0026, 11}, { 0x0027, 11}, { 0x0058, 12}, { 0x0059, 12}, | |||
| { 0x005A, 12}, { 0x005B, 12}, { 0x005C, 12}, { 0x005D, 12}, { 0x005E, 12}, { 0x005F, 12}, | |||
| { 0x0003, 7} | |||
| }, | |||
| { | |||
| { 0x0000, 2}, { 0x0003, 3}, { 0x000D, 4}, { 0x0005, 4}, { 0x001C, 5}, { 0x0016, 5}, | |||
| { 0x003F, 6}, { 0x003A, 6}, { 0x002E, 6}, { 0x0022, 6}, { 0x007B, 7}, { 0x0067, 7}, | |||
| { 0x005F, 7}, { 0x0047, 7}, { 0x0026, 7}, { 0x00EF, 8}, { 0x00CD, 8}, { 0x00C1, 8}, | |||
| { 0x00A9, 8}, { 0x004F, 8}, { 0x01F2, 9}, { 0x01DD, 9}, { 0x0199, 9}, { 0x0185, 9}, | |||
| { 0x015D, 9}, { 0x011B, 9}, { 0x03EF, 10}, { 0x03E1, 10}, { 0x03C8, 10}, { 0x0331, 10}, | |||
| { 0x0303, 10}, { 0x02F1, 10}, { 0x02A0, 10}, { 0x0233, 10}, { 0x0126, 10}, { 0x07C0, 11}, | |||
| { 0x076F, 11}, { 0x076C, 11}, { 0x0661, 11}, { 0x0604, 11}, { 0x0572, 11}, { 0x0551, 11}, | |||
| { 0x046A, 11}, { 0x0274, 11}, { 0x0F27, 12}, { 0x0F24, 12}, { 0x0EDB, 12}, { 0x0C8E, 12}, | |||
| { 0x0C0B, 12}, { 0x0C0A, 12}, { 0x0AE3, 12}, { 0x08D6, 12}, { 0x0490, 12}, { 0x0495, 12}, | |||
| { 0x1F19, 13}, { 0x1DB5, 13}, { 0x0009, 4}, { 0x0010, 5}, { 0x0029, 6}, { 0x0062, 7}, | |||
| { 0x00F3, 8}, { 0x00AD, 8}, { 0x01E5, 9}, { 0x0179, 9}, { 0x009C, 9}, { 0x03B1, 10}, | |||
| { 0x02AE, 10}, { 0x0127, 10}, { 0x076E, 11}, { 0x0570, 11}, { 0x0275, 11}, { 0x0F25, 12}, | |||
| { 0x0EC0, 12}, { 0x0AA0, 12}, { 0x08D7, 12}, { 0x1E4C, 13}, { 0x0008, 5}, { 0x0063, 7}, | |||
| { 0x00AF, 8}, { 0x017B, 9}, { 0x03B3, 10}, { 0x07DD, 11}, { 0x0640, 11}, { 0x0F8D, 12}, | |||
| { 0x0BC1, 12}, { 0x0491, 12}, { 0x0028, 6}, { 0x00C3, 8}, { 0x0151, 9}, { 0x02A1, 10}, | |||
| { 0x0573, 11}, { 0x0EC3, 12}, { 0x1F35, 13}, { 0x0065, 7}, { 0x01DA, 9}, { 0x02AF, 10}, | |||
| { 0x0277, 11}, { 0x08C9, 12}, { 0x1781, 13}, { 0x0025, 7}, { 0x0118, 9}, { 0x0646, 11}, | |||
| { 0x0AA6, 12}, { 0x1780, 13}, { 0x00C9, 8}, { 0x0321, 10}, { 0x0F9B, 12}, { 0x191E, 13}, | |||
| { 0x0048, 8}, { 0x07CC, 11}, { 0x0AA1, 12}, { 0x0180, 9}, { 0x0465, 11}, { 0x1905, 13}, | |||
| { 0x03E2, 10}, { 0x0EC1, 12}, { 0x3C9B, 14}, { 0x02F4, 10}, { 0x08C8, 12}, { 0x07C1, 11}, | |||
| { 0x0928, 13}, { 0x05E1, 11}, { 0x320D, 14}, { 0x0EC2, 12}, { 0x6418, 15}, { 0x1F34, 13}, | |||
| { 0x0078, 7}, { 0x0155, 9}, { 0x0552, 11}, { 0x191F, 13}, { 0x00FA, 8}, { 0x07DC, 11}, | |||
| { 0x1907, 13}, { 0x00AC, 8}, { 0x0249, 11}, { 0x13B1, 14}, { 0x01F6, 9}, { 0x0AE2, 12}, | |||
| { 0x01DC, 9}, { 0x04ED, 12}, { 0x0184, 9}, { 0x1904, 13}, { 0x0156, 9}, { 0x09D9, 13}, | |||
| { 0x03E7, 10}, { 0x0929, 13}, { 0x03B2, 10}, { 0x3B68, 14}, { 0x02F5, 10}, { 0x13B0, 14}, | |||
| { 0x0322, 10}, { 0x3B69, 14}, { 0x0234, 10}, { 0x7935, 15}, { 0x07C7, 11}, { 0xC833, 16}, | |||
| { 0x0660, 11}, { 0x7934, 15}, { 0x024B, 11}, { 0xC832, 16}, { 0x0AA7, 12}, { 0x1F18, 13}, | |||
| { 0x007A, 7} | |||
| }, | |||
| { | |||
| { 0x0002, 2}, { 0x0000, 3}, { 0x001E, 5}, { 0x0004, 5}, { 0x0012, 6}, { 0x0070, 7}, | |||
| { 0x001A, 7}, { 0x005F, 8}, { 0x0047, 8}, { 0x01D3, 9}, { 0x00B5, 9}, { 0x0057, 9}, | |||
| { 0x03B5, 10}, { 0x016D, 10}, { 0x0162, 10}, { 0x07CE, 11}, { 0x0719, 11}, { 0x0691, 11}, | |||
| { 0x02C6, 11}, { 0x0156, 11}, { 0x0F92, 12}, { 0x0D2E, 12}, { 0x0D20, 12}, { 0x059E, 12}, | |||
| { 0x0468, 12}, { 0x02A6, 12}, { 0x1DA2, 13}, { 0x1C60, 13}, { 0x1A43, 13}, { 0x0B1D, 13}, | |||
| { 0x08C0, 13}, { 0x055D, 13}, { 0x0003, 3}, { 0x000A, 5}, { 0x0077, 7}, { 0x00E5, 8}, | |||
| { 0x01D9, 9}, { 0x03E5, 10}, { 0x0166, 10}, { 0x0694, 11}, { 0x0152, 11}, { 0x059F, 12}, | |||
| { 0x1F3C, 13}, { 0x1A4B, 13}, { 0x055E, 13}, { 0x000C, 4}, { 0x007D, 7}, { 0x0044, 8}, | |||
| { 0x03E0, 10}, { 0x0769, 11}, { 0x0E31, 12}, { 0x1F26, 13}, { 0x055C, 13}, { 0x001B, 5}, | |||
| { 0x00E2, 8}, { 0x03A5, 10}, { 0x02C9, 11}, { 0x1F23, 13}, { 0x3B47, 14}, { 0x0007, 5}, | |||
| { 0x01D8, 9}, { 0x02D8, 11}, { 0x1F27, 13}, { 0x3494, 14}, { 0x0035, 6}, { 0x03E1, 10}, | |||
| { 0x059C, 12}, { 0x38C3, 14}, { 0x000C, 6}, { 0x0165, 10}, { 0x1D23, 13}, { 0x1638, 14}, | |||
| { 0x0068, 7}, { 0x0693, 11}, { 0x3A45, 14}, { 0x0020, 7}, { 0x0F90, 12}, { 0x7CF6, 15}, | |||
| { 0x00E8, 8}, { 0x058F, 12}, { 0x2CEF, 15}, { 0x0045, 8}, { 0x0B3A, 13}, { 0x01F1, 9}, | |||
| { 0x3B46, 14}, { 0x01A7, 9}, { 0x1676, 14}, { 0x0056, 9}, { 0x692A, 15}, { 0x038D, 10}, | |||
| { 0xE309, 16}, { 0x00AA, 10}, { 0x1C611, 17}, { 0x02DF, 11}, { 0xB3B9, 17}, { 0x02C8, 11}, | |||
| { 0x38C20, 18}, { 0x01B0, 11}, { 0x16390, 18}, { 0x0F9F, 12}, { 0x16771, 18}, { 0x0ED0, 12}, | |||
| { 0x71843, 19}, { 0x0D2A, 12}, { 0xF9E8C, 20}, { 0x0461, 12}, { 0xF9E8E, 20}, { 0x0B67, 13}, | |||
| { 0x055F, 13}, { 0x003F, 6}, { 0x006D, 9}, { 0x0E90, 12}, { 0x054E, 13}, { 0x0013, 6}, | |||
| { 0x0119, 10}, { 0x0B66, 13}, { 0x000B, 6}, { 0x0235, 11}, { 0x7CF5, 15}, { 0x0075, 7}, | |||
| { 0x0D24, 12}, { 0xF9E9, 16}, { 0x002E, 7}, { 0x1F22, 13}, { 0x0021, 7}, { 0x054F, 13}, | |||
| { 0x0014, 7}, { 0x3A44, 14}, { 0x00E4, 8}, { 0x7CF7, 15}, { 0x005E, 8}, { 0x7185, 15}, | |||
| { 0x0037, 8}, { 0x2C73, 15}, { 0x01DB, 9}, { 0x59DD, 16}, { 0x01C7, 9}, { 0x692B, 15}, | |||
| { 0x01A6, 9}, { 0x58E5, 16}, { 0x00B4, 9}, { 0x1F3D0, 17}, { 0x00B0, 9}, { 0xB1C9, 17}, | |||
| { 0x03E6, 10}, { 0x16770, 18}, { 0x016E, 10}, { 0x3E7A2, 18}, { 0x011B, 10}, { 0xF9E8D, 20}, | |||
| { 0x00D9, 10}, { 0xF9E8F, 20}, { 0x00A8, 10}, { 0x2C723, 19}, { 0x0749, 11}, { 0xE3084, 20}, | |||
| { 0x0696, 11}, { 0x58E45, 20}, { 0x02DE, 11}, { 0xB1C88, 21}, { 0x0231, 11}, { 0x1C610A, 21}, | |||
| { 0x01B1, 11}, { 0x71842D, 23}, { 0x0D2B, 12}, { 0x38C217, 22}, { 0x0D2F, 12}, { 0x163913, 22}, | |||
| { 0x05B2, 12}, { 0x163912, 22}, { 0x0469, 12}, { 0x71842C, 23}, { 0x1A42, 13}, { 0x08C1, 13}, | |||
| { 0x0073, 7} | |||
| } | |||
| }; | |||
| static const uint16_t vlc_offs[] = { | |||
| 0, 520, 552, 616, 1128, 1160, 1224, 1740, 1772, 1836, 1900, 2436, | |||
| 2986, 3050, 3610, 4154, 4218, 4746, 5326, 5390, 5902, 6554, 7658, 8342, | |||
| 9304, 9988, 10630, 11234, 12174, 13006, 13560, 14232, 14786, 15432, 16350, 17522, | |||
| 20372, 21818, 22330, 22394, 23166, 23678, 23742, 24820, 25332, 25396, 26460, 26980, | |||
| 27048, 27592, 27600, 27608, 27616, 27624, 28224, 28258, 28290, 28802, 28834, 28866, | |||
| 29378, 29412, 29444, 29960, 29994, 30026, 30538, 30572, 30604, 31120, 31154, 31186, | |||
| 31714, 31746, 31778, 32306, 32340, 32372 | |||
| }; | |||
| /** | |||
| * Init VC-1 specific tables and VC1Context members | |||
| * @param v The VC1Context to initialize | |||
| * @return Status | |||
| */ | |||
| int ff_vc1_init_common(VC1Context *v) | |||
| { | |||
| static int done = 0; | |||
| int i = 0; | |||
| static VLC_TYPE vlc_table[32372][2]; | |||
| v->hrd_rate = v->hrd_buffer = NULL; | |||
| /* VLC tables */ | |||
| if (!done) { | |||
| INIT_VLC_STATIC(&ff_vc1_bfraction_vlc, VC1_BFRACTION_VLC_BITS, 23, | |||
| ff_vc1_bfraction_bits, 1, 1, | |||
| ff_vc1_bfraction_codes, 1, 1, 1 << VC1_BFRACTION_VLC_BITS); | |||
| INIT_VLC_STATIC(&ff_vc1_norm2_vlc, VC1_NORM2_VLC_BITS, 4, | |||
| ff_vc1_norm2_bits, 1, 1, | |||
| ff_vc1_norm2_codes, 1, 1, 1 << VC1_NORM2_VLC_BITS); | |||
| INIT_VLC_STATIC(&ff_vc1_norm6_vlc, VC1_NORM6_VLC_BITS, 64, | |||
| ff_vc1_norm6_bits, 1, 1, | |||
| ff_vc1_norm6_codes, 2, 2, 556); | |||
| INIT_VLC_STATIC(&ff_vc1_imode_vlc, VC1_IMODE_VLC_BITS, 7, | |||
| ff_vc1_imode_bits, 1, 1, | |||
| ff_vc1_imode_codes, 1, 1, 1 << VC1_IMODE_VLC_BITS); | |||
| for (i = 0; i < 3; i++) { | |||
| ff_vc1_ttmb_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 0]]; | |||
| ff_vc1_ttmb_vlc[i].table_allocated = vlc_offs[i * 3 + 1] - vlc_offs[i * 3 + 0]; | |||
| init_vlc(&ff_vc1_ttmb_vlc[i], VC1_TTMB_VLC_BITS, 16, | |||
| ff_vc1_ttmb_bits[i], 1, 1, | |||
| ff_vc1_ttmb_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC); | |||
| ff_vc1_ttblk_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 1]]; | |||
| ff_vc1_ttblk_vlc[i].table_allocated = vlc_offs[i * 3 + 2] - vlc_offs[i * 3 + 1]; | |||
| init_vlc(&ff_vc1_ttblk_vlc[i], VC1_TTBLK_VLC_BITS, 8, | |||
| ff_vc1_ttblk_bits[i], 1, 1, | |||
| ff_vc1_ttblk_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); | |||
| ff_vc1_subblkpat_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 2]]; | |||
| ff_vc1_subblkpat_vlc[i].table_allocated = vlc_offs[i * 3 + 3] - vlc_offs[i * 3 + 2]; | |||
| init_vlc(&ff_vc1_subblkpat_vlc[i], VC1_SUBBLKPAT_VLC_BITS, 15, | |||
| ff_vc1_subblkpat_bits[i], 1, 1, | |||
| ff_vc1_subblkpat_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); | |||
| } | |||
| for (i = 0; i < 4; i++) { | |||
| ff_vc1_4mv_block_pattern_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 9]]; | |||
| ff_vc1_4mv_block_pattern_vlc[i].table_allocated = vlc_offs[i * 3 + 10] - vlc_offs[i * 3 + 9]; | |||
| init_vlc(&ff_vc1_4mv_block_pattern_vlc[i], VC1_4MV_BLOCK_PATTERN_VLC_BITS, 16, | |||
| ff_vc1_4mv_block_pattern_bits[i], 1, 1, | |||
| ff_vc1_4mv_block_pattern_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); | |||
| ff_vc1_cbpcy_p_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 10]]; | |||
| ff_vc1_cbpcy_p_vlc[i].table_allocated = vlc_offs[i * 3 + 11] - vlc_offs[i * 3 + 10]; | |||
| init_vlc(&ff_vc1_cbpcy_p_vlc[i], VC1_CBPCY_P_VLC_BITS, 64, | |||
| ff_vc1_cbpcy_p_bits[i], 1, 1, | |||
| ff_vc1_cbpcy_p_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC); | |||
| ff_vc1_mv_diff_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 11]]; | |||
| ff_vc1_mv_diff_vlc[i].table_allocated = vlc_offs[i * 3 + 12] - vlc_offs[i * 3 + 11]; | |||
| init_vlc(&ff_vc1_mv_diff_vlc[i], VC1_MV_DIFF_VLC_BITS, 73, | |||
| ff_vc1_mv_diff_bits[i], 1, 1, | |||
| ff_vc1_mv_diff_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC); | |||
| } | |||
| for (i = 0; i < 8; i++) { | |||
| ff_vc1_ac_coeff_table[i].table = &vlc_table[vlc_offs[i * 2 + 21]]; | |||
| ff_vc1_ac_coeff_table[i].table_allocated = vlc_offs[i * 2 + 22] - vlc_offs[i * 2 + 21]; | |||
| init_vlc(&ff_vc1_ac_coeff_table[i], AC_VLC_BITS, ff_vc1_ac_sizes[i], | |||
| &vc1_ac_tables[i][0][1], 8, 4, | |||
| &vc1_ac_tables[i][0][0], 8, 4, INIT_VLC_USE_NEW_STATIC); | |||
| /* initialize interlaced MVDATA tables (2-Ref) */ | |||
| ff_vc1_2ref_mvdata_vlc[i].table = &vlc_table[vlc_offs[i * 2 + 22]]; | |||
| ff_vc1_2ref_mvdata_vlc[i].table_allocated = vlc_offs[i * 2 + 23] - vlc_offs[i * 2 + 22]; | |||
| init_vlc(&ff_vc1_2ref_mvdata_vlc[i], VC1_2REF_MVDATA_VLC_BITS, 126, | |||
| ff_vc1_2ref_mvdata_bits[i], 1, 1, | |||
| ff_vc1_2ref_mvdata_codes[i], 4, 4, INIT_VLC_USE_NEW_STATIC); | |||
| } | |||
| for (i = 0; i < 4; i++) { | |||
| /* initialize 4MV MBMODE VLC tables for interlaced frame P picture */ | |||
| ff_vc1_intfr_4mv_mbmode_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 37]]; | |||
| ff_vc1_intfr_4mv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 38] - vlc_offs[i * 3 + 37]; | |||
| init_vlc(&ff_vc1_intfr_4mv_mbmode_vlc[i], VC1_INTFR_4MV_MBMODE_VLC_BITS, 15, | |||
| ff_vc1_intfr_4mv_mbmode_bits[i], 1, 1, | |||
| ff_vc1_intfr_4mv_mbmode_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC); | |||
| /* initialize NON-4MV MBMODE VLC tables for the same */ | |||
| ff_vc1_intfr_non4mv_mbmode_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 38]]; | |||
| ff_vc1_intfr_non4mv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 39] - vlc_offs[i * 3 + 38]; | |||
| init_vlc(&ff_vc1_intfr_non4mv_mbmode_vlc[i], VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 9, | |||
| ff_vc1_intfr_non4mv_mbmode_bits[i], 1, 1, | |||
| ff_vc1_intfr_non4mv_mbmode_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); | |||
| /* initialize interlaced MVDATA tables (1-Ref) */ | |||
| ff_vc1_1ref_mvdata_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 39]]; | |||
| ff_vc1_1ref_mvdata_vlc[i].table_allocated = vlc_offs[i * 3 + 40] - vlc_offs[i * 3 + 39]; | |||
| init_vlc(&ff_vc1_1ref_mvdata_vlc[i], VC1_1REF_MVDATA_VLC_BITS, 72, | |||
| ff_vc1_1ref_mvdata_bits[i], 1, 1, | |||
| ff_vc1_1ref_mvdata_codes[i], 4, 4, INIT_VLC_USE_NEW_STATIC); | |||
| } | |||
| for (i = 0; i < 4; i++) { | |||
| /* Initialize 2MV Block pattern VLC tables */ | |||
| ff_vc1_2mv_block_pattern_vlc[i].table = &vlc_table[vlc_offs[i + 49]]; | |||
| ff_vc1_2mv_block_pattern_vlc[i].table_allocated = vlc_offs[i + 50] - vlc_offs[i + 49]; | |||
| init_vlc(&ff_vc1_2mv_block_pattern_vlc[i], VC1_2MV_BLOCK_PATTERN_VLC_BITS, 4, | |||
| ff_vc1_2mv_block_pattern_bits[i], 1, 1, | |||
| ff_vc1_2mv_block_pattern_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); | |||
| } | |||
| for (i = 0; i < 8; i++) { | |||
| /* Initialize interlaced CBPCY VLC tables (Table 124 - Table 131) */ | |||
| ff_vc1_icbpcy_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 53]]; | |||
| ff_vc1_icbpcy_vlc[i].table_allocated = vlc_offs[i * 3 + 54] - vlc_offs[i * 3 + 53]; | |||
| init_vlc(&ff_vc1_icbpcy_vlc[i], VC1_ICBPCY_VLC_BITS, 63, | |||
| ff_vc1_icbpcy_p_bits[i], 1, 1, | |||
| ff_vc1_icbpcy_p_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC); | |||
| /* Initialize interlaced field picture MBMODE VLC tables */ | |||
| ff_vc1_if_mmv_mbmode_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 54]]; | |||
| ff_vc1_if_mmv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 55] - vlc_offs[i * 3 + 54]; | |||
| init_vlc(&ff_vc1_if_mmv_mbmode_vlc[i], VC1_IF_MMV_MBMODE_VLC_BITS, 8, | |||
| ff_vc1_if_mmv_mbmode_bits[i], 1, 1, | |||
| ff_vc1_if_mmv_mbmode_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); | |||
| ff_vc1_if_1mv_mbmode_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 55]]; | |||
| ff_vc1_if_1mv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 56] - vlc_offs[i * 3 + 55]; | |||
| init_vlc(&ff_vc1_if_1mv_mbmode_vlc[i], VC1_IF_1MV_MBMODE_VLC_BITS, 6, | |||
| ff_vc1_if_1mv_mbmode_bits[i], 1, 1, | |||
| ff_vc1_if_1mv_mbmode_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); | |||
| } | |||
| done = 1; | |||
| } | |||
| /* Other defaults */ | |||
| v->pq = -1; | |||
| v->mvrange = 0; /* 7.1.1.18, p80 */ | |||
| return 0; | |||
| } | |||
| @@ -28,6 +28,8 @@ | |||
| #include "intrax8.h" | |||
| #include "vc1dsp.h" | |||
| #define AC_VLC_BITS 9 | |||
| /** Markers used in VC-1 AP frame data */ | |||
| //@{ | |||
| enum VC1Code { | |||
| @@ -24,232 +24,7 @@ | |||
| #include <stdint.h> | |||
| #define AC_MODES 8 | |||
| static const int vc1_ac_sizes[AC_MODES] = { | |||
| 186, 169, 133, 149, 103, 103, 163, 175 | |||
| }; | |||
| static const uint32_t vc1_ac_tables[AC_MODES][186][2] = { | |||
| { | |||
| { 0x0001, 2}, { 0x0005, 3}, { 0x000D, 4}, { 0x0012, 5}, { 0x000E, 6}, { 0x0015, 7}, | |||
| { 0x0013, 8}, { 0x003F, 8}, { 0x004B, 9}, { 0x011F, 9}, { 0x00B8, 10}, { 0x03E3, 10}, | |||
| { 0x0172, 11}, { 0x024D, 12}, { 0x03DA, 12}, { 0x02DD, 13}, { 0x1F55, 13}, { 0x05B9, 14}, | |||
| { 0x3EAE, 14}, { 0x0000, 4}, { 0x0010, 5}, { 0x0008, 7}, { 0x0020, 8}, { 0x0029, 9}, | |||
| { 0x01F4, 9}, { 0x0233, 10}, { 0x01E0, 11}, { 0x012A, 12}, { 0x03DD, 12}, { 0x050A, 13}, | |||
| { 0x1F29, 13}, { 0x0A42, 14}, { 0x1272, 15}, { 0x1737, 15}, { 0x0003, 5}, { 0x0011, 7}, | |||
| { 0x00C4, 8}, { 0x004B, 10}, { 0x00B4, 11}, { 0x07D4, 11}, { 0x0345, 12}, { 0x02D7, 13}, | |||
| { 0x07BF, 13}, { 0x0938, 14}, { 0x0BBB, 14}, { 0x095E, 15}, { 0x0013, 5}, { 0x0078, 7}, | |||
| { 0x0069, 9}, { 0x0232, 10}, { 0x0461, 11}, { 0x03EC, 12}, { 0x0520, 13}, { 0x1F2A, 13}, | |||
| { 0x3E50, 14}, { 0x3E51, 14}, { 0x1486, 15}, { 0x000C, 6}, { 0x0024, 9}, { 0x0094, 11}, | |||
| { 0x08C0, 12}, { 0x0F09, 14}, { 0x1EF0, 15}, { 0x003D, 6}, { 0x0053, 9}, { 0x01A0, 11}, | |||
| { 0x02D6, 13}, { 0x0F08, 14}, { 0x0013, 7}, { 0x007C, 9}, { 0x07C1, 11}, { 0x04AC, 14}, | |||
| { 0x001B, 7}, { 0x00A0, 10}, { 0x0344, 12}, { 0x0F79, 14}, { 0x0079, 7}, { 0x03E1, 10}, | |||
| { 0x02D4, 13}, { 0x2306, 14}, { 0x0021, 8}, { 0x023C, 10}, { 0x0FAE, 12}, { 0x23DE, 14}, | |||
| { 0x0035, 8}, { 0x0175, 11}, { 0x07B3, 13}, { 0x00C5, 8}, { 0x0174, 11}, { 0x0785, 13}, | |||
| { 0x0048, 9}, { 0x01A3, 11}, { 0x049E, 13}, { 0x002C, 9}, { 0x00FA, 10}, { 0x07D6, 11}, | |||
| { 0x0092, 10}, { 0x05CC, 13}, { 0x1EF1, 15}, { 0x00A3, 10}, { 0x03ED, 12}, { 0x093E, 14}, | |||
| { 0x01E2, 11}, { 0x1273, 15}, { 0x07C4, 11}, { 0x1487, 15}, { 0x0291, 12}, { 0x0293, 12}, | |||
| { 0x0F8A, 12}, { 0x0509, 13}, { 0x0508, 13}, { 0x078D, 13}, { 0x07BE, 13}, { 0x078C, 13}, | |||
| { 0x04AE, 14}, { 0x0BBA, 14}, { 0x2307, 14}, { 0x0B9A, 14}, { 0x1736, 15}, { 0x000E, 4}, | |||
| { 0x0045, 7}, { 0x01F3, 9}, { 0x047A, 11}, { 0x05DC, 13}, { 0x23DF, 14}, { 0x0019, 5}, | |||
| { 0x0028, 9}, { 0x0176, 11}, { 0x049D, 13}, { 0x23DD, 14}, { 0x0030, 6}, { 0x00A2, 10}, | |||
| { 0x02EF, 12}, { 0x05B8, 14}, { 0x003F, 6}, { 0x00A5, 10}, { 0x03DB, 12}, { 0x093F, 14}, | |||
| { 0x0044, 7}, { 0x07CB, 11}, { 0x095F, 15}, { 0x0063, 7}, { 0x03C3, 12}, { 0x0015, 8}, | |||
| { 0x08F6, 12}, { 0x0017, 8}, { 0x0498, 13}, { 0x002C, 8}, { 0x07B2, 13}, { 0x002F, 8}, | |||
| { 0x1F54, 13}, { 0x008D, 8}, { 0x07BD, 13}, { 0x008E, 8}, { 0x1182, 13}, { 0x00FB, 8}, | |||
| { 0x050B, 13}, { 0x002D, 8}, { 0x07C0, 11}, { 0x0079, 9}, { 0x1F5F, 13}, { 0x007A, 9}, | |||
| { 0x1F56, 13}, { 0x0231, 10}, { 0x03E4, 10}, { 0x01A1, 11}, { 0x0143, 11}, { 0x01F7, 11}, | |||
| { 0x016F, 12}, { 0x0292, 12}, { 0x02E7, 12}, { 0x016C, 12}, { 0x016D, 12}, { 0x03DC, 12}, | |||
| { 0x0F8B, 12}, { 0x0499, 13}, { 0x03D8, 12}, { 0x078E, 13}, { 0x02D5, 13}, { 0x1F5E, 13}, | |||
| { 0x1F2B, 13}, { 0x078F, 13}, { 0x04AD, 14}, { 0x3EAF, 14}, { 0x23DC, 14}, { 0x004A, 9} | |||
| }, | |||
| { | |||
| { 0x0000, 3}, { 0x0003, 4}, { 0x000B, 5}, { 0x0014, 6}, { 0x003F, 6}, { 0x005D, 7}, | |||
| { 0x00A2, 8}, { 0x00AC, 9}, { 0x016E, 9}, { 0x020A, 10}, { 0x02E2, 10}, { 0x0432, 11}, | |||
| { 0x05C9, 11}, { 0x0827, 12}, { 0x0B54, 12}, { 0x04E6, 13}, { 0x105F, 13}, { 0x172A, 13}, | |||
| { 0x20B2, 14}, { 0x2D4E, 14}, { 0x39F0, 14}, { 0x4175, 15}, { 0x5A9E, 15}, { 0x0004, 4}, | |||
| { 0x001E, 5}, { 0x0042, 7}, { 0x00B6, 8}, { 0x0173, 9}, { 0x0395, 10}, { 0x072E, 11}, | |||
| { 0x0B94, 12}, { 0x16A4, 13}, { 0x20B3, 14}, { 0x2E45, 14}, { 0x0005, 5}, { 0x0040, 7}, | |||
| { 0x0049, 9}, { 0x028F, 10}, { 0x05CB, 11}, { 0x048A, 13}, { 0x09DD, 14}, { 0x73E2, 15}, | |||
| { 0x0018, 5}, { 0x0025, 8}, { 0x008A, 10}, { 0x051B, 11}, { 0x0E5F, 12}, { 0x09C9, 14}, | |||
| { 0x139C, 15}, { 0x0029, 6}, { 0x004F, 9}, { 0x0412, 11}, { 0x048D, 13}, { 0x2E41, 14}, | |||
| { 0x0038, 6}, { 0x010E, 9}, { 0x05A8, 11}, { 0x105C, 13}, { 0x39F2, 14}, { 0x0058, 7}, | |||
| { 0x021F, 10}, { 0x0E7E, 12}, { 0x39FF, 14}, { 0x0023, 8}, { 0x02E3, 10}, { 0x04E5, 13}, | |||
| { 0x2E40, 14}, { 0x00A1, 8}, { 0x05BE, 11}, { 0x09C8, 14}, { 0x0083, 8}, { 0x013A, 11}, | |||
| { 0x1721, 13}, { 0x0044, 9}, { 0x0276, 12}, { 0x39F6, 14}, { 0x008B, 10}, { 0x04EF, 13}, | |||
| { 0x5A9B, 15}, { 0x0208, 10}, { 0x1CFE, 13}, { 0x0399, 10}, { 0x1CB4, 13}, { 0x039E, 10}, | |||
| { 0x39F3, 14}, { 0x05AB, 11}, { 0x73E3, 15}, { 0x0737, 11}, { 0x5A9F, 15}, { 0x082D, 12}, | |||
| { 0x0E69, 12}, { 0x0E68, 12}, { 0x0433, 11}, { 0x0B7B, 12}, { 0x2DF8, 14}, { 0x2E56, 14}, | |||
| { 0x2E57, 14}, { 0x39F7, 14}, { 0x51A5, 15}, { 0x0003, 3}, { 0x002A, 6}, { 0x00E4, 8}, | |||
| { 0x028E, 10}, { 0x0735, 11}, { 0x1058, 13}, { 0x1CFA, 13}, { 0x2DF9, 14}, { 0x4174, 15}, | |||
| { 0x0009, 4}, { 0x0054, 8}, { 0x0398, 10}, { 0x048B, 13}, { 0x139D, 15}, { 0x000D, 4}, | |||
| { 0x00AD, 9}, { 0x0826, 12}, { 0x2D4C, 14}, { 0x0011, 5}, { 0x016B, 9}, { 0x0B7F, 12}, | |||
| { 0x51A4, 15}, { 0x0019, 5}, { 0x021B, 10}, { 0x16FD, 13}, { 0x001D, 5}, { 0x0394, 10}, | |||
| { 0x28D3, 14}, { 0x002B, 6}, { 0x05BC, 11}, { 0x5A9A, 15}, { 0x002F, 6}, { 0x0247, 12}, | |||
| { 0x0010, 7}, { 0x0A35, 12}, { 0x003E, 6}, { 0x0B7A, 12}, { 0x0059, 7}, { 0x105E, 13}, | |||
| { 0x0026, 8}, { 0x09CF, 14}, { 0x0055, 8}, { 0x1CB5, 13}, { 0x0057, 8}, { 0x0E5B, 12}, | |||
| { 0x00A0, 8}, { 0x1468, 13}, { 0x0170, 9}, { 0x0090, 10}, { 0x01CE, 9}, { 0x021A, 10}, | |||
| { 0x0218, 10}, { 0x0168, 9}, { 0x021E, 10}, { 0x0244, 12}, { 0x0736, 11}, { 0x0138, 11}, | |||
| { 0x0519, 11}, { 0x0E5E, 12}, { 0x072C, 11}, { 0x0B55, 12}, { 0x09DC, 14}, { 0x20BB, 14}, | |||
| { 0x048C, 13}, { 0x1723, 13}, { 0x2E44, 14}, { 0x16A5, 13}, { 0x0518, 11}, { 0x39FE, 14}, | |||
| { 0x0169, 9} | |||
| }, | |||
| { | |||
| { 0x0001, 2}, { 0x0006, 3}, { 0x000F, 4}, { 0x0016, 5}, { 0x0020, 6}, { 0x0018, 7}, | |||
| { 0x0008, 8}, { 0x009A, 8}, { 0x0056, 9}, { 0x013E, 9}, { 0x00F0, 10}, { 0x03A5, 10}, | |||
| { 0x0077, 11}, { 0x01EF, 11}, { 0x009A, 12}, { 0x005D, 13}, { 0x0001, 4}, { 0x0011, 5}, | |||
| { 0x0002, 7}, { 0x000B, 8}, { 0x0012, 9}, { 0x01D6, 9}, { 0x027E, 10}, { 0x0191, 11}, | |||
| { 0x00EA, 12}, { 0x03DC, 12}, { 0x013B, 13}, { 0x0004, 5}, { 0x0014, 7}, { 0x009E, 8}, | |||
| { 0x0009, 10}, { 0x01AC, 11}, { 0x01E2, 11}, { 0x03CA, 12}, { 0x005F, 13}, { 0x0017, 5}, | |||
| { 0x004E, 7}, { 0x005E, 9}, { 0x00F3, 10}, { 0x01AD, 11}, { 0x00EC, 12}, { 0x05F0, 13}, | |||
| { 0x000E, 6}, { 0x00E1, 8}, { 0x03A4, 10}, { 0x009C, 12}, { 0x013D, 13}, { 0x003B, 6}, | |||
| { 0x001C, 9}, { 0x0014, 11}, { 0x09BE, 12}, { 0x0006, 7}, { 0x007A, 9}, { 0x0190, 11}, | |||
| { 0x0137, 13}, { 0x001B, 7}, { 0x0008, 10}, { 0x075C, 11}, { 0x0071, 7}, { 0x00D7, 10}, | |||
| { 0x09BF, 12}, { 0x0007, 8}, { 0x00AF, 10}, { 0x04CC, 11}, { 0x0034, 8}, { 0x0265, 10}, | |||
| { 0x009F, 12}, { 0x00E0, 8}, { 0x0016, 11}, { 0x0327, 12}, { 0x0015, 9}, { 0x017D, 11}, | |||
| { 0x0EBB, 12}, { 0x0014, 9}, { 0x00F6, 10}, { 0x01E4, 11}, { 0x00CB, 10}, { 0x099D, 12}, | |||
| { 0x00CA, 10}, { 0x02FC, 12}, { 0x017F, 11}, { 0x04CD, 11}, { 0x02FD, 12}, { 0x04FE, 11}, | |||
| { 0x013A, 13}, { 0x000A, 4}, { 0x0042, 7}, { 0x01D3, 9}, { 0x04DD, 11}, { 0x0012, 5}, | |||
| { 0x00E8, 8}, { 0x004C, 11}, { 0x0136, 13}, { 0x0039, 6}, { 0x0264, 10}, { 0x0EBA, 12}, | |||
| { 0x0000, 7}, { 0x00AE, 10}, { 0x099C, 12}, { 0x001F, 7}, { 0x04DE, 11}, { 0x0043, 7}, | |||
| { 0x04DC, 11}, { 0x0003, 8}, { 0x03CB, 12}, { 0x0006, 8}, { 0x099E, 12}, { 0x002A, 8}, | |||
| { 0x05F1, 13}, { 0x000F, 8}, { 0x09FE, 12}, { 0x0033, 8}, { 0x09FF, 12}, { 0x0098, 8}, | |||
| { 0x099F, 12}, { 0x00EA, 8}, { 0x013C, 13}, { 0x002E, 8}, { 0x0192, 11}, { 0x0136, 9}, | |||
| { 0x006A, 9}, { 0x0015, 11}, { 0x03AF, 10}, { 0x01E3, 11}, { 0x0074, 11}, { 0x00EB, 12}, | |||
| { 0x02F9, 12}, { 0x005C, 13}, { 0x00ED, 12}, { 0x03DD, 12}, { 0x0326, 12}, { 0x005E, 13}, | |||
| { 0x0016, 7} | |||
| }, | |||
| { | |||
| { 0x0004, 3}, { 0x0014, 5}, { 0x0017, 7}, { 0x007F, 8}, { 0x0154, 9}, { 0x01F2, 10}, | |||
| { 0x00BF, 11}, { 0x0065, 12}, { 0x0AAA, 12}, { 0x0630, 13}, { 0x1597, 13}, { 0x03B7, 14}, | |||
| { 0x2B22, 14}, { 0x0BE6, 15}, { 0x000B, 4}, { 0x0037, 7}, { 0x0062, 9}, { 0x0007, 11}, | |||
| { 0x0166, 12}, { 0x00CE, 13}, { 0x1590, 13}, { 0x05F6, 14}, { 0x0BE7, 15}, { 0x0007, 5}, | |||
| { 0x006D, 8}, { 0x0003, 11}, { 0x031F, 12}, { 0x05F2, 14}, { 0x0002, 6}, { 0x0061, 9}, | |||
| { 0x0055, 12}, { 0x01DF, 14}, { 0x001A, 6}, { 0x001E, 10}, { 0x0AC9, 12}, { 0x2B23, 14}, | |||
| { 0x001E, 6}, { 0x001F, 10}, { 0x0AC3, 12}, { 0x2B2B, 14}, { 0x0006, 7}, { 0x0004, 11}, | |||
| { 0x02F8, 13}, { 0x0019, 7}, { 0x0006, 11}, { 0x063D, 13}, { 0x0057, 7}, { 0x0182, 11}, | |||
| { 0x2AA2, 14}, { 0x0004, 8}, { 0x0180, 11}, { 0x059C, 14}, { 0x007D, 8}, { 0x0164, 12}, | |||
| { 0x076D, 15}, { 0x0002, 9}, { 0x018D, 11}, { 0x1581, 13}, { 0x00AD, 8}, { 0x0060, 12}, | |||
| { 0x0C67, 14}, { 0x001C, 9}, { 0x00EE, 13}, { 0x0003, 9}, { 0x02CF, 13}, { 0x00D9, 9}, | |||
| { 0x1580, 13}, { 0x0002, 11}, { 0x0183, 11}, { 0x0057, 12}, { 0x0061, 12}, { 0x0031, 11}, | |||
| { 0x0066, 12}, { 0x0631, 13}, { 0x0632, 13}, { 0x00AC, 13}, { 0x031D, 12}, { 0x0076, 12}, | |||
| { 0x003A, 11}, { 0x0165, 12}, { 0x0C66, 14}, { 0x0003, 2}, { 0x0054, 7}, { 0x02AB, 10}, | |||
| { 0x0016, 13}, { 0x05F7, 14}, { 0x0005, 4}, { 0x00F8, 9}, { 0x0AA9, 12}, { 0x005F, 15}, | |||
| { 0x0004, 4}, { 0x001C, 10}, { 0x1550, 13}, { 0x0004, 5}, { 0x0077, 11}, { 0x076C, 15}, | |||
| { 0x000E, 5}, { 0x000A, 12}, { 0x000C, 5}, { 0x0562, 11}, { 0x0004, 6}, { 0x031C, 12}, | |||
| { 0x0006, 6}, { 0x00C8, 13}, { 0x000D, 6}, { 0x01DA, 13}, { 0x0007, 6}, { 0x00C9, 13}, | |||
| { 0x0001, 7}, { 0x002E, 14}, { 0x0014, 7}, { 0x1596, 13}, { 0x000A, 7}, { 0x0AC2, 12}, | |||
| { 0x0016, 7}, { 0x015B, 14}, { 0x0015, 7}, { 0x015A, 14}, { 0x000F, 8}, { 0x005E, 15}, | |||
| { 0x007E, 8}, { 0x00AB, 8}, { 0x002D, 9}, { 0x00D8, 9}, { 0x000B, 9}, { 0x0014, 10}, | |||
| { 0x02B3, 10}, { 0x01F3, 10}, { 0x003A, 10}, { 0x0000, 10}, { 0x0058, 10}, { 0x002E, 9}, | |||
| { 0x005E, 10}, { 0x0563, 11}, { 0x00EC, 12}, { 0x0054, 12}, { 0x0AC1, 12}, { 0x1556, 13}, | |||
| { 0x02FA, 13}, { 0x0181, 11}, { 0x1557, 13}, { 0x059D, 14}, { 0x2AA3, 14}, { 0x2B2A, 14}, | |||
| { 0x01DE, 14}, { 0x063C, 13}, { 0x00CF, 13}, { 0x1594, 13}, { 0x000D, 9} | |||
| }, | |||
| { | |||
| { 0x0002, 2}, { 0x0006, 3}, { 0x000F, 4}, { 0x000D, 5}, { 0x000C, 5}, { 0x0015, 6}, | |||
| { 0x0013, 6}, { 0x0012, 6}, { 0x0017, 7}, { 0x001F, 8}, { 0x001E, 8}, { 0x001D, 8}, | |||
| { 0x0025, 9}, { 0x0024, 9}, { 0x0023, 9}, { 0x0021, 9}, { 0x0021, 10}, { 0x0020, 10}, | |||
| { 0x000F, 10}, { 0x000E, 10}, { 0x0007, 11}, { 0x0006, 11}, { 0x0020, 11}, { 0x0021, 11}, | |||
| { 0x0050, 12}, { 0x0051, 12}, { 0x0052, 12}, { 0x000E, 4}, { 0x0014, 6}, { 0x0016, 7}, | |||
| { 0x001C, 8}, { 0x0020, 9}, { 0x001F, 9}, { 0x000D, 10}, { 0x0022, 11}, { 0x0053, 12}, | |||
| { 0x0055, 12}, { 0x000B, 5}, { 0x0015, 7}, { 0x001E, 9}, { 0x000C, 10}, { 0x0056, 12}, | |||
| { 0x0011, 6}, { 0x001B, 8}, { 0x001D, 9}, { 0x000B, 10}, { 0x0010, 6}, { 0x0022, 9}, | |||
| { 0x000A, 10}, { 0x000D, 6}, { 0x001C, 9}, { 0x0008, 10}, { 0x0012, 7}, { 0x001B, 9}, | |||
| { 0x0054, 12}, { 0x0014, 7}, { 0x001A, 9}, { 0x0057, 12}, { 0x0019, 8}, { 0x0009, 10}, | |||
| { 0x0018, 8}, { 0x0023, 11}, { 0x0017, 8}, { 0x0019, 9}, { 0x0018, 9}, { 0x0007, 10}, | |||
| { 0x0058, 12}, { 0x0007, 4}, { 0x000C, 6}, { 0x0016, 8}, { 0x0017, 9}, { 0x0006, 10}, | |||
| { 0x0005, 11}, { 0x0004, 11}, { 0x0059, 12}, { 0x000F, 6}, { 0x0016, 9}, { 0x0005, 10}, | |||
| { 0x000E, 6}, { 0x0004, 10}, { 0x0011, 7}, { 0x0024, 11}, { 0x0010, 7}, { 0x0025, 11}, | |||
| { 0x0013, 7}, { 0x005A, 12}, { 0x0015, 8}, { 0x005B, 12}, { 0x0014, 8}, { 0x0013, 8}, | |||
| { 0x001A, 8}, { 0x0015, 9}, { 0x0014, 9}, { 0x0013, 9}, { 0x0012, 9}, { 0x0011, 9}, | |||
| { 0x0026, 11}, { 0x0027, 11}, { 0x005C, 12}, { 0x005D, 12}, { 0x005E, 12}, { 0x005F, 12}, | |||
| { 0x0003, 7} | |||
| }, | |||
| { | |||
| { 0x0002, 2}, { 0x000F, 4}, { 0x0015, 6}, { 0x0017, 7}, { 0x001F, 8}, { 0x0025, 9}, | |||
| { 0x0024, 9}, { 0x0021, 10}, { 0x0020, 10}, { 0x0007, 11}, { 0x0006, 11}, { 0x0020, 11}, | |||
| { 0x0006, 3}, { 0x0014, 6}, { 0x001E, 8}, { 0x000F, 10}, { 0x0021, 11}, { 0x0050, 12}, | |||
| { 0x000E, 4}, { 0x001D, 8}, { 0x000E, 10}, { 0x0051, 12}, { 0x000D, 5}, { 0x0023, 9}, | |||
| { 0x000D, 10}, { 0x000C, 5}, { 0x0022, 9}, { 0x0052, 12}, { 0x000B, 5}, { 0x000C, 10}, | |||
| { 0x0053, 12}, { 0x0013, 6}, { 0x000B, 10}, { 0x0054, 12}, { 0x0012, 6}, { 0x000A, 10}, | |||
| { 0x0011, 6}, { 0x0009, 10}, { 0x0010, 6}, { 0x0008, 10}, { 0x0016, 7}, { 0x0055, 12}, | |||
| { 0x0015, 7}, { 0x0014, 7}, { 0x001C, 8}, { 0x001B, 8}, { 0x0021, 9}, { 0x0020, 9}, | |||
| { 0x001F, 9}, { 0x001E, 9}, { 0x001D, 9}, { 0x001C, 9}, { 0x001B, 9}, { 0x001A, 9}, | |||
| { 0x0022, 11}, { 0x0023, 11}, { 0x0056, 12}, { 0x0057, 12}, { 0x0007, 4}, { 0x0019, 9}, | |||
| { 0x0005, 11}, { 0x000F, 6}, { 0x0004, 11}, { 0x000E, 6}, { 0x000D, 6}, { 0x000C, 6}, | |||
| { 0x0013, 7}, { 0x0012, 7}, { 0x0011, 7}, { 0x0010, 7}, { 0x001A, 8}, { 0x0019, 8}, | |||
| { 0x0018, 8}, { 0x0017, 8}, { 0x0016, 8}, { 0x0015, 8}, { 0x0014, 8}, { 0x0013, 8}, | |||
| { 0x0018, 9}, { 0x0017, 9}, { 0x0016, 9}, { 0x0015, 9}, { 0x0014, 9}, { 0x0013, 9}, | |||
| { 0x0012, 9}, { 0x0011, 9}, { 0x0007, 10}, { 0x0006, 10}, { 0x0005, 10}, { 0x0004, 10}, | |||
| { 0x0024, 11}, { 0x0025, 11}, { 0x0026, 11}, { 0x0027, 11}, { 0x0058, 12}, { 0x0059, 12}, | |||
| { 0x005A, 12}, { 0x005B, 12}, { 0x005C, 12}, { 0x005D, 12}, { 0x005E, 12}, { 0x005F, 12}, | |||
| { 0x0003, 7} | |||
| }, | |||
| { | |||
| { 0x0000, 2}, { 0x0003, 3}, { 0x000D, 4}, { 0x0005, 4}, { 0x001C, 5}, { 0x0016, 5}, | |||
| { 0x003F, 6}, { 0x003A, 6}, { 0x002E, 6}, { 0x0022, 6}, { 0x007B, 7}, { 0x0067, 7}, | |||
| { 0x005F, 7}, { 0x0047, 7}, { 0x0026, 7}, { 0x00EF, 8}, { 0x00CD, 8}, { 0x00C1, 8}, | |||
| { 0x00A9, 8}, { 0x004F, 8}, { 0x01F2, 9}, { 0x01DD, 9}, { 0x0199, 9}, { 0x0185, 9}, | |||
| { 0x015D, 9}, { 0x011B, 9}, { 0x03EF, 10}, { 0x03E1, 10}, { 0x03C8, 10}, { 0x0331, 10}, | |||
| { 0x0303, 10}, { 0x02F1, 10}, { 0x02A0, 10}, { 0x0233, 10}, { 0x0126, 10}, { 0x07C0, 11}, | |||
| { 0x076F, 11}, { 0x076C, 11}, { 0x0661, 11}, { 0x0604, 11}, { 0x0572, 11}, { 0x0551, 11}, | |||
| { 0x046A, 11}, { 0x0274, 11}, { 0x0F27, 12}, { 0x0F24, 12}, { 0x0EDB, 12}, { 0x0C8E, 12}, | |||
| { 0x0C0B, 12}, { 0x0C0A, 12}, { 0x0AE3, 12}, { 0x08D6, 12}, { 0x0490, 12}, { 0x0495, 12}, | |||
| { 0x1F19, 13}, { 0x1DB5, 13}, { 0x0009, 4}, { 0x0010, 5}, { 0x0029, 6}, { 0x0062, 7}, | |||
| { 0x00F3, 8}, { 0x00AD, 8}, { 0x01E5, 9}, { 0x0179, 9}, { 0x009C, 9}, { 0x03B1, 10}, | |||
| { 0x02AE, 10}, { 0x0127, 10}, { 0x076E, 11}, { 0x0570, 11}, { 0x0275, 11}, { 0x0F25, 12}, | |||
| { 0x0EC0, 12}, { 0x0AA0, 12}, { 0x08D7, 12}, { 0x1E4C, 13}, { 0x0008, 5}, { 0x0063, 7}, | |||
| { 0x00AF, 8}, { 0x017B, 9}, { 0x03B3, 10}, { 0x07DD, 11}, { 0x0640, 11}, { 0x0F8D, 12}, | |||
| { 0x0BC1, 12}, { 0x0491, 12}, { 0x0028, 6}, { 0x00C3, 8}, { 0x0151, 9}, { 0x02A1, 10}, | |||
| { 0x0573, 11}, { 0x0EC3, 12}, { 0x1F35, 13}, { 0x0065, 7}, { 0x01DA, 9}, { 0x02AF, 10}, | |||
| { 0x0277, 11}, { 0x08C9, 12}, { 0x1781, 13}, { 0x0025, 7}, { 0x0118, 9}, { 0x0646, 11}, | |||
| { 0x0AA6, 12}, { 0x1780, 13}, { 0x00C9, 8}, { 0x0321, 10}, { 0x0F9B, 12}, { 0x191E, 13}, | |||
| { 0x0048, 8}, { 0x07CC, 11}, { 0x0AA1, 12}, { 0x0180, 9}, { 0x0465, 11}, { 0x1905, 13}, | |||
| { 0x03E2, 10}, { 0x0EC1, 12}, { 0x3C9B, 14}, { 0x02F4, 10}, { 0x08C8, 12}, { 0x07C1, 11}, | |||
| { 0x0928, 13}, { 0x05E1, 11}, { 0x320D, 14}, { 0x0EC2, 12}, { 0x6418, 15}, { 0x1F34, 13}, | |||
| { 0x0078, 7}, { 0x0155, 9}, { 0x0552, 11}, { 0x191F, 13}, { 0x00FA, 8}, { 0x07DC, 11}, | |||
| { 0x1907, 13}, { 0x00AC, 8}, { 0x0249, 11}, { 0x13B1, 14}, { 0x01F6, 9}, { 0x0AE2, 12}, | |||
| { 0x01DC, 9}, { 0x04ED, 12}, { 0x0184, 9}, { 0x1904, 13}, { 0x0156, 9}, { 0x09D9, 13}, | |||
| { 0x03E7, 10}, { 0x0929, 13}, { 0x03B2, 10}, { 0x3B68, 14}, { 0x02F5, 10}, { 0x13B0, 14}, | |||
| { 0x0322, 10}, { 0x3B69, 14}, { 0x0234, 10}, { 0x7935, 15}, { 0x07C7, 11}, { 0xC833, 16}, | |||
| { 0x0660, 11}, { 0x7934, 15}, { 0x024B, 11}, { 0xC832, 16}, { 0x0AA7, 12}, { 0x1F18, 13}, | |||
| { 0x007A, 7} | |||
| }, | |||
| { | |||
| { 0x0002, 2}, { 0x0000, 3}, { 0x001E, 5}, { 0x0004, 5}, { 0x0012, 6}, { 0x0070, 7}, | |||
| { 0x001A, 7}, { 0x005F, 8}, { 0x0047, 8}, { 0x01D3, 9}, { 0x00B5, 9}, { 0x0057, 9}, | |||
| { 0x03B5, 10}, { 0x016D, 10}, { 0x0162, 10}, { 0x07CE, 11}, { 0x0719, 11}, { 0x0691, 11}, | |||
| { 0x02C6, 11}, { 0x0156, 11}, { 0x0F92, 12}, { 0x0D2E, 12}, { 0x0D20, 12}, { 0x059E, 12}, | |||
| { 0x0468, 12}, { 0x02A6, 12}, { 0x1DA2, 13}, { 0x1C60, 13}, { 0x1A43, 13}, { 0x0B1D, 13}, | |||
| { 0x08C0, 13}, { 0x055D, 13}, { 0x0003, 3}, { 0x000A, 5}, { 0x0077, 7}, { 0x00E5, 8}, | |||
| { 0x01D9, 9}, { 0x03E5, 10}, { 0x0166, 10}, { 0x0694, 11}, { 0x0152, 11}, { 0x059F, 12}, | |||
| { 0x1F3C, 13}, { 0x1A4B, 13}, { 0x055E, 13}, { 0x000C, 4}, { 0x007D, 7}, { 0x0044, 8}, | |||
| { 0x03E0, 10}, { 0x0769, 11}, { 0x0E31, 12}, { 0x1F26, 13}, { 0x055C, 13}, { 0x001B, 5}, | |||
| { 0x00E2, 8}, { 0x03A5, 10}, { 0x02C9, 11}, { 0x1F23, 13}, { 0x3B47, 14}, { 0x0007, 5}, | |||
| { 0x01D8, 9}, { 0x02D8, 11}, { 0x1F27, 13}, { 0x3494, 14}, { 0x0035, 6}, { 0x03E1, 10}, | |||
| { 0x059C, 12}, { 0x38C3, 14}, { 0x000C, 6}, { 0x0165, 10}, { 0x1D23, 13}, { 0x1638, 14}, | |||
| { 0x0068, 7}, { 0x0693, 11}, { 0x3A45, 14}, { 0x0020, 7}, { 0x0F90, 12}, { 0x7CF6, 15}, | |||
| { 0x00E8, 8}, { 0x058F, 12}, { 0x2CEF, 15}, { 0x0045, 8}, { 0x0B3A, 13}, { 0x01F1, 9}, | |||
| { 0x3B46, 14}, { 0x01A7, 9}, { 0x1676, 14}, { 0x0056, 9}, { 0x692A, 15}, { 0x038D, 10}, | |||
| { 0xE309, 16}, { 0x00AA, 10}, { 0x1C611, 17}, { 0x02DF, 11}, { 0xB3B9, 17}, { 0x02C8, 11}, | |||
| { 0x38C20, 18}, { 0x01B0, 11}, { 0x16390, 18}, { 0x0F9F, 12}, { 0x16771, 18}, { 0x0ED0, 12}, | |||
| { 0x71843, 19}, { 0x0D2A, 12}, { 0xF9E8C, 20}, { 0x0461, 12}, { 0xF9E8E, 20}, { 0x0B67, 13}, | |||
| { 0x055F, 13}, { 0x003F, 6}, { 0x006D, 9}, { 0x0E90, 12}, { 0x054E, 13}, { 0x0013, 6}, | |||
| { 0x0119, 10}, { 0x0B66, 13}, { 0x000B, 6}, { 0x0235, 11}, { 0x7CF5, 15}, { 0x0075, 7}, | |||
| { 0x0D24, 12}, { 0xF9E9, 16}, { 0x002E, 7}, { 0x1F22, 13}, { 0x0021, 7}, { 0x054F, 13}, | |||
| { 0x0014, 7}, { 0x3A44, 14}, { 0x00E4, 8}, { 0x7CF7, 15}, { 0x005E, 8}, { 0x7185, 15}, | |||
| { 0x0037, 8}, { 0x2C73, 15}, { 0x01DB, 9}, { 0x59DD, 16}, { 0x01C7, 9}, { 0x692B, 15}, | |||
| { 0x01A6, 9}, { 0x58E5, 16}, { 0x00B4, 9}, { 0x1F3D0, 17}, { 0x00B0, 9}, { 0xB1C9, 17}, | |||
| { 0x03E6, 10}, { 0x16770, 18}, { 0x016E, 10}, { 0x3E7A2, 18}, { 0x011B, 10}, { 0xF9E8D, 20}, | |||
| { 0x00D9, 10}, { 0xF9E8F, 20}, { 0x00A8, 10}, { 0x2C723, 19}, { 0x0749, 11}, { 0xE3084, 20}, | |||
| { 0x0696, 11}, { 0x58E45, 20}, { 0x02DE, 11}, { 0xB1C88, 21}, { 0x0231, 11}, { 0x1C610A, 21}, | |||
| { 0x01B1, 11}, { 0x71842D, 23}, { 0x0D2B, 12}, { 0x38C217, 22}, { 0x0D2F, 12}, { 0x163913, 22}, | |||
| { 0x05B2, 12}, { 0x163912, 22}, { 0x0469, 12}, { 0x71842C, 23}, { 0x1A42, 13}, { 0x08C1, 13}, | |||
| { 0x0073, 7} | |||
| } | |||
| }; | |||
| #include "vc1data.h" | |||
| /* which indexes point to last=1 entries in tables */ | |||
| static const int vc1_last_decode_table[AC_MODES] = { | |||
| @@ -1129,3 +1129,7 @@ const uint16_t ff_vc1_b_field_mvpred_scales[7][4] = { | |||
| { 26, 17, 12, 10 }, // ZONE1OFFSET_X | |||
| { 7, 4, 3, 3 } // ZONE1OFFSET_Y | |||
| }; | |||
| const int ff_vc1_ac_sizes[AC_MODES] = { | |||
| 186, 169, 133, 149, 103, 103, 163, 175 | |||
| }; | |||
| @@ -200,4 +200,9 @@ extern const int32_t ff_vc1_dqscale[63]; | |||
| extern const uint16_t ff_vc1_field_mvpred_scales[2][7][4]; | |||
| /* B Interlaced field picture backward MV predictor scaling values for first field (Table 115) */ | |||
| extern const uint16_t ff_vc1_b_field_mvpred_scales[7][4]; | |||
| #define AC_MODES 8 | |||
| extern const int ff_vc1_ac_sizes[AC_MODES]; | |||
| #endif /* AVCODEC_VC1DATA_H */ | |||
| @@ -45,154 +45,12 @@ | |||
| #define MB_INTRA_VLC_BITS 9 | |||
| #define DC_VLC_BITS 9 | |||
| #define AC_VLC_BITS 9 | |||
| static const uint16_t vlc_offs[] = { | |||
| 0, 520, 552, 616, 1128, 1160, 1224, 1740, 1772, 1836, 1900, 2436, | |||
| 2986, 3050, 3610, 4154, 4218, 4746, 5326, 5390, 5902, 6554, 7658, 8342, | |||
| 9304, 9988, 10630, 11234, 12174, 13006, 13560, 14232, 14786, 15432, 16350, 17522, | |||
| 20372, 21818, 22330, 22394, 23166, 23678, 23742, 24820, 25332, 25396, 26460, 26980, | |||
| 27048, 27592, 27600, 27608, 27616, 27624, 28224, 28258, 28290, 28802, 28834, 28866, | |||
| 29378, 29412, 29444, 29960, 29994, 30026, 30538, 30572, 30604, 31120, 31154, 31186, | |||
| 31714, 31746, 31778, 32306, 32340, 32372 | |||
| }; | |||
| // offset tables for interlaced picture MVDATA decoding | |||
| static const int offset_table1[9] = { 0, 1, 2, 4, 8, 16, 32, 64, 128 }; | |||
| static const int offset_table2[9] = { 0, 1, 3, 7, 15, 31, 63, 127, 255 }; | |||
| /** | |||
| * Init VC-1 specific tables and VC1Context members | |||
| * @param v The VC1Context to initialize | |||
| * @return Status | |||
| */ | |||
| int ff_vc1_init_common(VC1Context *v) | |||
| { | |||
| static int done = 0; | |||
| int i = 0; | |||
| static VLC_TYPE vlc_table[32372][2]; | |||
| v->hrd_rate = v->hrd_buffer = NULL; | |||
| /* VLC tables */ | |||
| if (!done) { | |||
| INIT_VLC_STATIC(&ff_vc1_bfraction_vlc, VC1_BFRACTION_VLC_BITS, 23, | |||
| ff_vc1_bfraction_bits, 1, 1, | |||
| ff_vc1_bfraction_codes, 1, 1, 1 << VC1_BFRACTION_VLC_BITS); | |||
| INIT_VLC_STATIC(&ff_vc1_norm2_vlc, VC1_NORM2_VLC_BITS, 4, | |||
| ff_vc1_norm2_bits, 1, 1, | |||
| ff_vc1_norm2_codes, 1, 1, 1 << VC1_NORM2_VLC_BITS); | |||
| INIT_VLC_STATIC(&ff_vc1_norm6_vlc, VC1_NORM6_VLC_BITS, 64, | |||
| ff_vc1_norm6_bits, 1, 1, | |||
| ff_vc1_norm6_codes, 2, 2, 556); | |||
| INIT_VLC_STATIC(&ff_vc1_imode_vlc, VC1_IMODE_VLC_BITS, 7, | |||
| ff_vc1_imode_bits, 1, 1, | |||
| ff_vc1_imode_codes, 1, 1, 1 << VC1_IMODE_VLC_BITS); | |||
| for (i = 0; i < 3; i++) { | |||
| ff_vc1_ttmb_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 0]]; | |||
| ff_vc1_ttmb_vlc[i].table_allocated = vlc_offs[i * 3 + 1] - vlc_offs[i * 3 + 0]; | |||
| init_vlc(&ff_vc1_ttmb_vlc[i], VC1_TTMB_VLC_BITS, 16, | |||
| ff_vc1_ttmb_bits[i], 1, 1, | |||
| ff_vc1_ttmb_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC); | |||
| ff_vc1_ttblk_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 1]]; | |||
| ff_vc1_ttblk_vlc[i].table_allocated = vlc_offs[i * 3 + 2] - vlc_offs[i * 3 + 1]; | |||
| init_vlc(&ff_vc1_ttblk_vlc[i], VC1_TTBLK_VLC_BITS, 8, | |||
| ff_vc1_ttblk_bits[i], 1, 1, | |||
| ff_vc1_ttblk_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); | |||
| ff_vc1_subblkpat_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 2]]; | |||
| ff_vc1_subblkpat_vlc[i].table_allocated = vlc_offs[i * 3 + 3] - vlc_offs[i * 3 + 2]; | |||
| init_vlc(&ff_vc1_subblkpat_vlc[i], VC1_SUBBLKPAT_VLC_BITS, 15, | |||
| ff_vc1_subblkpat_bits[i], 1, 1, | |||
| ff_vc1_subblkpat_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); | |||
| } | |||
| for (i = 0; i < 4; i++) { | |||
| ff_vc1_4mv_block_pattern_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 9]]; | |||
| ff_vc1_4mv_block_pattern_vlc[i].table_allocated = vlc_offs[i * 3 + 10] - vlc_offs[i * 3 + 9]; | |||
| init_vlc(&ff_vc1_4mv_block_pattern_vlc[i], VC1_4MV_BLOCK_PATTERN_VLC_BITS, 16, | |||
| ff_vc1_4mv_block_pattern_bits[i], 1, 1, | |||
| ff_vc1_4mv_block_pattern_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); | |||
| ff_vc1_cbpcy_p_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 10]]; | |||
| ff_vc1_cbpcy_p_vlc[i].table_allocated = vlc_offs[i * 3 + 11] - vlc_offs[i * 3 + 10]; | |||
| init_vlc(&ff_vc1_cbpcy_p_vlc[i], VC1_CBPCY_P_VLC_BITS, 64, | |||
| ff_vc1_cbpcy_p_bits[i], 1, 1, | |||
| ff_vc1_cbpcy_p_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC); | |||
| ff_vc1_mv_diff_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 11]]; | |||
| ff_vc1_mv_diff_vlc[i].table_allocated = vlc_offs[i * 3 + 12] - vlc_offs[i * 3 + 11]; | |||
| init_vlc(&ff_vc1_mv_diff_vlc[i], VC1_MV_DIFF_VLC_BITS, 73, | |||
| ff_vc1_mv_diff_bits[i], 1, 1, | |||
| ff_vc1_mv_diff_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC); | |||
| } | |||
| for (i = 0; i < 8; i++) { | |||
| ff_vc1_ac_coeff_table[i].table = &vlc_table[vlc_offs[i * 2 + 21]]; | |||
| ff_vc1_ac_coeff_table[i].table_allocated = vlc_offs[i * 2 + 22] - vlc_offs[i * 2 + 21]; | |||
| init_vlc(&ff_vc1_ac_coeff_table[i], AC_VLC_BITS, vc1_ac_sizes[i], | |||
| &vc1_ac_tables[i][0][1], 8, 4, | |||
| &vc1_ac_tables[i][0][0], 8, 4, INIT_VLC_USE_NEW_STATIC); | |||
| /* initialize interlaced MVDATA tables (2-Ref) */ | |||
| ff_vc1_2ref_mvdata_vlc[i].table = &vlc_table[vlc_offs[i * 2 + 22]]; | |||
| ff_vc1_2ref_mvdata_vlc[i].table_allocated = vlc_offs[i * 2 + 23] - vlc_offs[i * 2 + 22]; | |||
| init_vlc(&ff_vc1_2ref_mvdata_vlc[i], VC1_2REF_MVDATA_VLC_BITS, 126, | |||
| ff_vc1_2ref_mvdata_bits[i], 1, 1, | |||
| ff_vc1_2ref_mvdata_codes[i], 4, 4, INIT_VLC_USE_NEW_STATIC); | |||
| } | |||
| for (i = 0; i < 4; i++) { | |||
| /* initialize 4MV MBMODE VLC tables for interlaced frame P picture */ | |||
| ff_vc1_intfr_4mv_mbmode_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 37]]; | |||
| ff_vc1_intfr_4mv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 38] - vlc_offs[i * 3 + 37]; | |||
| init_vlc(&ff_vc1_intfr_4mv_mbmode_vlc[i], VC1_INTFR_4MV_MBMODE_VLC_BITS, 15, | |||
| ff_vc1_intfr_4mv_mbmode_bits[i], 1, 1, | |||
| ff_vc1_intfr_4mv_mbmode_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC); | |||
| /* initialize NON-4MV MBMODE VLC tables for the same */ | |||
| ff_vc1_intfr_non4mv_mbmode_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 38]]; | |||
| ff_vc1_intfr_non4mv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 39] - vlc_offs[i * 3 + 38]; | |||
| init_vlc(&ff_vc1_intfr_non4mv_mbmode_vlc[i], VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 9, | |||
| ff_vc1_intfr_non4mv_mbmode_bits[i], 1, 1, | |||
| ff_vc1_intfr_non4mv_mbmode_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); | |||
| /* initialize interlaced MVDATA tables (1-Ref) */ | |||
| ff_vc1_1ref_mvdata_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 39]]; | |||
| ff_vc1_1ref_mvdata_vlc[i].table_allocated = vlc_offs[i * 3 + 40] - vlc_offs[i * 3 + 39]; | |||
| init_vlc(&ff_vc1_1ref_mvdata_vlc[i], VC1_1REF_MVDATA_VLC_BITS, 72, | |||
| ff_vc1_1ref_mvdata_bits[i], 1, 1, | |||
| ff_vc1_1ref_mvdata_codes[i], 4, 4, INIT_VLC_USE_NEW_STATIC); | |||
| } | |||
| for (i = 0; i < 4; i++) { | |||
| /* Initialize 2MV Block pattern VLC tables */ | |||
| ff_vc1_2mv_block_pattern_vlc[i].table = &vlc_table[vlc_offs[i + 49]]; | |||
| ff_vc1_2mv_block_pattern_vlc[i].table_allocated = vlc_offs[i + 50] - vlc_offs[i + 49]; | |||
| init_vlc(&ff_vc1_2mv_block_pattern_vlc[i], VC1_2MV_BLOCK_PATTERN_VLC_BITS, 4, | |||
| ff_vc1_2mv_block_pattern_bits[i], 1, 1, | |||
| ff_vc1_2mv_block_pattern_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); | |||
| } | |||
| for (i = 0; i < 8; i++) { | |||
| /* Initialize interlaced CBPCY VLC tables (Table 124 - Table 131) */ | |||
| ff_vc1_icbpcy_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 53]]; | |||
| ff_vc1_icbpcy_vlc[i].table_allocated = vlc_offs[i * 3 + 54] - vlc_offs[i * 3 + 53]; | |||
| init_vlc(&ff_vc1_icbpcy_vlc[i], VC1_ICBPCY_VLC_BITS, 63, | |||
| ff_vc1_icbpcy_p_bits[i], 1, 1, | |||
| ff_vc1_icbpcy_p_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC); | |||
| /* Initialize interlaced field picture MBMODE VLC tables */ | |||
| ff_vc1_if_mmv_mbmode_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 54]]; | |||
| ff_vc1_if_mmv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 55] - vlc_offs[i * 3 + 54]; | |||
| init_vlc(&ff_vc1_if_mmv_mbmode_vlc[i], VC1_IF_MMV_MBMODE_VLC_BITS, 8, | |||
| ff_vc1_if_mmv_mbmode_bits[i], 1, 1, | |||
| ff_vc1_if_mmv_mbmode_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); | |||
| ff_vc1_if_1mv_mbmode_vlc[i].table = &vlc_table[vlc_offs[i * 3 + 55]]; | |||
| ff_vc1_if_1mv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 56] - vlc_offs[i * 3 + 55]; | |||
| init_vlc(&ff_vc1_if_1mv_mbmode_vlc[i], VC1_IF_1MV_MBMODE_VLC_BITS, 6, | |||
| ff_vc1_if_1mv_mbmode_bits[i], 1, 1, | |||
| ff_vc1_if_1mv_mbmode_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC); | |||
| } | |||
| done = 1; | |||
| } | |||
| /* Other defaults */ | |||
| v->pq = -1; | |||
| v->mvrange = 0; /* 7.1.1.18, p80 */ | |||
| return 0; | |||
| } | |||
| /***********************************************************************/ | |||
| /** | |||
| * @name VC-1 Bitplane decoding | |||
| @@ -2624,7 +2482,7 @@ static void vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip, | |||
| int index, escape, run = 0, level = 0, lst = 0; | |||
| index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3); | |||
| if (index != vc1_ac_sizes[codingset] - 1) { | |||
| if (index != ff_vc1_ac_sizes[codingset] - 1) { | |||
| run = vc1_index_decode_table[codingset][index][0]; | |||
| level = vc1_index_decode_table[codingset][index][1]; | |||
| lst = index >= vc1_last_decode_table[codingset] || get_bits_left(gb) < 0; | |||
| @@ -22,6 +22,7 @@ | |||
| #include "avcodec.h" | |||
| #include "sinewin.h" | |||
| #include "wma.h" | |||
| #include "wma_common.h" | |||
| #include "wmadata.h" | |||
| #undef NDEBUG | |||
| @@ -67,46 +68,6 @@ static void init_coef_vlc(VLC *vlc, uint16_t **prun_table, | |||
| av_free(level_table); | |||
| } | |||
| /** | |||
| *@brief Get the samples per frame for this stream. | |||
| *@param sample_rate output sample_rate | |||
| *@param version wma version | |||
| *@param decode_flags codec compression features | |||
| *@return log2 of the number of output samples per frame | |||
| */ | |||
| int av_cold ff_wma_get_frame_len_bits(int sample_rate, int version, | |||
| unsigned int decode_flags) | |||
| { | |||
| int frame_len_bits; | |||
| if (sample_rate <= 16000) { | |||
| frame_len_bits = 9; | |||
| } else if (sample_rate <= 22050 || | |||
| (sample_rate <= 32000 && version == 1)) { | |||
| frame_len_bits = 10; | |||
| } else if (sample_rate <= 48000 || version < 3) { | |||
| frame_len_bits = 11; | |||
| } else if (sample_rate <= 96000) { | |||
| frame_len_bits = 12; | |||
| } else { | |||
| frame_len_bits = 13; | |||
| } | |||
| if (version == 3) { | |||
| int tmp = decode_flags & 0x6; | |||
| if (tmp == 0x2) { | |||
| ++frame_len_bits; | |||
| } else if (tmp == 0x4) { | |||
| --frame_len_bits; | |||
| } else if (tmp == 0x6) { | |||
| frame_len_bits -= 2; | |||
| } | |||
| } | |||
| return frame_len_bits; | |||
| } | |||
| int ff_wma_init(AVCodecContext *avctx, int flags2) | |||
| { | |||
| WMACodecContext *s = avctx->priv_data; | |||
| @@ -150,8 +150,6 @@ extern const float ff_wma_lsp_codebook[NB_LSP_COEFS][16]; | |||
| extern const uint32_t ff_aac_scalefactor_code[121]; | |||
| extern const uint8_t ff_aac_scalefactor_bits[121]; | |||
| int av_cold ff_wma_get_frame_len_bits(int sample_rate, int version, | |||
| unsigned int decode_flags); | |||
| int ff_wma_init(AVCodecContext * avctx, int flags2); | |||
| int ff_wma_total_gain_to_bits(int total_gain); | |||
| int ff_wma_end(AVCodecContext *avctx); | |||
| @@ -0,0 +1,62 @@ | |||
| /* | |||
| * common code shared by all WMA variants | |||
| * | |||
| * This file is part of Libav. | |||
| * | |||
| * Libav is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU Lesser General Public | |||
| * License as published by the Free Software Foundation; either | |||
| * version 2.1 of the License, or (at your option) any later version. | |||
| * | |||
| * Libav is distributed in the hope that 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 Libav; if not, write to the Free Software | |||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||
| */ | |||
| #include "libavutil/attributes.h" | |||
| #include "wma_common.h" | |||
| /** | |||
| *@brief Get the samples per frame for this stream. | |||
| *@param sample_rate output sample_rate | |||
| *@param version wma version | |||
| *@param decode_flags codec compression features | |||
| *@return log2 of the number of output samples per frame | |||
| */ | |||
| int av_cold ff_wma_get_frame_len_bits(int sample_rate, int version, | |||
| unsigned int decode_flags) | |||
| { | |||
| int frame_len_bits; | |||
| if (sample_rate <= 16000) { | |||
| frame_len_bits = 9; | |||
| } else if (sample_rate <= 22050 || | |||
| (sample_rate <= 32000 && version == 1)) { | |||
| frame_len_bits = 10; | |||
| } else if (sample_rate <= 48000 || version < 3) { | |||
| frame_len_bits = 11; | |||
| } else if (sample_rate <= 96000) { | |||
| frame_len_bits = 12; | |||
| } else { | |||
| frame_len_bits = 13; | |||
| } | |||
| if (version == 3) { | |||
| int tmp = decode_flags & 0x6; | |||
| if (tmp == 0x2) { | |||
| ++frame_len_bits; | |||
| } else if (tmp == 0x4) { | |||
| --frame_len_bits; | |||
| } else if (tmp == 0x6) { | |||
| frame_len_bits -= 2; | |||
| } | |||
| } | |||
| return frame_len_bits; | |||
| } | |||
| @@ -0,0 +1,29 @@ | |||
| /* | |||
| * common code shared by all WMA variants | |||
| * | |||
| * This file is part of Libav. | |||
| * | |||
| * Libav is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU Lesser General Public | |||
| * License as published by the Free Software Foundation; either | |||
| * version 2.1 of the License, or (at your option) any later version. | |||
| * | |||
| * Libav is distributed in the hope that 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 Libav; if not, write to the Free Software | |||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||
| */ | |||
| #ifndef AVCODEC_WMA_COMMON_H | |||
| #define AVCODEC_WMA_COMMON_H | |||
| #include "libavutil/attributes.h" | |||
| int av_cold ff_wma_get_frame_len_bits(int sample_rate, int version, | |||
| unsigned int decode_flags); | |||
| #endif /* AVCODEC_WMA_COMMON_H */ | |||
| @@ -27,6 +27,7 @@ | |||
| #include "get_bits.h" | |||
| #include "put_bits.h" | |||
| #include "wma.h" | |||
| #include "wma_common.h" | |||
| /** current decoder limitations */ | |||
| #define WMALL_MAX_CHANNELS 8 ///< max number of handled channels | |||
| @@ -406,7 +407,6 @@ static void decode_mclms(WmallDecodeCtx *s) | |||
| if (get_bits1(&s->gb)) { | |||
| int i, send_coef_bits; | |||
| int cbits = av_log2(s->mclms_scaling + 1); | |||
| assert(cbits == my_log2(s->mclms_scaling + 1)); | |||
| if (1 << cbits < s->mclms_scaling + 1) | |||
| cbits++; | |||
| @@ -97,6 +97,7 @@ | |||
| #include "fmtconvert.h" | |||
| #include "sinewin.h" | |||
| #include "wma.h" | |||
| #include "wma_common.h" | |||
| /** current decoder limitations */ | |||
| #define WMAPRO_MAX_CHANNELS 8 ///< max number of handled channels | |||
| @@ -35,13 +35,12 @@ pb_bswap32: db 3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 15, 14, 13, 12 | |||
| SECTION_TEXT | |||
| %macro SCALARPRODUCT 1 | |||
| ; int scalarproduct_int16(int16_t *v1, int16_t *v2, int order, int shift) | |||
| cglobal scalarproduct_int16_%1, 3,3,4, v1, v2, order, shift | |||
| ; int scalarproduct_int16(int16_t *v1, int16_t *v2, int order) | |||
| cglobal scalarproduct_int16_%1, 3,3,3, v1, v2, order | |||
| shl orderq, 1 | |||
| add v1q, orderq | |||
| add v2q, orderq | |||
| neg orderq | |||
| movd m3, shiftm | |||
| pxor m2, m2 | |||
| .loop: | |||
| movu m0, [v1q + orderq] | |||
| @@ -55,10 +54,8 @@ cglobal scalarproduct_int16_%1, 3,3,4, v1, v2, order, shift | |||
| %if mmsize == 16 | |||
| movhlps m0, m2 | |||
| paddd m2, m0 | |||
| psrad m2, m3 | |||
| pshuflw m0, m2, 0x4e | |||
| %else | |||
| psrad m2, m3 | |||
| pshufw m0, m2, 0x4e | |||
| %endif | |||
| paddd m2, m0 | |||
| @@ -1161,16 +1161,6 @@ QPEL(put_, 16,XMM, 16)\ | |||
| QPEL(avg_, 8, XMM, 16)\ | |||
| QPEL(avg_, 16,XMM, 16)\ | |||
| #define AVG_3DNOW_OP(a,b,temp, size) \ | |||
| "mov" #size " " #b ", " #temp " \n\t"\ | |||
| "pavgusb " #temp ", " #a " \n\t"\ | |||
| "mov" #size " " #a ", " #b " \n\t" | |||
| #define AVG_MMX2_OP(a,b,temp, size) \ | |||
| "mov" #size " " #b ", " #temp " \n\t"\ | |||
| "pavgb " #temp ", " #a " \n\t"\ | |||
| "mov" #size " " #a ", " #b " \n\t" | |||
| #define PAVGB "pavgusb" | |||
| QPEL_H264(put_, PUT_OP, 3dnow) | |||
| QPEL_H264(avg_, AVG_3DNOW_OP, 3dnow) | |||
| @@ -82,14 +82,14 @@ cglobal sbr_hf_g_filt, 5, 6, 5 | |||
| lea r0, [r0 + r3*8] | |||
| neg r3 | |||
| .loop4: | |||
| movq m0, [r2 + 4*r3 + 0] | |||
| movq m1, [r2 + 4*r3 + 8] | |||
| movq m2, [r1 + 0*STEP] | |||
| movq m3, [r1 + 2*STEP] | |||
| movlps m0, [r2 + 4*r3 + 0] | |||
| movlps m1, [r2 + 4*r3 + 8] | |||
| movlps m2, [r1 + 0*STEP] | |||
| movlps m3, [r1 + 2*STEP] | |||
| movhps m2, [r1 + 1*STEP] | |||
| movhps m3, [r1 + 3*STEP] | |||
| punpckldq m0, m0 | |||
| punpckldq m1, m1 | |||
| unpcklps m0, m0 | |||
| unpcklps m1, m1 | |||
| mulps m0, m2 | |||
| mulps m1, m3 | |||
| movu [r0 + 8*r3 + 0], m0 | |||
| @@ -101,8 +101,8 @@ cglobal sbr_hf_g_filt, 5, 6, 5 | |||
| jz .end | |||
| .loop1: ; element 0 and 1 can be computed at the same time | |||
| movss m0, [r2] | |||
| movq m2, [r1] | |||
| punpckldq m0, m0 | |||
| movlps m2, [r1] | |||
| unpcklps m0, m0 | |||
| mulps m2, m0 | |||
| movlps [r0], m2 | |||
| add r0, 8 | |||
| @@ -267,8 +267,15 @@ static int smacker_read_packet(AVFormatContext *s, AVPacket *pkt) | |||
| sz += (t & 0x7F) + 1; | |||
| pal += ((t & 0x7F) + 1) * 3; | |||
| } else if(t & 0x40){ /* copy with offset */ | |||
| off = avio_r8(s->pb) * 3; | |||
| off = avio_r8(s->pb); | |||
| j = (t & 0x3F) + 1; | |||
| if (off + j > 0xff) { | |||
| av_log(s, AV_LOG_ERROR, | |||
| "Invalid palette update, offset=%d length=%d extends beyond palette size\n", | |||
| off, j); | |||
| return AVERROR_INVALIDDATA; | |||
| } | |||
| off *= 3; | |||
| while(j-- && sz < 256) { | |||
| *pal++ = oldpal[off + 0]; | |||
| *pal++ = oldpal[off + 1]; | |||
| @@ -480,8 +480,10 @@ static int udp_open(URLContext *h, const char *uri, int flags) | |||
| } | |||
| /* bind to the local address if not multicast or if the multicast | |||
| * bind failed */ | |||
| if (bind_ret < 0 && bind(udp_fd,(struct sockaddr *)&my_addr, len) < 0) | |||
| if (bind_ret < 0 && bind(udp_fd,(struct sockaddr *)&my_addr, len) < 0) { | |||
| av_log(h, AV_LOG_ERROR, "bind failed: %s\n", strerror(errno)); | |||
| goto fail; | |||
| } | |||
| len = sizeof(my_addr); | |||
| getsockname(udp_fd, (struct sockaddr *)&my_addr, &len); | |||
| @@ -548,6 +548,11 @@ yuv2422_1_c_template(SwsContext *c, const int16_t *buf0, | |||
| V = av_clip_uint8(V); | |||
| } | |||
| Y1 = av_clip_uint8(Y1); | |||
| Y2 = av_clip_uint8(Y2); | |||
| U = av_clip_uint8(U); | |||
| V = av_clip_uint8(V); | |||
| output_pixels(i * 4, Y1, U, Y2, V); | |||
| } | |||
| } else { | |||
| @@ -565,6 +570,11 @@ yuv2422_1_c_template(SwsContext *c, const int16_t *buf0, | |||
| V = av_clip_uint8(V); | |||
| } | |||
| Y1 = av_clip_uint8(Y1); | |||
| Y2 = av_clip_uint8(Y2); | |||
| U = av_clip_uint8(U); | |||
| V = av_clip_uint8(V); | |||
| output_pixels(i * 4, Y1, U, Y2, V); | |||
| } | |||
| } | |||
| @@ -1008,9 +1018,16 @@ yuv2rgb_2_c_template(SwsContext *c, const int16_t *buf[2], | |||
| *g = (c->table_gU[U + YUVRGB_TABLE_HEADROOM] + c->table_gV[V + YUVRGB_TABLE_HEADROOM]), | |||
| *b = c->table_bU[U + YUVRGB_TABLE_HEADROOM]; | |||
| Y1 = av_clip_uint8(Y1); | |||
| Y2 = av_clip_uint8(Y2); | |||
| U = av_clip_uint8(U); | |||
| V = av_clip_uint8(V); | |||
| if (hasAlpha) { | |||
| A1 = (abuf0[i * 2 ] * yalpha1 + abuf1[i * 2 ] * yalpha) >> 19; | |||
| A2 = (abuf0[i * 2 + 1] * yalpha1 + abuf1[i * 2 + 1] * yalpha) >> 19; | |||
| A1 = av_clip_uint8(A1); | |||
| A2 = av_clip_uint8(A2); | |||
| } | |||
| yuv2rgb_write(dest, i, Y1, Y2, hasAlpha ? A1 : 0, hasAlpha ? A2 : 0, | |||
| @@ -1039,9 +1056,16 @@ yuv2rgb_1_c_template(SwsContext *c, const int16_t *buf0, | |||
| *g = (c->table_gU[U + YUVRGB_TABLE_HEADROOM] + c->table_gV[V + YUVRGB_TABLE_HEADROOM]), | |||
| *b = c->table_bU[U + YUVRGB_TABLE_HEADROOM]; | |||
| Y1 = av_clip_uint8(Y1); | |||
| Y2 = av_clip_uint8(Y2); | |||
| U = av_clip_uint8(U); | |||
| V = av_clip_uint8(V); | |||
| if (hasAlpha) { | |||
| A1 = abuf0[i * 2 ] * 255 + 16384 >> 15; | |||
| A2 = abuf0[i * 2 + 1] * 255 + 16384 >> 15; | |||
| A1 = av_clip_uint8(A1); | |||
| A2 = av_clip_uint8(A2); | |||
| } | |||
| yuv2rgb_write(dest, i, Y1, Y2, hasAlpha ? A1 : 0, hasAlpha ? A2 : 0, | |||
| @@ -1059,9 +1083,16 @@ yuv2rgb_1_c_template(SwsContext *c, const int16_t *buf0, | |||
| *g = (c->table_gU[U + YUVRGB_TABLE_HEADROOM] + c->table_gV[V + YUVRGB_TABLE_HEADROOM]), | |||
| *b = c->table_bU[U + YUVRGB_TABLE_HEADROOM]; | |||
| Y1 = av_clip_uint8(Y1); | |||
| Y2 = av_clip_uint8(Y2); | |||
| U = av_clip_uint8(U); | |||
| V = av_clip_uint8(V); | |||
| if (hasAlpha) { | |||
| A1 = (abuf0[i * 2 ] + 64) >> 7; | |||
| A2 = (abuf0[i * 2 + 1] + 64) >> 7; | |||
| A1 = av_clip_uint8(A1); | |||
| A2 = av_clip_uint8(A2); | |||
| } | |||
| yuv2rgb_write(dest, i, Y1, Y2, hasAlpha ? A1 : 0, hasAlpha ? A2 : 0, | |||