spdifenc.c
Go to the documentation of this file.
1 /*
2  * IEC 61937 muxer
3  * Copyright (c) 2009 Bartlomiej Wolowiec
4  * Copyright (c) 2010 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-preambule - IEC61937 frame header, contains 16-bits 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 "avformat.h"
48 #include "avio_internal.h"
49 #include "spdif.h"
50 #include "libavcodec/ac3.h"
51 #include "libavcodec/dca.h"
52 #include "libavcodec/aacadtsdec.h"
53 #include "libavutil/opt.h"
54 
55 typedef struct IEC61937Context {
56  const AVClass *av_class;
57  enum IEC61937DataType data_type;///< burst info - reference to type of payload of the data-burst
58  int length_code; ///< length code in bits or bytes, depending on data type
59  int pkt_offset; ///< data burst repetition period in bytes
60  uint8_t *buffer; ///< allocated buffer, used for swap bytes
61  int buffer_size; ///< size of allocated buffer
62 
63  uint8_t *out_buf; ///< pointer to the outgoing data before byte-swapping
64  int out_bytes; ///< amount of outgoing bytes
65 
66  int use_preamble; ///< preamble enabled (disabled for exactly pre-padded DTS)
67  int extra_bswap; ///< extra bswap for payload (for LE DTS => standard BE DTS)
68 
69  uint8_t *hd_buf; ///< allocated buffer to concatenate hd audio frames
70  int hd_buf_size; ///< size of the hd audio buffer
71  int hd_buf_count; ///< number of frames in the hd audio buffer
72  int hd_buf_filled; ///< amount of bytes in the hd audio buffer
73 
74  int dtshd_skip; ///< counter used for skipping DTS-HD frames
75 
76  /* AVOptions: */
79 #define SPDIF_FLAG_BIGENDIAN 0x01
81 
82  /// function, which generates codec dependent header information.
83  /// Sets data_type and pkt_offset, and length_code, out_bytes, out_buf if necessary
86 
87 static const AVOption options[] = {
88 { "spdif_flags", "IEC 61937 encapsulation flags", offsetof(IEC61937Context, spdif_flags), AV_OPT_TYPE_FLAGS, {.i64 = 0}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "spdif_flags" },
89 { "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, "spdif_flags" },
90 { "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 },
91 { "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 },
92 { NULL },
93 };
94 
95 static const AVClass class = {
96  .class_name = "spdif",
97  .item_name = av_default_item_name,
98  .option = options,
100 };
101 
103 {
104  IEC61937Context *ctx = s->priv_data;
105  int bitstream_mode = pkt->data[5] & 0x7;
106 
107  ctx->data_type = IEC61937_AC3 | (bitstream_mode << 8);
108  ctx->pkt_offset = AC3_FRAME_SIZE << 2;
109  return 0;
110 }
111 
113 {
114  IEC61937Context *ctx = s->priv_data;
115  static const uint8_t eac3_repeat[4] = {6, 3, 2, 1};
116  int repeat = 1;
117 
118  if ((pkt->data[4] & 0xc0) != 0xc0) /* fscod */
119  repeat = eac3_repeat[(pkt->data[4] & 0x30) >> 4]; /* numblkscod */
120 
121  ctx->hd_buf = av_fast_realloc(ctx->hd_buf, &ctx->hd_buf_size, ctx->hd_buf_filled + pkt->size);
122  if (!ctx->hd_buf)
123  return AVERROR(ENOMEM);
124 
125  memcpy(&ctx->hd_buf[ctx->hd_buf_filled], pkt->data, pkt->size);
126 
127  ctx->hd_buf_filled += pkt->size;
128  if (++ctx->hd_buf_count < repeat){
129  ctx->pkt_offset = 0;
130  return 0;
131  }
132  ctx->data_type = IEC61937_EAC3;
133  ctx->pkt_offset = 24576;
134  ctx->out_buf = ctx->hd_buf;
135  ctx->out_bytes = ctx->hd_buf_filled;
136  ctx->length_code = ctx->hd_buf_filled;
137 
138  ctx->hd_buf_count = 0;
139  ctx->hd_buf_filled = 0;
140  return 0;
141 }
142 
143 /*
144  * DTS type IV (DTS-HD) can be transmitted with various frame repetition
145  * periods; longer repetition periods allow for longer packets and therefore
146  * higher bitrate. Longer repetition periods mean that the constant bitrate of
147  * the outputted IEC 61937 stream is higher.
148  * The repetition period is measured in IEC 60958 frames (4 bytes).
149  */
150 static int spdif_dts4_subtype(int period)
151 {
152  switch (period) {
153  case 512: return 0x0;
154  case 1024: return 0x1;
155  case 2048: return 0x2;
156  case 4096: return 0x3;
157  case 8192: return 0x4;
158  case 16384: return 0x5;
159  }
160  return -1;
161 }
162 
163 static int spdif_header_dts4(AVFormatContext *s, AVPacket *pkt, int core_size,
164  int sample_rate, int blocks)
165 {
166  IEC61937Context *ctx = s->priv_data;
167  static const char dtshd_start_code[10] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe };
168  int pkt_size = pkt->size;
169  int period;
170  int subtype;
171 
172  if (!core_size) {
173  av_log(s, AV_LOG_ERROR, "HD mode not supported for this format\n");
174  return AVERROR(EINVAL);
175  }
176 
177  if (!sample_rate) {
178  av_log(s, AV_LOG_ERROR, "Unknown DTS sample rate for HD\n");
179  return AVERROR_INVALIDDATA;
180  }
181 
182  period = ctx->dtshd_rate * (blocks << 5) / sample_rate;
183  subtype = spdif_dts4_subtype(period);
184 
185  if (subtype < 0) {
186  av_log(s, AV_LOG_ERROR, "Specified HD rate of %d Hz would require an "
187  "impossible repetition period of %d for the current DTS stream"
188  " (blocks = %d, sample rate = %d)\n", ctx->dtshd_rate, period,
189  blocks << 5, sample_rate);
190  return AVERROR(EINVAL);
191  }
192 
193  /* set pkt_offset and DTS IV subtype according to the requested output
194  * rate */
195  ctx->pkt_offset = period * 4;
196  ctx->data_type = IEC61937_DTSHD | subtype << 8;
197 
198  /* If the bitrate is too high for transmitting at the selected
199  * repetition period setting, strip DTS-HD until a good amount
200  * of consecutive non-overflowing HD frames have been observed.
201  * This generally only happens if the caller is cramming a Master
202  * Audio stream into 192kHz IEC 60958 (which may or may not fit). */
203  if (sizeof(dtshd_start_code) + 2 + pkt_size
204  > ctx->pkt_offset - BURST_HEADER_SIZE && core_size) {
205  if (!ctx->dtshd_skip)
206  av_log(s, AV_LOG_WARNING, "DTS-HD bitrate too high, "
207  "temporarily sending core only\n");
208  if (ctx->dtshd_fallback > 0)
209  ctx->dtshd_skip = sample_rate * ctx->dtshd_fallback / (blocks << 5);
210  else
211  /* skip permanently (dtshd_fallback == -1) or just once
212  * (dtshd_fallback == 0) */
213  ctx->dtshd_skip = 1;
214  }
215  if (ctx->dtshd_skip && core_size) {
216  pkt_size = core_size;
217  if (ctx->dtshd_fallback >= 0)
218  --ctx->dtshd_skip;
219  }
220 
221  ctx->out_bytes = sizeof(dtshd_start_code) + 2 + pkt_size;
222 
223  /* Align so that (length_code & 0xf) == 0x8. This is reportedly needed
224  * with some receivers, but the exact requirement is unconfirmed. */
225  ctx->length_code = FFALIGN(ctx->out_bytes + 0x8, 0x10) - 0x8;
226 
227  av_fast_malloc(&ctx->hd_buf, &ctx->hd_buf_size, ctx->out_bytes);
228  if (!ctx->hd_buf)
229  return AVERROR(ENOMEM);
230 
231  ctx->out_buf = ctx->hd_buf;
232 
233  memcpy(ctx->hd_buf, dtshd_start_code, sizeof(dtshd_start_code));
234  AV_WB16(ctx->hd_buf + sizeof(dtshd_start_code), pkt_size);
235  memcpy(ctx->hd_buf + sizeof(dtshd_start_code) + 2, pkt->data, pkt_size);
236 
237  return 0;
238 }
239 
241 {
242  IEC61937Context *ctx = s->priv_data;
243  uint32_t syncword_dts = AV_RB32(pkt->data);
244  int blocks;
245  int sample_rate = 0;
246  int core_size = 0;
247 
248  if (pkt->size < 9)
249  return AVERROR_INVALIDDATA;
250 
251  switch (syncword_dts) {
252  case DCA_MARKER_RAW_BE:
253  blocks = (AV_RB16(pkt->data + 4) >> 2) & 0x7f;
254  core_size = ((AV_RB24(pkt->data + 5) >> 4) & 0x3fff) + 1;
255  sample_rate = avpriv_dca_sample_rates[(pkt->data[8] >> 2) & 0x0f];
256  break;
257  case DCA_MARKER_RAW_LE:
258  blocks = (AV_RL16(pkt->data + 4) >> 2) & 0x7f;
259  ctx->extra_bswap = 1;
260  break;
261  case DCA_MARKER_14B_BE:
262  blocks =
263  (((pkt->data[5] & 0x07) << 4) | ((pkt->data[6] & 0x3f) >> 2));
264  break;
265  case DCA_MARKER_14B_LE:
266  blocks =
267  (((pkt->data[4] & 0x07) << 4) | ((pkt->data[7] & 0x3f) >> 2));
268  ctx->extra_bswap = 1;
269  break;
270  case DCA_HD_MARKER:
271  /* We only handle HD frames that are paired with core. However,
272  sometimes DTS-HD streams with core have a stray HD frame without
273  core in the beginning of the stream. */
274  av_log(s, AV_LOG_ERROR, "stray DTS-HD frame\n");
275  return AVERROR_INVALIDDATA;
276  default:
277  av_log(s, AV_LOG_ERROR, "bad DTS syncword 0x%x\n", syncword_dts);
278  return AVERROR_INVALIDDATA;
279  }
280  blocks++;
281 
282  if (ctx->dtshd_rate)
283  /* DTS type IV output requested */
284  return spdif_header_dts4(s, pkt, core_size, sample_rate, blocks);
285 
286  switch (blocks) {
287  case 512 >> 5: ctx->data_type = IEC61937_DTS1; break;
288  case 1024 >> 5: ctx->data_type = IEC61937_DTS2; break;
289  case 2048 >> 5: ctx->data_type = IEC61937_DTS3; break;
290  default:
291  av_log(s, AV_LOG_ERROR, "%i samples in DTS frame not supported\n",
292  blocks << 5);
293  return AVERROR(ENOSYS);
294  }
295 
296  /* discard extraneous data by default */
297  if (core_size && core_size < pkt->size) {
298  ctx->out_bytes = core_size;
299  ctx->length_code = core_size << 3;
300  }
301 
302  ctx->pkt_offset = blocks << 7;
303 
304  if (ctx->out_bytes == ctx->pkt_offset) {
305  /* The DTS stream fits exactly into the output stream, so skip the
306  * preamble as it would not fit in there. This is the case for dts
307  * discs and dts-in-wav. */
308  ctx->use_preamble = 0;
309  } else if (ctx->out_bytes > ctx->pkt_offset - BURST_HEADER_SIZE) {
310  avpriv_request_sample(s, "Unrecognized large DTS frame");
311  /* This will fail with a "bitrate too high" in the caller */
312  }
313 
314  return 0;
315 }
316 
317 static const enum IEC61937DataType mpeg_data_type[2][3] = {
318  // LAYER1 LAYER2 LAYER3
320  { IEC61937_MPEG1_LAYER1, IEC61937_MPEG1_LAYER23, IEC61937_MPEG1_LAYER23 }, //MPEG1
321 };
322 
324 {
325  IEC61937Context *ctx = s->priv_data;
326  int version = (pkt->data[1] >> 3) & 3;
327  int layer = 3 - ((pkt->data[1] >> 1) & 3);
328  int extension = pkt->data[2] & 1;
329 
330  if (layer == 3 || version == 1) {
331  av_log(s, AV_LOG_ERROR, "Wrong MPEG file format\n");
332  return AVERROR_INVALIDDATA;
333  }
334  av_log(s, AV_LOG_DEBUG, "version: %i layer: %i extension: %i\n", version, layer, extension);
335  if (version == 2 && extension) {
337  ctx->pkt_offset = 4608;
338  } else {
339  ctx->data_type = mpeg_data_type [version & 1][layer];
340  ctx->pkt_offset = spdif_mpeg_pkt_offset[version & 1][layer];
341  }
342  // TODO Data type dependent info (normal/karaoke, dynamic range control)
343  return 0;
344 }
345 
347 {
348  IEC61937Context *ctx = s->priv_data;
349  AACADTSHeaderInfo hdr;
350  GetBitContext gbc;
351  int ret;
352 
353  init_get_bits(&gbc, pkt->data, AAC_ADTS_HEADER_SIZE * 8);
354  ret = avpriv_aac_parse_header(&gbc, &hdr);
355  if (ret < 0) {
356  av_log(s, AV_LOG_ERROR, "Wrong AAC file format\n");
357  return AVERROR_INVALIDDATA;
358  }
359 
360  ctx->pkt_offset = hdr.samples << 2;
361  switch (hdr.num_aac_frames) {
362  case 1:
364  break;
365  case 2:
367  break;
368  case 4:
370  break;
371  default:
372  av_log(s, AV_LOG_ERROR, "%i samples in AAC frame not supported\n",
373  hdr.samples);
374  return AVERROR(EINVAL);
375  }
376  //TODO Data type dependent info (LC profile/SBR)
377  return 0;
378 }
379 
380 
381 /*
382  * It seems Dolby TrueHD frames have to be encapsulated in MAT frames before
383  * they can be encapsulated in IEC 61937.
384  * Here we encapsulate 24 TrueHD frames in a single MAT frame, padding them
385  * to achieve constant rate.
386  * The actual format of a MAT frame is unknown, but the below seems to work.
387  * However, it seems it is not actually necessary for the 24 TrueHD frames to
388  * be in an exact alignment with the MAT frame.
389  */
390 #define MAT_FRAME_SIZE 61424
391 #define TRUEHD_FRAME_OFFSET 2560
392 #define MAT_MIDDLE_CODE_OFFSET -4
393 
395 {
396  IEC61937Context *ctx = s->priv_data;
397  int mat_code_length = 0;
398  const char mat_end_code[16] = { 0xC3, 0xC2, 0xC0, 0xC4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x11 };
399 
400  if (!ctx->hd_buf_count) {
401  const char mat_start_code[20] = { 0x07, 0x9E, 0x00, 0x03, 0x84, 0x01, 0x01, 0x01, 0x80, 0x00, 0x56, 0xA5, 0x3B, 0xF4, 0x81, 0x83, 0x49, 0x80, 0x77, 0xE0 };
402  mat_code_length = sizeof(mat_start_code) + BURST_HEADER_SIZE;
403  memcpy(ctx->hd_buf, mat_start_code, sizeof(mat_start_code));
404 
405  } else if (ctx->hd_buf_count == 12) {
406  const char mat_middle_code[12] = { 0xC3, 0xC1, 0x42, 0x49, 0x3B, 0xFA, 0x82, 0x83, 0x49, 0x80, 0x77, 0xE0 };
407  mat_code_length = sizeof(mat_middle_code) + MAT_MIDDLE_CODE_OFFSET;
409  mat_middle_code, sizeof(mat_middle_code));
410  }
411 
412  if (pkt->size > TRUEHD_FRAME_OFFSET - mat_code_length) {
413  /* if such frames exist, we'd need some more complex logic to
414  * distribute the TrueHD frames in the MAT frame */
415  avpriv_request_sample(s, "Too large TrueHD frame of %d bytes",
416  pkt->size);
417  return AVERROR_PATCHWELCOME;
418  }
419 
420  memcpy(&ctx->hd_buf[ctx->hd_buf_count * TRUEHD_FRAME_OFFSET - BURST_HEADER_SIZE + mat_code_length],
421  pkt->data, pkt->size);
422  memset(&ctx->hd_buf[ctx->hd_buf_count * TRUEHD_FRAME_OFFSET - BURST_HEADER_SIZE + mat_code_length + pkt->size],
423  0, TRUEHD_FRAME_OFFSET - pkt->size - mat_code_length);
424 
425  if (++ctx->hd_buf_count < 24){
426  ctx->pkt_offset = 0;
427  return 0;
428  }
429  memcpy(&ctx->hd_buf[MAT_FRAME_SIZE - sizeof(mat_end_code)], mat_end_code, sizeof(mat_end_code));
430  ctx->hd_buf_count = 0;
431 
432  ctx->data_type = IEC61937_TRUEHD;
433  ctx->pkt_offset = 61440;
434  ctx->out_buf = ctx->hd_buf;
435  ctx->out_bytes = MAT_FRAME_SIZE;
437  return 0;
438 }
439 
441 {
442  IEC61937Context *ctx = s->priv_data;
443 
444  switch (s->streams[0]->codec->codec_id) {
445  case AV_CODEC_ID_AC3:
447  break;
448  case AV_CODEC_ID_EAC3:
450  break;
451  case AV_CODEC_ID_MP1:
452  case AV_CODEC_ID_MP2:
453  case AV_CODEC_ID_MP3:
455  break;
456  case AV_CODEC_ID_DTS:
458  break;
459  case AV_CODEC_ID_AAC:
461  break;
462  case AV_CODEC_ID_TRUEHD:
465  if (!ctx->hd_buf)
466  return AVERROR(ENOMEM);
467  break;
468  default:
469  av_log(s, AV_LOG_ERROR, "codec not supported\n");
470  return AVERROR_PATCHWELCOME;
471  }
472  return 0;
473 }
474 
476 {
477  IEC61937Context *ctx = s->priv_data;
478  av_freep(&ctx->buffer);
479  av_freep(&ctx->hd_buf);
480  return 0;
481 }
482 
484  AVIOContext *pb, unsigned int val)
485 {
487  avio_wb16(pb, val);
488  else
489  avio_wl16(pb, val);
490 }
491 
493 {
494  IEC61937Context *ctx = s->priv_data;
495  int ret, padding;
496 
497  ctx->out_buf = pkt->data;
498  ctx->out_bytes = pkt->size;
499  ctx->length_code = FFALIGN(pkt->size, 2) << 3;
500  ctx->use_preamble = 1;
501  ctx->extra_bswap = 0;
502 
503  ret = ctx->header_info(s, pkt);
504  if (ret < 0)
505  return ret;
506  if (!ctx->pkt_offset)
507  return 0;
508 
509  padding = (ctx->pkt_offset - ctx->use_preamble * BURST_HEADER_SIZE - ctx->out_bytes) & ~1;
510  if (padding < 0) {
511  av_log(s, AV_LOG_ERROR, "bitrate is too high\n");
512  return AVERROR(EINVAL);
513  }
514 
515  if (ctx->use_preamble) {
516  spdif_put_16(ctx, s->pb, SYNCWORD1); //Pa
517  spdif_put_16(ctx, s->pb, SYNCWORD2); //Pb
518  spdif_put_16(ctx, s->pb, ctx->data_type); //Pc
519  spdif_put_16(ctx, s->pb, ctx->length_code);//Pd
520  }
521 
522  if (ctx->extra_bswap ^ (ctx->spdif_flags & SPDIF_FLAG_BIGENDIAN)) {
523  avio_write(s->pb, ctx->out_buf, ctx->out_bytes & ~1);
524  } else {
526  if (!ctx->buffer)
527  return AVERROR(ENOMEM);
528  ff_spdif_bswap_buf16((uint16_t *)ctx->buffer, (uint16_t *)ctx->out_buf, ctx->out_bytes >> 1);
529  avio_write(s->pb, ctx->buffer, ctx->out_bytes & ~1);
530  }
531 
532  /* a final lone byte has to be MSB aligned */
533  if (ctx->out_bytes & 1)
534  spdif_put_16(ctx, s->pb, ctx->out_buf[ctx->out_bytes - 1] << 8);
535 
536  ffio_fill(s->pb, 0, padding);
537 
538  av_log(s, AV_LOG_DEBUG, "type=%x len=%i pkt_offset=%i\n",
539  ctx->data_type, ctx->out_bytes, ctx->pkt_offset);
540 
541  return 0;
542 }
543 
545  .name = "spdif",
546  .long_name = NULL_IF_CONFIG_SMALL("IEC 61937 (used on S/PDIF - IEC958)"),
547  .extensions = "spdif",
548  .priv_data_size = sizeof(IEC61937Context),
549  .audio_codec = AV_CODEC_ID_AC3,
550  .video_codec = AV_CODEC_ID_NONE,
555  .priv_class = &class,
556 };
MPEG-2 AAC ADTS half-rate low sampling frequency.
Definition: spdif.h:49
uint8_t * out_buf
pointer to the outgoing data before byte-swapping
Definition: spdifenc.c:63
void avio_wl16(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:367
const char * s
Definition: avisynth_c.h:668
Bytestream IO Context.
Definition: avio.h:68
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
AVOption.
Definition: opt.h:251
int pkt_offset
data burst repetition period in bytes
Definition: spdifenc.c:59
av_default_item_name
static int spdif_header_mpeg(AVFormatContext *s, AVPacket *pkt)
Definition: spdifenc.c:323
struct IEC61937Context IEC61937Context
#define BURST_HEADER_SIZE
Definition: spdif.h:30
MPEG-2, layer-1 low sampling frequency.
Definition: spdif.h:38
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:154
static int write_packet(AVFormatContext *s, AVPacket *pkt)
static int spdif_dts4_subtype(int period)
Definition: spdifenc.c:150
#define AV_RB24
IEC61937DataType
Definition: spdif.h:32
#define AV_RL16
static int spdif_write_packet(struct AVFormatContext *s, AVPacket *pkt)
Definition: spdifenc.c:492
static int spdif_header_dts(AVFormatContext *s, AVPacket *pkt)
Definition: spdifenc.c:240
void ff_spdif_bswap_buf16(uint16_t *dst, const uint16_t *src, int w)
Definition: spdif.c:26
static int spdif_header_eac3(AVFormatContext *s, AVPacket *pkt)
Definition: spdifenc.c:112
#define FFALIGN(x, a)
Definition: common.h:63
int buffer_size
size of allocated buffer
Definition: spdifenc.c:61
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
Definition: mem.c:198
#define DCA_HD_MARKER
DCA-HD specific block starts with this marker.
Definition: dca.h:38
Format I/O context.
Definition: avformat.h:944
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:55
void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size)
Allocate a buffer, reusing the given one if large enough.
void void avpriv_request_sample(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
MPEG-2 AAC ADTS.
Definition: spdif.h:37
uint8_t
AVOptions.
#define AV_RB32
static AVPacket pkt
Definition: demuxing.c:56
AVStream ** streams
Definition: avformat.h:992
AVOutputFormat ff_spdif_muxer
Definition: spdifenc.c:544
uint8_t * data
#define MAT_MIDDLE_CODE_OFFSET
Definition: spdifenc.c:392
#define SPDIF_FLAG_BIGENDIAN
Definition: spdifenc.c:79
DTS type II (1024 samples)
Definition: spdif.h:42
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
Definition: aviobuf.c:173
static int spdif_write_trailer(AVFormatContext *s)
Definition: spdifenc.c:475
TrueHD data.
Definition: spdif.h:52
static int write_trailer(AVFormatContext *s)
#define AV_OPT_FLAG_ENCODING_PARAM
a generic parameter which can be set by the user for muxing or encoding
Definition: opt.h:281
DTS HD data.
Definition: spdif.h:47
DTS type III (2048 samples)
Definition: spdif.h:43
void * av_fast_realloc(void *ptr, unsigned int *size, size_t min_size)
Reallocate the given block if it is not large enough, otherwise do nothing.
const AVClass * av_class
Definition: spdifenc.c:56
#define AV_RB16
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
int(* header_info)(AVFormatContext *s, AVPacket *pkt)
function, which generates codec dependent header information.
Definition: spdifenc.c:84
preferred ID for decoding MPEG audio layer 1, 2 or 3
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
MPEG-1 layer 2 or 3 data or MPEG-2 without extension.
Definition: spdif.h:35
MPEG-2, layer-3 low sampling frequency.
Definition: spdif.h:40
int hd_buf_count
number of frames in the hd audio buffer
Definition: spdifenc.c:71
MPEG-1 layer 1.
Definition: spdif.h:34
int size
AVCodecContext * codec
Codec context associated with this stream.
Definition: avformat.h:662
#define FF_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
#define DCA_MARKER_14B_LE
Definition: dca.h:35
void ffio_fill(AVIOContext *s, int b, int count)
Definition: aviobuf.c:159
uint8_t * buffer
allocated buffer, used for swap bytes
Definition: spdifenc.c:60
ret
Definition: avfilter.c:821
int out_bytes
amount of outgoing bytes
Definition: spdifenc.c:64
uint8_t num_aac_frames
Definition: aacadtsdec.h:39
const char * name
Definition: avformat.h:378
#define TRUEHD_FRAME_OFFSET
Definition: spdifenc.c:391
int dtshd_fallback
Definition: spdifenc.c:78
uint32_t samples
Definition: aacadtsdec.h:33
const uint32_t avpriv_dca_sample_rates[16]
Definition: dca.c:31
static av_always_inline void spdif_put_16(IEC61937Context *ctx, AVIOContext *pb, unsigned int val)
Definition: spdifenc.c:483
enum IEC61937DataType data_type
burst info - reference to type of payload of the data-burst
Definition: spdifenc.c:57
LIBAVUTIL_VERSION_INT
Definition: eval.c:55
static enum IEC61937DataType mpeg_data_type[2][3]
Definition: spdifenc.c:317
#define SYNCWORD2
Definition: spdif.h:29
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:62
#define AVFMT_NOTIMESTAMPS
Format does not need / have any timestamps.
Definition: avformat.h:352
static const AVOption options[]
Definition: spdifenc.c:87
NULL
Definition: eval.c:55
#define AAC_ADTS_HEADER_SIZE
Definition: aacadtsdec.h:29
sample_rate
#define DCA_MARKER_RAW_LE
Definition: dca.h:33
#define MAT_FRAME_SIZE
Definition: spdifenc.c:390
static int spdif_write_header(AVFormatContext *s)
Definition: spdifenc.c:440
enum AVCodecID codec_id
AVIOContext * pb
I/O context.
Definition: avformat.h:977
int use_preamble
preamble enabled (disabled for exactly pre-padded DTS)
Definition: spdifenc.c:66
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
int avpriv_aac_parse_header(GetBitContext *gbc, AACADTSHeaderInfo *hdr)
Parse AAC frame header.
Definition: aacadtsdec.c:29
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:73
int hd_buf_filled
amount of bytes in the hd audio buffer
Definition: spdifenc.c:72
Describe the class of an AVClass context structure.
Definition: log.h:50
#define AV_WB16(p, darg)
Definition: intreadwrite.h:237
int length_code
length code in bits or bytes, depending on data type
Definition: spdifenc.c:58
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:379
static int spdif_header_truehd(AVFormatContext *s, AVPacket *pkt)
Definition: spdifenc.c:394
DTS type I (512 samples)
Definition: spdif.h:41
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer 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.Buffer references ownership and permissions
version
Definition: spdifenc.c:99
void avio_wb16(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:373
static int flags
Definition: cpu.c:23
MPEG-2, layer-2 low sampling frequency.
Definition: spdif.h:39
static int spdif_header_aac(AVFormatContext *s, AVPacket *pkt)
Definition: spdifenc.c:346
E-AC-3 data.
Definition: spdif.h:51
#define AC3_FRAME_SIZE
Definition: ac3.h:37
Main libavformat public API header.
#define DCA_MARKER_14B_BE
Definition: dca.h:34
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:162
MPEG-2 data with extension.
Definition: spdif.h:36
int dtshd_skip
counter used for skipping DTS-HD frames
Definition: spdifenc.c:74
int hd_buf_size
size of the hd audio buffer
Definition: spdifenc.c:70
MPEG-2 AAC ADTS quarter-rate low sampling frequency.
Definition: spdif.h:50
static const uint16_t spdif_mpeg_pkt_offset[2][3]
Definition: spdif.h:55
#define SYNCWORD1
Definition: spdif.h:28
void * priv_data
Format private data.
Definition: avformat.h:964
static void write_header(FFV1Context *f)
Definition: ffv1enc.c:470
static int spdif_header_ac3(AVFormatContext *s, AVPacket *pkt)
Definition: spdifenc.c:102
AC-3 data.
Definition: spdif.h:33
static int spdif_header_dts4(AVFormatContext *s, AVPacket *pkt, int core_size, int sample_rate, int blocks)
Definition: spdifenc.c:163
#define DCA_MARKER_RAW_BE
DCA syncwords, also used for bitstream type detection.
Definition: dca.h:32
#define av_always_inline
Definition: attributes.h:41
int extra_bswap
extra bswap for payload (for LE DTS => standard BE DTS)
Definition: spdifenc.c:67
This structure stores compressed data.
uint8_t * hd_buf
allocated buffer to concatenate hd audio frames
Definition: spdifenc.c:69
Common code between the AC-3 encoder and decoder.