Go to the documentation of this file.
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};
127 if (bsid > 10 && (
pkt->
data[4] & 0xc0) != 0xc0)
128 repeat = eac3_repeat[(
pkt->
data[4] & 0x30) >> 4];
137 if (++
ctx->hd_buf_count < repeat){
142 ctx->pkt_offset = 24576;
143 ctx->out_buf =
ctx->hd_buf[0];
144 ctx->out_bytes =
ctx->hd_buf_filled;
145 ctx->length_code =
ctx->hd_buf_filled;
147 ctx->hd_buf_count = 0;
148 ctx->hd_buf_filled = 0;
162 case 512:
return 0x0;
163 case 1024:
return 0x1;
164 case 2048:
return 0x2;
165 case 4096:
return 0x3;
166 case 8192:
return 0x4;
167 case 16384:
return 0x5;
176 static const char dtshd_start_code[10] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe };
196 "impossible repetition period of %d for the current DTS stream"
197 " (blocks = %d, sample rate = %d)\n",
ctx->dtshd_rate,
period,
212 if (
sizeof(dtshd_start_code) + 2 + pkt_size
214 if (!
ctx->dtshd_skip)
216 "temporarily sending core only\n");
217 if (
ctx->dtshd_fallback > 0)
224 if (
ctx->dtshd_skip && core_size) {
225 pkt_size = core_size;
226 if (
ctx->dtshd_fallback >= 0)
230 ctx->out_bytes =
sizeof(dtshd_start_code) + 2 + pkt_size;
234 ctx->length_code =
FFALIGN(
ctx->out_bytes + 0x8, 0x10) - 0x8;
240 ctx->out_buf =
ctx->hd_buf[0];
242 memcpy(
ctx->hd_buf[0], dtshd_start_code,
sizeof(dtshd_start_code));
243 AV_WB16(
ctx->hd_buf[0] +
sizeof(dtshd_start_code), pkt_size);
244 memcpy(
ctx->hd_buf[0] +
sizeof(dtshd_start_code) + 2,
pkt->
data, pkt_size);
260 switch (syncword_dts) {
268 ctx->extra_bswap = 1;
277 ctx->extra_bswap = 1;
306 if (core_size && core_size < pkt->
size) {
307 ctx->out_bytes = core_size;
308 ctx->length_code = core_size << 3;
311 ctx->pkt_offset = blocks << 7;
313 if (
ctx->out_bytes ==
ctx->pkt_offset) {
317 ctx->use_preamble = 0;
336 int layer = 3 - ((
pkt->
data[1] >> 1) & 3);
337 int extension =
pkt->
data[2] & 1;
339 if (layer == 3 ||
version == 1) {
344 if (
version == 2 && extension) {
346 ctx->pkt_offset = 4608;
381 "%"PRIu32
" samples in AAC frame not supported\n",
samples);
393 #define MAT_PKT_OFFSET 61440
394 #define MAT_FRAME_SIZE 61424
397 0x07, 0x9E, 0x00, 0x03, 0x84, 0x01, 0x01, 0x01, 0x80, 0x00, 0x56, 0xA5, 0x3B, 0xF4, 0x81, 0x83,
398 0x49, 0x80, 0x77, 0xE0,
401 0xC3, 0xC1, 0x42, 0x49, 0x3B, 0xFA, 0x82, 0x83, 0x49, 0x80, 0x77, 0xE0,
404 0xC3, 0xC2, 0xC0, 0xC4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x11,
407 #define MAT_CODE(position, data) { .pos = position, .code = data, .len = sizeof(data) }
409 static const struct {
424 int padding_remaining = 0;
425 uint16_t input_timing;
426 int total_frame_size =
pkt->
size;
428 int data_remaining =
pkt->
size;
444 ctx->truehd_samples_per_frame = 40 << (ratebits & 3);
446 ctx->truehd_samples_per_frame);
449 if (!
ctx->truehd_samples_per_frame)
453 if (
ctx->truehd_prev_size) {
454 uint16_t delta_samples = input_timing -
ctx->truehd_prev_time;
464 int delta_bytes = delta_samples * 2560 /
ctx->truehd_samples_per_frame;
467 padding_remaining = delta_bytes -
ctx->truehd_prev_size;
470 delta_samples, delta_bytes);
473 if (padding_remaining < 0 || padding_remaining >=
MAT_FRAME_SIZE / 2) {
475 ctx->truehd_prev_time, input_timing,
ctx->truehd_samples_per_frame);
476 padding_remaining = 0;
487 while (padding_remaining || data_remaining ||
492 int code_len =
mat_codes[next_code_idx].len;
493 int code_len_remaining = code_len;
496 ctx->hd_buf_filled += code_len;
504 ctx->out_buf = hd_buf;
505 ctx->hd_buf_idx ^= 1;
506 hd_buf =
ctx->hd_buf[
ctx->hd_buf_idx];
507 ctx->hd_buf_filled = 0;
513 if (padding_remaining) {
515 int counted_as_padding =
FFMIN(padding_remaining,
517 padding_remaining -= counted_as_padding;
518 code_len_remaining -= counted_as_padding;
521 if (code_len_remaining)
522 total_frame_size += code_len_remaining;
525 if (padding_remaining) {
529 memset(hd_buf +
ctx->hd_buf_filled, 0, padding_to_insert);
530 ctx->hd_buf_filled += padding_to_insert;
531 padding_remaining -= padding_to_insert;
533 if (padding_remaining)
537 if (data_remaining) {
541 memcpy(hd_buf +
ctx->hd_buf_filled, dataptr, data_to_insert);
542 ctx->hd_buf_filled += data_to_insert;
543 dataptr += data_to_insert;
544 data_remaining -= data_to_insert;
548 ctx->truehd_prev_size = total_frame_size;
549 ctx->truehd_prev_time = input_timing;
552 total_frame_size,
ctx->hd_buf_filled);
570 switch (
s->streams[0]->codecpar->codec_id) {
599 s->streams[0]->codecpar->codec_id);
630 ctx->use_preamble = 1;
631 ctx->extra_bswap = 0;
636 if (!
ctx->pkt_offset)
645 if (
ctx->use_preamble) {
663 if (
ctx->out_bytes & 1)
669 ctx->data_type,
ctx->out_bytes,
ctx->pkt_offset);
677 .extensions =
"spdif",
int truehd_samples_per_frame
samples per frame for padding calculation
static enum IEC61937DataType mpeg_data_type[2][3]
int extra_bswap
extra bswap for payload (for LE DTS => standard BE DTS)
#define AV_LOG_WARNING
Something somehow does not look correct.
@ IEC61937_MPEG2_AAC_LSF_4096
MPEG-2 AAC ADTS quarter-rate low sampling frequency.
static int spdif_header_mpeg(AVFormatContext *s, AVPacket *pkt)
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
static int spdif_header_aac(AVFormatContext *s, AVPacket *pkt)
static int spdif_write_packet(struct AVFormatContext *s, AVPacket *pkt)
uint16_t truehd_prev_time
input_timing from the last frame
int truehd_prev_size
previous frame size in bytes, including any MAT codes
#define DCA_SYNCWORD_CORE_14B_BE
int pkt_offset
data burst repetition period in bytes
static const uint8_t mat_start_code[20]
int buffer_size
size of allocated buffer
static int spdif_header_truehd(AVFormatContext *s, AVPacket *pkt)
@ IEC61937_MPEG2_LAYER1_LSF
MPEG-2, layer-1 low sampling frequency.
FFmpeg Automated Testing Environment ************************************Introduction Using FATE from your FFmpeg source directory Submitting the results to the FFmpeg result aggregation server Uploading new samples to the fate suite FATE makefile targets and variables Makefile targets Makefile variables Examples Introduction **************FATE is an extended regression suite on the client side and a means for results aggregation and presentation on the server side The first part of this document explains how you can use FATE from your FFmpeg source directory to test your ffmpeg binary The second part describes how you can run FATE to submit the results to FFmpeg’s FATE server In any way you can have a look at the publicly viewable FATE results by visiting this as it can be seen if some test on some platform broke with their recent contribution This usually happens on the platforms the developers could not test on The second part of this document describes how you can run FATE to submit your results to FFmpeg’s FATE server If you want to submit your results be sure to check that your combination of OS and compiler is not already listed on the above mentioned website In the third part you can find a comprehensive listing of FATE makefile targets and variables Using FATE from your FFmpeg source directory **********************************************If you want to run FATE on your machine you need to have the samples in place You can get the samples via the build target fate rsync Use this command from the top level source this will cause FATE to fail NOTE To use a custom wrapper to run the pass ‘ target exec’ to ‘configure’ or set the TARGET_EXEC Make variable Submitting the results to the FFmpeg result aggregation server ****************************************************************To submit your results to the server you should run fate through the shell script ‘tests fate sh’ from the FFmpeg sources This script needs to be invoked with a configuration file as its first argument tests fate sh path to fate_config A configuration file template with comments describing the individual configuration variables can be found at ‘doc fate_config sh template’ Create a configuration that suits your based on the configuration template The ‘slot’ configuration variable can be any string that is not yet but it is suggested that you name it adhering to the following pattern ‘ARCH OS COMPILER COMPILER VERSION’ The configuration file itself will be sourced in a shell therefore all shell features may be used This enables you to setup the environment as you need it for your build For your first test runs the ‘fate_recv’ variable should be empty or commented out This will run everything as normal except that it will omit the submission of the results to the server The following files should be present in $workdir as specified in the configuration it may help to try out the ‘ssh’ command with one or more ‘ v’ options You should get detailed output concerning your SSH configuration and the authentication process The only thing left is to automate the execution of the fate sh script and the synchronisation of the samples directory Uploading new samples to the fate suite *****************************************If you need a sample uploaded send a mail to samples request This is for developers who have an account on the fate suite server If you upload new samples
static av_always_inline void spdif_put_16(IEC61937Context *ctx, AVIOContext *pb, unsigned int val)
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.
void avio_wl16(AVIOContext *s, unsigned int val)
static const AVClass spdif_class
if it could not because there are no more frames
static double val(void *priv, double ch)
@ AV_CODEC_ID_MP3
preferred ID for decoding MPEG audio layer 1, 2 or 3
static int spdif_header_dts4(AVFormatContext *s, AVPacket *pkt, int core_size, int sample_rate, int blocks)
#define SPDIF_FLAG_BIGENDIAN
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
void ff_spdif_bswap_buf16(uint16_t *dst, const uint16_t *src, int w)
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.
@ IEC61937_MPEG2_EXT
MPEG-2 data with extension.
#define AV_OPT_FLAG_ENCODING_PARAM
a generic parameter which can be set by the user for muxing or encoding
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
enum IEC61937DataType data_type
burst info - reference to type of payload of the data-burst
#define LIBAVUTIL_VERSION_INT
Describe the class of an AVClass context structure.
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
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
static int spdif_header_dts(AVFormatContext *s, AVPacket *pkt)
const char * av_default_item_name(void *ptr)
Return the context name.
int hd_buf_count
number of frames in the hd audio buffer (eac3)
@ IEC61937_DTSHD
DTS HD data.
AVOutputFormat ff_spdif_muxer
@ IEC61937_DTS3
DTS type III (2048 samples)
@ IEC61937_MPEG1_LAYER23
MPEG-1 layer 2 or 3 data or MPEG-2 without extension.
static int spdif_header_eac3(AVFormatContext *s, AVPacket *pkt)
#define DCA_SYNCWORD_CORE_BE
#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.
@ IEC61937_DTS2
DTS type II (1024 samples)
static const uint8_t mat_end_code[16]
int out_bytes
amount of outgoing bytes
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
#define DCA_SYNCWORD_CORE_14B_LE
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
int length_code
length code in bits or bytes, depending on data type
@ IEC61937_DTS1
DTS type I (512 samples)
static int spdif_write_header(AVFormatContext *s)
static void write_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost, int unqueue)
uint8_t * buffer
allocated buffer, used for swap bytes
#define i(width, name, range_min, range_max)
int dtshd_skip
counter used for skipping DTS-HD frames
int use_preamble
preamble enabled (disabled for exactly pre-padded DTS)
@ IEC61937_MPEG1_LAYER1
MPEG-1 layer 1.
@ IEC61937_EAC3
E-AC-3 data.
#define DCA_SYNCWORD_SUBSTREAM
@ IEC61937_MPEG2_AAC_LSF_2048
MPEG-2 AAC ADTS half-rate low sampling frequency.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
#define AV_INPUT_BUFFER_PADDING_SIZE
#define FF_ARRAY_ELEMS(a)
int hd_buf_size
size of the hd audio buffer (eac3, dts4)
#define BURST_HEADER_SIZE
static int spdif_dts4_subtype(int period)
@ IEC61937_TRUEHD
TrueHD data.
uint8_t * out_buf
pointer to the outgoing data before byte-swapping
int hd_buf_filled
amount of bytes in the hd audio buffer (eac3, truehd)
#define MAT_CODE(position, data)
uint8_t * hd_buf[2]
allocated buffers to concatenate hd audio frames
#define DCA_SYNCWORD_CORE_LE
@ IEC61937_MPEG2_LAYER2_LSF
MPEG-2, layer-2 low sampling frequency.
#define avpriv_request_sample(...)
This structure stores compressed data.
void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size)
Allocate a buffer, reusing the given one if large enough.
static int spdif_header_ac3(AVFormatContext *s, AVPacket *pkt)
static const uint8_t mat_middle_code[12]
void ffio_fill(AVIOContext *s, int b, int count)
void avio_wb16(AVIOContext *s, unsigned int val)
#define flags(name, subs,...)
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
static const struct @279 mat_codes[]
static const AVOption options[]
@ IEC61937_MPEG2_AAC
MPEG-2 AAC ADTS.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
static void spdif_deinit(AVFormatContext *s)
static void write_header(FFV1Context *f)
int hd_buf_idx
active hd buffer index (truehd)
const uint32_t avpriv_dca_sample_rates[16]
static const uint16_t spdif_mpeg_pkt_offset[2][3]
@ IEC61937_MPEG2_LAYER3_LSF
MPEG-2, layer-3 low sampling frequency.