53 0, 1, 2, 3, 4, 5, 6, 7,
54 8, 9, 10, 11, 12, 13, 14, 16,
55 17, 19, 21, 23, 25, 28, 31, 34,
56 37, 41, 45, 50, 55, 60, 66, 73,
57 80, 88, 97, 107, 118, 130, 143, 157,
58 173, 190, 209, 230, 253, 279, 307, 337,
59 371, 408, 449, 494, 544, 598, 658, 724,
60 796, 876, 963, 1060, 1166, 1282, 1411, 1552,
61 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327,
62 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132,
63 7845, 8630, 9493, 10442, 11487, 12635, 13899, 15289,
64 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767,
68 0, 1, 2, 3, 4, 5, 6, 7,
69 8, 9, 10, 11, 12, 13, 14, 15,
70 16, 17, 18, 19, 20, 21, 22, 23,
71 24, 25, 26, 27, 28, 29, 30, 31,
72 32, 33, 34, 35, 36, 37, 38, 39,
73 40, 41, 42, 43, 47, 51, 56, 61,
74 66, 72, 79, 86, 94, 102, 112, 122,
75 133, 145, 158, 173, 189, 206, 225, 245,
76 267, 292, 318, 348, 379, 414, 452, 493,
77 538, 587, 640, 699, 763, 832, 908, 991,
78 1081, 1180, 1288, 1405, 1534, 1673, 1826, 1993,
79 2175, 2373, 2590, 2826, 3084, 3365, 3672, 4008,
80 4373, 4772, 5208, 5683, 6202, 6767, 7385, 8059,
81 8794, 9597, 10472, 11428, 12471, 13609, 14851, 16206,
82 17685, 19298, 21060, 22981, 25078, 27367, 29864, 32589,
83 -29973, -26728, -23186, -19322, -15105, -10503, -5481, -1,
84 1, 1, 5481, 10503, 15105, 19322, 23186, 26728,
85 29973, -32589, -29864, -27367, -25078, -22981, -21060, -19298,
86 -17685, -16206, -14851, -13609, -12471, -11428, -10472, -9597,
87 -8794, -8059, -7385, -6767, -6202, -5683, -5208, -4772,
88 -4373, -4008, -3672, -3365, -3084, -2826, -2590, -2373,
89 -2175, -1993, -1826, -1673, -1534, -1405, -1288, -1180,
90 -1081, -991, -908, -832, -763, -699, -640, -587,
91 -538, -493, -452, -414, -379, -348, -318, -292,
92 -267, -245, -225, -206, -189, -173, -158, -145,
93 -133, -122, -112, -102, -94, -86, -79, -72,
94 -66, -61, -56, -51, -47, -43, -42, -41,
95 -40, -39, -38, -37, -36, -35, -34, -33,
96 -32, -31, -30, -29, -28, -27, -26, -25,
97 -24, -23, -22, -21, -20, -19, -18, -17,
98 -16, -15, -14, -13, -12, -11, -10, -9,
99 -8, -7, -6, -5, -4, -3, -2, -1
104 0x0, 0x1, 0x2, 0x3, 0x6, 0xA, 0xF, 0x15,
105 -0x15, -0xF, -0xA, -0x6, -0x3, -0x2, -0x1, 0x0
109 0x0, 0x1, 0x2, 0x3, 0x6, 0xA, 0xF, 0x15,
110 0x0, -0x1, -0x2, -0x3, -0x6, -0xA, -0xF, -0x15
114 0x000, 0x008, 0x010, 0x020, 0x030, 0x040, 0x050, 0x060, 0x070, 0x080,
115 0x090, 0x0A0, 0x0B0, 0x0C0, 0x0D0, 0x0E0, 0x0F0, 0x100, 0x110, 0x120,
116 0x130, 0x140, 0x150, 0x160, 0x170, 0x180, 0x190, 0x1A0, 0x1B0, 0x1C0,
117 0x1D0, 0x1E0, 0x1F0, 0x200, 0x208, 0x210, 0x218, 0x220, 0x228, 0x230,
118 0x238, 0x240, 0x248, 0x250, 0x258, 0x260, 0x268, 0x270, 0x278, 0x280,
119 0x288, 0x290, 0x298, 0x2A0, 0x2A8, 0x2B0, 0x2B8, 0x2C0, 0x2C8, 0x2D0,
120 0x2D8, 0x2E0, 0x2E8, 0x2F0, 0x2F8, 0x300, 0x308, 0x310, 0x318, 0x320,
121 0x328, 0x330, 0x338, 0x340, 0x348, 0x350, 0x358, 0x360, 0x368, 0x370,
122 0x378, 0x380, 0x388, 0x390, 0x398, 0x3A0, 0x3A8, 0x3B0, 0x3B8, 0x3C0,
123 0x3C8, 0x3D0, 0x3D8, 0x3E0, 0x3E8, 0x3F0, 0x3F8, 0x400, 0x440, 0x480,
124 0x4C0, 0x500, 0x540, 0x580, 0x5C0, 0x600, 0x640, 0x680, 0x6C0, 0x700,
125 0x740, 0x780, 0x7C0, 0x800, 0x900, 0xA00, 0xB00, 0xC00, 0xD00, 0xE00,
126 0xF00, 0x1000, 0x1400, 0x1800, 0x1C00, 0x2000, 0x3000, 0x4000
140 s->sample[0] =
s->sample[1] = 0;
146 for (
i = 0;
i < 128;
i++) {
157 s->sample[0] =
s->sample[1] = 0x80;
161 s->sample[0] =
s->sample[1] = 0x80;
172 for (
i = -128;
i < 128;
i++) {
184 for (
i = 0;
i < 127;
i++) {
210 int *got_frame_ptr,
AVPacket *avpkt)
212 int buf_size = avpkt->
size;
219 int16_t *output_samples, *samples_end;
222 if (stereo && (buf_size & 1))
261 output_samples = (int16_t *)
frame->
data[0];
262 samples_end = output_samples +
out;
277 while (output_samples < samples_end) {
278 predictor[ch] +=
s->array[bytestream2_get_byteu(&gb)];
290 for (ch = 0; ch < avctx->
channels; ch++) {
296 while (output_samples < samples_end) {
308 int shift[2] = { 4, 4 };
310 for (ch = 0; ch < avctx->
channels; ch++)
314 while (output_samples < samples_end) {
315 int diff = bytestream2_get_byteu(&gb);
321 shift[ch] -= (2 * n);
341 *samples_end_u8 = output_samples_u8 +
out;
342 while (output_samples_u8 < samples_end_u8) {
343 int n = bytestream2_get_byteu(&gb);
345 s->sample[0] +=
s->sol_table[n >> 4];
347 *output_samples_u8++ =
s->sample[0];
349 s->sample[stereo] +=
s->sol_table[n & 0x0F];
351 *output_samples_u8++ =
s->sample[stereo];
354 while (output_samples < samples_end) {
355 int n = bytestream2_get_byteu(&gb);
359 *output_samples++ =
s->sample[ch];
367 while (output_samples < samples_end) {
368 int8_t n = bytestream2_get_byteu(&gb);
372 s->sample[ch] +=
s->array[n + 128];
374 *output_samples++ =
s->sample[ch];
382 while (output_samples < samples_end) {
383 uint8_t n = bytestream2_get_byteu(&gb);
385 *output_samples++ =
s->sample[idx] += (unsigned)
s->array[n];
394 while (output_samples < samples_end) {
395 uint8_t n = bytestream2_get_byteu(&gb);
400 *output_samples++ =
s->sample[idx];
412 #define DPCM_DECODER(id_, name_, long_name_) \
413 AVCodec ff_ ## name_ ## _decoder = { \
415 .long_name = NULL_IF_CONFIG_SMALL(long_name_), \
416 .type = AVMEDIA_TYPE_AUDIO, \
418 .priv_data_size = sizeof(DPCMContext), \
419 .init = dpcm_decode_init, \
420 .decode = dpcm_decode_frame, \
421 .capabilities = AV_CODEC_CAP_DR1, \
Libavcodec external API header.
static av_always_inline void bytestream2_skipu(GetByteContext *g, unsigned int size)
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
#define DPCM_DECODER(id_, name_, long_name_)
static const int8_t sol_table_new[16]
static const int16_t interplay_delta_table[]
static int dpcm_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
static const int8_t sol_table_old[16]
static const int32_t derf_steps[96]
static const int16_t sol_table_16[128]
static av_cold int dpcm_decode_init(AVCodecContext *avctx)
static void predictor(uint8_t *src, ptrdiff_t size)
@ AV_CODEC_ID_INTERPLAY_DPCM
@ AV_CODEC_ID_GREMLIN_DPCM
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
@ AV_SAMPLE_FMT_S16
signed 16 bits
common internal API header
static av_const int sign_extend(int val, unsigned bits)
static int shift(int a, int b)
main external API structure.
enum AVSampleFormat sample_fmt
audio sample format
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
const struct AVCodec * codec
int channels
number of audio channels
This structure describes decoded (raw) audio or video data.
int nb_samples
number of audio samples (per channel) described by this frame
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
This structure stores compressed data.
int sample[2]
previous sample (for SOL_DPCM)
const int8_t * sol_table
delta table for SOL_DPCM
static av_always_inline int diff(const uint32_t a, const uint32_t b)