FFmpeg
hcadec.c
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 #include "libavutil/crc.h"
20 #include "libavutil/float_dsp.h"
21 #include "libavutil/mem_internal.h"
22 #include "libavutil/tx.h"
23 
24 #include "avcodec.h"
25 #include "bytestream.h"
26 #include "codec_internal.h"
27 #include "decode.h"
28 #include "get_bits.h"
29 #include "hca_data.h"
30 
31 #define HCA_MASK 0x7f7f7f7f
32 #define MAX_CHANNELS 16
33 
34 typedef struct ChannelContext {
35  DECLARE_ALIGNED(32, float, base)[128];
36  DECLARE_ALIGNED(32, float, factors)[128];
37  DECLARE_ALIGNED(32, float, imdct_in)[128];
38  DECLARE_ALIGNED(32, float, imdct_out)[128];
39  DECLARE_ALIGNED(32, float, imdct_prev)[128];
40  int8_t scale_factors[128];
41  uint8_t scale[128];
42  int8_t intensity[8];
43  int8_t *hfr_scale;
44  unsigned count;
45  int chan_type;
47 
48 typedef struct HCAContext {
49  const AVCRC *crc_table;
50 
52 
53  uint8_t ath[128];
54  uint8_t cipher[256];
55  uint64_t key;
56  uint16_t subkey;
57 
58  int ath_type;
59  int ciph_type;
60  unsigned hfr_group_count;
61  uint8_t track_count;
62  uint8_t channel_config;
64  uint8_t base_band_count;
67 
71 } HCAContext;
72 
73 static void cipher_init56_create_table(uint8_t *r, uint8_t key)
74 {
75  const int mul = ((key & 1) << 3) | 5;
76  const int add = (key & 0xE) | 1;
77 
78  key >>= 4;
79  for (int i = 0; i < 16; i++) {
80  key = (key * mul + add) & 0xF;
81  r[i] = key;
82  }
83 }
84 
85 static void cipher_init56(uint8_t *cipher, uint64_t keycode)
86 {
87  uint8_t base[256], base_r[16], base_c[16], kc[8], seed[16];
88 
89  /* 56bit keycode encryption (given as a uint64_t number, but upper 8b aren't used) */
90  /* keycode = keycode - 1 */
91  if (keycode != 0)
92  keycode--;
93 
94  /* init keycode table */
95  for (int r = 0; r < (8-1); r++) {
96  kc[r] = keycode & 0xFF;
97  keycode = keycode >> 8;
98  }
99 
100  /* init seed table */
101  seed[ 0] = kc[1];
102  seed[ 1] = kc[1] ^ kc[6];
103  seed[ 2] = kc[2] ^ kc[3];
104  seed[ 3] = kc[2];
105  seed[ 4] = kc[2] ^ kc[1];
106  seed[ 5] = kc[3] ^ kc[4];
107  seed[ 6] = kc[3];
108  seed[ 7] = kc[3] ^ kc[2];
109  seed[ 8] = kc[4] ^ kc[5];
110  seed[ 9] = kc[4];
111  seed[10] = kc[4] ^ kc[3];
112  seed[11] = kc[5] ^ kc[6];
113  seed[12] = kc[5];
114  seed[13] = kc[5] ^ kc[4];
115  seed[14] = kc[6] ^ kc[1];
116  seed[15] = kc[6];
117 
118  /* init base table */
119  cipher_init56_create_table(base_r, kc[0]);
120  for (int r = 0; r < 16; r++) {
121  uint8_t nb;
123  nb = base_r[r] << 4;
124  for (int c = 0; c < 16; c++)
125  base[r*16 + c] = nb | base_c[c]; /* combine nibbles */
126  }
127 
128  /* final shuffle table */
129  {
130  unsigned x = 0;
131  unsigned pos = 1;
132 
133  for (int i = 0; i < 256; i++) {
134  x = (x + 17) & 0xFF;
135  if (base[x] != 0 && base[x] != 0xFF)
136  cipher[pos++] = base[x];
137  }
138  cipher[0] = 0;
139  cipher[0xFF] = 0xFF;
140  }
141 }
142 
143 static void cipher_init(uint8_t *cipher, int type, uint64_t keycode, uint16_t subkey)
144 {
145  switch (type) {
146  case 56:
147  if (keycode) {
148  if (subkey)
149  keycode = keycode * (((uint64_t)subkey<<16u)|((uint16_t)~subkey+2u));
150  cipher_init56(cipher, keycode);
151  }
152  break;
153  case 0:
154  for (int i = 0; i < 256; i++)
155  cipher[i] = i;
156  break;
157  }
158 }
159 
160 static void ath_init1(uint8_t *ath, int sample_rate)
161 {
162  unsigned int index;
163  unsigned int acc = 0;
164 
165  for (int i = 0; i < 128; i++) {
166  acc += sample_rate;
167  index = acc >> 13;
168 
169  if (index >= 654) {
170  memset(ath+i, 0xFF, (128 - i));
171  break;
172  }
173 
175  }
176 }
177 
178 static int ath_init(uint8_t *ath, int type, int sample_rate)
179 {
180  switch (type) {
181  case 0:
182  /* nothing to do */
183  break;
184  case 1:
186  break;
187  default:
188  return AVERROR_INVALIDDATA;
189  }
190 
191  return 0;
192 }
193 
194 static inline unsigned ceil2(unsigned a, unsigned b)
195 {
196  return (b > 0) ? (a / b + ((a % b) ? 1 : 0)) : 0;
197 }
198 
199 static int init_hca(AVCodecContext *avctx, const uint8_t *extradata,
200  const int extradata_size)
201 {
202  HCAContext *c = avctx->priv_data;
203  GetByteContext gb0, *const gb = &gb0;
204  int8_t r[16] = { 0 };
205  unsigned b, chunk;
206  int version, ret;
207 
208  if (extradata_size < 36)
209  return AVERROR_INVALIDDATA;
210 
211  bytestream2_init(gb, extradata, extradata_size);
212 
213  bytestream2_skipu(gb, 4);
214  version = bytestream2_get_be16(gb);
215  bytestream2_skipu(gb, 2);
216 
217  c->ath_type = version >= 0x200 ? 0 : 1;
218 
219  if ((bytestream2_get_be32u(gb) & HCA_MASK) != MKBETAG('f', 'm', 't', 0))
220  return AVERROR_INVALIDDATA;
221  bytestream2_skipu(gb, 4);
222  bytestream2_skipu(gb, 4);
223  bytestream2_skipu(gb, 4);
224 
225  chunk = bytestream2_get_be32u(gb) & HCA_MASK;
226  if (chunk == MKBETAG('c', 'o', 'm', 'p')) {
227  bytestream2_skipu(gb, 2);
228  bytestream2_skipu(gb, 1);
229  bytestream2_skipu(gb, 1);
230  c->track_count = bytestream2_get_byteu(gb);
231  c->channel_config = bytestream2_get_byteu(gb);
232  c->total_band_count = bytestream2_get_byteu(gb);
233  c->base_band_count = bytestream2_get_byteu(gb);
234  c->stereo_band_count = bytestream2_get_byte (gb);
235  c->bands_per_hfr_group = bytestream2_get_byte (gb);
236  } else if (chunk == MKBETAG('d', 'e', 'c', 0)) {
237  bytestream2_skipu(gb, 2);
238  bytestream2_skipu(gb, 1);
239  bytestream2_skipu(gb, 1);
240  c->total_band_count = bytestream2_get_byteu(gb) + 1;
241  c->base_band_count = bytestream2_get_byteu(gb) + 1;
242  c->track_count = bytestream2_peek_byteu(gb) >> 4;
243  c->channel_config = bytestream2_get_byteu(gb) & 0xF;
244  if (!bytestream2_get_byteu(gb))
245  c->base_band_count = c->total_band_count;
246  c->stereo_band_count = c->total_band_count - c->base_band_count;
247  c->bands_per_hfr_group = 0;
248  } else
249  return AVERROR_INVALIDDATA;
250 
251  if (c->total_band_count > FF_ARRAY_ELEMS(c->ch->imdct_in))
252  return AVERROR_INVALIDDATA;
253 
254  while (bytestream2_get_bytes_left(gb) >= 4) {
255  chunk = bytestream2_get_be32u(gb) & HCA_MASK;
256  if (chunk == MKBETAG('v', 'b', 'r', 0)) {
257  bytestream2_skip(gb, 2 + 2);
258  } else if (chunk == MKBETAG('a', 't', 'h', 0)) {
259  c->ath_type = bytestream2_get_be16(gb);
260  } else if (chunk == MKBETAG('r', 'v', 'a', 0)) {
261  bytestream2_skip(gb, 4);
262  } else if (chunk == MKBETAG('c', 'o', 'm', 'm')) {
263  bytestream2_skip(gb, bytestream2_get_byte(gb) * 8);
264  } else if (chunk == MKBETAG('c', 'i', 'p', 'h')) {
265  c->ciph_type = bytestream2_get_be16(gb);
266  } else if (chunk == MKBETAG('l', 'o', 'o', 'p')) {
267  bytestream2_skip(gb, 4 + 4 + 2 + 2);
268  } else if (chunk == MKBETAG('p', 'a', 'd', 0)) {
269  break;
270  } else {
271  break;
272  }
273  }
274 
275  if (bytestream2_get_bytes_left(gb) >= 10) {
277  c->key = bytestream2_get_be64u(gb);
278  c->subkey = bytestream2_get_be16u(gb);
279  }
280 
281  cipher_init(c->cipher, c->ciph_type, c->key, c->subkey);
282 
283  ret = ath_init(c->ath, c->ath_type, avctx->sample_rate);
284  if (ret < 0)
285  return ret;
286 
287  if (!c->track_count)
288  c->track_count = 1;
289 
290  b = avctx->ch_layout.nb_channels / c->track_count;
291  if (c->stereo_band_count && b > 1) {
292  int8_t *x = r;
293 
294  for (int i = 0; i < c->track_count; i++, x+=b) {
295  switch (b) {
296  case 2:
297  case 3:
298  x[0] = 1;
299  x[1] = 2;
300  break;
301  case 4:
302  x[0]=1; x[1] = 2;
303  if (c->channel_config == 0) {
304  x[2]=1;
305  x[3]=2;
306  }
307  break;
308  case 5:
309  x[0]=1; x[1] = 2;
310  if (c->channel_config <= 2) {
311  x[3]=1;
312  x[4]=2;
313  }
314  break;
315  case 6:
316  case 7:
317  x[0] = 1; x[1] = 2; x[4] = 1; x[5] = 2;
318  break;
319  case 8:
320  x[0] = 1; x[1] = 2; x[4] = 1; x[5] = 2; x[6] = 1; x[7] = 2;
321  break;
322  }
323  }
324  }
325 
326  if (c->total_band_count < c->base_band_count)
327  return AVERROR_INVALIDDATA;
328 
329  c->hfr_group_count = ceil2(c->total_band_count - (c->base_band_count + c->stereo_band_count),
330  c->bands_per_hfr_group);
331 
332  if (c->base_band_count + c->stereo_band_count + (unsigned long)c->hfr_group_count > 128ULL)
333  return AVERROR_INVALIDDATA;
334 
335  for (int i = 0; i < avctx->ch_layout.nb_channels; i++) {
336  c->ch[i].chan_type = r[i];
337  c->ch[i].count = c->base_band_count + ((r[i] != 2) ? c->stereo_band_count : 0);
338  c->ch[i].hfr_scale = &c->ch[i].scale_factors[c->base_band_count + c->stereo_band_count];
339  if (c->ch[i].count > 128)
340  return AVERROR_INVALIDDATA;
341  }
342 
343  return 0;
344 }
345 
347 {
348  HCAContext *c = avctx->priv_data;
349  float scale = 1.f / 8.f;
350  int ret;
351 
353  c->crc_table = av_crc_get_table(AV_CRC_16_ANSI);
354 
355  if (avctx->ch_layout.nb_channels <= 0 || avctx->ch_layout.nb_channels > FF_ARRAY_ELEMS(c->ch))
356  return AVERROR(EINVAL);
357 
359  if (!c->fdsp)
360  return AVERROR(ENOMEM);
361 
362  ret = av_tx_init(&c->tx_ctx, &c->tx_fn, AV_TX_FLOAT_MDCT, 1, 128, &scale, 0);
363  if (ret < 0)
364  return ret;
365 
366  if (avctx->extradata_size != 0 && avctx->extradata_size < 36)
367  return AVERROR_INVALIDDATA;
368 
369  if (!avctx->extradata_size)
370  return 0;
371 
372  return init_hca(avctx, avctx->extradata, avctx->extradata_size);
373 }
374 
375 static void run_imdct(HCAContext *c, ChannelContext *ch, int index, float *out)
376 {
377  c->tx_fn(c->tx_ctx, ch->imdct_out, ch->imdct_in, sizeof(float));
378 
379  c->fdsp->vector_fmul_window(out, ch->imdct_prev + (128 >> 1),
380  ch->imdct_out, window, 128 >> 1);
381 
382  memcpy(ch->imdct_prev, ch->imdct_out, 128 * sizeof(float));
383 }
384 
386  int index, unsigned band_count, unsigned base_band_count,
387  unsigned stereo_band_count)
388 {
389  float ratio_l = intensity_ratio_table[ch2->intensity[index]];
390  float ratio_r = ratio_l - 2.0f;
391  float *c1 = &ch1->imdct_in[base_band_count];
392  float *c2 = &ch2->imdct_in[base_band_count];
393 
394  if (ch1->chan_type != 1 || !stereo_band_count)
395  return;
396 
397  for (int i = 0; i < band_count; i++) {
398  c2[i] = c1[i] * ratio_r;
399  c1[i] *= ratio_l;
400  }
401 }
402 
404  unsigned hfr_group_count,
405  unsigned bands_per_hfr_group,
406  unsigned start_band, unsigned total_band_count)
407 {
408  if (ch->chan_type == 2 || !bands_per_hfr_group)
409  return;
410 
411  for (int i = 0, k = start_band, l = start_band - 1; i < hfr_group_count; i++){
412  for (int j = 0; j < bands_per_hfr_group && k < total_band_count && l >= 0; j++, k++, l--){
414  av_clip_intp2(ch->hfr_scale[i] - ch->scale_factors[l], 6) ] * ch->imdct_in[l];
415  }
416  }
417 
418  ch->imdct_in[127] = 0;
419 }
420 
422  GetBitContext *gb)
423 {
424  const float *base = ch->base;
425  float *factors = ch->factors;
426  float *out = ch->imdct_in;
427 
428  for (int i = 0; i < ch->count; i++) {
429  unsigned scale = ch->scale[i];
430  int nb_bits = max_bits_table[scale];
431  int value = get_bitsz(gb, nb_bits);
432  float factor;
433 
434  if (scale > 7) {
435  value = (1 - ((value & 1) << 1)) * (value >> 1);
436  if (!value)
437  skip_bits_long(gb, -1);
438  factor = value;
439  } else {
440  value += scale << 4;
441  skip_bits_long(gb, quant_spectrum_bits[value] - nb_bits);
443  }
444  factors[i] = factor;
445  }
446 
447  memset(factors + ch->count, 0, 512 - ch->count * sizeof(*factors));
448  c->fdsp->vector_fmul(out, factors, base, 128);
449 }
450 
451 static void unpack(HCAContext *c, ChannelContext *ch,
452  GetBitContext *gb,
453  unsigned hfr_group_count,
454  int packed_noise_level,
455  const uint8_t *ath)
456 {
457  int delta_bits = get_bits(gb, 3);
458 
459  if (delta_bits > 5) {
460  for (int i = 0; i < ch->count; i++)
461  ch->scale_factors[i] = get_bits(gb, 6);
462  } else if (delta_bits) {
463  int factor = get_bits(gb, 6);
464  int max_value = (1 << delta_bits) - 1;
465  int half_max = max_value >> 1;
466 
467  ch->scale_factors[0] = factor;
468  for (int i = 1; i < ch->count; i++){
469  int delta = get_bits(gb, delta_bits);
470 
471  if (delta == max_value) {
472  factor = get_bits(gb, 6);
473  } else {
474  factor += delta - half_max;
475  }
477 
478  ch->scale_factors[i] = factor;
479  }
480  } else {
481  memset(ch->scale_factors, 0, 128);
482  }
483 
484  if (ch->chan_type == 2){
485  ch->intensity[0] = get_bits(gb, 4);
486  if (ch->intensity[0] < 15) {
487  for (int i = 1; i < 8; i++)
488  ch->intensity[i] = get_bits(gb, 4);
489  }
490  } else {
491  for (int i = 0; i < hfr_group_count; i++)
492  ch->hfr_scale[i] = get_bits(gb, 6);
493  }
494 
495  for (int i = 0; i < ch->count; i++) {
496  int scale = ch->scale_factors[i];
497 
498  if (scale) {
499  scale = c->ath[i] + ((packed_noise_level + i) >> 8) - ((scale * 5) >> 1) + 2;
500  scale = scale_table[av_clip(scale, 0, 58)];
501  }
502  ch->scale[i] = scale;
503  }
504 
505  memset(ch->scale + ch->count, 0, sizeof(ch->scale) - ch->count);
506 
507  for (int i = 0; i < ch->count; i++)
509 }
510 
512  int *got_frame_ptr, AVPacket *avpkt)
513 {
514  HCAContext *c = avctx->priv_data;
515  int ch, offset = 0, ret, packed_noise_level;
516  GetBitContext gb0, *const gb = &gb0;
517  float **samples;
518 
519  if (avpkt->size <= 8)
520  return AVERROR_INVALIDDATA;
521 
522  if (AV_RN16(avpkt->data) != 0xFFFF) {
523  if ((AV_RL32(avpkt->data)) != MKTAG('H','C','A',0)) {
524  return AVERROR_INVALIDDATA;
525  } else if (AV_RB16(avpkt->data + 6) <= avpkt->size) {
526  ret = init_hca(avctx, avpkt->data, AV_RB16(avpkt->data + 6));
527  if (ret < 0)
528  return ret;
529  offset = AV_RB16(avpkt->data + 6);
530  if (offset == avpkt->size)
531  return avpkt->size;
532  } else {
533  return AVERROR_INVALIDDATA;
534  }
535  }
536 
537  if (c->key || c->subkey) {
538  uint8_t *data, *cipher = c->cipher;
539 
540  if ((ret = av_packet_make_writable(avpkt)) < 0)
541  return ret;
542  data = avpkt->data;
543  for (int n = 0; n < avpkt->size; n++)
544  data[n] = cipher[data[n]];
545  }
546 
547  if (avctx->err_recognition & AV_EF_CRCCHECK) {
548  if (av_crc(c->crc_table, 0, avpkt->data + offset, avpkt->size - offset))
549  return AVERROR_INVALIDDATA;
550  }
551 
552  if ((ret = init_get_bits8(gb, avpkt->data + offset, avpkt->size - offset)) < 0)
553  return ret;
554 
555  if (get_bits(gb, 16) != 0xFFFF)
556  return AVERROR_INVALIDDATA;
557 
558  frame->nb_samples = 1024;
559  if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
560  return ret;
561  samples = (float **)frame->extended_data;
562 
563  packed_noise_level = (get_bits(gb, 9) << 8) - get_bits(gb, 7);
564 
565  for (ch = 0; ch < avctx->ch_layout.nb_channels; ch++)
566  unpack(c, &c->ch[ch], gb, c->hfr_group_count, packed_noise_level, c->ath);
567 
568  for (int i = 0; i < 8; i++) {
569  for (ch = 0; ch < avctx->ch_layout.nb_channels; ch++)
570  dequantize_coefficients(c, &c->ch[ch], gb);
571  for (ch = 0; ch < avctx->ch_layout.nb_channels; ch++)
572  reconstruct_hfr(c, &c->ch[ch], c->hfr_group_count, c->bands_per_hfr_group,
573  c->stereo_band_count + c->base_band_count, c->total_band_count);
574  for (ch = 0; ch < avctx->ch_layout.nb_channels - 1; ch++)
575  apply_intensity_stereo(c, &c->ch[ch], &c->ch[ch+1], i,
576  c->total_band_count - c->base_band_count,
577  c->base_band_count, c->stereo_band_count);
578  for (ch = 0; ch < avctx->ch_layout.nb_channels; ch++)
579  run_imdct(c, &c->ch[ch], i, samples[ch] + i * 128);
580  }
581 
582  *got_frame_ptr = 1;
583 
584  return avpkt->size;
585 }
586 
588 {
589  HCAContext *c = avctx->priv_data;
590 
591  av_freep(&c->fdsp);
592  av_tx_uninit(&c->tx_ctx);
593 
594  return 0;
595 }
596 
598  .p.name = "hca",
599  CODEC_LONG_NAME("CRI HCA"),
600  .p.type = AVMEDIA_TYPE_AUDIO,
601  .p.id = AV_CODEC_ID_HCA,
602  .priv_data_size = sizeof(HCAContext),
603  .init = decode_init,
605  .close = decode_close,
606  .p.capabilities = AV_CODEC_CAP_DR1,
607  .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
608  .p.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP,
610 };
AV_SAMPLE_FMT_FLTP
@ AV_SAMPLE_FMT_FLTP
float, planar
Definition: samplefmt.h:66
skip_bits_long
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
Definition: get_bits.h:278
ChannelContext::hfr_scale
int8_t * hfr_scale
Definition: hcadec.c:43
MAX_CHANNELS
#define MAX_CHANNELS
Definition: hcadec.c:32
av_clip
#define av_clip
Definition: common.h:96
FF_CODEC_CAP_INIT_CLEANUP
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
Definition: codec_internal.h:42
r
const char * r
Definition: vf_curves.c:126
acc
int acc
Definition: yuv2rgb.c:554
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
mem_internal.h
out
FILE * out
Definition: movenc.c:54
AVCodecContext::sample_rate
int sample_rate
samples per second
Definition: avcodec.h:1060
GetByteContext
Definition: bytestream.h:33
u
#define u(width, name, range_min, range_max)
Definition: cbs_h2645.c:239
AVCRC
uint32_t AVCRC
Definition: crc.h:46
av_clip_uintp2
#define av_clip_uintp2
Definition: common.h:120
AVTXContext
Definition: tx_priv.h:235
AVCodecContext::err_recognition
int err_recognition
Error recognition; may misdetect some more or less valid parts as errors.
Definition: avcodec.h:1408
bytestream2_skipu
static av_always_inline void bytestream2_skipu(GetByteContext *g, unsigned int size)
Definition: bytestream.h:174
AV_RN16
#define AV_RN16(p)
Definition: intreadwrite.h:358
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:340
AVPacket::data
uint8_t * data
Definition: packet.h:374
b
#define b
Definition: input.c:41
data
const char data[16]
Definition: mxf.c:148
init_hca
static int init_hca(AVCodecContext *avctx, const uint8_t *extradata, const int extradata_size)
Definition: hcadec.c:199
HCAContext::ch
ChannelContext ch[MAX_CHANNELS]
Definition: hcadec.c:51
FFCodec
Definition: codec_internal.h:127
base
uint8_t base
Definition: vp3data.h:128
ChannelContext::imdct_prev
float imdct_prev[128]
Definition: hcadec.c:39
c1
static const uint64_t c1
Definition: murmur3.c:52
AVChannelLayout::nb_channels
int nb_channels
Number of channels in this layout.
Definition: channel_layout.h:311
apply_intensity_stereo
static void apply_intensity_stereo(HCAContext *s, ChannelContext *ch1, ChannelContext *ch2, int index, unsigned band_count, unsigned base_band_count, unsigned stereo_band_count)
Definition: hcadec.c:385
sample_rate
sample_rate
Definition: ffmpeg_filter.c:331
HCAContext::key
uint64_t key
Definition: hcadec.c:55
av_tx_init
av_cold int av_tx_init(AVTXContext **ctx, av_tx_fn *tx, enum AVTXType type, int inv, int len, const void *scale, uint64_t flags)
Initialize a transform context with the given configuration (i)MDCTs with an odd length are currently...
Definition: tx.c:901
crc.h
cipher_init56
static void cipher_init56(uint8_t *cipher, uint64_t keycode)
Definition: hcadec.c:85
bytestream2_skip
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
Definition: bytestream.h:168
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:335
window
static SDL_Window * window
Definition: ffplay.c:360
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:131
AVCodecContext::ch_layout
AVChannelLayout ch_layout
Audio channel layout.
Definition: avcodec.h:2101
GetBitContext
Definition: get_bits.h:108
AVCodecContext::flags
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:517
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
scale
static av_always_inline float scale(float x, float s)
Definition: vf_v360.c:1389
HCA_MASK
#define HCA_MASK
Definition: hcadec.c:31
ChannelContext::base
float base[128]
Definition: hcadec.c:35
HCAContext::bands_per_hfr_group
uint8_t bands_per_hfr_group
Definition: hcadec.c:66
HCAContext::hfr_group_count
unsigned hfr_group_count
Definition: hcadec.c:60
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
av_cold
#define av_cold
Definition: attributes.h:90
init_get_bits8
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:545
av_tx_fn
void(* av_tx_fn)(AVTXContext *s, void *out, void *in, ptrdiff_t stride)
Function pointer to a function to perform the transform.
Definition: tx.h:151
unpack
static void unpack(HCAContext *c, ChannelContext *ch, GetBitContext *gb, unsigned hfr_group_count, int packed_noise_level, const uint8_t *ath)
Definition: hcadec.c:451
ath_init1
static void ath_init1(uint8_t *ath, int sample_rate)
Definition: hcadec.c:160
AVCodecContext::extradata_size
int extradata_size
Definition: avcodec.h:539
AV_TX_FLOAT_MDCT
@ AV_TX_FLOAT_MDCT
Standard MDCT with a sample data type of float, double or int32_t, respecively.
Definition: tx.h:68
HCAContext::total_band_count
uint8_t total_band_count
Definition: hcadec.c:63
FF_CODEC_DECODE_CB
#define FF_CODEC_DECODE_CB(func)
Definition: codec_internal.h:306
HCAContext::tx_fn
av_tx_fn tx_fn
Definition: hcadec.c:68
s
#define s(width, name)
Definition: cbs_vp9.c:198
scale_conversion_table
static const float scale_conversion_table[]
Definition: hca_data.h:91
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts_bsf.c:365
quant_spectrum_bits
static const uint8_t quant_spectrum_bits[]
Definition: hca_data.h:29
decode.h
get_bits.h
decode_frame
static int decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, AVPacket *avpkt)
Definition: hcadec.c:511
HCAContext::ath_type
int ath_type
Definition: hcadec.c:58
key
const char * key
Definition: hwcontext_opencl.c:174
ath
static av_cold float ath(float f, float add)
Calculate ATH value for given frequency.
Definition: aacpsy.c:292
quant_spectrum_value
static const int8_t quant_spectrum_value[]
Definition: hca_data.h:41
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:272
dequantize_coefficients
static void dequantize_coefficients(HCAContext *c, ChannelContext *ch, GetBitContext *gb)
Definition: hcadec.c:421
AV_CRC_16_ANSI
@ AV_CRC_16_ANSI
Definition: crc.h:50
ChannelContext::chan_type
int chan_type
Definition: hcadec.c:45
HCAContext::ath
uint8_t ath[128]
Definition: hcadec.c:53
av_clip_intp2
#define av_clip_intp2
Definition: common.h:117
decode_init
static av_cold int decode_init(AVCodecContext *avctx)
Definition: hcadec.c:346
ChannelContext::imdct_out
float imdct_out[128]
Definition: hcadec.c:38
quant_step_size
static const float quant_step_size[]
Definition: hca_data.h:125
HCAContext::fdsp
AVFloatDSPContext * fdsp
Definition: hcadec.c:70
AV_EF_CRCCHECK
#define AV_EF_CRCCHECK
Verify checksums embedded in the bitstream (could be of either encoded or decoded data,...
Definition: defs.h:48
seed
static unsigned int seed
Definition: videogen.c:78
index
int index
Definition: gxfenc.c:89
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
bytestream2_get_bytes_left
static av_always_inline int bytestream2_get_bytes_left(GetByteContext *g)
Definition: bytestream.h:158
float_dsp.h
ath_init
static int ath_init(uint8_t *ath, int type, int sample_rate)
Definition: hcadec.c:178
ff_get_buffer
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition: decode.c:1575
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
AVPacket::size
int size
Definition: packet.h:375
dequantizer_scaling_table
static const float dequantizer_scaling_table[]
Definition: hca_data.h:113
codec_internal.h
DECLARE_ALIGNED
#define DECLARE_ALIGNED(n, t, v)
Definition: mem_internal.h:87
HCAContext::stereo_band_count
uint8_t stereo_band_count
Definition: hcadec.c:65
scale_table
static const uint8_t scale_table[]
Definition: hca_data.h:53
AVCodecContext::sample_fmt
enum AVSampleFormat sample_fmt
audio sample format
Definition: avcodec.h:1076
AV_SAMPLE_FMT_NONE
@ AV_SAMPLE_FMT_NONE
Definition: samplefmt.h:56
ff_hca_decoder
const FFCodec ff_hca_decoder
Definition: hcadec.c:597
MKBETAG
#define MKBETAG(a, b, c, d)
Definition: macros.h:56
reconstruct_hfr
static void reconstruct_hfr(HCAContext *s, ChannelContext *ch, unsigned hfr_group_count, unsigned bands_per_hfr_group, unsigned start_band, unsigned total_band_count)
Definition: hcadec.c:403
AVFloatDSPContext
Definition: float_dsp.h:24
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
av_crc_get_table
const AVCRC * av_crc_get_table(AVCRCId crc_id)
Get an initialized standard CRC table.
Definition: crc.c:374
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
version
version
Definition: libkvazaar.c:314
HCAContext::base_band_count
uint8_t base_band_count
Definition: hcadec.c:64
av_tx_uninit
av_cold void av_tx_uninit(AVTXContext **ctx)
Frees a context and sets *ctx to NULL, does nothing when *ctx == NULL.
Definition: tx.c:294
HCAContext::crc_table
const AVCRC * crc_table
Definition: hcadec.c:49
decode_close
static av_cold int decode_close(AVCodecContext *avctx)
Definition: hcadec.c:587
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:244
ChannelContext::scale
uint8_t scale[128]
Definition: hcadec.c:41
AVCodecContext::extradata
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
Definition: avcodec.h:538
hca_data.h
AVSampleFormat
AVSampleFormat
Audio sample formats.
Definition: samplefmt.h:55
delta
float delta
Definition: vorbis_enc_data.h:430
value
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default value
Definition: writing_filters.txt:86
ChannelContext::factors
float factors[128]
Definition: hcadec.c:36
ath_base_curve
static const uint8_t ath_base_curve[656]
Definition: hca_data.h:131
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:194
max_bits_table
static const uint8_t max_bits_table[]
Definition: hca_data.h:25
avcodec.h
ChannelContext::count
unsigned count
Definition: hcadec.c:44
HCAContext::track_count
uint8_t track_count
Definition: hcadec.c:61
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
HCAContext::subkey
uint16_t subkey
Definition: hcadec.c:56
ceil2
static unsigned ceil2(unsigned a, unsigned b)
Definition: hcadec.c:194
pos
unsigned int pos
Definition: spdifenc.c:413
HCAContext
Definition: hcadec.c:48
AV_RL32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition: bytestream.h:92
ChannelContext::intensity
int8_t intensity[8]
Definition: hcadec.c:42
AVCodecContext
main external API structure.
Definition: avcodec.h:437
c2
static const uint64_t c2
Definition: murmur3.c:53
cipher_init
static void cipher_init(uint8_t *cipher, int type, uint64_t keycode, uint16_t subkey)
Definition: hcadec.c:143
av_crc
uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length)
Calculate the CRC of a block.
Definition: crc.c:392
av_packet_make_writable
int av_packet_make_writable(AVPacket *pkt)
Create a writable reference for the data described by a given packet, avoiding data copy if possible.
Definition: avpacket.c:505
samples
Filter the word “frame” indicates either a video frame or a group of audio samples
Definition: filter_design.txt:8
ChannelContext::imdct_in
float imdct_in[128]
Definition: hcadec.c:37
ChannelContext
Definition: hcadec.c:34
ChannelContext::scale_factors
int8_t scale_factors[128]
Definition: hcadec.c:40
factor
static const int factor[16]
Definition: vf_pp7.c:78
cipher_init56_create_table
static void cipher_init56_create_table(uint8_t *r, uint8_t key)
Definition: hcadec.c:73
HCAContext::channel_config
uint8_t channel_config
Definition: hcadec.c:62
get_bitsz
static av_always_inline int get_bitsz(GetBitContext *s, int n)
Read 0-25 bits.
Definition: get_bits.h:351
AV_CODEC_FLAG_BITEXACT
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
Definition: avcodec.h:334
intensity_ratio_table
static const float intensity_ratio_table[]
Definition: hca_data.h:85
HCAContext::tx_ctx
AVTXContext * tx_ctx
Definition: hcadec.c:69
AVPacket
This structure stores compressed data.
Definition: packet.h:351
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:464
HCAContext::cipher
uint8_t cipher[256]
Definition: hcadec.c:54
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
avpriv_float_dsp_alloc
av_cold AVFloatDSPContext * avpriv_float_dsp_alloc(int bit_exact)
Allocate a float DSP context.
Definition: float_dsp.c:135
bytestream.h
bytestream2_init
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition: bytestream.h:137
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
MKTAG
#define MKTAG(a, b, c, d)
Definition: macros.h:55
scale_conv_bias
static const int scale_conv_bias
Definition: hca_data.h:111
AV_CODEC_ID_HCA
@ AV_CODEC_ID_HCA
Definition: codec_id.h:535
run_imdct
static void run_imdct(HCAContext *c, ChannelContext *ch, int index, float *out)
Definition: hcadec.c:375
AV_RB16
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_RB16
Definition: bytestream.h:98
tx.h
HCAContext::ciph_type
int ciph_type
Definition: hcadec.c:59