FFmpeg
spdifenc.c
Go to the documentation of this file.
1 /*
2  * IEC 61937 muxer
3  * Copyright (c) 2009 Bartlomiej Wolowiec
4  * Copyright (c) 2010, 2020 Anssi Hannula
5  * Copyright (c) 2010 Carl Eugen Hoyos
6  *
7  * This file is part of FFmpeg.
8  *
9  * FFmpeg is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * FFmpeg is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with FFmpeg; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  */
23 
24 /**
25  * @file
26  * IEC-61937 encapsulation of various formats, used by S/PDIF
27  * @author Bartlomiej Wolowiec
28  * @author Anssi Hannula
29  * @author Carl Eugen Hoyos
30  */
31 
32 /*
33  * Terminology used in specification:
34  * data-burst - IEC61937 frame, contains header and encapsuled frame
35  * burst-preamble - IEC61937 frame header, contains 16-bit words named Pa, Pb, Pc and Pd
36  * burst-payload - encapsuled frame
37  * Pa, Pb - syncword - 0xF872, 0x4E1F
38  * Pc - burst-info, contains data-type (bits 0-6), error flag (bit 7), data-type-dependent info (bits 8-12)
39  * and bitstream number (bits 13-15)
40  * data-type - determines type of encapsuled frames
41  * Pd - length code (number of bits or bytes of encapsuled frame - according to data_type)
42  *
43  * IEC 61937 frames at normal usage start every specific count of bytes,
44  * dependent from data-type (spaces between packets are filled by zeros)
45  */
46 
47 #include <inttypes.h>
48 
49 #include "avformat.h"
50 #include "avio_internal.h"
51 #include "mux.h"
52 #include "spdif.h"
53 #include "libavcodec/ac3defs.h"
54 #include "libavcodec/adts_parser.h"
55 #include "libavcodec/dca.h"
57 #include "libavcodec/get_bits.h"
58 #include "libavutil/mem.h"
59 #include "libavutil/opt.h"
60 
61 /*
62  * With padding up to MAT_FRAME_SIZE*2 allowed, TrueHD/MLP can complete two MAT
63  * buffers with one AVPacket. A third is needed for the active buffer, so no
64  * less than three are required. Since no more than one MAT can be written per
65  * AVPacket, extra headroom has been given.
66  *
67  * E-AC-3 and DTS-HD only need hd_buf[0].
68  */
69 #define HD_BUF_COUNT 6
70 
71 typedef struct IEC61937Context {
72  const AVClass *av_class;
73  enum IEC61937DataType data_type;///< burst info - reference to type of payload of the data-burst
74  int length_code; ///< length code in bits or bytes, depending on data type
75  int pkt_offset; ///< data burst repetition period in bytes
76  uint8_t *buffer; ///< allocated buffer, used for swap bytes
77  int buffer_size; ///< size of allocated buffer
78 
79  const uint8_t *out_buf; ///< pointer to the outgoing data before byte-swapping
80  int out_bytes; ///< amount of outgoing bytes
81 
82  int use_preamble; ///< preamble enabled (disabled for exactly pre-padded DTS)
83  int extra_bswap; ///< extra bswap for payload (for LE DTS => standard BE DTS)
84 
85  uint8_t *hd_buf[HD_BUF_COUNT]; ///< allocated buffers to concatenate hd audio frames
86  int hd_buf_size; ///< size of the hd audio buffer (eac3, dts4)
87  int hd_buf_count; ///< number of frames in the hd audio buffer (eac3)
88  int hd_buf_filled; ///< amount of bytes in the hd audio buffer (eac3, truehd)
89  int hd_buf_idx; ///< active hd buffer index (truehd)
90  int hd_buf_next_ready_idx; ///< oldest completed truehd MAT buffer ready to write (truehd)
91  int hd_buf_ready_count; ///< number of completed TrueHD MAT buffers ready to write (truehd)
92 
93  int dtshd_skip; ///< counter used for skipping DTS-HD frames
94 
95  uint16_t truehd_prev_time; ///< input_timing from the last frame
96  int truehd_prev_size; ///< previous frame size in bytes, including any MAT codes
97  int truehd_samples_per_frame; ///< samples per frame for padding calculation
98  uint16_t truehd_output_timing; ///< expected output_timing for truehd restart headers
99  int truehd_output_timing_valid; ///< restart header output_timing has been read
100  int truehd_oi_delta; ///< signed (output_timing-samples_per_frame)-input_timing
101 
102  /* AVOptions: */
105 #define SPDIF_FLAG_BIGENDIAN 0x01
107 
108  /// function, which generates codec dependent header information.
109  /// Sets data_type and pkt_offset, and length_code, out_bytes, out_buf if necessary
112 
113 static const AVOption options[] = {
114 { "spdif_flags", "IEC 61937 encapsulation flags", offsetof(IEC61937Context, spdif_flags), AV_OPT_TYPE_FLAGS, {.i64 = 0}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, .unit = "spdif_flags" },
115 { "be", "output in big-endian format (for use as s16be)", 0, AV_OPT_TYPE_CONST, {.i64 = SPDIF_FLAG_BIGENDIAN}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, .unit = "spdif_flags" },
116 { "dtshd_rate", "mux complete DTS frames in HD mode at the specified IEC958 rate (in Hz, default 0=disabled)", offsetof(IEC61937Context, dtshd_rate), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 768000, AV_OPT_FLAG_ENCODING_PARAM },
117 { "dtshd_fallback_time", "min secs to strip HD for after an overflow (-1: till the end, default 60)", offsetof(IEC61937Context, dtshd_fallback), AV_OPT_TYPE_INT, {.i64 = 60}, -1, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
118 { NULL },
119 };
120 
121 static const AVClass spdif_class = {
122  .class_name = "spdif",
123  .item_name = av_default_item_name,
124  .option = options,
125  .version = LIBAVUTIL_VERSION_INT,
126 };
127 
129 {
130  IEC61937Context *ctx = s->priv_data;
131  int bitstream_mode = pkt->data[5] & 0x7;
132 
133  ctx->data_type = IEC61937_AC3 | (bitstream_mode << 8);
134  ctx->pkt_offset = AC3_FRAME_SIZE << 2;
135  return 0;
136 }
137 
139 {
140  IEC61937Context *ctx = s->priv_data;
141  static const uint8_t eac3_repeat[4] = {6, 3, 2, 1};
142  int repeat = 1;
143  uint8_t *tmp;
144 
145  int bsid = pkt->data[5] >> 3;
146  if (bsid > 10 && (pkt->data[4] & 0xc0) != 0xc0) /* fscod */
147  repeat = eac3_repeat[(pkt->data[4] & 0x30) >> 4]; /* numblkscod */
148 
149  tmp = av_fast_realloc(ctx->hd_buf[0], &ctx->hd_buf_size, ctx->hd_buf_filled + pkt->size);
150  if (!tmp)
151  return AVERROR(ENOMEM);
152  ctx->hd_buf[0] = tmp;
153 
154  memcpy(&ctx->hd_buf[0][ctx->hd_buf_filled], pkt->data, pkt->size);
155 
156  ctx->hd_buf_filled += pkt->size;
157  if (++ctx->hd_buf_count < repeat){
158  ctx->pkt_offset = 0;
159  return 0;
160  }
161  ctx->data_type = IEC61937_EAC3;
162  ctx->pkt_offset = 24576;
163  ctx->out_buf = ctx->hd_buf[0];
164  ctx->out_bytes = ctx->hd_buf_filled;
165  ctx->length_code = ctx->hd_buf_filled;
166 
167  ctx->hd_buf_count = 0;
168  ctx->hd_buf_filled = 0;
169  return 0;
170 }
171 
172 /*
173  * DTS type IV (DTS-HD) can be transmitted with various frame repetition
174  * periods; longer repetition periods allow for longer packets and therefore
175  * higher bitrate. Longer repetition periods mean that the constant bitrate of
176  * the output IEC 61937 stream is higher.
177  * The repetition period is measured in IEC 60958 frames (4 bytes).
178  */
179 static int spdif_dts4_subtype(int period)
180 {
181  switch (period) {
182  case 512: return 0x0;
183  case 1024: return 0x1;
184  case 2048: return 0x2;
185  case 4096: return 0x3;
186  case 8192: return 0x4;
187  case 16384: return 0x5;
188  }
189  return -1;
190 }
191 
192 static int spdif_header_dts4(AVFormatContext *s, AVPacket *pkt, int core_size,
193  int sample_rate, int blocks)
194 {
195  IEC61937Context *ctx = s->priv_data;
196  static const char dtshd_start_code[10] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe };
197  int pkt_size = pkt->size;
198  int period;
199  int subtype;
200 
201  if (!core_size) {
202  av_log(s, AV_LOG_ERROR, "HD mode not supported for this format\n");
203  return AVERROR(EINVAL);
204  }
205 
206  if (!sample_rate) {
207  av_log(s, AV_LOG_ERROR, "Unknown DTS sample rate for HD\n");
208  return AVERROR_INVALIDDATA;
209  }
210 
211  period = ctx->dtshd_rate * (blocks << 5) / sample_rate;
212  subtype = spdif_dts4_subtype(period);
213 
214  if (subtype < 0) {
215  av_log(s, AV_LOG_ERROR, "Specified HD rate of %d Hz would require an "
216  "impossible repetition period of %d for the current DTS stream"
217  " (blocks = %d, sample rate = %d)\n", ctx->dtshd_rate, period,
218  blocks << 5, sample_rate);
219  return AVERROR(EINVAL);
220  }
221 
222  /* set pkt_offset and DTS IV subtype according to the requested output
223  * rate */
224  ctx->pkt_offset = period * 4;
225  ctx->data_type = IEC61937_DTSHD | subtype << 8;
226 
227  /* If the bitrate is too high for transmitting at the selected
228  * repetition period setting, strip DTS-HD until a good amount
229  * of consecutive non-overflowing HD frames have been observed.
230  * This generally only happens if the caller is cramming a Master
231  * Audio stream into 192kHz IEC 60958 (which may or may not fit). */
232  if (sizeof(dtshd_start_code) + 2 + pkt_size
233  > ctx->pkt_offset - BURST_HEADER_SIZE && core_size) {
234  if (!ctx->dtshd_skip)
235  av_log(s, AV_LOG_WARNING, "DTS-HD bitrate too high, "
236  "temporarily sending core only\n");
237  if (ctx->dtshd_fallback > 0)
238  ctx->dtshd_skip = sample_rate * ctx->dtshd_fallback / (blocks << 5);
239  else
240  /* skip permanently (dtshd_fallback == -1) or just once
241  * (dtshd_fallback == 0) */
242  ctx->dtshd_skip = 1;
243  }
244  if (ctx->dtshd_skip && core_size && core_size <= pkt->size) {
245  pkt_size = core_size;
246  if (ctx->dtshd_fallback >= 0)
247  --ctx->dtshd_skip;
248  }
249 
250  ctx->out_bytes = sizeof(dtshd_start_code) + 2 + pkt_size;
251 
252  /* Align so that (length_code & 0xf) == 0x8. This is reportedly needed
253  * with some receivers, but the exact requirement is unconfirmed. */
254  ctx->length_code = FFALIGN(ctx->out_bytes + 0x8, 0x10) - 0x8;
255 
256  av_fast_malloc(&ctx->hd_buf[0], &ctx->hd_buf_size, ctx->out_bytes);
257  if (!ctx->hd_buf[0])
258  return AVERROR(ENOMEM);
259 
260  ctx->out_buf = ctx->hd_buf[0];
261 
262  memcpy(ctx->hd_buf[0], dtshd_start_code, sizeof(dtshd_start_code));
263  AV_WB16(ctx->hd_buf[0] + sizeof(dtshd_start_code), pkt_size);
264  memcpy(ctx->hd_buf[0] + sizeof(dtshd_start_code) + 2, pkt->data, pkt_size);
265 
266  return 0;
267 }
268 
270 {
271  IEC61937Context *ctx = s->priv_data;
272  uint32_t syncword_dts = AV_RB32(pkt->data);
273  int blocks;
274  int sample_rate = 0;
275  int core_size = 0;
276 
277  if (pkt->size < 9)
278  return AVERROR_INVALIDDATA;
279 
280  switch (syncword_dts) {
282  blocks = (AV_RB16(pkt->data + 4) >> 2) & 0x7f;
283  core_size = ((AV_RB24(pkt->data + 5) >> 4) & 0x3fff) + 1;
284  sample_rate = ff_dca_sample_rates[(pkt->data[8] >> 2) & 0x0f];
285  break;
287  blocks = (AV_RL16(pkt->data + 4) >> 2) & 0x7f;
288  ctx->extra_bswap = 1;
289  break;
291  blocks =
292  (((pkt->data[5] & 0x07) << 4) | ((pkt->data[6] & 0x3f) >> 2));
293  break;
295  blocks =
296  (((pkt->data[4] & 0x07) << 4) | ((pkt->data[7] & 0x3f) >> 2));
297  ctx->extra_bswap = 1;
298  break;
300  /* We only handle HD frames that are paired with core. However,
301  sometimes DTS-HD streams with core have a stray HD frame without
302  core in the beginning of the stream. */
303  av_log(s, AV_LOG_ERROR, "stray DTS-HD frame\n");
304  return AVERROR_INVALIDDATA;
305  default:
306  av_log(s, AV_LOG_ERROR, "bad DTS syncword 0x%"PRIx32"\n", syncword_dts);
307  return AVERROR_INVALIDDATA;
308  }
309  blocks++;
310 
311  if (ctx->dtshd_rate)
312  /* DTS type IV output requested */
313  return spdif_header_dts4(s, pkt, core_size, sample_rate, blocks);
314 
315  switch (blocks) {
316  case 512 >> 5: ctx->data_type = IEC61937_DTS1; break;
317  case 1024 >> 5: ctx->data_type = IEC61937_DTS2; break;
318  case 2048 >> 5: ctx->data_type = IEC61937_DTS3; break;
319  default:
320  av_log(s, AV_LOG_ERROR, "%i samples in DTS frame not supported\n",
321  blocks << 5);
322  return AVERROR(ENOSYS);
323  }
324 
325  /* discard extraneous data by default */
326  if (core_size && core_size < pkt->size) {
327  ctx->out_bytes = core_size;
328  ctx->length_code = core_size << 3;
329  }
330 
331  ctx->pkt_offset = blocks << 7;
332 
333  if (ctx->out_bytes == ctx->pkt_offset) {
334  /* The DTS stream fits exactly into the output stream, so skip the
335  * preamble as it would not fit in there. This is the case for dts
336  * discs and dts-in-wav. */
337  ctx->use_preamble = 0;
338  } else if (ctx->out_bytes > ctx->pkt_offset - BURST_HEADER_SIZE) {
339  avpriv_request_sample(s, "Unrecognized large DTS frame");
340  /* This will fail with a "bitrate too high" in the caller */
341  }
342 
343  return 0;
344 }
345 
346 static const enum IEC61937DataType mpeg_data_type[2][3] = {
347  // LAYER1 LAYER2 LAYER3
350 };
351 
353 {
354  IEC61937Context *ctx = s->priv_data;
355  int version = (pkt->data[1] >> 3) & 3;
356  int layer = 3 - ((pkt->data[1] >> 1) & 3);
357  int extension = pkt->data[2] & 1;
358 
359  if (layer == 3 || version == 1) {
360  av_log(s, AV_LOG_ERROR, "Wrong MPEG file format\n");
361  return AVERROR_INVALIDDATA;
362  }
363  av_log(s, AV_LOG_DEBUG, "version: %i layer: %i extension: %i\n", version, layer, extension);
364  if (version == 2 && extension) {
365  ctx->data_type = IEC61937_MPEG2_EXT;
366  ctx->pkt_offset = 4608;
367  } else {
368  ctx->data_type = mpeg_data_type [version & 1][layer];
369  ctx->pkt_offset = spdif_mpeg_pkt_offset[version & 1][layer];
370  }
371  // TODO Data type dependent info (normal/karaoke, dynamic range control)
372  return 0;
373 }
374 
376 {
377  IEC61937Context *ctx = s->priv_data;
378  uint32_t samples;
379  uint8_t frames;
380  int ret;
381 
383  if (ret < 0) {
384  av_log(s, AV_LOG_ERROR, "Wrong AAC file format\n");
385  return ret;
386  }
387 
388  ctx->pkt_offset = samples << 2;
389  switch (frames) {
390  case 1:
391  ctx->data_type = IEC61937_MPEG2_AAC;
392  break;
393  case 2:
394  ctx->data_type = IEC61937_MPEG2_AAC_LSF_2048;
395  break;
396  case 4:
397  ctx->data_type = IEC61937_MPEG2_AAC_LSF_4096;
398  break;
399  default:
401  "%"PRIu32" samples in AAC frame not supported\n", samples);
402  return AVERROR(EINVAL);
403  }
404  //TODO Data type dependent info (LC profile/SBR)
405  return 0;
406 }
407 
408 
409 /*
410  * It seems Dolby TrueHD frames have to be encapsulated in MAT frames before
411  * they can be encapsulated in IEC 61937.
412  */
413 #define MAT_PKT_OFFSET 61440
414 #define MAT_FRAME_SIZE 61424
415 #define TRUEHD_NOMINAL_AU_SPACING 2560
416 
417 static const uint8_t mat_start_code[20] = {
418  0x07, 0x9E, 0x00, 0x03, 0x84, 0x01, 0x01, 0x01, 0x80, 0x00, 0x56, 0xA5, 0x3B, 0xF4, 0x81, 0x83,
419  0x49, 0x80, 0x77, 0xE0,
420 };
421 static const uint8_t mat_middle_code[12] = {
422  0xC3, 0xC1, 0x42, 0x49, 0x3B, 0xFA, 0x82, 0x83, 0x49, 0x80, 0x77, 0xE0,
423 };
424 static const uint8_t mat_end_code[16] = {
425  0xC3, 0xC2, 0xC0, 0xC4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x11,
426 };
427 
428 #define MAT_CODE(position, data) { .pos = position, .code = data, .len = sizeof(data) }
429 
430 static const struct {
431  unsigned int pos;
432  unsigned int len;
433  const uint8_t *code;
434 } mat_codes[] = {
436  MAT_CODE(30708, mat_middle_code),
438 };
439 
440 /**
441  * Get the next index in the MAT buffer ring.
442  */
443 static int truehd_next_mat_buffer(int idx)
444 {
445  return (idx + 1) % HD_BUF_COUNT;
446 }
447 
448 /**
449  * Mark the current MAT buffer ready and advance to the next free buffer.
450  */
452 {
453  IEC61937Context *ctx = s->priv_data;
454 
455  if (ctx->hd_buf_ready_count >= HD_BUF_COUNT - 1) {
456  av_log(s, AV_LOG_ERROR, "Too many completed TrueHD MAT frames pending\n");
457  return AVERROR(EINVAL);
458  }
459 
460  ctx->hd_buf_ready_count++;
461  ctx->hd_buf_idx = truehd_next_mat_buffer(ctx->hd_buf_idx);
462  return 0;
463 }
464 
465 typedef struct TrueHDAccessUnitInfo {
466  uint16_t input_timing;
467  uint16_t output_timing;
471 
472 static int truehd_parse_access_unit(const uint8_t *au_data, int au_size,
474 {
475  GetBitContext gb;
476  int major_sync_size = 28;
477  int ratebits;
478  int num_substreams;
479  int sync_word;
480  int ret;
481  int i;
482  const uint8_t *data;
483  int size;
484 
485  memset(au, 0, sizeof(*au));
486 
487  if (au_size < 4)
488  return AVERROR_INVALIDDATA;
489 
490  data = au_data + 4;
491  size = au_size - 4;
492 
493  au->input_timing = AV_RB16(au_data + 2);
494 
495  if (size < 6 || AV_RB24(data) != 0xf8726f)
496  return 0;
497 
498  /* major sync unit, fetch sample rate */
499  if (data[3] == 0xba)
500  ratebits = data[4] >> 4;
501  else if (data[3] == 0xbb)
502  ratebits = data[5] >> 4;
503  else
504  return AVERROR_INVALIDDATA;
505  au->samples_per_frame = 40 << (ratebits & 3);
506 
507  if (size < 27)
508  return 0;
509 
510  if (data[3] == 0xba && data[25] & 1) {
511  int ext_size = data[26] >> 4;
512  major_sync_size += 2 + ext_size * 2;
513  }
514 
515  if (major_sync_size > size)
516  return 0;
517 
518  ret = init_get_bits8(&gb, data + major_sync_size, size - major_sync_size);
519  if (ret < 0)
520  return ret;
521 
522  num_substreams = data[16] >> 4;
523  if (num_substreams <= 0)
524  return 0;
525 
526  for (i = 0; i < num_substreams; i++) {
527  int extra_word;
528  if (get_bits_left(&gb) < 16)
529  return 0;
530  extra_word = get_bits1(&gb);
531  skip_bits_long(&gb, 15);
532  if (!extra_word)
533  continue;
534  if (get_bits_left(&gb) < 16)
535  return 0;
536  skip_bits_long(&gb, 16);
537  }
538 
539  /* output timing is always at least found in the first substream if it
540  * is present at all, so only walk the first substream.
541  */
542  if (get_bits_left(&gb) < 1)
543  return 0;
544  if (!get_bits1(&gb)) /* ! block_header_exists */
545  return 0;
546  if (get_bits_left(&gb) < 1)
547  return 0;
548  if (!get_bits1(&gb)) /* ! restart_header_exists */
549  return 0;
550  if (get_bits_left(&gb) < 13 + 1 + 16)
551  return 0;
552 
553  sync_word = get_bits(&gb, 13);
554  if (sync_word != (0x31ea >> 1))
555  return 0;
556  skip_bits1(&gb); /* noise_type */
557 
558  au->output_timing = get_bits(&gb, 16);
559  au->has_output_timing = 1;
560 
561  return 0;
562 }
563 
565 {
566  IEC61937Context *ctx = s->priv_data;
567  uint8_t *hd_buf = ctx->hd_buf[ctx->hd_buf_idx];
569  int padding_remaining = 0;
570  int max_padding_per_packet = MAT_FRAME_SIZE * 2;
571  int output_discontinuity = 0;
572  uint16_t input_timing;
573  int total_frame_size = pkt->size;
574  const uint8_t *dataptr = pkt->data;
575  int data_remaining = pkt->size;
576  int have_pkt = 0;
577  int next_code_idx;
578  int ret;
579 
580  if (pkt->size < 10)
581  return AVERROR_INVALIDDATA;
582 
584  if (ret < 0)
585  return ret;
586 
587  if (au.samples_per_frame) {
588  ctx->truehd_samples_per_frame = au.samples_per_frame;
589  av_log(s, AV_LOG_TRACE, "TrueHD samples per frame: %d\n",
590  ctx->truehd_samples_per_frame);
591  }
592 
593  if (!ctx->truehd_samples_per_frame)
594  return AVERROR_INVALIDDATA;
595 
596  input_timing = au.input_timing;
597 
598  ctx->truehd_output_timing += ctx->truehd_samples_per_frame;
599  if (au.has_output_timing) {
600  if (ctx->truehd_output_timing_valid &&
601  au.output_timing != ctx->truehd_output_timing) {
602  /*
603  * Each TrueHD access unit, output_timing increments by
604  * samples_per_frame, and input_timing nominally increments by the
605  * same amount. However if input_timing has fallen behind relative
606  * to output_timing at a discontinuity then additional padding can be
607  * added to preserve the correct MAT timing and IEC61937 carrier. So
608  * at the discontinuity compute padding based on the output-input
609  * timing delta relative to the new output-input delta. Negative or
610  * excessive padding will be ignored and logged.
611  *
612  * output_timing is always ahead by one frame period, so one period is
613  * always subtracted before comparison.
614  */
615  int bytes_per_sample = TRUEHD_NOMINAL_AU_SPACING /
616  ctx->truehd_samples_per_frame;
617  uint16_t output_timing_minus_spf = au.output_timing -
618  ctx->truehd_samples_per_frame;
619  int previous_oi_delta = ctx->truehd_oi_delta;
620  int current_oi_delta = (int16_t)(output_timing_minus_spf -
621  input_timing);
622  int prev_padding = 0;
623  int discontinuity_padding = 0;
624 
625  output_discontinuity = 1;
626  discontinuity_padding = (previous_oi_delta - current_oi_delta) *
627  bytes_per_sample;
628 
629  if (ctx->truehd_prev_size)
630  prev_padding = TRUEHD_NOMINAL_AU_SPACING - ctx->truehd_prev_size;
631 
632  padding_remaining = prev_padding + discontinuity_padding;
633 
634  if (padding_remaining < 0 || padding_remaining > max_padding_per_packet) {
636  "Unusual TrueHD output_timing discontinuity: "
637  "expected %"PRIu16" got %"PRIu16", "
638  "timing delta %d => %d, prev padding %d, "
639  "discontinuity padding %d, "
640  "total padding %d ignored",
641  ctx->truehd_output_timing, au.output_timing,
642  previous_oi_delta, current_oi_delta, prev_padding,
643  discontinuity_padding, padding_remaining);
644  padding_remaining = 0;
645  } else {
647  "TrueHD output_timing discontinuity: "
648  "expected %"PRIu16" got %"PRIu16", "
649  "timing delta %d => %d, prev padding %d, "
650  "discontinuity padding %d, "
651  "total padding %d\n",
652  ctx->truehd_output_timing, au.output_timing,
653  previous_oi_delta, current_oi_delta, prev_padding,
654  discontinuity_padding, padding_remaining);
655  }
656  }
657 
658  ctx->truehd_output_timing = au.output_timing;
659  ctx->truehd_output_timing_valid = 1;
660  }
661 
662  if (ctx->truehd_prev_size && !output_discontinuity) {
663  uint16_t delta_samples = input_timing - ctx->truehd_prev_time;
664  /*
665  * One multiple-of-48kHz frame is 1/1200 sec and the IEC 61937 rate
666  * is 768kHz = 768000*4 bytes/sec.
667  * The nominal space per frame is therefore
668  * (768000*4 bytes/sec) * (1/1200 sec) = 2560 bytes.
669  * For multiple-of-44.1kHz frames: 1/1102.5 sec, 705.6kHz, 2560 bytes.
670  *
671  * 2560 is divisible by truehd_samples_per_frame.
672  */
673  int delta_bytes = delta_samples * TRUEHD_NOMINAL_AU_SPACING /
674  ctx->truehd_samples_per_frame;
675 
676  /* padding needed before this frame */
677  padding_remaining = delta_bytes - ctx->truehd_prev_size;
678 
679  av_log(s, AV_LOG_TRACE, "delta_samples: %"PRIu16", delta_bytes: %d\n",
680  delta_samples, delta_bytes);
681 
682  /* sanity check */
683  if (padding_remaining < 0 || padding_remaining > max_padding_per_packet) {
684  avpriv_request_sample(s, "Unusual frame timing: %"PRIu16" => %"PRIu16", %d samples/frame",
685  ctx->truehd_prev_time, input_timing, ctx->truehd_samples_per_frame);
686  padding_remaining = 0;
687  }
688  }
689 
690  if (ctx->truehd_output_timing_valid) {
691  uint16_t output_timing_minus_spf = ctx->truehd_output_timing -
692  ctx->truehd_samples_per_frame;
693  ctx->truehd_oi_delta = (int16_t)(output_timing_minus_spf - input_timing);
694  }
695 
696  for (next_code_idx = 0; next_code_idx < FF_ARRAY_ELEMS(mat_codes); next_code_idx++)
697  if (ctx->hd_buf_filled <= mat_codes[next_code_idx].pos)
698  break;
699 
700  if (next_code_idx >= FF_ARRAY_ELEMS(mat_codes))
701  return AVERROR_BUG;
702 
703  while (padding_remaining || data_remaining ||
704  mat_codes[next_code_idx].pos == ctx->hd_buf_filled) {
705 
706  if (mat_codes[next_code_idx].pos == ctx->hd_buf_filled) {
707  /* time to insert MAT code */
708  int code_len = mat_codes[next_code_idx].len;
709  int code_len_remaining = code_len;
710  memcpy(hd_buf + mat_codes[next_code_idx].pos,
711  mat_codes[next_code_idx].code, code_len);
712  ctx->hd_buf_filled += code_len;
713 
714  next_code_idx++;
715  if (next_code_idx == FF_ARRAY_ELEMS(mat_codes)) {
716  next_code_idx = 0;
717 
718  /* this was the last code, move to the next MAT frame */
719  have_pkt = 1;
721  if (ret < 0)
722  return ret;
723 
724  hd_buf = ctx->hd_buf[ctx->hd_buf_idx];
725  ctx->hd_buf_filled = 0;
726 
727  /* inter-frame gap has to be counted as well, add it */
728  code_len_remaining += MAT_PKT_OFFSET - MAT_FRAME_SIZE;
729  }
730 
731  if (padding_remaining) {
732  /* consider the MAT code as padding */
733  int counted_as_padding = FFMIN(padding_remaining,
734  code_len_remaining);
735  padding_remaining -= counted_as_padding;
736  code_len_remaining -= counted_as_padding;
737  }
738  /* count the remainder of the code as part of frame size */
739  if (code_len_remaining)
740  total_frame_size += code_len_remaining;
741  }
742 
743  if (padding_remaining) {
744  int padding_to_insert = FFMIN(mat_codes[next_code_idx].pos - ctx->hd_buf_filled,
745  padding_remaining);
746 
747  memset(hd_buf + ctx->hd_buf_filled, 0, padding_to_insert);
748  ctx->hd_buf_filled += padding_to_insert;
749  padding_remaining -= padding_to_insert;
750 
751  if (padding_remaining)
752  continue; /* time to insert MAT code */
753  }
754 
755  if (data_remaining) {
756  int data_to_insert = FFMIN(mat_codes[next_code_idx].pos - ctx->hd_buf_filled,
757  data_remaining);
758 
759  memcpy(hd_buf + ctx->hd_buf_filled, dataptr, data_to_insert);
760  ctx->hd_buf_filled += data_to_insert;
761  dataptr += data_to_insert;
762  data_remaining -= data_to_insert;
763  }
764  }
765 
766  ctx->truehd_prev_size = total_frame_size;
767  ctx->truehd_prev_time = input_timing;
768 
769  av_log(s, AV_LOG_TRACE, "TrueHD frame inserted, total size %d, buffer position %d\n",
770  total_frame_size, ctx->hd_buf_filled);
771 
772  if (!have_pkt) {
773  ctx->pkt_offset = 0;
774  return 0;
775  }
776 
777  return 0;
778 }
779 
781 {
782  IEC61937Context *ctx = s->priv_data;
783 
784  switch (s->streams[0]->codecpar->codec_id) {
785  case AV_CODEC_ID_AC3:
786  ctx->header_info = spdif_header_ac3;
787  break;
788  case AV_CODEC_ID_EAC3:
789  ctx->header_info = spdif_header_eac3;
790  break;
791  case AV_CODEC_ID_MP1:
792  case AV_CODEC_ID_MP2:
793  case AV_CODEC_ID_MP3:
794  ctx->header_info = spdif_header_mpeg;
795  break;
796  case AV_CODEC_ID_DTS:
797  ctx->header_info = spdif_header_dts;
798  break;
799  case AV_CODEC_ID_AAC:
800  ctx->header_info = spdif_header_aac;
801  break;
802  case AV_CODEC_ID_TRUEHD:
803  case AV_CODEC_ID_MLP:
804  ctx->header_info = spdif_header_truehd;
805  for (int i = 0; i < FF_ARRAY_ELEMS(ctx->hd_buf); i++) {
806  ctx->hd_buf[i] = av_malloc(MAT_FRAME_SIZE);
807  if (!ctx->hd_buf[i])
808  return AVERROR(ENOMEM);
809  }
810  break;
811  default:
812  avpriv_report_missing_feature(s, "Codec %d",
813  s->streams[0]->codecpar->codec_id);
814  return AVERROR_PATCHWELCOME;
815  }
816  return 0;
817 }
818 
820 {
821  IEC61937Context *ctx = s->priv_data;
822  av_freep(&ctx->buffer);
823  for (int i = 0; i < FF_ARRAY_ELEMS(ctx->hd_buf); i++)
824  av_freep(&ctx->hd_buf[i]);
825 }
826 
828  AVIOContext *pb, unsigned int val)
829 {
830  if (ctx->spdif_flags & SPDIF_FLAG_BIGENDIAN)
831  avio_wb16(pb, val);
832  else
833  avio_wl16(pb, val);
834 }
835 
837 {
838  IEC61937Context *ctx = s->priv_data;
839  int ret, padding;
840 
841  ctx->out_buf = pkt->data;
842  ctx->out_bytes = pkt->size;
843  ctx->length_code = FFALIGN(pkt->size, 2) << 3;
844  ctx->use_preamble = 1;
845  ctx->extra_bswap = 0;
846 
847  ret = ctx->header_info(s, pkt);
848  if (ret < 0)
849  return ret;
850 
851  if (ctx->header_info == spdif_header_truehd) {
852  /* TrueHD may complete more than one MAT buffer in one AVPacket. At
853  * most, write one completed buffer per AVPacket.
854  */
855  int ready_idx;
856 
857  if (!ctx->hd_buf_ready_count)
858  return 0;
859 
860  ready_idx = ctx->hd_buf_next_ready_idx;
861  ctx->hd_buf_next_ready_idx = truehd_next_mat_buffer(ctx->hd_buf_next_ready_idx);
862  ctx->hd_buf_ready_count--;
863 
864  ctx->out_buf = ctx->hd_buf[ready_idx];
865  ctx->out_bytes = MAT_FRAME_SIZE;
866  ctx->data_type = IEC61937_TRUEHD;
867  ctx->length_code = MAT_FRAME_SIZE;
868  ctx->pkt_offset = MAT_PKT_OFFSET;
869  }
870 
871  if (!ctx->pkt_offset)
872  return 0;
873 
874  padding = (ctx->pkt_offset - ctx->use_preamble * BURST_HEADER_SIZE - ctx->out_bytes) & ~1;
875  if (padding < 0) {
876  av_log(s, AV_LOG_ERROR, "bitrate is too high\n");
877  return AVERROR(EINVAL);
878  }
879 
880  if (ctx->use_preamble) {
881  spdif_put_16(ctx, s->pb, SYNCWORD1); //Pa
882  spdif_put_16(ctx, s->pb, SYNCWORD2); //Pb
883  spdif_put_16(ctx, s->pb, ctx->data_type); //Pc
884  spdif_put_16(ctx, s->pb, ctx->length_code);//Pd
885  }
886 
887  if (ctx->extra_bswap ^ (ctx->spdif_flags & SPDIF_FLAG_BIGENDIAN)) {
888  avio_write(s->pb, ctx->out_buf, ctx->out_bytes & ~1);
889  } else {
890  av_fast_malloc(&ctx->buffer, &ctx->buffer_size, ctx->out_bytes + AV_INPUT_BUFFER_PADDING_SIZE);
891  if (!ctx->buffer)
892  return AVERROR(ENOMEM);
893  ff_spdif_bswap_buf16((uint16_t *)ctx->buffer, (const uint16_t *)ctx->out_buf, ctx->out_bytes >> 1);
894  avio_write(s->pb, ctx->buffer, ctx->out_bytes & ~1);
895  }
896 
897  /* a final lone byte has to be MSB aligned */
898  if (ctx->out_bytes & 1)
899  spdif_put_16(ctx, s->pb, ctx->out_buf[ctx->out_bytes - 1] << 8);
900 
901  ffio_fill(s->pb, 0, padding);
902 
903  av_log(s, AV_LOG_DEBUG, "type=%x len=%i pkt_offset=%i\n",
904  ctx->data_type, ctx->out_bytes, ctx->pkt_offset);
905 
906  return 0;
907 }
908 
910  .p.name = "spdif",
911  .p.long_name = NULL_IF_CONFIG_SMALL("IEC 61937 (used on S/PDIF - IEC958)"),
912  .p.extensions = "spdif",
913  .priv_data_size = sizeof(IEC61937Context),
914  .p.audio_codec = AV_CODEC_ID_AC3,
915  .p.video_codec = AV_CODEC_ID_NONE,
916  .p.subtitle_codec = AV_CODEC_ID_NONE,
917  .write_header = spdif_write_header,
918  .write_packet = spdif_write_packet,
919  .deinit = spdif_deinit,
920  .p.flags = AVFMT_NOTIMESTAMPS,
921  .p.priv_class = &spdif_class,
922  .flags_internal = FF_OFMT_FLAG_MAX_ONE_OF_EACH,
923 };
IEC61937Context::truehd_samples_per_frame
int truehd_samples_per_frame
samples per frame for padding calculation
Definition: spdifenc.c:97
mpeg_data_type
static enum IEC61937DataType mpeg_data_type[2][3]
Definition: spdifenc.c:346
IEC61937Context::extra_bswap
int extra_bswap
extra bswap for payload (for LE DTS => standard BE DTS)
Definition: spdifenc.c:83
skip_bits_long
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
Definition: get_bits.h:280
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
MAT_PKT_OFFSET
#define MAT_PKT_OFFSET
Definition: spdifenc.c:413
IEC61937_MPEG2_AAC_LSF_4096
@ IEC61937_MPEG2_AAC_LSF_4096
MPEG-2 AAC ADTS quarter-rate low sampling frequency.
Definition: spdif.h:50
spdif_header_mpeg
static int spdif_header_mpeg(AVFormatContext *s, AVPacket *pkt)
Definition: spdifenc.c:352
AV_CODEC_ID_AC3
@ AV_CODEC_ID_AC3
Definition: codec_id.h:456
IEC61937DataType
IEC61937DataType
Definition: spdif.h:32
AVOutputFormat::name
const char * name
Definition: avformat.h:527
get_bits_left
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:688
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
opt.h
IEC61937Context::spdif_flags
int spdif_flags
Definition: spdifenc.c:106
dca.h
IEC61937Context::hd_buf
uint8_t * hd_buf[HD_BUF_COUNT]
allocated buffers to concatenate hd audio frames
Definition: spdifenc.c:85
spdif_header_aac
static int spdif_header_aac(AVFormatContext *s, AVPacket *pkt)
Definition: spdifenc.c:375
AVFMT_NOTIMESTAMPS
#define AVFMT_NOTIMESTAMPS
Format does not need / have any timestamps.
Definition: avformat.h:498
spdif_write_packet
static int spdif_write_packet(struct AVFormatContext *s, AVPacket *pkt)
Definition: spdifenc.c:836
IEC61937Context::truehd_prev_time
uint16_t truehd_prev_time
input_timing from the last frame
Definition: spdifenc.c:95
IEC61937Context::truehd_prev_size
int truehd_prev_size
previous frame size in bytes, including any MAT codes
Definition: spdifenc.c:96
DCA_SYNCWORD_CORE_14B_BE
#define DCA_SYNCWORD_CORE_14B_BE
Definition: dca_syncwords.h:24
IEC61937Context::pkt_offset
int pkt_offset
data burst repetition period in bytes
Definition: spdifenc.c:75
mat_start_code
static const uint8_t mat_start_code[20]
Definition: spdifenc.c:417
AVPacket::data
uint8_t * data
Definition: packet.h:603
IEC61937Context::buffer_size
int buffer_size
size of allocated buffer
Definition: spdifenc.c:77
AVOption
AVOption.
Definition: opt.h:428
data
const char data[16]
Definition: mxf.c:149
len
unsigned int len
Definition: spdifenc.c:432
spdif_header_truehd
static int spdif_header_truehd(AVFormatContext *s, AVPacket *pkt)
Definition: spdifenc.c:564
IEC61937_MPEG2_LAYER1_LSF
@ IEC61937_MPEG2_LAYER1_LSF
MPEG-2, layer-1 low sampling frequency.
Definition: spdif.h:38
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:226
TrueHDAccessUnitInfo::samples_per_frame
int samples_per_frame
Definition: spdifenc.c:469
spdif_put_16
static av_always_inline void spdif_put_16(IEC61937Context *ctx, AVIOContext *pb, unsigned int val)
Definition: spdifenc.c:827
AV_CODEC_ID_TRUEHD
@ AV_CODEC_ID_TRUEHD
Definition: codec_id.h:497
FFOutputFormat::p
AVOutputFormat p
The public AVOutputFormat.
Definition: mux.h:65
av_adts_header_parse
int av_adts_header_parse(const uint8_t *buf, uint32_t *samples, uint8_t *frames)
Extract the number of samples and frames from AAC data.
Definition: adts_parser.c:30
av_always_inline
#define av_always_inline
Definition: attributes.h:76
avio_wl16
void avio_wl16(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:440
spdif_class
static const AVClass spdif_class
Definition: spdifenc.c:121
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:337
frames
if it could not because there are no more frames
Definition: filter_design.txt:267
GetBitContext
Definition: get_bits.h:109
TrueHDAccessUnitInfo::output_timing
uint16_t output_timing
Definition: spdifenc.c:467
val
static double val(void *priv, double ch)
Definition: aeval.c:77
AV_CODEC_ID_MP3
@ AV_CODEC_ID_MP3
preferred ID for decoding MPEG audio layer 1, 2 or 3
Definition: codec_id.h:454
spdif_header_dts4
static int spdif_header_dts4(AVFormatContext *s, AVPacket *pkt, int core_size, int sample_rate, int blocks)
Definition: spdifenc.c:192
SPDIF_FLAG_BIGENDIAN
#define SPDIF_FLAG_BIGENDIAN
Definition: spdifenc.c:105
AV_LOG_TRACE
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
Definition: log.h:236
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
init_get_bits8
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:544
ff_spdif_bswap_buf16
void ff_spdif_bswap_buf16(uint16_t *dst, const uint16_t *src, int w)
Definition: spdif.c:26
av_fast_realloc
void * av_fast_realloc(void *ptr, unsigned int *size, size_t min_size)
Reallocate the given buffer if it is not large enough, otherwise do nothing.
Definition: mem.c:495
IEC61937_MPEG2_EXT
@ IEC61937_MPEG2_EXT
MPEG-2 data with extension.
Definition: spdif.h:36
IEC61937Context
Definition: spdifenc.c:71
AV_CODEC_ID_MP2
@ AV_CODEC_ID_MP2
Definition: codec_id.h:453
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
ctx
static AVFormatContext * ctx
Definition: movenc.c:49
get_bits.h
AV_RL16
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_RL16
Definition: bytestream.h:94
code
const uint8_t * code
Definition: spdifenc.c:433
ff_dca_sample_rates
const uint32_t ff_dca_sample_rates[16]
Definition: dca_sample_rate_tab.h:29
tmp
static uint8_t tmp[40]
Definition: aes_ctr.c:52
IEC61937Context::data_type
enum IEC61937DataType data_type
burst info - reference to type of payload of the data-burst
Definition: spdifenc.c:73
dca_syncwords.h
AVFormatContext
Format I/O context.
Definition: avformat.h:1333
IEC61937_AC3
@ IEC61937_AC3
AC-3 data.
Definition: spdif.h:33
ac3defs.h
TrueHDAccessUnitInfo::has_output_timing
int has_output_timing
Definition: spdifenc.c:468
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
NULL
#define NULL
Definition: coverity.c:32
AC3_FRAME_SIZE
#define AC3_FRAME_SIZE
Definition: ac3defs.h:32
AVERROR_PATCHWELCOME
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:64
IEC61937Context::av_class
const AVClass * av_class
Definition: spdifenc.c:72
AV_WB16
#define AV_WB16(p, v)
Definition: intreadwrite.h:401
period
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 minimum maximum flags name is the option keep it simple and lowercase description are in without period
Definition: writing_filters.txt:89
spdif_header_dts
static int spdif_header_dts(AVFormatContext *s, AVPacket *pkt)
Definition: spdifenc.c:269
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:242
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:391
options
Definition: swscale.c:50
FFOutputFormat
Definition: mux.h:61
IEC61937Context::hd_buf_count
int hd_buf_count
number of frames in the hd audio buffer (eac3)
Definition: spdifenc.c:87
IEC61937_DTSHD
@ IEC61937_DTSHD
DTS HD data.
Definition: spdif.h:47
mat_codes
static const struct @525 mat_codes[]
ffio_fill
void ffio_fill(AVIOContext *s, int b, int64_t count)
Definition: aviobuf.c:192
AV_OPT_FLAG_ENCODING_PARAM
#define AV_OPT_FLAG_ENCODING_PARAM
A generic parameter which can be set by the user for muxing or encoding.
Definition: opt.h:351
IEC61937_DTS3
@ IEC61937_DTS3
DTS type III (2048 samples)
Definition: spdif.h:43
AV_CODEC_ID_EAC3
@ AV_CODEC_ID_EAC3
Definition: codec_id.h:493
AV_CODEC_ID_AAC
@ AV_CODEC_ID_AAC
Definition: codec_id.h:455
IEC61937_MPEG1_LAYER23
@ IEC61937_MPEG1_LAYER23
MPEG-1 layer 2 or 3 data or MPEG-2 without extension.
Definition: spdif.h:35
spdif_header_eac3
static int spdif_header_eac3(AVFormatContext *s, AVPacket *pkt)
Definition: spdifenc.c:138
DCA_SYNCWORD_CORE_BE
#define DCA_SYNCWORD_CORE_BE
Definition: dca_syncwords.h:22
AVIOContext
Bytestream IO Context.
Definition: avio.h:160
IEC61937Context::out_buf
const uint8_t * out_buf
pointer to the outgoing data before byte-swapping
Definition: spdifenc.c:79
AVPacket::size
int size
Definition: packet.h:604
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:88
IEC61937Context::hd_buf_next_ready_idx
int hd_buf_next_ready_idx
oldest completed truehd MAT buffer ready to write (truehd)
Definition: spdifenc.c:90
IEC61937Context::header_info
int(* header_info)(AVFormatContext *s, AVPacket *pkt)
function, which generates codec dependent header information.
Definition: spdifenc.c:110
IEC61937_DTS2
@ IEC61937_DTS2
DTS type II (1024 samples)
Definition: spdif.h:42
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
AV_CODEC_ID_DTS
@ AV_CODEC_ID_DTS
Definition: codec_id.h:457
mat_end_code
static const uint8_t mat_end_code[16]
Definition: spdifenc.c:424
IEC61937Context::out_bytes
int out_bytes
amount of outgoing bytes
Definition: spdifenc.c:80
size
int size
Definition: twinvq_data.h:10344
AV_RB32
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_RB32
Definition: bytestream.h:96
avpriv_report_missing_feature
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
av_malloc
#define av_malloc(s)
Definition: ops_static.c:44
DCA_SYNCWORD_CORE_14B_LE
#define DCA_SYNCWORD_CORE_14B_LE
Definition: dca_syncwords.h:25
avio_write
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
Definition: aviobuf.c:206
IEC61937Context::length_code
int length_code
length code in bits or bytes, depending on data type
Definition: spdifenc.c:74
IEC61937Context::dtshd_rate
int dtshd_rate
Definition: spdifenc.c:103
IEC61937_DTS1
@ IEC61937_DTS1
DTS type I (512 samples)
Definition: spdif.h:41
skip_bits1
static void skip_bits1(GetBitContext *s)
Definition: get_bits.h:416
spdif_write_header
static int spdif_write_header(AVFormatContext *s)
Definition: spdifenc.c:780
version
version
Definition: libkvazaar.c:313
IEC61937Context::buffer
uint8_t * buffer
allocated buffer, used for swap bytes
Definition: spdifenc.c:76
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:48
avio_internal.h
FF_OFMT_FLAG_MAX_ONE_OF_EACH
#define FF_OFMT_FLAG_MAX_ONE_OF_EACH
If this flag is set, it indicates that for each codec type whose corresponding default codec (i....
Definition: mux.h:50
s
uint8_t s
Definition: llvidencdsp.c:39
IEC61937Context::dtshd_skip
int dtshd_skip
counter used for skipping DTS-HD frames
Definition: spdifenc.c:93
IEC61937Context::use_preamble
int use_preamble
preamble enabled (disabled for exactly pre-padded DTS)
Definition: spdifenc.c:82
IEC61937_MPEG1_LAYER1
@ IEC61937_MPEG1_LAYER1
MPEG-1 layer 1.
Definition: spdif.h:34
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
IEC61937_EAC3
@ IEC61937_EAC3
E-AC-3 data.
Definition: spdif.h:51
IEC61937Context::dtshd_fallback
int dtshd_fallback
Definition: spdifenc.c:104
DCA_SYNCWORD_SUBSTREAM
#define DCA_SYNCWORD_SUBSTREAM
Definition: dca_syncwords.h:32
HD_BUF_COUNT
#define HD_BUF_COUNT
Definition: spdifenc.c:69
IEC61937_MPEG2_AAC_LSF_2048
@ IEC61937_MPEG2_AAC_LSF_2048
MPEG-2 AAC ADTS half-rate low sampling frequency.
Definition: spdif.h:49
ret
ret
Definition: filter_design.txt:187
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:81
adts_parser.h
pos
unsigned int pos
Definition: spdifenc.c:431
avformat.h
SYNCWORD2
#define SYNCWORD2
Definition: spdif.h:29
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: defs.h:40
truehd_enqueue_mat
static int truehd_enqueue_mat(AVFormatContext *s)
Mark the current MAT buffer ready and advance to the next free buffer.
Definition: spdifenc.c:451
IEC61937Context::truehd_oi_delta
int truehd_oi_delta
signed (output_timing-samples_per_frame)-input_timing
Definition: spdifenc.c:100
truehd_next_mat_buffer
static int truehd_next_mat_buffer(int idx)
Get the next index in the MAT buffer ring.
Definition: spdifenc.c:443
IEC61937Context::hd_buf_size
int hd_buf_size
size of the hd audio buffer (eac3, dts4)
Definition: spdifenc.c:86
BURST_HEADER_SIZE
#define BURST_HEADER_SIZE
Definition: spdif.h:30
spdif_dts4_subtype
static int spdif_dts4_subtype(int period)
Definition: spdifenc.c:179
IEC61937_TRUEHD
@ IEC61937_TRUEHD
TrueHD data.
Definition: spdif.h:52
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:258
TrueHDAccessUnitInfo
Definition: spdifenc.c:465
samples
Filter the word “frame” indicates either a video frame or a group of audio samples
Definition: filter_design.txt:8
Windows::Graphics::DirectX::Direct3D11::p
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
Definition: vsrc_gfxcapture_winrt.hpp:53
IEC61937Context::hd_buf_filled
int hd_buf_filled
amount of bytes in the hd audio buffer (eac3, truehd)
Definition: spdifenc.c:88
MAT_CODE
#define MAT_CODE(position, data)
Definition: spdifenc.c:428
DCA_SYNCWORD_CORE_LE
#define DCA_SYNCWORD_CORE_LE
Definition: dca_syncwords.h:23
mem.h
IEC61937_MPEG2_LAYER2_LSF
@ IEC61937_MPEG2_LAYER2_LSF
MPEG-2, layer-2 low sampling frequency.
Definition: spdif.h:39
TrueHDAccessUnitInfo::input_timing
uint16_t input_timing
Definition: spdifenc.c:466
IEC61937Context::truehd_output_timing
uint16_t truehd_output_timing
expected output_timing for truehd restart headers
Definition: spdifenc.c:98
avpriv_request_sample
#define avpriv_request_sample(...)
Definition: tableprint_vlc.h:37
FFALIGN
#define FFALIGN(x, a)
Definition: macros.h:78
AVPacket
This structure stores compressed data.
Definition: packet.h:580
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
av_fast_malloc
void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size)
Allocate a buffer, reusing the given one if large enough.
Definition: mem.c:555
IEC61937Context::hd_buf_ready_count
int hd_buf_ready_count
number of completed TrueHD MAT buffers ready to write (truehd)
Definition: spdifenc.c:91
spdif_header_ac3
static int spdif_header_ac3(AVFormatContext *s, AVPacket *pkt)
Definition: spdifenc.c:128
IEC61937Context::truehd_output_timing_valid
int truehd_output_timing_valid
restart header output_timing has been read
Definition: spdifenc.c:99
mat_middle_code
static const uint8_t mat_middle_code[12]
Definition: spdifenc.c:421
AV_OPT_TYPE_FLAGS
@ AV_OPT_TYPE_FLAGS
Underlying C type is unsigned int.
Definition: opt.h:254
avio_wb16
void avio_wb16(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:446
AVERROR_BUG
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Definition: error.h:52
ff_spdif_muxer
const FFOutputFormat ff_spdif_muxer
Definition: spdifenc.c:909
options
static const AVOption options[]
Definition: spdifenc.c:113
truehd_parse_access_unit
static int truehd_parse_access_unit(const uint8_t *au_data, int au_size, TrueHDAccessUnitInfo *au)
Definition: spdifenc.c:472
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
IEC61937_MPEG2_AAC
@ IEC61937_MPEG2_AAC
MPEG-2 AAC ADTS.
Definition: spdif.h:37
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
spdif_deinit
static void spdif_deinit(AVFormatContext *s)
Definition: spdifenc.c:819
pkt
static AVPacket * pkt
Definition: demux_decode.c:55
MAT_FRAME_SIZE
#define MAT_FRAME_SIZE
Definition: spdifenc.c:414
IEC61937Context::hd_buf_idx
int hd_buf_idx
active hd buffer index (truehd)
Definition: spdifenc.c:89
AV_RB24
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_RB24
Definition: bytestream.h:97
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition: opt.h:298
AV_CODEC_ID_MP1
@ AV_CODEC_ID_MP1
Definition: codec_id.h:495
spdif_mpeg_pkt_offset
static const uint16_t spdif_mpeg_pkt_offset[2][3]
Definition: spdif.h:56
IEC61937_MPEG2_LAYER3_LSF
@ IEC61937_MPEG2_LAYER3_LSF
MPEG-2, layer-3 low sampling frequency.
Definition: spdif.h:40
TRUEHD_NOMINAL_AU_SPACING
#define TRUEHD_NOMINAL_AU_SPACING
Definition: spdifenc.c:415
spdif.h
SYNCWORD1
#define SYNCWORD1
Definition: spdif.h:28
AV_CODEC_ID_MLP
@ AV_CODEC_ID_MLP
Definition: codec_id.h:482
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
mux.h