2 * Copyright (c) 2001-2003 The FFmpeg project
4 * first version by Francois Revol (revol@free.fr)
5 * fringe ADPCM codecs (e.g., DK3, DK4, Westwood)
6 * by Mike Melanson (melanson@pcisys.net)
8 * This file is part of FFmpeg.
10 * FFmpeg is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
15 * FFmpeg is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with FFmpeg; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 #include "config_components.h"
27 #include "libavutil/mem.h"
28 #include "libavutil/opt.h"
32 #include "bytestream.h"
34 #include "adpcm_data.h"
35 #include "codec_internal.h"
41 * See ADPCM decoder reference documents for codec information.
44 #define CASE_0(codec_id, ...)
45 #define CASE_1(codec_id, ...) \
49 #define CASE_2(enabled, codec_id, ...) \
50 CASE_ ## enabled(codec_id, __VA_ARGS__)
51 #define CASE_3(config, codec_id, ...) \
52 CASE_2(config, codec_id, __VA_ARGS__)
53 #define CASE(codec, ...) \
54 CASE_3(CONFIG_ ## codec ## _ENCODER, AV_CODEC_ID_ ## codec, __VA_ARGS__)
56 typedef struct TrellisPath
{
61 typedef struct TrellisNode
{
69 typedef struct ADPCMEncodeContext
{
73 ADPCMChannelStatus status
[6];
75 TrellisNode
*node_buf
;
76 TrellisNode
**nodep_buf
;
77 uint8_t *trellis_hash
;
80 #define FREEZE_INTERVAL 128
82 static av_cold
int adpcm_encode_init(AVCodecContext
*avctx
)
84 ADPCMEncodeContext
*s
= avctx
->priv_data
;
85 int channels
= avctx
->ch_layout
.nb_channels
;
88 * AMV's block size has to match that of the corresponding video
89 * stream. Relax the POT requirement.
91 if (avctx
->codec
->id
!= AV_CODEC_ID_ADPCM_IMA_AMV
&&
92 (s
->block_size
& (s
->block_size
- 1))) {
93 av_log(avctx
, AV_LOG_ERROR
, "block size must be power of 2\n");
94 return AVERROR(EINVAL
);
98 int frontier
, max_paths
;
100 if ((unsigned)avctx
->trellis
> 16U) {
101 av_log(avctx
, AV_LOG_ERROR
, "invalid trellis size\n");
102 return AVERROR(EINVAL
);
105 if (avctx
->codec
->id
== AV_CODEC_ID_ADPCM_IMA_SSI
||
106 avctx
->codec
->id
== AV_CODEC_ID_ADPCM_IMA_APM
||
107 avctx
->codec
->id
== AV_CODEC_ID_ADPCM_ARGO
||
108 avctx
->codec
->id
== AV_CODEC_ID_ADPCM_IMA_WS
) {
110 * The current trellis implementation doesn't work for extended
111 * runs of samples without periodic resets. Disallow it.
113 av_log(avctx
, AV_LOG_ERROR
, "trellis not supported\n");
114 return AVERROR_PATCHWELCOME
;
117 frontier
= 1 << avctx
->trellis
;
118 max_paths
= frontier
* FREEZE_INTERVAL
;
119 if (!FF_ALLOC_TYPED_ARRAY(s
->paths
, max_paths
) ||
120 !FF_ALLOC_TYPED_ARRAY(s
->node_buf
, 2 * frontier
) ||
121 !FF_ALLOC_TYPED_ARRAY(s
->nodep_buf
, 2 * frontier
) ||
122 !FF_ALLOC_TYPED_ARRAY(s
->trellis_hash
, 65536))
123 return AVERROR(ENOMEM
);
126 avctx
->bits_per_coded_sample
= av_get_bits_per_sample(avctx
->codec
->id
);
128 switch (avctx
->codec
->id
) {
130 /* each 16 bits sample gives one nibble
131 and we have 4 bytes per channel overhead */
132 avctx
->frame_size
= (s
->block_size
- 4 * channels
) * 8 /
134 /* seems frame_size isn't taken into account...
135 have to buffer the samples :-( */
136 avctx
->block_align
= s
->block_size
;
137 avctx
->bits_per_coded_sample
= 4;
140 avctx
->frame_size
= 64;
141 avctx
->block_align
= 34 * channels
;
145 /* each 16 bits sample gives one nibble
146 and we have 7 bytes per channel overhead */
147 avctx
->frame_size
= (s
->block_size
- 7 * channels
) * 2 / channels
+ 2;
148 avctx
->bits_per_coded_sample
= 4;
149 avctx
->block_align
= s
->block_size
;
150 if (!(avctx
->extradata
= av_malloc(32 + AV_INPUT_BUFFER_PADDING_SIZE
)))
151 return AVERROR(ENOMEM
);
152 avctx
->extradata_size
= 32;
153 extradata
= avctx
->extradata
;
154 bytestream_put_le16(&extradata
, avctx
->frame_size
);
155 bytestream_put_le16(&extradata
, 7); /* wNumCoef */
156 for (int i
= 0; i
< 7; i
++) {
157 bytestream_put_le16(&extradata
, ff_adpcm_AdaptCoeff1
[i
] * 4);
158 bytestream_put_le16(&extradata
, ff_adpcm_AdaptCoeff2
[i
] * 4);
162 avctx
->frame_size
= s
->block_size
* 2 / channels
;
163 avctx
->block_align
= s
->block_size
;
166 if (avctx
->sample_rate
!= 11025 &&
167 avctx
->sample_rate
!= 22050 &&
168 avctx
->sample_rate
!= 44100) {
169 av_log(avctx
, AV_LOG_ERROR
, "Sample rate must be 11025, "
171 return AVERROR(EINVAL
);
173 avctx
->frame_size
= 4096; /* Hardcoded according to the SWF spec. */
174 avctx
->block_align
= (2 + channels
* (22 + 4 * (avctx
->frame_size
- 1)) + 7) / 8;
176 case AV_CODEC_ID_ADPCM_IMA_SSI
:
177 case AV_CODEC_ID_ADPCM_IMA_ALP
:
178 avctx
->frame_size
= s
->block_size
* 2 / channels
;
179 avctx
->block_align
= s
->block_size
;
182 if (avctx
->sample_rate
!= 22050) {
183 av_log(avctx
, AV_LOG_ERROR
, "Sample rate must be 22050\n");
184 return AVERROR(EINVAL
);
188 av_log(avctx
, AV_LOG_ERROR
, "Only mono is supported\n");
189 return AVERROR(EINVAL
);
192 avctx
->frame_size
= s
->block_size
;
193 avctx
->block_align
= 8 + (FFALIGN(avctx
->frame_size
, 2) / 2);
196 avctx
->frame_size
= s
->block_size
* 2 / channels
;
197 avctx
->block_align
= s
->block_size
;
199 if (!(avctx
->extradata
= av_mallocz(28 + AV_INPUT_BUFFER_PADDING_SIZE
)))
200 return AVERROR(ENOMEM
);
201 avctx
->extradata_size
= 28;
204 avctx
->frame_size
= 32;
205 avctx
->block_align
= 17 * channels
;
208 /* each 16 bits sample gives one nibble */
209 avctx
->frame_size
= s
->block_size
* 2 / channels
;
210 avctx
->block_align
= s
->block_size
;
213 return AVERROR(EINVAL
);
219 static av_cold
int adpcm_encode_close(AVCodecContext
*avctx
)
221 ADPCMEncodeContext
*s
= avctx
->priv_data
;
223 av_freep(&s
->node_buf
);
224 av_freep(&s
->nodep_buf
);
225 av_freep(&s
->trellis_hash
);
231 static inline uint8_t adpcm_ima_compress_sample(ADPCMChannelStatus
*c
,
234 int delta
= sample
- c
->prev_sample
;
235 int nibble
= FFMIN(7, abs(delta
) * 4 /
236 ff_adpcm_step_table
[c
->step_index
]) + (delta
< 0) * 8;
237 c
->prev_sample
+= ((ff_adpcm_step_table
[c
->step_index
] *
238 ff_adpcm_yamaha_difflookup
[nibble
]) / 8);
239 c
->prev_sample
= av_clip_int16(c
->prev_sample
);
240 c
->step_index
= av_clip(c
->step_index
+ ff_adpcm_index_table
[nibble
], 0, 88);
244 static inline uint8_t adpcm_ima_alp_compress_sample(ADPCMChannelStatus
*c
, int16_t sample
)
246 const int delta
= sample
- c
->prev_sample
;
247 const int step
= ff_adpcm_step_table
[c
->step_index
];
248 const int sign
= (delta
< 0) * 8;
250 int nibble
= FFMIN(abs(delta
) * 4 / step
, 7);
251 int diff
= (step
* nibble
) >> 2;
255 nibble
= sign
| nibble
;
257 c
->prev_sample
+= diff
;
258 c
->prev_sample
= av_clip_int16(c
->prev_sample
);
259 c
->step_index
= av_clip(c
->step_index
+ ff_adpcm_index_table
[nibble
], 0, 88);
263 static inline uint8_t adpcm_ima_qt_compress_sample(ADPCMChannelStatus
*c
,
266 int delta
= sample
- c
->prev_sample
;
267 int diff
, step
= ff_adpcm_step_table
[c
->step_index
];
268 int nibble
= 8*(delta
< 0);
271 diff
= delta
+ (step
>> 3);
290 c
->prev_sample
-= diff
;
292 c
->prev_sample
+= diff
;
294 c
->prev_sample
= av_clip_int16(c
->prev_sample
);
295 c
->step_index
= av_clip(c
->step_index
+ ff_adpcm_index_table
[nibble
], 0, 88);
300 static inline uint8_t adpcm_ms_compress_sample(ADPCMChannelStatus
*c
,
303 int predictor
, nibble
, bias
;
305 predictor
= (((c
->sample1
) * (c
->coeff1
)) +
306 (( c
->sample2
) * (c
->coeff2
))) / 64;
308 nibble
= sample
- predictor
;
310 bias
= c
->idelta
/ 2;
312 bias
= -c
->idelta
/ 2;
314 nibble
= (nibble
+ bias
) / c
->idelta
;
315 nibble
= av_clip_intp2(nibble
, 3) & 0x0F;
317 predictor
+= ((nibble
& 0x08) ? (nibble
- 0x10) : nibble
) * c
->idelta
;
319 c
->sample2
= c
->sample1
;
320 c
->sample1
= av_clip_int16(predictor
);
322 c
->idelta
= (ff_adpcm_AdaptationTable
[nibble
] * c
->idelta
) >> 8;
329 static inline uint8_t adpcm_yamaha_compress_sample(ADPCMChannelStatus
*c
,
339 delta
= sample
- c
->predictor
;
341 nibble
= FFMIN(7, abs(delta
) * 4 / c
->step
) + (delta
< 0) * 8;
343 c
->predictor
+= ((c
->step
* ff_adpcm_yamaha_difflookup
[nibble
]) / 8);
344 c
->predictor
= av_clip_int16(c
->predictor
);
345 c
->step
= (c
->step
* ff_adpcm_yamaha_indexscale
[nibble
]) >> 8;
346 c
->step
= av_clip(c
->step
, 127, 24576);
351 static void adpcm_compress_trellis(AVCodecContext
*avctx
,
352 const int16_t *samples
, uint8_t *dst
,
353 ADPCMChannelStatus
*c
, int n
, int stride
)
355 //FIXME 6% faster if frontier is a compile-time constant
356 ADPCMEncodeContext
*s
= avctx
->priv_data
;
357 const int frontier
= 1 << avctx
->trellis
;
358 const int version
= avctx
->codec
->id
;
359 TrellisPath
*paths
= s
->paths
, *p
;
360 TrellisNode
*node_buf
= s
->node_buf
;
361 TrellisNode
**nodep_buf
= s
->nodep_buf
;
362 TrellisNode
**nodes
= nodep_buf
; // nodes[] is always sorted by .ssd
363 TrellisNode
**nodes_next
= nodep_buf
+ frontier
;
364 int pathn
= 0, froze
= -1, i
, j
, k
, generation
= 0;
365 uint8_t *hash
= s
->trellis_hash
;
366 memset(hash
, 0xff, 65536 * sizeof(*hash
));
368 memset(nodep_buf
, 0, 2 * frontier
* sizeof(*nodep_buf
));
369 nodes
[0] = node_buf
+ frontier
;
372 nodes
[0]->step
= c
->step_index
;
373 nodes
[0]->sample1
= c
->sample1
;
374 nodes
[0]->sample2
= c
->sample2
;
375 if (version
== AV_CODEC_ID_ADPCM_IMA_WAV
||
376 version
== AV_CODEC_ID_ADPCM_IMA_QT
||
377 version
== AV_CODEC_ID_ADPCM_IMA_AMV
||
378 version
== AV_CODEC_ID_ADPCM_SWF
)
379 nodes
[0]->sample1
= c
->prev_sample
;
380 if (version
== AV_CODEC_ID_ADPCM_MS
)
381 nodes
[0]->step
= c
->idelta
;
382 if (version
== AV_CODEC_ID_ADPCM_YAMAHA
) {
384 nodes
[0]->step
= 127;
385 nodes
[0]->sample1
= 0;
387 nodes
[0]->step
= c
->step
;
388 nodes
[0]->sample1
= c
->predictor
;
392 for (i
= 0; i
< n
; i
++) {
393 TrellisNode
*t
= node_buf
+ frontier
*(i
&1);
395 int sample
= samples
[i
* stride
];
397 memset(nodes_next
, 0, frontier
* sizeof(TrellisNode
*));
398 for (j
= 0; j
< frontier
&& nodes
[j
]; j
++) {
399 // higher j have higher ssd already, so they're likely
400 // to yield a suboptimal next sample too
401 const int range
= (j
< frontier
/ 2) ? 1 : 0;
402 const int step
= nodes
[j
]->step
;
404 if (version
== AV_CODEC_ID_ADPCM_MS
) {
405 const int predictor
= ((nodes
[j
]->sample1
* c
->coeff1
) +
406 (nodes
[j
]->sample2
* c
->coeff2
)) / 64;
407 const int div
= (sample
- predictor
) / step
;
408 const int nmin
= av_clip(div
-range
, -8, 6);
409 const int nmax
= av_clip(div
+range
, -7, 7);
410 for (nidx
= nmin
; nidx
<= nmax
; nidx
++) {
411 const int nibble
= nidx
& 0xf;
412 int dec_sample
= predictor
+ nidx
* step
;
413 #define STORE_NODE(NAME, STEP_INDEX)\
419 dec_sample = av_clip_int16(dec_sample);\
420 d = sample - dec_sample;\
421 ssd = nodes[j]->ssd + d*(unsigned)d;\
422 /* Check for wraparound, skip such samples completely. \
423 * Note, changing ssd to a 64 bit variable would be \
424 * simpler, avoiding this check, but it's slower on \
425 * x86 32 bit at the moment. */\
426 if (ssd < nodes[j]->ssd)\
428 /* Collapse any two states with the same previous sample value. \
429 * One could also distinguish states by step and by 2nd to last
430 * sample, but the effects of that are negligible.
431 * Since nodes in the previous generation are iterated
432 * through a heap, they're roughly ordered from better to
433 * worse, but not strictly ordered. Therefore, an earlier
434 * node with the same sample value is better in most cases
435 * (and thus the current is skipped), but not strictly
436 * in all cases. Only skipping samples where ssd >=
437 * ssd of the earlier node with the same sample gives
438 * slightly worse quality, though, for some reason. */ \
439 h = &hash[(uint16_t) dec_sample];\
440 if (*h == generation)\
442 if (heap_pos < frontier) {\
445 /* Try to replace one of the leaf nodes with the new \
446 * one, but try a different slot each time. */\
447 pos = (frontier >> 1) +\
448 (heap_pos & ((frontier >> 1) - 1));\
449 if (ssd > nodes_next[pos]->ssd)\
454 u = nodes_next[pos];\
456 av_assert1(pathn < FREEZE_INTERVAL << avctx->trellis);\
458 nodes_next[pos] = u;\
462 u->step = STEP_INDEX;\
463 u->sample2 = nodes[j]->sample1;\
464 u->sample1 = dec_sample;\
465 paths[u->path].nibble = nibble;\
466 paths[u->path].prev = nodes[j]->path;\
467 /* Sift the newly inserted node up in the heap to \
468 * restore the heap property. */\
470 int parent = (pos - 1) >> 1;\
471 if (nodes_next[parent]->ssd <= ssd)\
473 FFSWAP(TrellisNode*, nodes_next[parent], nodes_next[pos]);\
477 STORE_NODE(ms
, FFMAX(16,
478 (ff_adpcm_AdaptationTable
[nibble
] * step
) >> 8));
480 } else if (version
== AV_CODEC_ID_ADPCM_IMA_WAV
||
481 version
== AV_CODEC_ID_ADPCM_IMA_QT
||
482 version
== AV_CODEC_ID_ADPCM_IMA_AMV
||
483 version
== AV_CODEC_ID_ADPCM_SWF
) {
484 #define LOOP_NODES(NAME, STEP_TABLE, STEP_INDEX)\
485 const int predictor = nodes[j]->sample1;\
486 const int div = (sample - predictor) * 4 / STEP_TABLE;\
487 int nmin = av_clip(div - range, -7, 6);\
488 int nmax = av_clip(div + range, -6, 7);\
490 nmin--; /* distinguish -0 from +0 */\
493 for (nidx = nmin; nidx <= nmax; nidx++) {\
494 const int nibble = nidx < 0 ? 7 - nidx : nidx;\
495 int dec_sample = predictor +\
497 ff_adpcm_yamaha_difflookup[nibble]) / 8;\
498 STORE_NODE(NAME, STEP_INDEX);\
500 LOOP_NODES(ima
, ff_adpcm_step_table
[step
],
501 av_clip(step
+ ff_adpcm_index_table
[nibble
], 0, 88));
502 } else { //AV_CODEC_ID_ADPCM_YAMAHA
503 LOOP_NODES(yamaha
, step
,
504 av_clip((step
* ff_adpcm_yamaha_indexscale
[nibble
]) >> 8,
516 if (generation
== 255) {
517 memset(hash
, 0xff, 65536 * sizeof(*hash
));
522 if (nodes
[0]->ssd
> (1 << 28)) {
523 for (j
= 1; j
< frontier
&& nodes
[j
]; j
++)
524 nodes
[j
]->ssd
-= nodes
[0]->ssd
;
528 // merge old paths to save memory
529 if (i
== froze
+ FREEZE_INTERVAL
) {
530 p
= &paths
[nodes
[0]->path
];
531 for (k
= i
; k
> froze
; k
--) {
537 // other nodes might use paths that don't coincide with the frozen one.
538 // checking which nodes do so is too slow, so just kill them all.
539 // this also slightly improves quality, but I don't know why.
540 memset(nodes
+ 1, 0, (frontier
- 1) * sizeof(TrellisNode
*));
544 p
= &paths
[nodes
[0]->path
];
545 for (i
= n
- 1; i
> froze
; i
--) {
550 c
->predictor
= nodes
[0]->sample1
;
551 c
->sample1
= nodes
[0]->sample1
;
552 c
->sample2
= nodes
[0]->sample2
;
553 c
->step_index
= nodes
[0]->step
;
554 c
->step
= nodes
[0]->step
;
555 c
->idelta
= nodes
[0]->step
;
558 #if CONFIG_ADPCM_ARGO_ENCODER
559 static inline int adpcm_argo_compress_nibble(const ADPCMChannelStatus
*cs
, int16_t s
,
565 nibble
= 4 * s
- 8 * cs
->sample1
+ 4 * cs
->sample2
;
567 nibble
= 4 * s
- 4 * cs
->sample1
;
569 return (nibble
>> shift
) & 0x0F;
572 static int64_t adpcm_argo_compress_block(ADPCMChannelStatus
*cs
, PutBitContext
*pb
,
573 const int16_t *samples
, int nsamples
,
579 put_bits(pb
, 4, shift
- 2);
581 put_bits(pb
, 1, !!flag
);
585 for (int n
= 0; n
< nsamples
; n
++) {
586 /* Compress the nibble, then expand it to see how much precision we've lost. */
587 int nibble
= adpcm_argo_compress_nibble(cs
, samples
[n
], shift
, flag
);
588 int16_t sample
= ff_adpcm_argo_expand_nibble(cs
, nibble
, shift
, flag
);
590 error
+= abs(samples
[n
] - sample
);
593 put_bits(pb
, 4, nibble
);
600 static int adpcm_encode_frame(AVCodecContext
*avctx
, AVPacket
*avpkt
,
601 const AVFrame
*frame
, int *got_packet_ptr
)
603 int st
, pkt_size
, ret
;
604 const int16_t *samples
;
605 const int16_t *const *samples_p
;
607 ADPCMEncodeContext
*c
= avctx
->priv_data
;
608 int channels
= avctx
->ch_layout
.nb_channels
;
610 samples
= (const int16_t *)frame
->data
[0];
611 samples_p
= (const int16_t *const *)frame
->extended_data
;
614 if (avctx
->codec_id
== AV_CODEC_ID_ADPCM_IMA_SSI
||
615 avctx
->codec_id
== AV_CODEC_ID_ADPCM_IMA_ALP
||
616 avctx
->codec_id
== AV_CODEC_ID_ADPCM_IMA_APM
||
617 avctx
->codec_id
== AV_CODEC_ID_ADPCM_IMA_WS
)
618 pkt_size
= (frame
->nb_samples
* channels
+ 1) / 2;
620 pkt_size
= avctx
->block_align
;
621 if ((ret
= ff_get_encode_buffer(avctx
, avpkt
, pkt_size
, 0)) < 0)
625 switch(avctx
->codec
->id
) {
627 int blocks
= (frame
->nb_samples
- 1) / 8;
629 for (int ch
= 0; ch
< channels
; ch
++) {
630 ADPCMChannelStatus
*status
= &c
->status
[ch
];
631 status
->prev_sample
= samples_p
[ch
][0];
632 /* status->step_index = 0;
633 XXX: not sure how to init the state machine */
634 bytestream_put_le16(&dst
, status
->prev_sample
);
635 *dst
++ = status
->step_index
;
636 *dst
++ = 0; /* unknown */
639 /* stereo: 4 bytes (8 samples) for left, 4 bytes for right */
640 if (avctx
->trellis
> 0) {
642 if (!FF_ALLOC_TYPED_ARRAY(buf
, channels
* blocks
* 8))
643 return AVERROR(ENOMEM
);
644 for (int ch
= 0; ch
< channels
; ch
++) {
645 adpcm_compress_trellis(avctx
, &samples_p
[ch
][1],
646 buf
+ ch
* blocks
* 8, &c
->status
[ch
],
649 for (int i
= 0; i
< blocks
; i
++) {
650 for (int ch
= 0; ch
< channels
; ch
++) {
651 uint8_t *buf1
= buf
+ ch
* blocks
* 8 + i
* 8;
652 for (int j
= 0; j
< 8; j
+= 2)
653 *dst
++ = buf1
[j
] | (buf1
[j
+ 1] << 4);
658 for (int i
= 0; i
< blocks
; i
++) {
659 for (int ch
= 0; ch
< channels
; ch
++) {
660 ADPCMChannelStatus
*status
= &c
->status
[ch
];
661 const int16_t *smp
= &samples_p
[ch
][1 + i
* 8];
662 for (int j
= 0; j
< 8; j
+= 2) {
663 uint8_t v
= adpcm_ima_compress_sample(status
, smp
[j
]);
664 v
|= adpcm_ima_compress_sample(status
, smp
[j
+ 1]) << 4;
673 init_put_bits(&pb
, dst
, pkt_size
);
675 for (int ch
= 0; ch
< channels
; ch
++) {
676 ADPCMChannelStatus
*status
= &c
->status
[ch
];
677 put_bits(&pb
, 9, (status
->prev_sample
& 0xFFFF) >> 7);
678 put_bits(&pb
, 7, status
->step_index
);
679 if (avctx
->trellis
> 0) {
681 adpcm_compress_trellis(avctx
, &samples_p
[ch
][0], buf
, status
,
683 for (int i
= 0; i
< 64; i
++)
684 put_bits(&pb
, 4, buf
[i
^ 1]);
685 status
->prev_sample
= status
->predictor
;
687 for (int i
= 0; i
< 64; i
+= 2) {
689 t1
= adpcm_ima_qt_compress_sample(status
, samples_p
[ch
][i
]);
690 t2
= adpcm_ima_qt_compress_sample(status
, samples_p
[ch
][i
+ 1]);
691 put_bits(&pb
, 4, t2
);
692 put_bits(&pb
, 4, t1
);
701 init_put_bits(&pb
, dst
, pkt_size
);
703 av_assert0(avctx
->trellis
== 0);
705 for (int i
= 0; i
< frame
->nb_samples
; i
++) {
706 for (int ch
= 0; ch
< channels
; ch
++) {
707 put_bits(&pb
, 4, adpcm_ima_qt_compress_sample(c
->status
+ ch
, *samples
++));
715 init_put_bits(&pb
, dst
, pkt_size
);
717 av_assert0(avctx
->trellis
== 0);
719 for (int n
= frame
->nb_samples
/ 2; n
> 0; n
--) {
720 for (int ch
= 0; ch
< channels
; ch
++) {
721 put_bits(&pb
, 4, adpcm_ima_alp_compress_sample(c
->status
+ ch
, *samples
++));
722 put_bits(&pb
, 4, adpcm_ima_alp_compress_sample(c
->status
+ ch
, samples
[st
]));
730 const int n
= frame
->nb_samples
- 1;
732 init_put_bits(&pb
, dst
, pkt_size
);
734 /* NB: This is safe as we don't have AV_CODEC_CAP_SMALL_LAST_FRAME. */
735 av_assert0(n
== 4095);
737 // store AdpcmCodeSize
738 put_bits(&pb
, 2, 2); // set 4-bit flash adpcm format
740 // init the encoder state
741 for (int i
= 0; i
< channels
; i
++) {
742 // clip step so it fits 6 bits
743 c
->status
[i
].step_index
= av_clip_uintp2(c
->status
[i
].step_index
, 6);
744 put_sbits(&pb
, 16, samples
[i
]);
745 put_bits(&pb
, 6, c
->status
[i
].step_index
);
746 c
->status
[i
].prev_sample
= samples
[i
];
749 if (avctx
->trellis
> 0) {
750 uint8_t buf
[8190 /* = 2 * n */];
751 adpcm_compress_trellis(avctx
, samples
+ channels
, buf
,
752 &c
->status
[0], n
, channels
);
754 adpcm_compress_trellis(avctx
, samples
+ channels
+ 1,
755 buf
+ n
, &c
->status
[1], n
,
757 for (int i
= 0; i
< n
; i
++) {
758 put_bits(&pb
, 4, buf
[i
]);
760 put_bits(&pb
, 4, buf
[n
+ i
]);
763 for (int i
= 1; i
< frame
->nb_samples
; i
++) {
764 put_bits(&pb
, 4, adpcm_ima_compress_sample(&c
->status
[0],
765 samples
[channels
* i
]));
767 put_bits(&pb
, 4, adpcm_ima_compress_sample(&c
->status
[1],
768 samples
[2 * i
+ 1]));
774 for (int i
= 0; i
< channels
; i
++) {
777 c
->status
[i
].coeff1
= ff_adpcm_AdaptCoeff1
[predictor
];
778 c
->status
[i
].coeff2
= ff_adpcm_AdaptCoeff2
[predictor
];
780 for (int i
= 0; i
< channels
; i
++) {
781 if (c
->status
[i
].idelta
< 16)
782 c
->status
[i
].idelta
= 16;
783 bytestream_put_le16(&dst
, c
->status
[i
].idelta
);
785 for (int i
= 0; i
< channels
; i
++)
786 c
->status
[i
].sample2
= *samples
++;
787 for (int i
= 0; i
< channels
; i
++) {
788 c
->status
[i
].sample1
= *samples
++;
789 bytestream_put_le16(&dst
, c
->status
[i
].sample1
);
791 for (int i
= 0; i
< channels
; i
++)
792 bytestream_put_le16(&dst
, c
->status
[i
].sample2
);
794 if (avctx
->trellis
> 0) {
795 const int n
= avctx
->block_align
- 7 * channels
;
796 uint8_t *buf
= av_malloc(2 * n
);
798 return AVERROR(ENOMEM
);
800 adpcm_compress_trellis(avctx
, samples
, buf
, &c
->status
[0], n
,
802 for (int i
= 0; i
< n
; i
+= 2)
803 *dst
++ = (buf
[i
] << 4) | buf
[i
+ 1];
805 adpcm_compress_trellis(avctx
, samples
, buf
,
806 &c
->status
[0], n
, channels
);
807 adpcm_compress_trellis(avctx
, samples
+ 1, buf
+ n
,
808 &c
->status
[1], n
, channels
);
809 for (int i
= 0; i
< n
; i
++)
810 *dst
++ = (buf
[i
] << 4) | buf
[n
+ i
];
814 for (int i
= 7 * channels
; i
< avctx
->block_align
; i
++) {
816 nibble
= adpcm_ms_compress_sample(&c
->status
[ 0], *samples
++) << 4;
817 nibble
|= adpcm_ms_compress_sample(&c
->status
[st
], *samples
++);
823 int n
= frame
->nb_samples
/ 2;
824 if (avctx
->trellis
> 0) {
825 uint8_t *buf
= av_malloc(2 * n
* 2);
827 return AVERROR(ENOMEM
);
830 adpcm_compress_trellis(avctx
, samples
, buf
, &c
->status
[0], n
,
832 for (int i
= 0; i
< n
; i
+= 2)
833 *dst
++ = buf
[i
] | (buf
[i
+ 1] << 4);
835 adpcm_compress_trellis(avctx
, samples
, buf
,
836 &c
->status
[0], n
, channels
);
837 adpcm_compress_trellis(avctx
, samples
+ 1, buf
+ n
,
838 &c
->status
[1], n
, channels
);
839 for (int i
= 0; i
< n
; i
++)
840 *dst
++ = buf
[i
] | (buf
[n
+ i
] << 4);
844 for (n
*= channels
; n
> 0; n
--) {
846 nibble
= adpcm_yamaha_compress_sample(&c
->status
[ 0], *samples
++);
847 nibble
|= adpcm_yamaha_compress_sample(&c
->status
[st
], *samples
++) << 4;
853 init_put_bits(&pb
, dst
, pkt_size
);
855 av_assert0(avctx
->trellis
== 0);
857 for (int n
= frame
->nb_samples
/ 2; n
> 0; n
--) {
858 for (int ch
= 0; ch
< channels
; ch
++) {
859 put_bits(&pb
, 4, adpcm_ima_qt_compress_sample(c
->status
+ ch
, *samples
++));
860 put_bits(&pb
, 4, adpcm_ima_qt_compress_sample(c
->status
+ ch
, samples
[st
]));
868 av_assert0(channels
== 1);
870 c
->status
[0].prev_sample
= *samples
;
871 bytestream_put_le16(&dst
, c
->status
[0].prev_sample
);
872 bytestream_put_byte(&dst
, c
->status
[0].step_index
);
873 bytestream_put_byte(&dst
, 0);
874 bytestream_put_le32(&dst
, avctx
->frame_size
);
876 if (avctx
->trellis
> 0) {
877 const int n
= frame
->nb_samples
>> 1;
878 uint8_t *buf
= av_malloc(2 * n
);
881 return AVERROR(ENOMEM
);
883 adpcm_compress_trellis(avctx
, samples
, buf
, &c
->status
[0], 2 * n
, channels
);
884 for (int i
= 0; i
< n
; i
++)
885 bytestream_put_byte(&dst
, (buf
[2 * i
] << 4) | buf
[2 * i
+ 1]);
889 } else for (int n
= frame
->nb_samples
>> 1; n
> 0; n
--) {
891 nibble
= adpcm_ima_compress_sample(&c
->status
[0], *samples
++) << 4;
892 nibble
|= adpcm_ima_compress_sample(&c
->status
[0], *samples
++) & 0x0F;
893 bytestream_put_byte(&dst
, nibble
);
896 if (avctx
->frame_size
& 1) {
897 int nibble
= adpcm_ima_compress_sample(&c
->status
[0], *samples
++) << 4;
898 bytestream_put_byte(&dst
, nibble
);
903 init_put_bits(&pb
, dst
, pkt_size
);
905 av_assert0(frame
->nb_samples
== 32);
907 for (int ch
= 0; ch
< channels
; ch
++) {
908 int64_t error
= INT64_MAX
, tmperr
= INT64_MAX
;
909 int shift
= 2, flag
= 0;
910 int saved1
= c
->status
[ch
].sample1
;
911 int saved2
= c
->status
[ch
].sample2
;
913 /* Find the optimal coefficients, bail early if we find a perfect result. */
914 for (int s
= 2; s
< 18 && tmperr
!= 0; s
++) {
915 for (int f
= 0; f
< 2 && tmperr
!= 0; f
++) {
916 c
->status
[ch
].sample1
= saved1
;
917 c
->status
[ch
].sample2
= saved2
;
918 tmperr
= adpcm_argo_compress_block(c
->status
+ ch
, NULL
, samples_p
[ch
],
919 frame
->nb_samples
, s
, f
);
920 if (tmperr
< error
) {
928 /* Now actually do the encode. */
929 c
->status
[ch
].sample1
= saved1
;
930 c
->status
[ch
].sample2
= saved2
;
931 adpcm_argo_compress_block(c
->status
+ ch
, &pb
, samples_p
[ch
],
932 frame
->nb_samples
, shift
, flag
);
939 init_put_bits(&pb
, dst
, pkt_size
);
941 av_assert0(avctx
->trellis
== 0);
942 for (int n
= frame
->nb_samples
/ 2; n
> 0; n
--) {
943 /* stereo: 1 byte (2 samples) for left, 1 byte for right */
944 for (int ch
= 0; ch
< channels
; ch
++) {
946 t1
= adpcm_ima_compress_sample(&c
->status
[ch
], *samples
++);
947 t2
= adpcm_ima_compress_sample(&c
->status
[ch
], samples
[st
]);
948 put_bits(&pb
, 4, t2
);
949 put_bits(&pb
, 4, t1
);
956 return AVERROR(EINVAL
);
963 static const enum AVSampleFormat sample_fmts
[] = {
964 AV_SAMPLE_FMT_S16
, AV_SAMPLE_FMT_NONE
967 static const enum AVSampleFormat sample_fmts_p
[] = {
968 AV_SAMPLE_FMT_S16P
, AV_SAMPLE_FMT_NONE
971 static const AVChannelLayout ch_layouts
[] = {
972 AV_CHANNEL_LAYOUT_MONO
,
973 AV_CHANNEL_LAYOUT_STEREO
,
977 static const AVOption options
[] = {
979 .name
= "block_size",
980 .help
= "set the block size",
981 .offset
= offsetof(ADPCMEncodeContext
, block_size
),
982 .type
= AV_OPT_TYPE_INT
,
983 .default_val
= {.i64
= 1024},
985 .max
= 8192, /* Is this a reasonable upper limit? */
986 .flags
= AV_OPT_FLAG_ENCODING_PARAM
| AV_OPT_FLAG_AUDIO_PARAM
991 static const AVClass adpcm_encoder_class
= {
992 .class_name
= "ADPCM encoder",
993 .item_name
= av_default_item_name
,
995 .version
= LIBAVUTIL_VERSION_INT
,
998 #define ADPCM_ENCODER_0(id_, name_, sample_fmts_, capabilities_, long_name_)
999 #define ADPCM_ENCODER_1(id_, name_, sample_fmts_, capabilities_, long_name_) \
1000 const FFCodec ff_ ## name_ ## _encoder = { \
1002 CODEC_LONG_NAME(long_name_), \
1003 .p.type = AVMEDIA_TYPE_AUDIO, \
1005 .p.sample_fmts = sample_fmts_, \
1006 .p.ch_layouts = ch_layouts, \
1007 .p.capabilities = capabilities_ | AV_CODEC_CAP_DR1 | \
1008 AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE, \
1009 .p.priv_class = &adpcm_encoder_class, \
1010 .priv_data_size = sizeof(ADPCMEncodeContext), \
1011 .init = adpcm_encode_init, \
1012 FF_CODEC_ENCODE_CB(adpcm_encode_frame), \
1013 .close = adpcm_encode_close, \
1014 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, \
1016 #define ADPCM_ENCODER_2(enabled, codec_id, name, sample_fmts, capabilities, long_name) \
1017 ADPCM_ENCODER_ ## enabled(codec_id, name, sample_fmts, capabilities, long_name)
1018 #define ADPCM_ENCODER_3(config, codec_id, name, sample_fmts, capabilities, long_name) \
1019 ADPCM_ENCODER_2(config, codec_id, name, sample_fmts, capabilities, long_name)
1020 #define ADPCM_ENCODER(codec, name, sample_fmts, capabilities, long_name) \
1021 ADPCM_ENCODER_3(CONFIG_ ## codec ## _ENCODER, AV_CODEC_ID_ ## codec, \
1022 name, sample_fmts, capabilities, long_name)
1024 ADPCM_ENCODER(ADPCM_ARGO
, adpcm_argo
, sample_fmts_p
, 0, "ADPCM Argonaut Games")
1025 ADPCM_ENCODER(ADPCM_IMA_AMV
, adpcm_ima_amv
, sample_fmts
, 0, "ADPCM IMA AMV")
1026 ADPCM_ENCODER(ADPCM_IMA_APM
, adpcm_ima_apm
, sample_fmts
, AV_CODEC_CAP_SMALL_LAST_FRAME
, "ADPCM IMA Ubisoft APM")
1027 ADPCM_ENCODER(ADPCM_IMA_ALP
, adpcm_ima_alp
, sample_fmts
, AV_CODEC_CAP_SMALL_LAST_FRAME
, "ADPCM IMA High Voltage Software ALP")
1028 ADPCM_ENCODER(ADPCM_IMA_QT
, adpcm_ima_qt
, sample_fmts_p
, 0, "ADPCM IMA QuickTime")
1029 ADPCM_ENCODER(ADPCM_IMA_SSI
, adpcm_ima_ssi
, sample_fmts
, AV_CODEC_CAP_SMALL_LAST_FRAME
, "ADPCM IMA Simon & Schuster Interactive")
1030 ADPCM_ENCODER(ADPCM_IMA_WAV
, adpcm_ima_wav
, sample_fmts_p
, 0, "ADPCM IMA WAV")
1031 ADPCM_ENCODER(ADPCM_IMA_WS
, adpcm_ima_ws
, sample_fmts
, AV_CODEC_CAP_SMALL_LAST_FRAME
, "ADPCM IMA Westwood")
1032 ADPCM_ENCODER(ADPCM_MS
, adpcm_ms
, sample_fmts
, 0, "ADPCM Microsoft")
1033 ADPCM_ENCODER(ADPCM_SWF
, adpcm_swf
, sample_fmts
, 0, "ADPCM Shockwave Flash")
1034 ADPCM_ENCODER(ADPCM_YAMAHA
, adpcm_yamaha
, sample_fmts
, 0, "ADPCM Yamaha")