1 /*
2 * DV decoder
3 * Copyright (c) 2002 Fabrice Bellard
4 * Copyright (c) 2004 Roman Shaposhnik
5 *
6 * 50 Mbps (DVCPRO50) support
7 * Copyright (c) 2006 Daniel Maas <dmaas@maasdigital.com>
8 *
9 * 100 Mbps (DVCPRO HD) support
10 * Initial code by Daniel Maas <dmaas@maasdigital.com> (funded by BBC R&D)
11 * Final code by Roman Shaposhnik
12 *
13 * Many thanks to Dan Dennedy <dan@dennedy.org> for providing wealth
14 * of DV technical info.
15 *
16 * This file is part of FFmpeg.
17 *
18 * FFmpeg is free software; you can redistribute it and/or
19 * modify it under the terms of the GNU Lesser General Public
20 * License as published by the Free Software Foundation; either
21 * version 2.1 of the License, or (at your option) any later version.
22 *
23 * FFmpeg is distributed in the hope that it will be useful,
24 * but WITHOUT ANY WARRANTY; without even the implied warranty of
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
26 * Lesser General Public License for more details.
27 *
28 * You should have received a copy of the GNU Lesser General Public
29 * License along with FFmpeg; if not, write to the Free Software
30 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
31 */
32
33 /**
34 * @file
35 * DV decoder
36 */
37
42
52
62
64
66 32768, 16705, 16705, 17734, 17032, 17734, 18205, 18081,
67 18081, 18205, 18725, 18562, 19195, 18562, 18725, 19266,
68 19091, 19705, 19705, 19091, 19266, 21407, 19643, 20267,
69 20228, 20267, 19643, 21407, 22725, 21826, 20853, 20806,
70 20806, 20853, 21826, 22725, 23170, 23170, 21407, 21400,
71 21407, 23170, 23170, 24598, 23786, 22018, 22018, 23786,
72 24598, 25251, 24465, 22654, 24465, 25251, 25972, 25172,
73 25172, 25972, 26722, 27969, 26722, 29692, 29692, 31521,
74 };
76 32768, 16384, 16705, 16705, 17734, 17734, 17734, 17734,
77 18081, 18081, 18725, 18725, 21407, 21407, 19091, 19091,
78 19195, 19195, 18205, 18205, 18725, 18725, 19705, 19705,
79 20267, 20267, 21826, 21826, 23170, 23170, 20806, 20806,
80 20267, 20267, 19266, 19266, 21407, 21407, 20853, 20853,
81 21400, 21400, 23786, 23786, 24465, 24465, 22018, 22018,
82 23170, 23170, 22725, 22725, 24598, 24598, 24465, 24465,
83 25172, 25172, 27969, 27969, 25972, 25972, 29692, 29692
84 };
85
86 /**
87 * The "inverse" DV100 weights are actually just the spec weights (zig-zagged).
88 */
90 128, 16, 16, 17, 17, 17, 18, 18,
91 18, 18, 18, 18, 19, 18, 18, 19,
92 19, 19, 19, 19, 19, 42, 38, 40,
93 40, 40, 38, 42, 44, 43, 41, 41,
94 41, 41, 43, 44, 45, 45, 42, 42,
95 42, 45, 45, 48, 46, 43, 43, 46,
96 48, 49, 48, 44, 48, 49, 101, 98,
97 98, 101, 104, 109, 104, 116, 116, 123,
98 };
100 128, 16, 16, 17, 17, 17, 25, 25,
101 25, 25, 26, 25, 26, 25, 26, 26,
102 26, 27, 27, 26, 26, 42, 38, 40,
103 40, 40, 38, 42, 44, 43, 41, 41,
104 41, 41, 43, 44, 91, 91, 84, 84,
105 84, 91, 91, 96, 93, 86, 86, 93,
106 96, 197, 191, 177, 191, 197, 203, 197,
107 197, 203, 209, 219, 209, 232, 232, 246,
108 };
110 128, 16, 16, 17, 17, 17, 18, 18,
111 18, 18, 18, 18, 19, 18, 18, 19,
112 19, 19, 19, 19, 19, 42, 38, 40,
113 40, 40, 38, 42, 44, 43, 41, 41,
114 41, 41, 43, 44, 68, 68, 63, 63,
115 63, 68, 68, 96, 92, 86, 86, 92,
116 96, 98, 96, 88, 96, 98, 202, 196,
117 196, 202, 208, 218, 208, 232, 232, 246,
118 };
120 128, 24, 24, 26, 26, 26, 36, 36,
121 36, 36, 36, 36, 38, 36, 36, 38,
122 38, 38, 38, 38, 38, 84, 76, 80,
123 80, 80, 76, 84, 88, 86, 82, 82,
124 82, 82, 86, 88, 182, 182, 168, 168,
125 168, 182, 182, 192, 186, 192, 172, 186,
126 192, 394, 382, 354, 382, 394, 406, 394,
127 394, 406, 418, 438, 418, 464, 464, 492,
128 };
129
131 {
135
137 /* quantization quanta by QNO for DV100 */
138 static const uint8_t dv100_qstep[16] = {
139 1, /* QNO = 0 and 1 both have no quantization */
140 1,
141 2, 3, 4, 5, 6, 7, 8, 16, 18, 20, 22, 24, 28, 52
142 };
143 const uint16_t *iweight1, *iweight2;
144
148 } else {
151 }
152 for (c = 0; c < 4; c++) {
153 for (s = 0; s < 16; s++) {
154 for (i = 0; i < 64; i++) {
155 *factor1++ = (dv100_qstep[
s] << (c + 9)) * iweight1[i];
156 *factor2++ = (dv100_qstep[
s] << (c + 9)) * iweight2[i];
157 }
158 }
159 }
160 } else {
161 static const uint8_t dv_quant_areas[4] = { 6, 21, 43, 64 };
164 for (s = 0; s < 22; s++) {
165 for (i = c = 0; c < 4; c++) {
166 for (; i < dv_quant_areas[
c]; i++) {
168 *factor2++ = (*factor1++) << 1;
169 }
170 }
171 }
172 }
173 }
174 }
175
177 {
180 int i;
181
182 memset(&idsp,0, sizeof(idsp));
184
185 for (i = 0; i < 64; i++)
187
189 for (i = 0; i < 64; i++){
192 }
193 }else
195
198
200 }
201
202 /* decode AC coefficients */
204 {
211
214
215 /* if we must parse a partial VLC, we do it here */
216 if (partial_bit_count > 0) {
217 re_cache = re_cache >> partial_bit_count |
219 re_index -= partial_bit_count;
221 }
222
223 /* get the AC coefficients until last_index is reached */
224 for (;;) {
226 re_index);
227 /* our own optimized GET_RL_VLC */
230 if (vlc_len < 0) {
234 }
237
238 /* gotta check if we're still within gb boundaries */
239 if (re_index + vlc_len > last_index) {
240 /* should be < 16 bits otherwise a codeword could have been parsed */
243 re_index = last_index;
244 break;
245 }
246 re_index += vlc_len;
247
250 if (pos >= 64)
251 break;
252
255 block[scan_table[pos]] =
level;
256
258 }
261 }
262
264 {
269 }
270 if (bits_left > 0)
272 }
273
274 /* mb_x and mb_y are in units of 8 pixels */
276 {
279 int quant,
dc, dct_mode, class1, j;
280 int mb_index, mb_x, mb_y, last_index;
281 int y_stride, linesize;
283 int c_offset;
293 int is_field_mode[5];
294 int vs_bit_buffer_damaged = 0;
295 int mb_bit_buffer_damaged[5] = {0};
296 int retried = 0;
297 int sta;
298
301
302 retry:
303
304 memset(sblock, 0, 5 *
DV_MAX_BPM *
sizeof(*sblock));
305
306 /* pass 1: read DC and AC coefficients in blocks */
308 block1 = &sblock[0][0];
309 mb1 = mb_data;
311 for (mb_index = 0; mb_index < 5; mb_index++, mb1 += s->
sys->
bpm, block1 += s->
sys->
bpm * 64) {
312 /* skip header */
313 quant = buf_ptr[3] & 0x0f;
315 if ((buf_ptr[3] >> 4) == 0x0E)
316 vs_bit_buffer_damaged = 1;
317 if (!mb_index) {
318 sta = buf_ptr[3] >> 4;
319 } else if (sta != (buf_ptr[3] >> 4))
320 vs_bit_buffer_damaged = 1;
321 }
322 buf_ptr += 4;
324 mb = mb1;
326 is_field_mode[mb_index] = 0;
327 for (j = 0; j < s->
sys->
bpm; j++) {
330
331 /* get the DC */
339 class1 * 16 * 64 +
340 quant * 64];
341 is_field_mode[mb_index] |= !j && dct_mode;
342 } else {
347 dct_mode * 22 * 64 +
349 }
350 dc = dc * 4;
351 /* convert to unsigned because 128 is not added in the
352 * standard IDCT */
353 dc += 1024;
355 buf_ptr += last_index >> 3;
358
359 ff_dlog(avctx,
"MB block: %d, %d ", mb_index, j);
361
362 /* write the remaining bits in a new buffer only if the
363 * block is finished */
366 if (mb->
pos >= 64 && mb->
pos < 127)
367 vs_bit_buffer_damaged = mb_bit_buffer_damaged[mb_index] = 1;
368
369 block += 64;
370 mb++;
371 }
372
373 if (mb_bit_buffer_damaged[mb_index] > 0)
374 continue;
375
376 /* pass 2: we can do it just after */
379 mb = mb1;
383 for (j = 0; j < s->
sys->
bpm; j++, block += 64, mb++) {
386 /* if still not finished, no need to parse other blocks */
388 break;
390 vs_bit_buffer_damaged = mb_bit_buffer_damaged[mb_index] = 1;
391 }
392 }
393 /* all blocks are finished, so the extra bytes can be used at
394 * the video segment level */
397 }
398
399 /* we need a pass over the whole video segment */
401 block = &sblock[0][0];
402 mb = mb_data;
404 put_bits32(&vs_pb, 0);
// padding must be zeroed
406 for (mb_index = 0; mb_index < 5; mb_index++) {
407 for (j = 0; j < s->
sys->
bpm; j++) {
409 ff_dlog(avctx,
"start %d:%d\n", mb_index, j);
411 }
412
413 if (mb->
pos >= 64 && mb->
pos < 127) {
415 "AC EOB marker is absent pos=%d\n", mb->
pos);
416 vs_bit_buffer_damaged = 1;
417 }
418 block += 64;
419 mb++;
420 }
421 }
422 if (vs_bit_buffer_damaged && !retried) {
424 retried = 1;
425 goto retry;
426 }
427
428 /* compute idct and place blocks */
429 block = &sblock[0][0];
430 mb = mb_data;
431 for (mb_index = 0; mb_index < 5; mb_index++) {
433
434 /* idct_put'ting luminance */
437 (s->
sys->
height >= 720 && mb_y != 134)) {
439 ((!is_field_mode[mb_index]) * log2_blocksize));
440 } else {
441 y_stride = (2 << log2_blocksize);
442 }
446 mb[0].
idct_put(y_ptr, linesize, block + 0 * 64);
448 mb[2].
idct_put(y_ptr + (1 << log2_blocksize), linesize, block + 2 * 64);
449 } else {
450 mb[1].
idct_put(y_ptr + (1 << log2_blocksize), linesize, block + 1 * 64);
451 mb[2].
idct_put(y_ptr + y_stride, linesize, block + 2 * 64);
452 mb[3].
idct_put(y_ptr + (1 << log2_blocksize) + y_stride, linesize, block + 3 * 64);
453 }
454 mb += 4;
455 block += 4 * 64;
456
457 /* idct_put'ting chrominance */
460 for (j = 2; j; j--) {
463 uint64_t aligned_pixels[64 / 8];
466 int x, y;
468 for (y = 0; y < (1 << log2_blocksize); y++, c_ptr += s->
frame->
linesize[j], pixels += 8) {
469 ptr1 = pixels + ((1 << (log2_blocksize))>>1);
471 for (x = 0; x < (1 <<
FFMAX(log2_blocksize - 1, 0)); x++) {
472 c_ptr[x] = pixels[x];
473 c_ptr1[x] = ptr1[x];
474 }
475 }
476 block += 64;
477 mb++;
478 } else {
479 y_stride = (mb_y == 134) ? (1 << log2_blocksize) :
480 s->
frame->
linesize[j] << ((!is_field_mode[mb_index]) * log2_blocksize);
482 (mb++)->
idct_put(c_ptr, linesize, block);
483 block += 64;
485 (mb++)->
idct_put(c_ptr + y_stride, linesize, block);
486 block += 64;
487 }
488 }
489 }
490 }
491 return 0;
492 }
493
494 /* NOTE: exactly one frame must be given (120000 bytes for NTSC,
495 * 144000 bytes for PAL - or twice those for 50Mbps) */
498 {
500 int buf_size = avpkt->
size;
504 int apt, is16_9, ret;
506
510 return -1; /* NOTE: we only accept several full frames */
511 }
512
515 if (ret < 0) {
517 return ret;
518 }
521 }
522
528
530 if (ret < 0)
531 return ret;
532
533 /* Determine the codec's sample_aspect ratio from the packet */
534 vsc_pack = buf + 80 * 5 + 48 + 5;
536 apt = buf[4] & 0x07;
537 is16_9 = (vsc_pack[2] & 0x07) == 0x02 ||
538 (!apt && (vsc_pack[2] & 0x07) == 0x07);
540 }
541
543 return ret;
546
547 /* Determine the codec's field order from the packet */
550 }
551
555
556 emms_c();
557
558 /* return image */
559 *got_frame = 1;
560
562 }
563
573 .max_lowres = 3,
574 };
static void av_unused put_bits32(PutBitContext *s, uint32_t value)
Write exactly 32 bits into a bitstream.
This structure describes decoded (raw) audio or video data.
ptrdiff_t const GLvoid * data
uint32_t idct_factor[2 *4 *16 *64]
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
const uint8_t * block_sizes
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Check that the provided frame dimensions are valid and set them on the codec context.
static av_cold int init(AVCodecContext *avctx)
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
const uint8_t ff_dv_quant_offset[4]
void(* idct_put)(uint8_t *dest, int line_size, int16_t *block)
static const uint16_t dv_iweight_88[64]
static int get_sbits(GetBitContext *s, int n)
static av_cold int dvvideo_decode_init(AVCodecContext *avctx)
void(* idct_put[2])(uint8_t *dest, int line_size, int16_t *block)
const uint8_t ff_dv_zigzag248_direct[64]
const AVDVProfile * ff_dv_frame_profile(AVCodecContext *codec, const AVDVProfile *sys, const uint8_t *frame, unsigned buf_size)
Get a DV profile for the provided compressed frame.
void ff_simple_idct248_put(uint8_t *dest, int line_size, int16_t *block)
int ff_set_sar(AVCodecContext *avctx, AVRational sar)
Check that the provided sample aspect ratio is valid and set it on the codec context.
bitstream reader API header.
int interlaced_frame
The content of the picture is interlaced.
int lowres
low resolution decoding, 1-> 1/2 size, 2->1/4 size
enum AVPixelFormat pix_fmt
static int get_bits_left(GetBitContext *gb)
DVwork_chunk work_chunks[4 *12 *27]
#define UPDATE_CACHE(name, gb)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static void bit_copy(PutBitContext *pb, GetBitContext *gb)
static const uint16_t dv_iweight_720_y[64]
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
int error_concealment
error concealment flags
static int dv_work_pool_size(const AVDVProfile *d)
AVCodec ff_dvvideo_decoder
simple assert() macros that are a bit more flexible than ISO C assert().
const char * name
Name of the codec implementation.
static void dv_init_weight_tables(DVVideoContext *ctx, const AVDVProfile *d)
#define CLOSE_READER(name, gb)
static int put_bits_count(PutBitContext *s)
common internal API header
enum AVPictureType pict_type
Picture type of the frame.
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
#define DV_MAX_BPM
maximum number of blocks per macroblock in any DV format
typedef void(APIENTRY *FF_PFNGLACTIVETEXTUREPROC)(GLenum texture)
#define DV_PROFILE_IS_HD(p)
uint32_t partial_bit_buffer
RL_VLC_ELEM ff_dv_rl_vlc[1664]
static const uint16_t dv_iweight_1080_y[64]
The "inverse" DV100 weights are actually just the spec weights (zig-zagged).
const uint8_t * scan_table
uint8_t idct_permutation[64]
IDCT input permutation.
#define SHOW_UBITS(name, gb, num)
static const uint16_t dv_iweight_720_c[64]
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
void(* idct_put)(uint8_t *dest, int line_size, int16_t *block)
block -> idct -> clip to unsigned 8 bit -> dest.
static void idct_put(FourXContext *f, int x, int y)
static int dvvideo_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Libavcodec external API header.
const uint32_t * factor_table
static int dv_decode_video_segment(AVCodecContext *avctx, void *arg)
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
main external API structure.
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
static unsigned int get_bits1(GetBitContext *s)
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
av_cold int ff_dvvideo_init(AVCodecContext *avctx)
const uint8_t ff_zigzag_direct[64]
uint8_t partial_bit_count
static const uint16_t dv_iweight_1080_c[64]
static int16_t block1[64]
static av_always_inline AVRational av_inv_q(AVRational q)
Invert a rational.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
static const uint16_t dv_iweight_248[64]
static int decode(AVCodecContext *avctx, void *data, int *got_sub, AVPacket *avpkt)
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
const uint8_t ff_dv_quant_shifts[22][4]
#define OPEN_READER_NOSIZE(name, gb)
common internal api header.
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
int ff_dv_init_dynamic_tables(DVVideoContext *ctx, const AVDVProfile *d)
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
int(* execute)(struct AVCodecContext *c, int(*func)(struct AVCodecContext *c2, void *arg), void *arg2, int *ret, int count, int size)
The codec may call this to execute several independent things.
av_cold void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx)
int top_field_first
If the content is interlaced, is top field displayed first.
static void dv_calculate_mb_xy(DVVideoContext *s, DVwork_chunk *work_chunk, int m, int *mb_x, int *mb_y)
int key_frame
1 -> keyframe, 0-> not
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(constint16_t *) pi >>8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(constint32_t *) pi >>24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(constfloat *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(constfloat *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(constfloat *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(constdouble *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(constdouble *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(constdouble *) pi *(1U<< 31))))#defineSET_CONV_FUNC_GROUP(ofmt, ifmt) staticvoidset_generic_function(AudioConvert *ac){}voidff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enumAVSampleFormatout_fmt, enumAVSampleFormatin_fmt, intchannels, intsample_rate, intapply_map){AudioConvert *ac;intin_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) returnNULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt)>2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);returnNULL;}returnac;}in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}elseif(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;elseac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);returnac;}intff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){intuse_generic=1;intlen=in->nb_samples;intp;if(ac->dc){av_log(ac->avr, AV_LOG_TRACE,"%dsamples-audio_convert:%sto%s(dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));returnff_convert_dither(ac-> dc
#define LOCAL_ALIGNED_16(t, v,...)
static void dv_decode_ac(GetBitContext *gb, BlockInfo *mb, int16_t *block)
This structure stores compressed data.
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
static const int dv_iweight_bits