FFmpeg
dpcm.c
Go to the documentation of this file.
1 /*
2  * Assorted DPCM codecs
3  * Copyright (c) 2003 The FFmpeg project
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 /**
23  * @file
24  * Assorted DPCM (differential pulse code modulation) audio codecs
25  * by Mike Melanson (melanson@pcisys.net)
26  * Xan DPCM decoder by Mario Brito (mbrito@student.dei.uc.pt)
27  * for more information on the specific data formats, visit:
28  * http://www.pcisys.net/~melanson/codecs/simpleaudio.html
29  * SOL DPCMs implemented by Konstantin Shishkov
30  *
31  * Note about using the Xan DPCM decoder: Xan DPCM is used in AVI files
32  * found in the Wing Commander IV computer game. These AVI files contain
33  * WAVEFORMAT headers which report the audio format as 0x01: raw PCM.
34  * Clearly incorrect. To detect Xan DPCM, you will probably have to
35  * special-case your AVI demuxer to use Xan DPCM if the file uses 'Xxan'
36  * (Xan video) for its video codec. Alternately, such AVI files also contain
37  * the fourcc 'Axan' in the 'auds' chunk of the AVI header.
38  */
39 
40 #include "libavutil/intreadwrite.h"
41 #include "avcodec.h"
42 #include "bytestream.h"
43 #include "internal.h"
44 #include "mathops.h"
45 
46 typedef struct DPCMContext {
47  int16_t array[256];
48  int sample[2]; ///< previous sample (for SOL_DPCM)
49  const int8_t *sol_table; ///< delta table for SOL_DPCM
50 } DPCMContext;
51 
52 static const int16_t interplay_delta_table[] = {
53  0, 1, 2, 3, 4, 5, 6, 7,
54  8, 9, 10, 11, 12, 13, 14, 15,
55  16, 17, 18, 19, 20, 21, 22, 23,
56  24, 25, 26, 27, 28, 29, 30, 31,
57  32, 33, 34, 35, 36, 37, 38, 39,
58  40, 41, 42, 43, 47, 51, 56, 61,
59  66, 72, 79, 86, 94, 102, 112, 122,
60  133, 145, 158, 173, 189, 206, 225, 245,
61  267, 292, 318, 348, 379, 414, 452, 493,
62  538, 587, 640, 699, 763, 832, 908, 991,
63  1081, 1180, 1288, 1405, 1534, 1673, 1826, 1993,
64  2175, 2373, 2590, 2826, 3084, 3365, 3672, 4008,
65  4373, 4772, 5208, 5683, 6202, 6767, 7385, 8059,
66  8794, 9597, 10472, 11428, 12471, 13609, 14851, 16206,
67  17685, 19298, 21060, 22981, 25078, 27367, 29864, 32589,
68  -29973, -26728, -23186, -19322, -15105, -10503, -5481, -1,
69  1, 1, 5481, 10503, 15105, 19322, 23186, 26728,
70  29973, -32589, -29864, -27367, -25078, -22981, -21060, -19298,
71  -17685, -16206, -14851, -13609, -12471, -11428, -10472, -9597,
72  -8794, -8059, -7385, -6767, -6202, -5683, -5208, -4772,
73  -4373, -4008, -3672, -3365, -3084, -2826, -2590, -2373,
74  -2175, -1993, -1826, -1673, -1534, -1405, -1288, -1180,
75  -1081, -991, -908, -832, -763, -699, -640, -587,
76  -538, -493, -452, -414, -379, -348, -318, -292,
77  -267, -245, -225, -206, -189, -173, -158, -145,
78  -133, -122, -112, -102, -94, -86, -79, -72,
79  -66, -61, -56, -51, -47, -43, -42, -41,
80  -40, -39, -38, -37, -36, -35, -34, -33,
81  -32, -31, -30, -29, -28, -27, -26, -25,
82  -24, -23, -22, -21, -20, -19, -18, -17,
83  -16, -15, -14, -13, -12, -11, -10, -9,
84  -8, -7, -6, -5, -4, -3, -2, -1
85 
86 };
87 
88 static const int8_t sol_table_old[16] = {
89  0x0, 0x1, 0x2, 0x3, 0x6, 0xA, 0xF, 0x15,
90  -0x15, -0xF, -0xA, -0x6, -0x3, -0x2, -0x1, 0x0
91 };
92 
93 static const int8_t sol_table_new[16] = {
94  0x0, 0x1, 0x2, 0x3, 0x6, 0xA, 0xF, 0x15,
95  0x0, -0x1, -0x2, -0x3, -0x6, -0xA, -0xF, -0x15
96 };
97 
98 static const int16_t sol_table_16[128] = {
99  0x000, 0x008, 0x010, 0x020, 0x030, 0x040, 0x050, 0x060, 0x070, 0x080,
100  0x090, 0x0A0, 0x0B0, 0x0C0, 0x0D0, 0x0E0, 0x0F0, 0x100, 0x110, 0x120,
101  0x130, 0x140, 0x150, 0x160, 0x170, 0x180, 0x190, 0x1A0, 0x1B0, 0x1C0,
102  0x1D0, 0x1E0, 0x1F0, 0x200, 0x208, 0x210, 0x218, 0x220, 0x228, 0x230,
103  0x238, 0x240, 0x248, 0x250, 0x258, 0x260, 0x268, 0x270, 0x278, 0x280,
104  0x288, 0x290, 0x298, 0x2A0, 0x2A8, 0x2B0, 0x2B8, 0x2C0, 0x2C8, 0x2D0,
105  0x2D8, 0x2E0, 0x2E8, 0x2F0, 0x2F8, 0x300, 0x308, 0x310, 0x318, 0x320,
106  0x328, 0x330, 0x338, 0x340, 0x348, 0x350, 0x358, 0x360, 0x368, 0x370,
107  0x378, 0x380, 0x388, 0x390, 0x398, 0x3A0, 0x3A8, 0x3B0, 0x3B8, 0x3C0,
108  0x3C8, 0x3D0, 0x3D8, 0x3E0, 0x3E8, 0x3F0, 0x3F8, 0x400, 0x440, 0x480,
109  0x4C0, 0x500, 0x540, 0x580, 0x5C0, 0x600, 0x640, 0x680, 0x6C0, 0x700,
110  0x740, 0x780, 0x7C0, 0x800, 0x900, 0xA00, 0xB00, 0xC00, 0xD00, 0xE00,
111  0xF00, 0x1000, 0x1400, 0x1800, 0x1C00, 0x2000, 0x3000, 0x4000
112 };
113 
114 
116 {
117  DPCMContext *s = avctx->priv_data;
118  int i;
119 
120  if (avctx->channels < 1 || avctx->channels > 2) {
121  av_log(avctx, AV_LOG_ERROR, "invalid number of channels\n");
122  return AVERROR(EINVAL);
123  }
124 
125  s->sample[0] = s->sample[1] = 0;
126 
127  switch(avctx->codec->id) {
128 
130  /* initialize square table */
131  for (i = 0; i < 128; i++) {
132  int16_t square = i * i;
133  s->array[i ] = square;
134  s->array[i + 128] = -square;
135  }
136  break;
137 
139  switch(avctx->codec_tag){
140  case 1:
141  s->sol_table = sol_table_old;
142  s->sample[0] = s->sample[1] = 0x80;
143  break;
144  case 2:
145  s->sol_table = sol_table_new;
146  s->sample[0] = s->sample[1] = 0x80;
147  break;
148  case 3:
149  break;
150  default:
151  av_log(avctx, AV_LOG_ERROR, "Unknown SOL subcodec\n");
152  return -1;
153  }
154  break;
155 
157  for (i = -128; i < 128; i++) {
158  int16_t square = i * i * 2;
159  s->array[i+128] = i < 0 ? -square: square;
160  }
161  break;
162 
164  int delta = 0;
165  int code = 64;
166  int step = 45;
167 
168  s->array[0] = 0;
169  for (i = 0; i < 127; i++) {
170  delta += (code >> 5);
171  code += step;
172  step += 2;
173 
174  s->array[i*2 + 1] = delta;
175  s->array[i*2 + 2] = -delta;
176  }
177  s->array[255] = delta + (code >> 5);
178  }
179  break;
180 
181  default:
182  break;
183  }
184 
185  if (avctx->codec->id == AV_CODEC_ID_SOL_DPCM && avctx->codec_tag != 3)
186  avctx->sample_fmt = AV_SAMPLE_FMT_U8;
187  else
188  avctx->sample_fmt = AV_SAMPLE_FMT_S16;
189 
190  return 0;
191 }
192 
193 
194 static int dpcm_decode_frame(AVCodecContext *avctx, void *data,
195  int *got_frame_ptr, AVPacket *avpkt)
196 {
197  int buf_size = avpkt->size;
198  DPCMContext *s = avctx->priv_data;
199  AVFrame *frame = data;
200  int out = 0, ret;
201  int predictor[2];
202  int ch = 0;
203  int stereo = avctx->channels - 1;
204  int16_t *output_samples, *samples_end;
205  GetByteContext gb;
206 
207  if (stereo && (buf_size & 1))
208  buf_size--;
209  bytestream2_init(&gb, avpkt->data, buf_size);
210 
211  /* calculate output size */
212  switch(avctx->codec->id) {
214  out = buf_size - 8;
215  break;
217  out = buf_size - 6 - avctx->channels;
218  break;
220  out = buf_size - 2 * avctx->channels;
221  break;
223  if (avctx->codec_tag != 3)
224  out = buf_size * 2;
225  else
226  out = buf_size;
227  break;
230  out = buf_size;
231  break;
232  }
233  if (out <= 0) {
234  av_log(avctx, AV_LOG_ERROR, "packet is too small\n");
235  return AVERROR(EINVAL);
236  }
237  if (out % avctx->channels) {
238  av_log(avctx, AV_LOG_WARNING, "channels have differing number of samples\n");
239  }
240 
241  /* get output buffer */
242  frame->nb_samples = (out + avctx->channels - 1) / avctx->channels;
243  if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
244  return ret;
245  output_samples = (int16_t *)frame->data[0];
246  samples_end = output_samples + out;
247 
248  switch(avctx->codec->id) {
249 
251  bytestream2_skipu(&gb, 6);
252 
253  if (stereo) {
254  predictor[1] = sign_extend(bytestream2_get_byteu(&gb) << 8, 16);
255  predictor[0] = sign_extend(bytestream2_get_byteu(&gb) << 8, 16);
256  } else {
257  predictor[0] = sign_extend(bytestream2_get_le16u(&gb), 16);
258  }
259 
260  /* decode the samples */
261  while (output_samples < samples_end) {
262  predictor[ch] += s->array[bytestream2_get_byteu(&gb)];
263  predictor[ch] = av_clip_int16(predictor[ch]);
264  *output_samples++ = predictor[ch];
265 
266  /* toggle channel */
267  ch ^= stereo;
268  }
269  break;
270 
272  bytestream2_skipu(&gb, 6); /* skip over the stream mask and stream length */
273 
274  for (ch = 0; ch < avctx->channels; ch++) {
275  predictor[ch] = sign_extend(bytestream2_get_le16u(&gb), 16);
276  *output_samples++ = predictor[ch];
277  }
278 
279  ch = 0;
280  while (output_samples < samples_end) {
281  predictor[ch] += interplay_delta_table[bytestream2_get_byteu(&gb)];
282  predictor[ch] = av_clip_int16(predictor[ch]);
283  *output_samples++ = predictor[ch];
284 
285  /* toggle channel */
286  ch ^= stereo;
287  }
288  break;
289 
291  {
292  int shift[2] = { 4, 4 };
293 
294  for (ch = 0; ch < avctx->channels; ch++)
295  predictor[ch] = sign_extend(bytestream2_get_le16u(&gb), 16);
296 
297  ch = 0;
298  while (output_samples < samples_end) {
299  int diff = bytestream2_get_byteu(&gb);
300  int n = diff & 3;
301 
302  if (n == 3)
303  shift[ch]++;
304  else
305  shift[ch] -= (2 * n);
306  diff = sign_extend((diff &~ 3) << 8, 16);
307 
308  /* saturate the shifter to 0..31 */
309  shift[ch] = av_clip_uintp2(shift[ch], 5);
310 
311  diff >>= shift[ch];
312  predictor[ch] += diff;
313 
314  predictor[ch] = av_clip_int16(predictor[ch]);
315  *output_samples++ = predictor[ch];
316 
317  /* toggle channel */
318  ch ^= stereo;
319  }
320  break;
321  }
323  if (avctx->codec_tag != 3) {
324  uint8_t *output_samples_u8 = frame->data[0],
325  *samples_end_u8 = output_samples_u8 + out;
326  while (output_samples_u8 < samples_end_u8) {
327  int n = bytestream2_get_byteu(&gb);
328 
329  s->sample[0] += s->sol_table[n >> 4];
330  s->sample[0] = av_clip_uint8(s->sample[0]);
331  *output_samples_u8++ = s->sample[0];
332 
333  s->sample[stereo] += s->sol_table[n & 0x0F];
334  s->sample[stereo] = av_clip_uint8(s->sample[stereo]);
335  *output_samples_u8++ = s->sample[stereo];
336  }
337  } else {
338  while (output_samples < samples_end) {
339  int n = bytestream2_get_byteu(&gb);
340  if (n & 0x80) s->sample[ch] -= sol_table_16[n & 0x7F];
341  else s->sample[ch] += sol_table_16[n & 0x7F];
342  s->sample[ch] = av_clip_int16(s->sample[ch]);
343  *output_samples++ = s->sample[ch];
344  /* toggle channel */
345  ch ^= stereo;
346  }
347  }
348  break;
349 
351  while (output_samples < samples_end) {
352  int8_t n = bytestream2_get_byteu(&gb);
353 
354  if (!(n & 1))
355  s->sample[ch] = 0;
356  s->sample[ch] += s->array[n + 128];
357  s->sample[ch] = av_clip_int16(s->sample[ch]);
358  *output_samples++ = s->sample[ch];
359  ch ^= stereo;
360  }
361  break;
362 
364  int idx = 0;
365 
366  while (output_samples < samples_end) {
367  uint8_t n = bytestream2_get_byteu(&gb);
368 
369  *output_samples++ = s->sample[idx] += (unsigned)s->array[n];
370  idx ^= 1;
371  }
372  }
373  break;
374  }
375 
376  *got_frame_ptr = 1;
377 
378  return avpkt->size;
379 }
380 
381 #define DPCM_DECODER(id_, name_, long_name_) \
382 AVCodec ff_ ## name_ ## _decoder = { \
383  .name = #name_, \
384  .long_name = NULL_IF_CONFIG_SMALL(long_name_), \
385  .type = AVMEDIA_TYPE_AUDIO, \
386  .id = id_, \
387  .priv_data_size = sizeof(DPCMContext), \
388  .init = dpcm_decode_init, \
389  .decode = dpcm_decode_frame, \
390  .capabilities = AV_CODEC_CAP_DR1, \
391 }
392 
393 DPCM_DECODER(AV_CODEC_ID_GREMLIN_DPCM, gremlin_dpcm, "DPCM Gremlin");
394 DPCM_DECODER(AV_CODEC_ID_INTERPLAY_DPCM, interplay_dpcm, "DPCM Interplay");
395 DPCM_DECODER(AV_CODEC_ID_ROQ_DPCM, roq_dpcm, "DPCM id RoQ");
396 DPCM_DECODER(AV_CODEC_ID_SDX2_DPCM, sdx2_dpcm, "DPCM Squareroot-Delta-Exact");
397 DPCM_DECODER(AV_CODEC_ID_SOL_DPCM, sol_dpcm, "DPCM Sol");
398 DPCM_DECODER(AV_CODEC_ID_XAN_DPCM, xan_dpcm, "DPCM Xan");
sol_table_16
static const int16_t sol_table_16[128]
Definition: dpcm.c:98
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:182
DPCM_DECODER
#define DPCM_DECODER(id_, name_, long_name_)
Definition: dpcm.c:381
DPCMContext
Definition: dpcm.c:46
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
out
FILE * out
Definition: movenc.c:54
GetByteContext
Definition: bytestream.h:33
n
int n
Definition: avisynth_c.h:760
bytestream2_skipu
static av_always_inline void bytestream2_skipu(GetByteContext *g, unsigned int size)
Definition: bytestream.h:170
ch
uint8_t pi<< 24) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_U8,(uint64_t)((*(const uint8_t *) pi - 0x80U))<< 56) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8,(*(const uint8_t *) pi - 0x80) *(1.0f/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8,(*(const uint8_t *) pi - 0x80) *(1.0/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16,(*(const int16_t *) pi >>8)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S16,(uint64_t)(*(const int16_t *) pi)<< 48) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, *(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, *(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32,(*(const int32_t *) pi >>24)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S32,(uint64_t)(*(const int32_t *) pi)<< 32) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, *(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, *(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S64,(*(const int64_t *) pi >>56)+0x80) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S64, *(const int64_t *) pi *(1.0f/(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S64, *(const int64_t *) pi *(1.0/(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_FLT, llrintf(*(const float *) pi *(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_DBL, llrint(*(const double *) pi *(INT64_C(1)<< 63))) #define FMT_PAIR_FUNC(out, in) static conv_func_type *const fmt_pair_to_conv_functions[AV_SAMPLE_FMT_NB *AV_SAMPLE_FMT_NB]={ FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S64), };static void cpy1(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, len);} static void cpy2(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 2 *len);} static void cpy4(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 4 *len);} static void cpy8(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 8 *len);} AudioConvert *swri_audio_convert_alloc(enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, const int *ch_map, int flags) { AudioConvert *ctx;conv_func_type *f=fmt_pair_to_conv_functions[av_get_packed_sample_fmt(out_fmt)+AV_SAMPLE_FMT_NB *av_get_packed_sample_fmt(in_fmt)];if(!f) return NULL;ctx=av_mallocz(sizeof(*ctx));if(!ctx) return NULL;if(channels==1){ in_fmt=av_get_planar_sample_fmt(in_fmt);out_fmt=av_get_planar_sample_fmt(out_fmt);} ctx->channels=channels;ctx->conv_f=f;ctx->ch_map=ch_map;if(in_fmt==AV_SAMPLE_FMT_U8||in_fmt==AV_SAMPLE_FMT_U8P) memset(ctx->silence, 0x80, sizeof(ctx->silence));if(out_fmt==in_fmt &&!ch_map) { switch(av_get_bytes_per_sample(in_fmt)){ case 1:ctx->simd_f=cpy1;break;case 2:ctx->simd_f=cpy2;break;case 4:ctx->simd_f=cpy4;break;case 8:ctx->simd_f=cpy8;break;} } if(HAVE_X86ASM &&1) swri_audio_convert_init_x86(ctx, out_fmt, in_fmt, channels);if(ARCH_ARM) swri_audio_convert_init_arm(ctx, out_fmt, in_fmt, channels);if(ARCH_AARCH64) swri_audio_convert_init_aarch64(ctx, out_fmt, in_fmt, channels);return ctx;} void swri_audio_convert_free(AudioConvert **ctx) { av_freep(ctx);} int swri_audio_convert(AudioConvert *ctx, AudioData *out, AudioData *in, int len) { int ch;int off=0;const int os=(out->planar ? 1 :out->ch_count) *out->bps;unsigned misaligned=0;av_assert0(ctx->channels==out->ch_count);if(ctx->in_simd_align_mask) { int planes=in->planar ? in->ch_count :1;unsigned m=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) in->ch[ch];misaligned|=m &ctx->in_simd_align_mask;} if(ctx->out_simd_align_mask) { int planes=out->planar ? out->ch_count :1;unsigned m=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) out->ch[ch];misaligned|=m &ctx->out_simd_align_mask;} if(ctx->simd_f &&!ctx->ch_map &&!misaligned){ off=len &~15;av_assert1(off >=0);av_assert1(off<=len);av_assert2(ctx->channels==SWR_CH_MAX||!in->ch[ctx->channels]);if(off >0){ if(out->planar==in->planar){ int planes=out->planar ? out->ch_count :1;for(ch=0;ch< planes;ch++){ ctx->simd_f(out-> ch ch
Definition: audioconvert.c:56
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:295
step
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about which is also called distortion Distortion can be quantified by almost any quality measurement one chooses the sum of squared differences is used but more complex methods that consider psychovisual effects can be used as well It makes no difference in this discussion First step
Definition: rate_distortion.txt:58
interplay_delta_table
static const int16_t interplay_delta_table[]
Definition: dpcm.c:52
internal.h
AVPacket::data
uint8_t * data
Definition: avcodec.h:1477
data
const char data[16]
Definition: mxf.c:91
dpcm_decode_init
static av_cold int dpcm_decode_init(AVCodecContext *avctx)
Definition: dpcm.c:115
AV_CODEC_ID_SOL_DPCM
@ AV_CODEC_ID_SOL_DPCM
Definition: avcodec.h:558
sol_table_new
static const int8_t sol_table_new[16]
Definition: dpcm.c:93
dpcm_decode_frame
static int dpcm_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
Definition: dpcm.c:194
AVCodecContext::codec
const struct AVCodec * codec
Definition: avcodec.h:1574
AV_CODEC_ID_XAN_DPCM
@ AV_CODEC_ID_XAN_DPCM
Definition: avcodec.h:557
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
av_cold
#define av_cold
Definition: attributes.h:84
intreadwrite.h
s
#define s(width, name)
Definition: cbs_vp9.c:257
DPCMContext::sample
int sample[2]
previous sample (for SOL_DPCM)
Definition: dpcm.c:48
sol_table_old
static const int8_t sol_table_old[16]
Definition: dpcm.c:88
if
if(ret)
Definition: filter_design.txt:179
AV_CODEC_ID_INTERPLAY_DPCM
@ AV_CODEC_ID_INTERPLAY_DPCM
Definition: avcodec.h:556
mathops.h
DPCMContext::sol_table
const int8_t * sol_table
delta table for SOL_DPCM
Definition: dpcm.c:49
AV_CODEC_ID_ROQ_DPCM
@ AV_CODEC_ID_ROQ_DPCM
Definition: avcodec.h:555
AV_SAMPLE_FMT_U8
AV_SAMPLE_FMT_U8
Definition: audio_convert.c:194
ff_get_buffer
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition: decode.c:1965
AVPacket::size
int size
Definition: avcodec.h:1478
AVCodecContext::sample_fmt
enum AVSampleFormat sample_fmt
audio sample format
Definition: avcodec.h:2233
DPCMContext::array
int16_t array[256]
Definition: dpcm.c:47
AVCodecContext::channels
int channels
number of audio channels
Definition: avcodec.h:2226
AVCodec::id
enum AVCodecID id
Definition: avcodec.h:3495
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:259
code
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some it can consider them to be part of the FIFO and delay acknowledging a status change accordingly Example code
Definition: filter_design.txt:178
delta
float delta
Definition: vorbis_enc_data.h:457
uint8_t
uint8_t
Definition: audio_convert.c:194
AV_SAMPLE_FMT_S16
@ AV_SAMPLE_FMT_S16
signed 16 bits
Definition: samplefmt.h:61
avcodec.h
ret
ret
Definition: filter_design.txt:187
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:264
square
static int square(int x)
Definition: roqvideoenc.c:113
AVCodecContext
main external API structure.
Definition: avcodec.h:1565
sign_extend
static av_const int sign_extend(int val, unsigned bits)
Definition: mathops.h:130
shift
static int shift(int a, int b)
Definition: sonic.c:82
AV_CODEC_ID_SDX2_DPCM
@ AV_CODEC_ID_SDX2_DPCM
Definition: avcodec.h:560
diff
static av_always_inline int diff(const uint32_t a, const uint32_t b)
Definition: vf_palettegen.c:136
AVCodecContext::codec_tag
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
Definition: avcodec.h:1590
AVPacket
This structure stores compressed data.
Definition: avcodec.h:1454
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:1592
bytestream.h
bytestream2_init
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition: bytestream.h:133
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
AV_CODEC_ID_GREMLIN_DPCM
@ AV_CODEC_ID_GREMLIN_DPCM
Definition: avcodec.h:561