87 #define SPDIF_FLAG_BIGENDIAN 0x01
96 {
"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" },
98 {
"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 },
99 {
"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 },
113 int bitstream_mode =
pkt->
data[5] & 0x7;
123 static const uint8_t eac3_repeat[4] = {6, 3, 2, 1};
128 if (bsid > 10 && (
pkt->
data[4] & 0xc0) != 0xc0)
129 repeat = eac3_repeat[(
pkt->
data[4] & 0x30) >> 4];
139 if (++
ctx->hd_buf_count < repeat){
144 ctx->pkt_offset = 24576;
145 ctx->out_buf =
ctx->hd_buf[0];
146 ctx->out_bytes =
ctx->hd_buf_filled;
147 ctx->length_code =
ctx->hd_buf_filled;
149 ctx->hd_buf_count = 0;
150 ctx->hd_buf_filled = 0;
164 case 512:
return 0x0;
165 case 1024:
return 0x1;
166 case 2048:
return 0x2;
167 case 4096:
return 0x3;
168 case 8192:
return 0x4;
169 case 16384:
return 0x5;
178 static const char dtshd_start_code[10] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe };
198 "impossible repetition period of %d for the current DTS stream"
199 " (blocks = %d, sample rate = %d)\n",
ctx->dtshd_rate, period,
206 ctx->pkt_offset = period * 4;
214 if (
sizeof(dtshd_start_code) + 2 + pkt_size
216 if (!
ctx->dtshd_skip)
218 "temporarily sending core only\n");
219 if (
ctx->dtshd_fallback > 0)
226 if (
ctx->dtshd_skip && core_size) {
227 pkt_size = core_size;
228 if (
ctx->dtshd_fallback >= 0)
232 ctx->out_bytes =
sizeof(dtshd_start_code) + 2 + pkt_size;
236 ctx->length_code =
FFALIGN(
ctx->out_bytes + 0x8, 0x10) - 0x8;
242 ctx->out_buf =
ctx->hd_buf[0];
244 memcpy(
ctx->hd_buf[0], dtshd_start_code,
sizeof(dtshd_start_code));
245 AV_WB16(
ctx->hd_buf[0] +
sizeof(dtshd_start_code), pkt_size);
246 memcpy(
ctx->hd_buf[0] +
sizeof(dtshd_start_code) + 2,
pkt->
data, pkt_size);
262 switch (syncword_dts) {
270 ctx->extra_bswap = 1;
279 ctx->extra_bswap = 1;
308 if (core_size && core_size < pkt->
size) {
309 ctx->out_bytes = core_size;
310 ctx->length_code = core_size << 3;
313 ctx->pkt_offset = blocks << 7;
315 if (
ctx->out_bytes ==
ctx->pkt_offset) {
319 ctx->use_preamble = 0;
338 int layer = 3 - ((
pkt->
data[1] >> 1) & 3);
339 int extension =
pkt->
data[2] & 1;
341 if (layer == 3 ||
version == 1) {
346 if (
version == 2 && extension) {
348 ctx->pkt_offset = 4608;
370 ctx->pkt_offset = samples << 2;
383 "%"PRIu32
" samples in AAC frame not supported\n", samples);
395 #define MAT_PKT_OFFSET 61440
396 #define MAT_FRAME_SIZE 61424
399 0x07, 0x9E, 0x00, 0x03, 0x84, 0x01, 0x01, 0x01, 0x80, 0x00, 0x56, 0xA5, 0x3B, 0xF4, 0x81, 0x83,
400 0x49, 0x80, 0x77, 0xE0,
403 0xC3, 0xC1, 0x42, 0x49, 0x3B, 0xFA, 0x82, 0x83, 0x49, 0x80, 0x77, 0xE0,
406 0xC3, 0xC2, 0xC0, 0xC4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x11,
409 #define MAT_CODE(position, data) { .pos = position, .code = data, .len = sizeof(data) }
411 static const struct {
426 int padding_remaining = 0;
427 uint16_t input_timing;
428 int total_frame_size =
pkt->
size;
430 int data_remaining =
pkt->
size;
446 ctx->truehd_samples_per_frame = 40 << (ratebits & 3);
448 ctx->truehd_samples_per_frame);
451 if (!
ctx->truehd_samples_per_frame)
455 if (
ctx->truehd_prev_size) {
456 uint16_t delta_samples = input_timing -
ctx->truehd_prev_time;
466 int delta_bytes = delta_samples * 2560 /
ctx->truehd_samples_per_frame;
469 padding_remaining = delta_bytes -
ctx->truehd_prev_size;
472 delta_samples, delta_bytes);
475 if (padding_remaining < 0 || padding_remaining >=
MAT_FRAME_SIZE / 2) {
477 ctx->truehd_prev_time, input_timing,
ctx->truehd_samples_per_frame);
478 padding_remaining = 0;
489 while (padding_remaining || data_remaining ||
494 int code_len =
mat_codes[next_code_idx].len;
495 int code_len_remaining = code_len;
498 ctx->hd_buf_filled += code_len;
506 ctx->out_buf = hd_buf;
507 ctx->hd_buf_idx ^= 1;
508 hd_buf =
ctx->hd_buf[
ctx->hd_buf_idx];
509 ctx->hd_buf_filled = 0;
515 if (padding_remaining) {
517 int counted_as_padding =
FFMIN(padding_remaining,
519 padding_remaining -= counted_as_padding;
520 code_len_remaining -= counted_as_padding;
523 if (code_len_remaining)
524 total_frame_size += code_len_remaining;
527 if (padding_remaining) {
531 memset(hd_buf +
ctx->hd_buf_filled, 0, padding_to_insert);
532 ctx->hd_buf_filled += padding_to_insert;
533 padding_remaining -= padding_to_insert;
535 if (padding_remaining)
539 if (data_remaining) {
543 memcpy(hd_buf +
ctx->hd_buf_filled, dataptr, data_to_insert);
544 ctx->hd_buf_filled += data_to_insert;
545 dataptr += data_to_insert;
546 data_remaining -= data_to_insert;
550 ctx->truehd_prev_size = total_frame_size;
551 ctx->truehd_prev_time = input_timing;
554 total_frame_size,
ctx->hd_buf_filled);
572 switch (
s->streams[0]->codecpar->codec_id) {
601 s->streams[0]->codecpar->codec_id);
632 ctx->use_preamble = 1;
633 ctx->extra_bswap = 0;
635 ret =
ctx->header_info(
s,
pkt);
638 if (!
ctx->pkt_offset)
647 if (
ctx->use_preamble) {
665 if (
ctx->out_bytes & 1)
671 ctx->data_type,
ctx->out_bytes,
ctx->pkt_offset);
679 .extensions =
"spdif",
Common code between the AC-3 encoder and decoder.
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.
static double val(void *priv, double ch)
void avio_wl16(AVIOContext *s, unsigned int val)
void avio_wb16(AVIOContext *s, unsigned int val)
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
void ffio_fill(AVIOContext *s, int b, int count)
#define flags(name, subs,...)
const uint32_t avpriv_dca_sample_rates[16]
#define DCA_SYNCWORD_SUBSTREAM
#define DCA_SYNCWORD_CORE_14B_BE
#define DCA_SYNCWORD_CORE_LE
#define DCA_SYNCWORD_CORE_BE
#define DCA_SYNCWORD_CORE_14B_LE
static void write_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost, int unqueue)
static void write_header(FFV1Context *f)
@ AV_CODEC_ID_MP3
preferred ID for decoding MPEG audio layer 1, 2 or 3
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding.
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
const char * av_default_item_name(void *ptr)
Return the context name.
void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size)
Allocate a buffer, reusing the given one if large enough.
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.
#define LIBAVUTIL_VERSION_INT
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
#define AV_OPT_FLAG_ENCODING_PARAM
a generic parameter which can be set by the user for muxing or encoding
#define FF_ARRAY_ELEMS(a)
void ff_spdif_bswap_buf16(uint16_t *dst, const uint16_t *src, int w)
@ IEC61937_MPEG1_LAYER1
MPEG-1 layer 1.
@ IEC61937_MPEG2_AAC_LSF_2048
MPEG-2 AAC ADTS half-rate low sampling frequency.
@ IEC61937_TRUEHD
TrueHD data.
@ IEC61937_DTS3
DTS type III (2048 samples)
@ IEC61937_MPEG1_LAYER23
MPEG-1 layer 2 or 3 data or MPEG-2 without extension.
@ IEC61937_MPEG2_EXT
MPEG-2 data with extension.
@ IEC61937_DTS2
DTS type II (1024 samples)
@ IEC61937_MPEG2_AAC_LSF_4096
MPEG-2 AAC ADTS quarter-rate low sampling frequency.
@ IEC61937_MPEG2_AAC
MPEG-2 AAC ADTS.
@ IEC61937_DTSHD
DTS HD data.
@ IEC61937_MPEG2_LAYER2_LSF
MPEG-2, layer-2 low sampling frequency.
@ IEC61937_EAC3
E-AC-3 data.
@ IEC61937_MPEG2_LAYER1_LSF
MPEG-2, layer-1 low sampling frequency.
@ IEC61937_DTS1
DTS type I (512 samples)
@ IEC61937_MPEG2_LAYER3_LSF
MPEG-2, layer-3 low sampling frequency.
static const uint16_t spdif_mpeg_pkt_offset[2][3]
#define BURST_HEADER_SIZE
static int spdif_header_eac3(AVFormatContext *s, AVPacket *pkt)
static int spdif_write_packet(struct AVFormatContext *s, AVPacket *pkt)
static const uint8_t mat_start_code[20]
static int spdif_header_truehd(AVFormatContext *s, AVPacket *pkt)
static const AVOption options[]
static int spdif_header_ac3(AVFormatContext *s, AVPacket *pkt)
static int spdif_dts4_subtype(int period)
static enum IEC61937DataType mpeg_data_type[2][3]
static const struct @285 mat_codes[]
static int spdif_header_dts4(AVFormatContext *s, AVPacket *pkt, int core_size, int sample_rate, int blocks)
static int spdif_header_aac(AVFormatContext *s, AVPacket *pkt)
#define MAT_CODE(position, data)
static const AVClass spdif_class
AVOutputFormat ff_spdif_muxer
static int spdif_write_header(AVFormatContext *s)
static int spdif_header_dts(AVFormatContext *s, AVPacket *pkt)
#define SPDIF_FLAG_BIGENDIAN
static const uint8_t mat_end_code[16]
static int spdif_header_mpeg(AVFormatContext *s, AVPacket *pkt)
static const uint8_t mat_middle_code[12]
static void spdif_deinit(AVFormatContext *s)
static av_always_inline void spdif_put_16(IEC61937Context *ctx, AVIOContext *pb, unsigned int val)
Describe the class of an AVClass context structure.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
This structure stores compressed data.
int length_code
length code in bits or bytes, depending on data type
int(* header_info)(AVFormatContext *s, AVPacket *pkt)
function, which generates codec dependent header information.
uint8_t * hd_buf[2]
allocated buffers to concatenate hd audio frames
int hd_buf_count
number of frames in the hd audio buffer (eac3)
int dtshd_skip
counter used for skipping DTS-HD frames
int truehd_prev_size
previous frame size in bytes, including any MAT codes
int hd_buf_filled
amount of bytes in the hd audio buffer (eac3, truehd)
uint8_t * buffer
allocated buffer, used for swap bytes
int extra_bswap
extra bswap for payload (for LE DTS => standard BE DTS)
int hd_buf_size
size of the hd audio buffer (eac3, dts4)
int use_preamble
preamble enabled (disabled for exactly pre-padded DTS)
enum IEC61937DataType data_type
burst info - reference to type of payload of the data-burst
uint16_t truehd_prev_time
input_timing from the last frame
uint8_t * out_buf
pointer to the outgoing data before byte-swapping
int pkt_offset
data burst repetition period in bytes
int truehd_samples_per_frame
samples per frame for padding calculation
int out_bytes
amount of outgoing bytes
int buffer_size
size of allocated buffer
int hd_buf_idx
active hd buffer index (truehd)
#define avpriv_request_sample(...)