* 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 | ffmpeg -f sndio -i /dev/audio0 /tmp/oss.wav | ||||
| @end example | @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 | The name of the device to grab is a file device node, usually Linux | ||||
| systems tend to automatically create such nodes when the device | 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 | kind @file{/dev/video@var{N}}, where @var{N} is a number associated to | ||||
| the device. | 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 | @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" | Note that if FFmpeg is build with v4l-utils support ("--enable-libv4l2" | ||||
| option), it will always be used. | option), it will always be used. | ||||
| Follow some usage examples of the video4linux devices with the ff* | |||||
| tools. | |||||
| @example | @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 | @end example | ||||
| "v4l" and "v4l2" can be used as aliases for the respective "video4linux" and | "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_BETHSOFTVID_DECODER) += bethsoftvideo.o | ||||
| OBJS-$(CONFIG_BFI_DECODER) += bfi.o | OBJS-$(CONFIG_BFI_DECODER) += bfi.o | ||||
| OBJS-$(CONFIG_BINK_DECODER) += bink.o binkdsp.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_BINTEXT_DECODER) += bintext.o cga_data.o | ||||
| OBJS-$(CONFIG_BMP_DECODER) += bmp.o msrledec.o | OBJS-$(CONFIG_BMP_DECODER) += bmp.o msrledec.o | ||||
| OBJS-$(CONFIG_BMP_ENCODER) += bmpenc.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_VP8_DECODER) += vp8.o vp8dsp.o vp56rac.o | ||||
| OBJS-$(CONFIG_VQA_DECODER) += vqavideo.o | OBJS-$(CONFIG_VQA_DECODER) += vqavideo.o | ||||
| OBJS-$(CONFIG_WAVPACK_DECODER) += wavpack.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 \ | OBJS-$(CONFIG_WMAVOICE_DECODER) += wmavoice.o \ | ||||
| celp_math.o celp_filters.o \ | celp_math.o celp_filters.o \ | ||||
| acelp_vectors.o acelp_filters.o | acelp_vectors.o acelp_filters.o | ||||
| @@ -116,7 +116,7 @@ int16_t ff_acelp_decode_gain_code( | |||||
| ); | ); | ||||
| #else | #else | ||||
| mr_energy = gain_corr_factor * exp(M_LN10 / (20 << 23) * mr_energy) / | 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; | return mr_energy >> 12; | ||||
| #endif | #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); | 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, | int32_t ff_scalarproduct_and_madd_int16_neon(int16_t *v1, const int16_t *v2, | ||||
| const int16_t *v3, int len, int mul); | 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 q1, #0 | ||||
| vmov.i16 q2, #0 | vmov.i16 q2, #0 | ||||
| vmov.i16 q3, #0 | vmov.i16 q3, #0 | ||||
| negs r3, r3 | |||||
| beq 2f | |||||
| vdup.s32 q12, r3 | |||||
| 1: vld1.16 {d16-d17}, [r0]! | 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]! | vld1.16 {d20-d21}, [r1,:128]! | ||||
| vmlal.s16 q0, d16, d20 | vmlal.s16 q0, d16, d20 | ||||
| vld1.16 {d18-d19}, [r0]! | vld1.16 {d18-d19}, [r0]! | ||||
| @@ -62,9 +38,9 @@ function ff_scalarproduct_int16_neon, export=1 | |||||
| vmlal.s16 q2, d18, d22 | vmlal.s16 q2, d18, d22 | ||||
| vmlal.s16 q3, d19, d23 | vmlal.s16 q3, d19, d23 | ||||
| subs r2, r2, #16 | 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 d17, d2, d3 | ||||
| vpadd.s32 d10, d4, d5 | vpadd.s32 d10, d4, d5 | ||||
| vpadd.s32 d11, d6, d7 | vpadd.s32 d11, d6, d7 | ||||
| @@ -855,8 +855,8 @@ static int joint_decode(COOKContext *q, COOKSubpacket *p, float *mlt_buffer1, | |||||
| cpl_tmp = cplband[i]; | cpl_tmp = cplband[i]; | ||||
| idx -= decouple_tab[cpl_tmp]; | idx -= decouple_tab[cpl_tmp]; | ||||
| cplscale = q->cplscales[p->js_vlc_bits - 2]; // choose decoupler table | 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); | q->decouple(q, p, i, f1, f2, decode_buffer, mlt_buffer1, mlt_buffer2); | ||||
| idx = (1 << p->js_vlc_bits) - 1; | idx = (1 << p->js_vlc_bits) - 1; | ||||
| } | } | ||||
| @@ -510,23 +510,37 @@ static const int cplband[51] = { | |||||
| 19, | 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.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.981279790401459,0.936997592449188,0.875934481620789,0.70710676908493, | ||||
| 0.482430040836334,0.349335819482803,0.192587479948997, | 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.991486728191376,0.973249018192291,0.953020632266998,0.930133521556854, | ||||
| 0.903453230857849,0.870746195316315,0.826180458068848,0.70710676908493, | 0.903453230857849,0.870746195316315,0.826180458068848,0.70710676908493, | ||||
| 0.563405573368073,0.491732746362686,0.428686618804932,0.367221474647522, | 0.563405573368073,0.491732746362686,0.428686618804932,0.367221474647522, | ||||
| 0.302905440330505,0.229752898216248,0.130207896232605, | 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.995926380157471,0.987517595291138,0.978726446628571,0.969505727291107, | ||||
| 0.95979779958725,0.949531257152557,0.938616216182709,0.926936149597168, | 0.95979779958725,0.949531257152557,0.938616216182709,0.926936149597168, | ||||
| 0.914336204528809,0.900602877140045,0.885426938533783,0.868331849575043, | 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.464778542518616,0.434642940759659,0.404955863952637,0.375219136476517, | ||||
| 0.344963222742081,0.313672333955765,0.280692428350449,0.245068684220314, | 0.344963222742081,0.313672333955765,0.280692428350449,0.245068684220314, | ||||
| 0.205169528722763,0.157508864998817,0.0901700109243393, | 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.998005926609039,0.993956744670868,0.989822506904602,0.985598564147949, | ||||
| 0.981279790401459,0.976860702037811,0.972335040569305,0.967696130275726, | 0.981279790401459,0.976860702037811,0.972335040569305,0.967696130275726, | ||||
| 0.962936460971832,0.958047747612000,0.953020632266998,0.947844684123993, | 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.302905440330505,0.286608695983887,0.269728302955627,0.252119421958923, | ||||
| 0.233590632677078,0.213876649737358,0.192587479948997,0.169101938605309, | 0.233590632677078,0.213876649737358,0.192587479948997,0.169101938605309, | ||||
| 0.142307326197624,0.109772264957428,0.0631198287010193, | 0.142307326197624,0.109772264957428,0.0631198287010193, | ||||
| 0, | |||||
| }; | }; | ||||
| static const float* const cplscales[5] = { | 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) { | if (level < 5) { | ||||
| /* huffman encoded */ | /* huffman encoded */ | ||||
| value += get_bitalloc(gb, &dca_scalefactor, level); | 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; | 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++) { | for (j = base_channel; j < s->prim_channels; j++) { | ||||
| const uint32_t *scale_table; | const uint32_t *scale_table; | ||||
| unsigned int scale_max; | |||||
| int scale_sum; | |||||
| int scale_sum, log_size; | |||||
| memset(s->scale_factor[j], 0, | memset(s->scale_factor[j], 0, | ||||
| s->subband_activity[j] * sizeof(s->scale_factor[0][0][0]) * 2); | s->subband_activity[j] * sizeof(s->scale_factor[0][0][0]) * 2); | ||||
| if (s->scalefactor_huffman[j] == 6) { | if (s->scalefactor_huffman[j] == 6) { | ||||
| scale_table = scale_factor_quant7; | scale_table = scale_factor_quant7; | ||||
| scale_max = 127; | |||||
| log_size = 7; | |||||
| } else { | } else { | ||||
| scale_table = scale_factor_quant6; | scale_table = scale_factor_quant6; | ||||
| scale_max = 63; | |||||
| log_size = 6; | |||||
| } | } | ||||
| /* When huffman coded, only the difference is encoded */ | /* 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++) { | for (k = 0; k < s->subband_activity[j]; k++) { | ||||
| if (k >= s->vq_start_subband[j] || s->bitalloc[j][k] > 0) { | 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]; | s->scale_factor[j][k][0] = scale_table[scale_sum]; | ||||
| } | } | ||||
| if (k < s->vq_start_subband[j] && s->transition_mode[j][k]) { | if (k < s->vq_start_subband[j] && s->transition_mode[j][k]) { | ||||
| /* Get second scale factor */ | /* 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]; | 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 ???) */ | * (is this valid as well for joint scales ???) */ | ||||
| for (k = s->subband_activity[j]; k < s->subband_activity[source_channel]; k++) { | 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]; */ | 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 { | } else { | ||||
| int am = s->amode & DCA_CHANNEL_MASK; | 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++) { | for (j = base_channel; j < s->prim_channels; j++) { | ||||
| s->downmix_coef[j][0] = dca_default_coeffs[am][j][0]; | s->downmix_coef[j][0] = dca_default_coeffs[am][j][0]; | ||||
| s->downmix_coef[j][1] = dca_default_coeffs[am][j][1]; | 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, | 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 }, }, | { { 13, 13 }, }, | ||||
| { { 0, 64 }, { 64, 0 }, }, | { { 0, 64 }, { 64, 0 }, }, | ||||
| { { 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; | int res = 0; | ||||
| while (order--) | while (order--) | ||||
| res += (*v1++ * *v2++) >> shift; | |||||
| res += *v1++ * *v2++; | |||||
| return res; | return res; | ||||
| } | } | ||||
| @@ -537,9 +537,8 @@ typedef struct DSPContext { | |||||
| /** | /** | ||||
| * Calculate scalar product of two vectors. | * Calculate scalar product of two vectors. | ||||
| * @param len length of vectors, should be multiple of 16 | * @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 */ | /* ape functions */ | ||||
| /** | /** | ||||
| * Calculate scalar product of v1 and v2, | * 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 DVprofile* avpriv_dv_frame_profile2(AVCodecContext* codec, const DVprofile *sys, | ||||
| const uint8_t* frame, unsigned buf_size) | 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, | const DVprofile* avpriv_dv_frame_profile(const DVprofile *sys, | ||||
| @@ -43,6 +43,7 @@ typedef struct TgqContext { | |||||
| ScanTable scantable; | ScanTable scantable; | ||||
| int qtable[64]; | int qtable[64]; | ||||
| DECLARE_ALIGNED(16, DCTELEM, block)[6][64]; | DECLARE_ALIGNED(16, DCTELEM, block)[6][64]; | ||||
| GetByteContext gb; | |||||
| } TgqContext; | } TgqContext; | ||||
| static av_cold int tgq_decode_init(AVCodecContext *avctx){ | 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 mode; | ||||
| int i; | int i; | ||||
| int8_t dc[6]; | 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) { | if (mode>12) { | ||||
| GetBitContext gb; | 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++) | for(i=0; i<6; i++) | ||||
| tgq_decode_block(s, s->block[i], &gb); | tgq_decode_block(s, s->block[i], &gb); | ||||
| tgq_idct_put_mb(s, s->block, mb_x, mb_y); | tgq_idct_put_mb(s, s->block, mb_x, mb_y); | ||||
| bytestream2_skip(&s->gb, mode); | |||||
| }else{ | }else{ | ||||
| if (mode==3) { | 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) { | }else if (mode==6) { | ||||
| memcpy(dc, *bs, 6); | |||||
| bytestream2_get_buffer(&s->gb, dc, 6); | |||||
| }else if (mode==12) { | }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{ | }else{ | ||||
| av_log(s->avctx, AV_LOG_ERROR, "unsupported mb mode %i\n", mode); | av_log(s->avctx, AV_LOG_ERROR, "unsupported mb mode %i\n", mode); | ||||
| } | } | ||||
| tgq_idct_put_mb_dconly(s, mb_x, mb_y, dc); | tgq_idct_put_mb_dconly(s, mb_x, mb_y, dc); | ||||
| } | } | ||||
| *bs += mode; | |||||
| return 0; | |||||
| } | } | ||||
| static void tgq_calculate_qtable(TgqContext *s, int quant){ | static void tgq_calculate_qtable(TgqContext *s, int quant){ | ||||
| @@ -195,28 +191,30 @@ static int tgq_decode_frame(AVCodecContext *avctx, | |||||
| AVPacket *avpkt){ | AVPacket *avpkt){ | ||||
| const uint8_t *buf = avpkt->data; | const uint8_t *buf = avpkt->data; | ||||
| int buf_size = avpkt->size; | int buf_size = avpkt->size; | ||||
| const uint8_t *buf_start = buf; | |||||
| const uint8_t *buf_end = buf + buf_size; | |||||
| TgqContext *s = avctx->priv_data; | TgqContext *s = avctx->priv_data; | ||||
| int x,y, ret; | int x,y, ret; | ||||
| int big_endian = AV_RL32(&buf[4]) > 0x000FFFFF; | 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"); | av_log(avctx, AV_LOG_WARNING, "truncated header\n"); | ||||
| return -1; | 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) { | if (s->avctx->width!=s->width || s->avctx->height!=s->height) { | ||||
| avcodec_set_dimensions(s->avctx, s->width, s->height); | avcodec_set_dimensions(s->avctx, s->width, s->height); | ||||
| if (s->frame.data[0]) | if (s->frame.data[0]) | ||||
| avctx->release_buffer(avctx, &s->frame); | 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]) { | if (!s->frame.data[0]) { | ||||
| s->frame.key_frame = 1; | 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); | *data_size = sizeof(AVFrame); | ||||
| *(AVFrame*)data = s->frame; | *(AVFrame*)data = s->frame; | ||||
| return buf-buf_start; | |||||
| return avpkt->size; | |||||
| } | } | ||||
| static av_cold int tgq_decode_end(AVCodecContext *avctx){ | 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, | ener = dsp->scalarproduct_int16(sig_scaled + RES_PREV_DATA_SIZE, | ||||
| sig_scaled + RES_PREV_DATA_SIZE, | sig_scaled + RES_PREV_DATA_SIZE, | ||||
| subframe_size, 0); | |||||
| subframe_size); | |||||
| if (ener) { | if (ener) { | ||||
| sh_ener = FFMAX(av_log2(ener) - 14, 0); | sh_ener = FFMAX(av_log2(ener) - 14, 0); | ||||
| ener >>= sh_ener; | 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++) { | for (i = pitch_delay_int - 1; i <= pitch_delay_int + 1; i++) { | ||||
| sum = dsp->scalarproduct_int16(sig_scaled + RES_PREV_DATA_SIZE, | sum = dsp->scalarproduct_int16(sig_scaled + RES_PREV_DATA_SIZE, | ||||
| sig_scaled + RES_PREV_DATA_SIZE - i, | sig_scaled + RES_PREV_DATA_SIZE - i, | ||||
| subframe_size, 0); | |||||
| subframe_size); | |||||
| if (sum > corr_int_num) { | if (sum > corr_int_num) { | ||||
| corr_int_num = sum; | corr_int_num = sum; | ||||
| best_delay_int = i; | 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). */ | /* Compute denominator of pseudo-normalized correlation R'(0). */ | ||||
| corr_int_den = dsp->scalarproduct_int16(sig_scaled - best_delay_int + RES_PREV_DATA_SIZE, | corr_int_den = dsp->scalarproduct_int16(sig_scaled - best_delay_int + RES_PREV_DATA_SIZE, | ||||
| 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), | /* Compute signals with non-integer delay k (with 1/8 precision), | ||||
| where k is in [0;6] range. | 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++) { | for (k = 0; k < ANALYZED_FRAC_DELAYS; k++) { | ||||
| sum = dsp->scalarproduct_int16(&delayed_signal[k][1], | sum = dsp->scalarproduct_int16(&delayed_signal[k][1], | ||||
| &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][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]; | 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). */ | correlation R'(k). */ | ||||
| sum = dsp->scalarproduct_int16(&delayed_signal[k][i], | sum = dsp->scalarproduct_int16(&delayed_signal[k][i], | ||||
| sig_scaled + RES_PREV_DATA_SIZE, | sig_scaled + RES_PREV_DATA_SIZE, | ||||
| subframe_size, 0); | |||||
| subframe_size); | |||||
| gain_num_short = FFMAX(sum >> sh_gain_num, 0); | 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. */ | /* Compute R'(k) correlation's numerator. */ | ||||
| sum = dsp->scalarproduct_int16(residual_filt, | sum = dsp->scalarproduct_int16(residual_filt, | ||||
| sig_scaled + RES_PREV_DATA_SIZE, | sig_scaled + RES_PREV_DATA_SIZE, | ||||
| subframe_size, 0); | |||||
| subframe_size); | |||||
| if (sum < 0) { | if (sum < 0) { | ||||
| gain_long_num = 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. */ | /* 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); | tmp = FFMAX(av_log2(sum) - 14, 0); | ||||
| sum >>= tmp; | 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 | /* Now lp_gn (starting with 10) contains impulse response | ||||
| of A(z/FORMANT_PP_FACTOR_NUM)/A(z/FORMANT_PP_FACTOR_DEN) filter. */ | 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 */ | /* downscale to avoid overflow */ | ||||
| temp = av_log2(rh0) - 14; | temp = av_log2(rh0) - 14; | ||||
| @@ -33,6 +33,7 @@ | |||||
| #include "libavutil/intreadwrite.h" | #include "libavutil/intreadwrite.h" | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "bytestream.h" | |||||
| #define MM_PREAMBLE_SIZE 6 | #define MM_PREAMBLE_SIZE 6 | ||||
| @@ -48,6 +49,7 @@ typedef struct MmContext { | |||||
| AVCodecContext *avctx; | AVCodecContext *avctx; | ||||
| AVFrame frame; | AVFrame frame; | ||||
| int palette[AVPALETTE_COUNT]; | int palette[AVPALETTE_COUNT]; | ||||
| GetByteContext gb; | |||||
| } MmContext; | } MmContext; | ||||
| static av_cold int mm_decode_init(AVCodecContext *avctx) | static av_cold int mm_decode_init(AVCodecContext *avctx) | ||||
| @@ -64,40 +66,40 @@ static av_cold int mm_decode_init(AVCodecContext *avctx) | |||||
| return 0; | 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; | 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; | s->palette[i+128] = s->palette[i]<<2; | ||||
| buf += 3; | |||||
| } | } | ||||
| return 0; | |||||
| } | } | ||||
| /** | /** | ||||
| * @param half_horiz Half horizontal resolution (0 or 1) | * @param half_horiz Half horizontal resolution (0 or 1) | ||||
| * @param half_vert Half vertical 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; | int i, x, y; | ||||
| i=0; x=0; y=0; | i=0; x=0; y=0; | ||||
| while(i<buf_size) { | |||||
| while (bytestream2_get_bytes_left(&s->gb) > 0) { | |||||
| int run_length, color; | int run_length, color; | ||||
| if (y >= s->avctx->height) | if (y >= s->avctx->height) | ||||
| return; | |||||
| return 0; | |||||
| if (buf[i] & 0x80) { | |||||
| color = bytestream2_get_byte(&s->gb); | |||||
| if (color & 0x80) { | |||||
| run_length = 1; | run_length = 1; | ||||
| color = buf[i]; | |||||
| i++; | |||||
| }else{ | }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) | 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; | y += 1 + half_vert; | ||||
| } | } | ||||
| } | } | ||||
| return 0; | |||||
| } | } | ||||
| /* | /* | ||||
| * @param half_horiz Half horizontal resolution (0 or 1) | * @param half_horiz Half horizontal resolution (0 or 1) | ||||
| * @param half_vert Half vertical 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 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) { | if (length==0) { | ||||
| y += x; | y += x; | ||||
| continue; | 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++) { | for(i=0; i<length; i++) { | ||||
| int replace_array = bytestream2_get_byte(&s->gb); | |||||
| for(j=0; j<8; j++) { | for(j=0; j<8; j++) { | ||||
| int replace = (buf[r+i] >> (7-j)) & 1; | |||||
| int replace = (replace_array >> (7-j)) & 1; | |||||
| if (replace) { | 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; | s->frame.data[0][y*s->frame.linesize[0] + x] = color; | ||||
| if (half_horiz) | if (half_horiz) | ||||
| s->frame.data[0][y*s->frame.linesize[0] + x + 1] = color; | 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) | if (half_horiz) | ||||
| s->frame.data[0][(y+1)*s->frame.linesize[0] + x + 1] = color; | s->frame.data[0][(y+1)*s->frame.linesize[0] + x + 1] = color; | ||||
| } | } | ||||
| d++; | |||||
| } | } | ||||
| x += 1 + half_horiz; | x += 1 + half_horiz; | ||||
| } | } | ||||
| } | } | ||||
| r += length; | |||||
| y += 1 + half_vert; | y += 1 + half_vert; | ||||
| } | } | ||||
| return 0; | |||||
| } | } | ||||
| static int mm_decode_frame(AVCodecContext *avctx, | static int mm_decode_frame(AVCodecContext *avctx, | ||||
| @@ -184,12 +180,14 @@ static int mm_decode_frame(AVCodecContext *avctx, | |||||
| const uint8_t *buf = avpkt->data; | const uint8_t *buf = avpkt->data; | ||||
| int buf_size = avpkt->size; | int buf_size = avpkt->size; | ||||
| MmContext *s = avctx->priv_data; | 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]); | type = AV_RL16(&buf[0]); | ||||
| buf += MM_PREAMBLE_SIZE; | buf += MM_PREAMBLE_SIZE; | ||||
| buf_size -= MM_PREAMBLE_SIZE; | buf_size -= MM_PREAMBLE_SIZE; | ||||
| bytestream2_init(&s->gb, buf, buf_size); | |||||
| if (avctx->reget_buffer(avctx, &s->frame) < 0) { | if (avctx->reget_buffer(avctx, &s->frame) < 0) { | ||||
| av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n"); | av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n"); | ||||
| @@ -197,16 +195,19 @@ static int mm_decode_frame(AVCodecContext *avctx, | |||||
| } | } | ||||
| switch(type) { | 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); | 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 | uint64_t state64; ///< contains the last 8 bytes in MSB order | ||||
| } ParseContext; | } ParseContext; | ||||
| struct MpegEncContext; | |||||
| #define END_NOT_FOUND (-100) | #define END_NOT_FOUND (-100) | ||||
| int ff_combine_frame(ParseContext *pc, int next, const uint8_t **buf, int *buf_size); | 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 */ | /* There's always an even number of channels in the source */ | ||||
| num_source_channels = FFALIGN(avctx->channels, 2); | 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; | samples = buf_size / sample_size; | ||||
| /* get output buffer */ | /* get output buffer */ | ||||
| @@ -155,6 +155,9 @@ static int raw_decode(AVCodecContext *avctx, | |||||
| frame->top_field_first = context->tff; | 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 ...) | //2bpp and 4bpp raw in avi and mov (yes this is ugly ...) | ||||
| if (context->buffer) { | if (context->buffer) { | ||||
| int i; | int i; | ||||
| @@ -182,9 +185,6 @@ static int raw_decode(AVCodecContext *avctx, | |||||
| avctx->codec_tag == MKTAG('A', 'V', 'u', 'p')) | avctx->codec_tag == MKTAG('A', 'V', 'u', 'p')) | ||||
| buf += buf_size - context->length; | 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); | avpicture_fill(picture, buf, avctx->pix_fmt, avctx->width, avctx->height); | ||||
| if((avctx->pix_fmt==PIX_FMT_PAL8 && buf_size < context->length) || | if((avctx->pix_fmt==PIX_FMT_PAL8 && buf_size < context->length) || | ||||
| (av_pix_fmt_descriptors[avctx->pix_fmt].flags & PIX_FMT_PSEUDOPAL)) { | (av_pix_fmt_descriptors[avctx->pix_fmt].flags & PIX_FMT_PSEUDOPAL)) { | ||||
| @@ -24,6 +24,7 @@ | |||||
| #include "libavutil/lfg.h" | #include "libavutil/lfg.h" | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "bytestream.h" | |||||
| #include "dsputil.h" | #include "dsputil.h" | ||||
| typedef struct { | typedef struct { | ||||
| @@ -53,8 +54,7 @@ typedef struct RoqContext { | |||||
| roq_cell cb2x2[256]; | roq_cell cb2x2[256]; | ||||
| roq_qcell cb4x4[256]; | roq_qcell cb4x4[256]; | ||||
| const unsigned char *buf; | |||||
| int size; | |||||
| GetByteContext gb; | |||||
| int width, height; | int width, height; | ||||
| /* Encoder only data */ | /* Encoder only data */ | ||||
| @@ -38,16 +38,15 @@ static void roqvideo_decode_frame(RoqContext *ri) | |||||
| unsigned int chunk_id = 0, chunk_arg = 0; | unsigned int chunk_id = 0, chunk_arg = 0; | ||||
| unsigned long chunk_size = 0; | unsigned long chunk_size = 0; | ||||
| int i, j, k, nv1, nv2, vqflg = 0, vqflg_pos = -1; | 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}}; | int frame_stats[2][4] = {{0},{0}}; | ||||
| roq_qcell *qcell; | 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) | if(chunk_id == RoQ_QUAD_VQ) | ||||
| break; | break; | ||||
| @@ -57,33 +56,36 @@ static void roqvideo_decode_frame(RoqContext *ri) | |||||
| if((nv2 = chunk_arg & 0xff) == 0 && nv1 * 6 < chunk_size) | if((nv2 = chunk_arg & 0xff) == 0 && nv1 * 6 < chunk_size) | ||||
| nv2 = 256; | nv2 = 256; | ||||
| for(i = 0; i < nv1; i++) { | 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(i = 0; i < nv2; i++) | ||||
| for(j = 0; j < 4; j++) | 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"); | 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 (yp = ypos; yp < ypos + 16; yp += 8) | ||||
| for (xp = xpos; xp < xpos + 16; xp += 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"); | av_log(ri->avctx, AV_LOG_ERROR, "Input buffer too small\n"); | ||||
| return; | return; | ||||
| } | } | ||||
| if (vqflg_pos < 0) { | if (vqflg_pos < 0) { | ||||
| vqflg = buf[bpos++]; vqflg |= (buf[bpos++] << 8); | |||||
| vqflg = bytestream2_get_le16(&ri->gb); | |||||
| vqflg_pos = 7; | vqflg_pos = 7; | ||||
| } | } | ||||
| vqid = (vqflg >> (vqflg_pos * 2)) & 0x3; | vqid = (vqflg >> (vqflg_pos * 2)) & 0x3; | ||||
| @@ -93,17 +95,19 @@ static void roqvideo_decode_frame(RoqContext *ri) | |||||
| switch(vqid) { | switch(vqid) { | ||||
| case RoQ_ID_MOT: | case RoQ_ID_MOT: | ||||
| break; | 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); | ff_apply_motion_8x8(ri, xp, yp, mx, my); | ||||
| break; | break; | ||||
| } | |||||
| case RoQ_ID_SLD: | 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; | break; | ||||
| case RoQ_ID_CCC: | case RoQ_ID_CCC: | ||||
| for (k = 0; k < 4; k++) { | for (k = 0; k < 4; k++) { | ||||
| @@ -111,13 +115,12 @@ static void roqvideo_decode_frame(RoqContext *ri) | |||||
| if(k & 0x01) x += 4; | if(k & 0x01) x += 4; | ||||
| if(k & 0x02) y += 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"); | av_log(ri->avctx, AV_LOG_ERROR, "Input buffer too small\n"); | ||||
| return; | return; | ||||
| } | } | ||||
| if (vqflg_pos < 0) { | if (vqflg_pos < 0) { | ||||
| vqflg = buf[bpos++]; | |||||
| vqflg |= (buf[bpos++] << 8); | |||||
| vqflg = bytestream2_get_le16(&ri->gb); | |||||
| vqflg_pos = 7; | vqflg_pos = 7; | ||||
| } | } | ||||
| vqid = (vqflg >> (vqflg_pos * 2)) & 0x3; | vqid = (vqflg >> (vqflg_pos * 2)) & 0x3; | ||||
| @@ -126,24 +129,25 @@ static void roqvideo_decode_frame(RoqContext *ri) | |||||
| switch(vqid) { | switch(vqid) { | ||||
| case RoQ_ID_MOT: | case RoQ_ID_MOT: | ||||
| break; | 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); | ff_apply_motion_4x4(ri, x, y, mx, my); | ||||
| break; | break; | ||||
| } | |||||
| case RoQ_ID_SLD: | 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; | break; | ||||
| case RoQ_ID_CCC: | 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; | break; | ||||
| } | } | ||||
| } | } | ||||
| @@ -199,8 +203,7 @@ static int roq_decode_frame(AVCodecContext *avctx, | |||||
| av_picture_copy((AVPicture*)s->current_frame, (AVPicture*)s->last_frame, | av_picture_copy((AVPicture*)s->current_frame, (AVPicture*)s->last_frame, | ||||
| avctx->pix_fmt, avctx->width, avctx->height); | 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); | roqvideo_decode_frame(s); | ||||
| *data_size = sizeof(AVFrame); | *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 A[2] = {0}, B[2], C[2]; | ||||
| int i, j; | int i, j; | ||||
| int mx, my; | 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]; | int c_off = part_sizes_w[block_type]; | ||||
| mv_pos += (subblock_no & 1) + (subblock_no >> 1)*s->b8_stride; | mv_pos += (subblock_no & 1) + (subblock_no >> 1)*s->b8_stride; | ||||
| if(subblock_no == 3) | if(subblock_no == 3) | ||||
| c_off = -1; | 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[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]; | 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[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]; | B[1] = s->current_picture_ptr->f.motion_val[0][mv_pos-s->b8_stride][1]; | ||||
| }else{ | }else{ | ||||
| B[0] = A[0]; | B[0] = A[0]; | ||||
| B[1] = A[1]; | 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[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]; | C[1] = s->current_picture_ptr->f.motion_val[0][mv_pos-s->b8_stride-1][1]; | ||||
| }else{ | }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 A[2] = {0}, B[2], C[2]; | ||||
| int i, j, k; | int i, j, k; | ||||
| int mx, my; | 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[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]; | 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[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]; | B[1] = s->current_picture_ptr->f.motion_val[0][mv_pos - s->b8_stride][1]; | ||||
| }else{ | }else{ | ||||
| B[0] = A[0]; | B[0] = A[0]; | ||||
| B[1] = A[1]; | 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[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]; | C[1] = s->current_picture_ptr->f.motion_val[0][mv_pos - s->b8_stride - 1][1]; | ||||
| }else{ | }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]; | q_ac = rv34_qscale_tab[s->qscale]; | ||||
| uint8_t *dst = s->dest[0]; | uint8_t *dst = s->dest[0]; | ||||
| DCTELEM *ptr = s->block[0]; | DCTELEM *ptr = s->block[0]; | ||||
| int avail[6*8] = {0}; | |||||
| int i, j, itype, has_ac; | int i, j, itype, has_ac; | ||||
| memset(block16, 0, 16 * sizeof(*block16)); | 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); | has_ac = rv34_decode_block(block16, gb, r->cur_vlcs, 3, 0, q_dc, q_dc, q_ac); | ||||
| if(has_ac) | if(has_ac) | ||||
| r->rdsp.rv34_inv_transform(block16); | 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) | static float sbr_sum_square_c(float (*x)[2], int n) | ||||
| { | { | ||||
| float sum = 0.0f; | |||||
| float sum0 = 0.0f, sum1 = 0.0f; | |||||
| int i; | 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) | static void sbr_neg_odd_64_c(float *x) | ||||
| @@ -34,6 +34,7 @@ | |||||
| #include "libavutil/intreadwrite.h" | #include "libavutil/intreadwrite.h" | ||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "bytestream.h" | |||||
| #define CPAIR 2 | #define CPAIR 2 | ||||
| #define CQUAD 4 | #define CQUAD 4 | ||||
| @@ -46,8 +47,7 @@ typedef struct SmcContext { | |||||
| AVCodecContext *avctx; | AVCodecContext *avctx; | ||||
| AVFrame frame; | AVFrame frame; | ||||
| const unsigned char *buf; | |||||
| int size; | |||||
| GetByteContext gb; | |||||
| /* SMC color tables */ | /* SMC color tables */ | ||||
| unsigned char color_pairs[COLORS_PER_TABLE * CPAIR]; | unsigned char color_pairs[COLORS_PER_TABLE * CPAIR]; | ||||
| @@ -58,7 +58,7 @@ typedef struct SmcContext { | |||||
| } SmcContext; | } SmcContext; | ||||
| #define GET_BLOCK_COUNT() \ | #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() \ | #define ADVANCE_BLOCK() \ | ||||
| { \ | { \ | ||||
| @@ -82,8 +82,8 @@ static void smc_decode_stream(SmcContext *s) | |||||
| int height = s->avctx->height; | int height = s->avctx->height; | ||||
| int stride = s->frame.linesize[0]; | int stride = s->frame.linesize[0]; | ||||
| int i; | int i; | ||||
| int stream_ptr = 0; | |||||
| int chunk_size; | int chunk_size; | ||||
| int buf_size = (int) (s->gb.buffer_end - s->gb.buffer_start); | |||||
| unsigned char opcode; | unsigned char opcode; | ||||
| int n_blocks; | int n_blocks; | ||||
| unsigned int color_flags; | unsigned int color_flags; | ||||
| @@ -113,24 +113,18 @@ static void smc_decode_stream(SmcContext *s) | |||||
| /* make the palette available */ | /* make the palette available */ | ||||
| memcpy(s->frame.data[1], s->pal, AVPALETTE_SIZE); | 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", | 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); | total_blocks = ((s->avctx->width + 3) / 4) * ((s->avctx->height + 3) / 4); | ||||
| /* traverse through the blocks */ | /* traverse through the blocks */ | ||||
| while (total_blocks) { | while (total_blocks) { | ||||
| /* sanity checks */ | /* 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 */ | /* make sure the row pointer hasn't gone wild */ | ||||
| if (row_ptr >= image_size) { | 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", | 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; | return; | ||||
| } | } | ||||
| opcode = s->buf[stream_ptr++]; | |||||
| opcode = bytestream2_get_byte(&s->gb); | |||||
| switch (opcode & 0xF0) { | switch (opcode & 0xF0) { | ||||
| /* skip n blocks */ | /* skip n blocks */ | ||||
| case 0x00: | case 0x00: | ||||
| @@ -158,7 +152,7 @@ static void smc_decode_stream(SmcContext *s) | |||||
| if ((row_ptr == 0) && (pixel_ptr == 0)) { | 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", | av_log(s->avctx, AV_LOG_INFO, "encountered repeat block opcode (%02X) but no blocks rendered yet\n", | ||||
| opcode & 0xF0); | opcode & 0xF0); | ||||
| break; | |||||
| return; | |||||
| } | } | ||||
| /* figure out where the previous block started */ | /* 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)) { | 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", | av_log(s->avctx, AV_LOG_INFO, "encountered repeat block opcode (%02X) but not enough blocks rendered yet\n", | ||||
| opcode & 0xF0); | opcode & 0xF0); | ||||
| break; | |||||
| return; | |||||
| } | } | ||||
| /* figure out where the previous 2 blocks started */ | /* figure out where the previous 2 blocks started */ | ||||
| @@ -233,7 +227,7 @@ static void smc_decode_stream(SmcContext *s) | |||||
| case 0x60: | case 0x60: | ||||
| case 0x70: | case 0x70: | ||||
| n_blocks = GET_BLOCK_COUNT(); | n_blocks = GET_BLOCK_COUNT(); | ||||
| pixel = s->buf[stream_ptr++]; | |||||
| pixel = bytestream2_get_byte(&s->gb); | |||||
| while (n_blocks--) { | while (n_blocks--) { | ||||
| block_ptr = row_ptr + pixel_ptr; | 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 | /* fetch the next 2 colors from bytestream and store in next | ||||
| * available entry in the color pair table */ | * available entry in the color pair table */ | ||||
| for (i = 0; i < CPAIR; i++) { | 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; | color_table_index = CPAIR * color_pair_index + i; | ||||
| s->color_pairs[color_table_index] = pixel; | 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) | if (color_pair_index == COLORS_PER_TABLE) | ||||
| color_pair_index = 0; | color_pair_index = 0; | ||||
| } else | } else | ||||
| color_table_index = CPAIR * s->buf[stream_ptr++]; | |||||
| color_table_index = CPAIR * bytestream2_get_byte(&s->gb); | |||||
| while (n_blocks--) { | while (n_blocks--) { | ||||
| color_flags = AV_RB16(&s->buf[stream_ptr]); | |||||
| stream_ptr += 2; | |||||
| color_flags = bytestream2_get_be16(&s->gb); | |||||
| flag_mask = 0x8000; | flag_mask = 0x8000; | ||||
| block_ptr = row_ptr + pixel_ptr; | block_ptr = row_ptr + pixel_ptr; | ||||
| for (pixel_y = 0; pixel_y < 4; pixel_y++) { | 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 | /* fetch the next 4 colors from bytestream and store in next | ||||
| * available entry in the color quad table */ | * available entry in the color quad table */ | ||||
| for (i = 0; i < CQUAD; i++) { | 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; | color_table_index = CQUAD * color_quad_index + i; | ||||
| s->color_quads[color_table_index] = pixel; | 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) | if (color_quad_index == COLORS_PER_TABLE) | ||||
| color_quad_index = 0; | color_quad_index = 0; | ||||
| } else | } 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 actually acts as a bit shift count here */ | ||||
| flag_mask = 30; | flag_mask = 30; | ||||
| block_ptr = row_ptr + pixel_ptr; | 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 | /* fetch the next 8 colors from bytestream and store in next | ||||
| * available entry in the color octet table */ | * available entry in the color octet table */ | ||||
| for (i = 0; i < COCTET; i++) { | 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; | color_table_index = COCTET * color_octet_index + i; | ||||
| s->color_octets[color_table_index] = pixel; | 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) | if (color_octet_index == COLORS_PER_TABLE) | ||||
| color_octet_index = 0; | color_octet_index = 0; | ||||
| } else | } else | ||||
| color_table_index = COCTET * s->buf[stream_ptr++]; | |||||
| color_table_index = COCTET * bytestream2_get_byte(&s->gb); | |||||
| while (n_blocks--) { | while (n_blocks--) { | ||||
| /* | /* | ||||
| @@ -363,15 +355,12 @@ static void smc_decode_stream(SmcContext *s) | |||||
| flags_a = xx012456, flags_b = xx89A37B | flags_a = xx012456, flags_b = xx89A37B | ||||
| */ | */ | ||||
| /* build the color flags */ | /* 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; | color_flags = color_flags_a; | ||||
| /* flag mask actually acts as a bit shift count here */ | /* 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; | block_ptr = row_ptr + pixel_ptr; | ||||
| for (pixel_y = 0; pixel_y < 4; pixel_y++) { | for (pixel_y = 0; pixel_y < 4; pixel_y++) { | ||||
| for (pixel_x = 0; pixel_x < 4; pixel_x++) { | 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; | block_ptr += row_inc; | ||||
| } | } | ||||
| @@ -412,10 +401,12 @@ static void smc_decode_stream(SmcContext *s) | |||||
| break; | break; | ||||
| case 0xF0: | 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; | break; | ||||
| } | } | ||||
| } | } | ||||
| return; | |||||
| } | } | ||||
| static av_cold int smc_decode_init(AVCodecContext *avctx) | 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; | SmcContext *s = avctx->priv_data; | ||||
| const uint8_t *pal = av_packet_get_side_data(avpkt, AV_PKT_DATA_PALETTE, NULL); | 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.reference = 3; | ||||
| s->frame.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE | | 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; | 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 "intrax8.h" | ||||
| #include "vc1dsp.h" | #include "vc1dsp.h" | ||||
| #define AC_VLC_BITS 9 | |||||
| /** Markers used in VC-1 AP frame data */ | /** Markers used in VC-1 AP frame data */ | ||||
| //@{ | //@{ | ||||
| enum VC1Code { | enum VC1Code { | ||||
| @@ -24,232 +24,7 @@ | |||||
| #include <stdint.h> | #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 */ | /* which indexes point to last=1 entries in tables */ | ||||
| static const int vc1_last_decode_table[AC_MODES] = { | 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 | { 26, 17, 12, 10 }, // ZONE1OFFSET_X | ||||
| { 7, 4, 3, 3 } // ZONE1OFFSET_Y | { 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]; | 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) */ | /* 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]; | 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 */ | #endif /* AVCODEC_VC1DATA_H */ | ||||
| @@ -45,154 +45,12 @@ | |||||
| #define MB_INTRA_VLC_BITS 9 | #define MB_INTRA_VLC_BITS 9 | ||||
| #define DC_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 | // 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_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 }; | 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 | * @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; | int index, escape, run = 0, level = 0, lst = 0; | ||||
| index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3); | 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]; | run = vc1_index_decode_table[codingset][index][0]; | ||||
| level = vc1_index_decode_table[codingset][index][1]; | level = vc1_index_decode_table[codingset][index][1]; | ||||
| lst = index >= vc1_last_decode_table[codingset] || get_bits_left(gb) < 0; | lst = index >= vc1_last_decode_table[codingset] || get_bits_left(gb) < 0; | ||||
| @@ -22,6 +22,7 @@ | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| #include "sinewin.h" | #include "sinewin.h" | ||||
| #include "wma.h" | #include "wma.h" | ||||
| #include "wma_common.h" | |||||
| #include "wmadata.h" | #include "wmadata.h" | ||||
| #undef NDEBUG | #undef NDEBUG | ||||
| @@ -67,46 +68,6 @@ static void init_coef_vlc(VLC *vlc, uint16_t **prun_table, | |||||
| av_free(level_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) | int ff_wma_init(AVCodecContext *avctx, int flags2) | ||||
| { | { | ||||
| WMACodecContext *s = avctx->priv_data; | 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 uint32_t ff_aac_scalefactor_code[121]; | ||||
| extern const uint8_t ff_aac_scalefactor_bits[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_init(AVCodecContext * avctx, int flags2); | ||||
| int ff_wma_total_gain_to_bits(int total_gain); | int ff_wma_total_gain_to_bits(int total_gain); | ||||
| int ff_wma_end(AVCodecContext *avctx); | 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 "get_bits.h" | ||||
| #include "put_bits.h" | #include "put_bits.h" | ||||
| #include "wma.h" | #include "wma.h" | ||||
| #include "wma_common.h" | |||||
| /** current decoder limitations */ | /** current decoder limitations */ | ||||
| #define WMALL_MAX_CHANNELS 8 ///< max number of handled channels | #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)) { | if (get_bits1(&s->gb)) { | ||||
| int i, send_coef_bits; | int i, send_coef_bits; | ||||
| int cbits = av_log2(s->mclms_scaling + 1); | int cbits = av_log2(s->mclms_scaling + 1); | ||||
| assert(cbits == my_log2(s->mclms_scaling + 1)); | |||||
| if (1 << cbits < s->mclms_scaling + 1) | if (1 << cbits < s->mclms_scaling + 1) | ||||
| cbits++; | cbits++; | ||||
| @@ -97,6 +97,7 @@ | |||||
| #include "fmtconvert.h" | #include "fmtconvert.h" | ||||
| #include "sinewin.h" | #include "sinewin.h" | ||||
| #include "wma.h" | #include "wma.h" | ||||
| #include "wma_common.h" | |||||
| /** current decoder limitations */ | /** current decoder limitations */ | ||||
| #define WMAPRO_MAX_CHANNELS 8 ///< max number of handled channels | #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 | SECTION_TEXT | ||||
| %macro SCALARPRODUCT 1 | %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 | shl orderq, 1 | ||||
| add v1q, orderq | add v1q, orderq | ||||
| add v2q, orderq | add v2q, orderq | ||||
| neg orderq | neg orderq | ||||
| movd m3, shiftm | |||||
| pxor m2, m2 | pxor m2, m2 | ||||
| .loop: | .loop: | ||||
| movu m0, [v1q + orderq] | movu m0, [v1q + orderq] | ||||
| @@ -55,10 +54,8 @@ cglobal scalarproduct_int16_%1, 3,3,4, v1, v2, order, shift | |||||
| %if mmsize == 16 | %if mmsize == 16 | ||||
| movhlps m0, m2 | movhlps m0, m2 | ||||
| paddd m2, m0 | paddd m2, m0 | ||||
| psrad m2, m3 | |||||
| pshuflw m0, m2, 0x4e | pshuflw m0, m2, 0x4e | ||||
| %else | %else | ||||
| psrad m2, m3 | |||||
| pshufw m0, m2, 0x4e | pshufw m0, m2, 0x4e | ||||
| %endif | %endif | ||||
| paddd m2, m0 | paddd m2, m0 | ||||
| @@ -1161,16 +1161,6 @@ QPEL(put_, 16,XMM, 16)\ | |||||
| QPEL(avg_, 8, XMM, 16)\ | QPEL(avg_, 8, XMM, 16)\ | ||||
| QPEL(avg_, 16,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" | #define PAVGB "pavgusb" | ||||
| QPEL_H264(put_, PUT_OP, 3dnow) | QPEL_H264(put_, PUT_OP, 3dnow) | ||||
| QPEL_H264(avg_, AVG_3DNOW_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] | lea r0, [r0 + r3*8] | ||||
| neg r3 | neg r3 | ||||
| .loop4: | .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 m2, [r1 + 1*STEP] | ||||
| movhps m3, [r1 + 3*STEP] | movhps m3, [r1 + 3*STEP] | ||||
| punpckldq m0, m0 | |||||
| punpckldq m1, m1 | |||||
| unpcklps m0, m0 | |||||
| unpcklps m1, m1 | |||||
| mulps m0, m2 | mulps m0, m2 | ||||
| mulps m1, m3 | mulps m1, m3 | ||||
| movu [r0 + 8*r3 + 0], m0 | movu [r0 + 8*r3 + 0], m0 | ||||
| @@ -101,8 +101,8 @@ cglobal sbr_hf_g_filt, 5, 6, 5 | |||||
| jz .end | jz .end | ||||
| .loop1: ; element 0 and 1 can be computed at the same time | .loop1: ; element 0 and 1 can be computed at the same time | ||||
| movss m0, [r2] | movss m0, [r2] | ||||
| movq m2, [r1] | |||||
| punpckldq m0, m0 | |||||
| movlps m2, [r1] | |||||
| unpcklps m0, m0 | |||||
| mulps m2, m0 | mulps m2, m0 | ||||
| movlps [r0], m2 | movlps [r0], m2 | ||||
| add r0, 8 | add r0, 8 | ||||
| @@ -267,8 +267,15 @@ static int smacker_read_packet(AVFormatContext *s, AVPacket *pkt) | |||||
| sz += (t & 0x7F) + 1; | sz += (t & 0x7F) + 1; | ||||
| pal += ((t & 0x7F) + 1) * 3; | pal += ((t & 0x7F) + 1) * 3; | ||||
| } else if(t & 0x40){ /* copy with offset */ | } else if(t & 0x40){ /* copy with offset */ | ||||
| off = avio_r8(s->pb) * 3; | |||||
| off = avio_r8(s->pb); | |||||
| j = (t & 0x3F) + 1; | 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) { | while(j-- && sz < 256) { | ||||
| *pal++ = oldpal[off + 0]; | *pal++ = oldpal[off + 0]; | ||||
| *pal++ = oldpal[off + 1]; | *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 to the local address if not multicast or if the multicast | ||||
| * bind failed */ | * 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; | goto fail; | ||||
| } | |||||
| len = sizeof(my_addr); | len = sizeof(my_addr); | ||||
| getsockname(udp_fd, (struct sockaddr *)&my_addr, &len); | 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); | 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); | output_pixels(i * 4, Y1, U, Y2, V); | ||||
| } | } | ||||
| } else { | } else { | ||||
| @@ -565,6 +570,11 @@ yuv2422_1_c_template(SwsContext *c, const int16_t *buf0, | |||||
| V = av_clip_uint8(V); | 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); | 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]), | *g = (c->table_gU[U + YUVRGB_TABLE_HEADROOM] + c->table_gV[V + YUVRGB_TABLE_HEADROOM]), | ||||
| *b = c->table_bU[U + 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) { | if (hasAlpha) { | ||||
| A1 = (abuf0[i * 2 ] * yalpha1 + abuf1[i * 2 ] * yalpha) >> 19; | A1 = (abuf0[i * 2 ] * yalpha1 + abuf1[i * 2 ] * yalpha) >> 19; | ||||
| A2 = (abuf0[i * 2 + 1] * yalpha1 + abuf1[i * 2 + 1] * 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, | 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]), | *g = (c->table_gU[U + YUVRGB_TABLE_HEADROOM] + c->table_gV[V + YUVRGB_TABLE_HEADROOM]), | ||||
| *b = c->table_bU[U + 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) { | if (hasAlpha) { | ||||
| A1 = abuf0[i * 2 ] * 255 + 16384 >> 15; | A1 = abuf0[i * 2 ] * 255 + 16384 >> 15; | ||||
| A2 = abuf0[i * 2 + 1] * 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, | 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]), | *g = (c->table_gU[U + YUVRGB_TABLE_HEADROOM] + c->table_gV[V + YUVRGB_TABLE_HEADROOM]), | ||||
| *b = c->table_bU[U + 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) { | if (hasAlpha) { | ||||
| A1 = (abuf0[i * 2 ] + 64) >> 7; | A1 = (abuf0[i * 2 ] + 64) >> 7; | ||||
| A2 = (abuf0[i * 2 + 1] + 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, | yuv2rgb_write(dest, i, Y1, Y2, hasAlpha ? A1 : 0, hasAlpha ? A2 : 0, | ||||