mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
Merge remote-tracking branch 'qatar/master'
* 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>
This commit is contained in:
commit
bf807a5e87
@ -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
|
supported using @command{-list_formats all} for Video4Linux2 devices.
|
||||||
devices and using @command{-list_formats all} for Video4Linux2 devices.
|
|
||||||
|
|
||||||
If the size for the device is set to 0x0, the input device will
|
Some usage examples of the video4linux2 devices with ffmpeg and ffplay:
|
||||||
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.
|
|
||||||
|
|
||||||
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
|
# Grab and show the input of a video4linux2 device.
|
||||||
# to the default of 25/1.
|
ffplay -f video4linux2 -framerate 30 -video_size hd720 /dev/video0
|
||||||
ffplay -s 320x240 -f video4linux /dev/video0
|
|
||||||
|
|
||||||
# Grab and show the input of a video4linux2 device, auto-adjust size.
|
# Grab and record the input of a video4linux2 device, leave the
|
||||||
ffplay -f video4linux2 /dev/video0
|
framerate and size as previously set.
|
||||||
|
ffmpeg -f video4linux2 -input_format mjpeg -i /dev/video0 out.mpeg
|
||||||
# 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
|
|
||||||
@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_DCT_DECODER) += binkaudio.o wma.o wma_common.o
|
||||||
OBJS-$(CONFIG_BINKAUDIO_RDFT_DECODER) += binkaudio.o wma.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_WMALOSSLESS_DECODER) += wmalosslessdec.o wma_common.o
|
||||||
OBJS-$(CONFIG_WMAPRO_DECODER) += wmaprodec.o wma.o
|
OBJS-$(CONFIG_WMAPRO_DECODER) += wmaprodec.o wma.o wma_common.o
|
||||||
OBJS-$(CONFIG_WMAV1_DECODER) += wmadec.o wma.o aactab.o
|
OBJS-$(CONFIG_WMAV1_DECODER) += wmadec.o wma.o wma_common.o aactab.o
|
||||||
OBJS-$(CONFIG_WMAV1_ENCODER) += wmaenc.o wma.o aactab.o
|
OBJS-$(CONFIG_WMAV1_ENCODER) += wmaenc.o wma.o wma_common.o aactab.o
|
||||||
OBJS-$(CONFIG_WMAV2_DECODER) += wmadec.o wma.o aactab.o
|
OBJS-$(CONFIG_WMAV2_DECODER) += wmadec.o wma.o wma_common.o aactab.o
|
||||||
OBJS-$(CONFIG_WMAV2_ENCODER) += wmaenc.o wma.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,
|
int32_t ff_scalarproduct_int16_neon(const int16_t *v1, const int16_t *v2, int len);
|
||||||
int shift);
|
|
||||||
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]];
|
f1 = cplscale[decouple_tab[cpl_tmp] + 1];
|
||||||
f2 = cplscale[idx - 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 = 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);
|
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, log_size;
|
||||||
int scale_sum;
|
|
||||||
|
|
||||||
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);
|
scale_sum = get_scale(&s->gb, s->scalefactor_huffman[j], scale_sum, log_size);
|
||||||
if (scale_sum > scale_max) {
|
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "scale_sum out of range\n");
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
}
|
|
||||||
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);
|
scale_sum = get_scale(&s->gb, s->scalefactor_huffman[j], scale_sum, log_size);
|
||||||
if (scale_sum > scale_max) {
|
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "scale_sum out of range\n");
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
}
|
|
||||||
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 = get_scale(&s->gb, s->joint_huff[j], 64 /* bias */, 7);
|
||||||
scale += 64; /* bias */
|
|
||||||
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,
|
||||||
|
@ -293,7 +293,7 @@ const DVprofile* avpriv_dv_frame_profile2(AVCodecContext* codec, const DVprofile
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
dsf = (frame[3] & 0x80) >> 7;
|
dsf = (frame[3] & 0x80) >> 7;
|
||||||
stype = frame[80*5 + 48 + 3] & 0x1f;
|
stype = frame[80 * 5 + 48 + 3] & 0x1f;
|
||||||
|
|
||||||
/* 576i50 25Mbps 4:1:1 is a special case */
|
/* 576i50 25Mbps 4:1:1 is a special case */
|
||||||
if (dsf == 1 && stype == 0 && frame[4] & 0x07 /* the APT field */) {
|
if (dsf == 1 && stype == 0 && frame[4] & 0x07 /* the APT field */) {
|
||||||
@ -303,7 +303,7 @@ const DVprofile* avpriv_dv_frame_profile2(AVCodecContext* codec, const DVprofile
|
|||||||
if(codec && codec->codec_tag==AV_RL32("dvsd") && codec->width==720 && codec->height==576)
|
if(codec && codec->codec_tag==AV_RL32("dvsd") && codec->width==720 && codec->height==576)
|
||||||
return &dv_profiles[1];
|
return &dv_profiles[1];
|
||||||
|
|
||||||
for (i=0; i<FF_ARRAY_ELEMS(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)
|
if (dsf == dv_profiles[i].dsf && stype == dv_profiles[i].video_stype)
|
||||||
return &dv_profiles[i];
|
return &dv_profiles[i];
|
||||||
|
|
||||||
|
@ -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);
|
mode = bytestream2_get_byte(&s->gb);
|
||||||
if (mode>buf_end-*bs) {
|
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "truncated macroblock\n");
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
}
|
|
||||||
|
|
||||||
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);
|
memset(dc, bytestream2_get_byte(&s->gb), 4);
|
||||||
dc[4] = (*bs)[1];
|
dc[4] = bytestream2_get_byte(&s->gb);
|
||||||
dc[5] = (*bs)[2];
|
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++)
|
for (i = 0; i < 6; i++) {
|
||||||
dc[i] = (*bs)[i*2];
|
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]);
|
bytestream2_init(&s->gb, buf + 8, buf_size - 8);
|
||||||
s->height = big_endian ? AV_RB16(&buf[2]) : AV_RL16(&buf[2]);
|
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]);
|
tgq_calculate_qtable(s, bytestream2_get_byteu(&s->gb));
|
||||||
buf += 8;
|
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 (y = 0; y < FFALIGN(avctx->height, 16) >> 4; y++)
|
||||||
for (x=0; x<(avctx->width+15)/16; x++)
|
for (x = 0; x < FFALIGN(avctx->width, 16) >> 4; x++)
|
||||||
if ((ret=tgq_decode_mb(s, y, x, &buf, buf_end)) < 0)
|
tgq_decode_mb(s, y, x);
|
||||||
return ret;
|
|
||||||
|
|
||||||
*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);
|
rh0 = dsp->scalarproduct_int16(lp_gn + 10, lp_gn + 10, 20);
|
||||||
rh1 = dsp->scalarproduct_int16(lp_gn + 10, lp_gn + 11, 20, 0);
|
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++) {
|
bytestream2_skip(&s->gb, 4);
|
||||||
s->palette[i] = 0xFF << 24 | AV_RB24(buf);
|
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;
|
run_length = (color & 0x7f) + 2;
|
||||||
color = buf[i+1];
|
color = bytestream2_get_byte(&s->gb);
|
||||||
i+=2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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 data_off = bytestream2_get_le16(&s->gb), y;
|
||||||
int d, r, y;
|
GetByteContext data_ptr;
|
||||||
|
|
||||||
if(buf_size < 2) {
|
if (bytestream2_get_bytes_left(&s->gb) < data_off)
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "1 or less byte inter frame\n");
|
return AVERROR_INVALIDDATA;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
data_ptr = 2 + AV_RL16(&buf[0]);
|
bytestream2_init(&data_ptr, s->gb.buffer + data_off, bytestream2_get_bytes_left(&s->gb) - data_off);
|
||||||
d = data_ptr; r = 2; y = 0;
|
while (s->gb.buffer < data_ptr.buffer_start) {
|
||||||
|
|
||||||
while(r + 1 < data_ptr) {
|
|
||||||
int i, j;
|
int i, j;
|
||||||
int length = buf[r] & 0x7f;
|
int length = bytestream2_get_byte(&s->gb);
|
||||||
int x = buf[r+1] + ((buf[r] & 0x80) << 1);
|
int x = bytestream2_get_byte(&s->gb) + ((length & 0x80) << 1);
|
||||||
r += 2;
|
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)
|
if (y + half_vert >= s->avctx->height)
|
||||||
return;
|
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;
|
int color = bytestream2_get_byte(&data_ptr);
|
||||||
if (d >= buf_size) {
|
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "overread buf\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
color = buf[d];
|
|
||||||
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, res;
|
||||||
int type;
|
|
||||||
|
|
||||||
|
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_PALETTE : res = mm_decode_pal(s); return buf_size;
|
||||||
case MM_TYPE_INTRA : mm_decode_intra(s, 0, 0, buf, buf_size); break;
|
case MM_TYPE_INTRA : res = mm_decode_intra(s, 0, 0); break;
|
||||||
case MM_TYPE_INTRA_HH : mm_decode_intra(s, 1, 0, buf, buf_size); break;
|
case MM_TYPE_INTRA_HH : res = mm_decode_intra(s, 1, 0); break;
|
||||||
case MM_TYPE_INTRA_HHV : mm_decode_intra(s, 1, 1, buf, buf_size); break;
|
case MM_TYPE_INTRA_HHV : res = mm_decode_intra(s, 1, 1); break;
|
||||||
case MM_TYPE_INTER : mm_decode_inter(s, 0, 0, buf, buf_size); break;
|
case MM_TYPE_INTER : res = mm_decode_inter(s, 0, 0); break;
|
||||||
case MM_TYPE_INTER_HH : mm_decode_inter(s, 1, 0, buf, buf_size); break;
|
case MM_TYPE_INTER_HH : res = mm_decode_inter(s, 1, 0); break;
|
||||||
case MM_TYPE_INTER_HHV : mm_decode_inter(s, 1, 1, buf, buf_size); break;
|
case MM_TYPE_INTER_HHV : res = mm_decode_inter(s, 1, 1); break;
|
||||||
default :
|
default:
|
||||||
return -1;
|
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;
|
GetByteContext gb;
|
||||||
int size;
|
|
||||||
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;
|
int64_t chunk_start;
|
||||||
const unsigned char *buf_end = ri->buf + ri->size;
|
|
||||||
|
|
||||||
while (buf + 8 <= buf_end) {
|
while (bytestream2_get_bytes_left(&ri->gb) >= 8) {
|
||||||
chunk_id = bytestream_get_le16(&buf);
|
chunk_id = bytestream2_get_le16(&ri->gb);
|
||||||
chunk_size = bytestream_get_le32(&buf);
|
chunk_size = bytestream2_get_le32(&ri->gb);
|
||||||
chunk_arg = bytestream_get_le16(&buf);
|
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[0] = bytestream2_get_byte(&ri->gb);
|
||||||
ri->cb2x2[i].y[1] = *buf++;
|
ri->cb2x2[i].y[1] = bytestream2_get_byte(&ri->gb);
|
||||||
ri->cb2x2[i].y[2] = *buf++;
|
ri->cb2x2[i].y[2] = bytestream2_get_byte(&ri->gb);
|
||||||
ri->cb2x2[i].y[3] = *buf++;
|
ri->cb2x2[i].y[3] = bytestream2_get_byte(&ri->gb);
|
||||||
ri->cb2x2[i].u = *buf++;
|
ri->cb2x2[i].u = bytestream2_get_byte(&ri->gb);
|
||||||
ri->cb2x2[i].v = *buf++;
|
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;
|
chunk_start = bytestream2_tell(&ri->gb);
|
||||||
if (chunk_size > buf_end - buf) {
|
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:
|
case RoQ_ID_FCC: {
|
||||||
mx = 8 - (buf[bpos] >> 4) - ((signed char) (chunk_arg >> 8));
|
int byte = bytestream2_get_byte(&ri->gb);
|
||||||
my = 8 - (buf[bpos++] & 0xf) - ((signed char) chunk_arg);
|
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++];
|
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, 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 + 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, yp + 4, ri->cb2x2 + qcell->idx[2]);
|
||||||
ff_apply_vector_4x4(ri, xp+4, yp+4, ri->cb2x2 + qcell->idx[3]);
|
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 = bytestream2_get_le16(&ri->gb);
|
||||||
vqflg |= (buf[bpos++] << 8);
|
|
||||||
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:
|
case RoQ_ID_FCC: {
|
||||||
mx = 8 - (buf[bpos] >> 4) - ((signed char) (chunk_arg >> 8));
|
int byte = bytestream2_get_byte(&ri->gb);
|
||||||
my = 8 - (buf[bpos++] & 0xf) - ((signed char) chunk_arg);
|
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++];
|
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, 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 + 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, y + 2, ri->cb2x2 + qcell->idx[2]);
|
||||||
ff_apply_vector_2x2(ri, x+2, y+2, ri->cb2x2 + qcell->idx[3]);
|
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, y, ri->cb2x2 + bytestream2_get_byte(&ri->gb));
|
||||||
ff_apply_vector_2x2(ri, x+2, y, ri->cb2x2 + buf[bpos+1]);
|
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 + buf[bpos+2]);
|
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 + buf[bpos+3]);
|
ff_apply_vector_2x2(ri, x + 2, y + 2, ri->cb2x2 + bytestream2_get_byte(&ri->gb));
|
||||||
bpos += 4;
|
|
||||||
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;
|
bytestream2_init(&s->gb, buf, buf_size);
|
||||||
s->size = 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(!avail[c_off-4]){
|
||||||
if(r->avail_cache[avail_index - 4] && (r->avail_cache[avail_index - 1] || r->rv30)){
|
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(!avail[-4 + 2]){
|
||||||
if(r->avail_cache[avail_index - 4] && (r->avail_cache[avail_index - 1])){
|
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++)
|
for (i = 0; i < n; i += 2)
|
||||||
sum += x[i][0] * x[i][0] + x[i][1] * x[i][1];
|
{
|
||||||
|
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;
|
GetByteContext gb;
|
||||||
int size;
|
|
||||||
|
|
||||||
/* 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;
|
bytestream2_skip(&s->gb, 1);
|
||||||
stream_ptr += 4;
|
chunk_size = bytestream2_get_be24(&s->gb);
|
||||||
if (chunk_size != s->size)
|
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]);
|
color_flags = bytestream2_get_be16(&s->gb);
|
||||||
stream_ptr += 2;
|
|
||||||
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) {
|
while (n_blocks--) {
|
||||||
color_flags = AV_RB32(&s->buf[stream_ptr]);
|
color_flags = bytestream2_get_be32(&s->gb);
|
||||||
stream_ptr += 4;
|
|
||||||
/* 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 =
|
int val1 = bytestream2_get_be16(&s->gb);
|
||||||
((AV_RB16(s->buf + stream_ptr ) & 0xFFF0) << 8) |
|
int val2 = bytestream2_get_be16(&s->gb);
|
||||||
(AV_RB16(s->buf + stream_ptr + 2) >> 4);
|
int val3 = bytestream2_get_be16(&s->gb);
|
||||||
color_flags_b =
|
color_flags_a = ((val1 & 0xFFF0) << 8) | (val2 >> 4);
|
||||||
((AV_RB16(s->buf + stream_ptr + 4) & 0xFFF0) << 8) |
|
color_flags_b = ((val3 & 0xFFF0) << 8) |
|
||||||
((s->buf[stream_ptr + 1] & 0x0F) << 8) |
|
((val1 & 0x0F) << 8) | ((val2 & 0x0F) << 4) | (val3 & 0x0F);
|
||||||
((s->buf[stream_ptr + 3] & 0x0F) << 4) |
|
|
||||||
(s->buf[stream_ptr + 5] & 0x0F);
|
|
||||||
stream_ptr += 6;
|
|
||||||
|
|
||||||
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;
|
bytestream2_init(&s->gb, buf, buf_size);
|
||||||
s->size = 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 |
|
||||||
|
362
libavcodec/vc1.c
362
libavcodec/vc1.c
@ -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
|
#include "vc1data.h"
|
||||||
|
|
||||||
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}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* 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);
|
||||||
|
62
libavcodec/wma_common.c
Normal file
62
libavcodec/wma_common.c
Normal file
@ -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;
|
||||||
|
}
|
29
libavcodec/wma_common.h
Normal file
29
libavcodec/wma_common.h
Normal file
@ -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)
|
; int scalarproduct_int16(int16_t *v1, int16_t *v2, int order)
|
||||||
cglobal scalarproduct_int16_%1, 3,3,4, v1, v2, order, shift
|
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]
|
movlps m0, [r2 + 4*r3 + 0]
|
||||||
movq m1, [r2 + 4*r3 + 8]
|
movlps m1, [r2 + 4*r3 + 8]
|
||||||
movq m2, [r1 + 0*STEP]
|
movlps m2, [r1 + 0*STEP]
|
||||||
movq m3, [r1 + 2*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
|
unpcklps m0, m0
|
||||||
punpckldq m1, m1
|
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]
|
movlps m2, [r1]
|
||||||
punpckldq m0, m0
|
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,
|
||||||
|
Loading…
Reference in New Issue
Block a user