3 * Copyright (c) 2009 Bartlomiej Wolowiec
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 * @file libavformat/spdif.c
24 * IEC-61937 encapsulation of various formats, used by S/PDIF
25 * @author Bartlomiej Wolowiec
29 * Terminology used in specification:
30 * data-burst - IEC958 frame, contains header and encapsuled frame
31 * burst-preambule - IEC958 frame header, contains 16-bits words named Pa, Pb, Pc and Pd
32 * burst-payload - encapsuled frame
33 * Pa, Pb - syncword - 0xF872, 0x4E1F
34 * Pc - burst-info, contains data-type (bits 0-6), error flag (bit 7), data-type-dependent info (bits 8-12)
35 * and bitstream number (bits 13-15)
36 * data-type - determines type of encapsuled frames
37 * Pd - length code (number of bits or bytes of encapsuled frame - according to data_type)
39 * IEC958 frames at normal usage start every specific count of bytes,
40 * dependent from data-type (spaces between packets are filled by zeros)
44 #include "libavcodec/ac3.h"
45 #include "libavcodec/dca.h"
46 #include "libavcodec/aac_parser.h"
48 #define SYNCWORD1 0xF872
49 #define SYNCWORD2 0x4E1F
50 #define BURST_HEADER_SIZE 0x8
53 IEC958_AC3
= 0x01, ///< AC-3 data
54 IEC958_MPEG1_LAYER1
= 0x04, ///< MPEG-1 layer 1
55 IEC958_MPEG1_LAYER23
= 0x05, ///< MPEG-1 layer 2 or 3 data or MPEG-2 without extension
56 IEC958_MPEG2_EXT
= 0x06, ///< MPEG-2 data with extension
57 IEC958_MPEG2_AAC
= 0x07, ///< MPEG-2 AAC ADTS
58 IEC958_MPEG2_LAYER1_LSF
= 0x08, ///< MPEG-2, layer-1 low sampling frequency
59 IEC958_MPEG2_LAYER2_LSF
= 0x09, ///< MPEG-2, layer-2 low sampling frequency
60 IEC958_MPEG2_LAYER3_LSF
= 0x0A, ///< MPEG-2, layer-3 low sampling frequency
61 IEC958_DTS1
= 0x0B, ///< DTS type I (512 samples)
62 IEC958_DTS2
= 0x0C, ///< DTS type II (1024 samples)
63 IEC958_DTS3
= 0x0D, ///< DTS type III (2048 samples)
64 IEC958_MPEG2_AAC_LSF_2048
= 0x13, ///< MPEG-2 AAC ADTS half-rate low sampling frequency
65 IEC958_MPEG2_AAC_LSF_4096
= 0x13 | 0x20, ///< MPEG-2 AAC ADTS quarter-rate low sampling frequency
68 typedef struct IEC958Context
{
69 enum IEC958DataType data_type
; ///< burst info - reference to type of payload of the data-burst
70 int pkt_size
; ///< length code in bits
71 int pkt_offset
; ///< data burst repetition period in bytes
72 uint8_t *buffer
; ///< allocated buffer, used for swap bytes
73 int buffer_size
; ///< size of allocated buffer
75 /// function, which generates codec dependent header information.
76 /// Sets data_type and data_offset
77 int (*header_info
) (AVFormatContext
*s
, AVPacket
*pkt
);
81 static void bswap_buf16(uint16_t *dst
, const uint16_t *src
, int w
)
85 for (i
= 0; i
+ 8 <= w
; i
+= 8) {
86 dst
[i
+ 0] = bswap_16(src
[i
+ 0]);
87 dst
[i
+ 1] = bswap_16(src
[i
+ 1]);
88 dst
[i
+ 2] = bswap_16(src
[i
+ 2]);
89 dst
[i
+ 3] = bswap_16(src
[i
+ 3]);
90 dst
[i
+ 4] = bswap_16(src
[i
+ 4]);
91 dst
[i
+ 5] = bswap_16(src
[i
+ 5]);
92 dst
[i
+ 6] = bswap_16(src
[i
+ 6]);
93 dst
[i
+ 7] = bswap_16(src
[i
+ 7]);
96 dst
[i
+ 0] = bswap_16(src
[i
+ 0]);
99 static int spdif_header_ac3(AVFormatContext
*s
, AVPacket
*pkt
)
101 IEC958Context
*ctx
= s
->priv_data
;
102 int bitstream_mode
= pkt
->data
[6] & 0x7;
104 ctx
->data_type
= IEC958_AC3
| (bitstream_mode
<< 8);
105 ctx
->pkt_offset
= AC3_FRAME_SIZE
<< 2;
109 static int spdif_header_dts(AVFormatContext
*s
, AVPacket
*pkt
)
111 IEC958Context
*ctx
= s
->priv_data
;
112 uint32_t syncword_dts
= AV_RB32(pkt
->data
);
115 switch (syncword_dts
) {
116 case DCA_MARKER_RAW_BE
:
117 blocks
= (AV_RB16(pkt
->data
+ 4) >> 2) & 0x7f;
119 case DCA_MARKER_RAW_LE
:
120 blocks
= (AV_RL16(pkt
->data
+ 4) >> 2) & 0x7f;
122 case DCA_MARKER_14B_BE
:
124 (((pkt
->data
[5] & 0x07) << 4) | ((pkt
->data
[6] & 0x3f) >> 2));
126 case DCA_MARKER_14B_LE
:
128 (((pkt
->data
[4] & 0x07) << 4) | ((pkt
->data
[7] & 0x3f) >> 2));
131 av_log(s
, AV_LOG_ERROR
, "bad DTS syncword 0x%x\n", syncword_dts
);
136 case 512 >> 5: ctx
->data_type
= IEC958_DTS1
; break;
137 case 1024 >> 5: ctx
->data_type
= IEC958_DTS2
; break;
138 case 2048 >> 5: ctx
->data_type
= IEC958_DTS3
; break;
140 av_log(s
, AV_LOG_ERROR
, "%i samples in DTS frame not supported\n",
144 ctx
->pkt_offset
= blocks
<< 7;
149 static const enum IEC958DataType mpeg_data_type
[2][3] = {
150 // LAYER1 LAYER2 LAYER3
151 { IEC958_MPEG2_LAYER1_LSF
, IEC958_MPEG2_LAYER2_LSF
, IEC958_MPEG2_LAYER3_LSF
}, //MPEG2 LSF
152 { IEC958_MPEG1_LAYER1
, IEC958_MPEG1_LAYER23
, IEC958_MPEG1_LAYER23
}, //MPEG1
155 static const uint16_t mpeg_pkt_offset
[2][3] = {
156 //LAYER1 LAYER2 LAYER3
157 { 3072, 9216, 4608 }, // MPEG2 LSF
158 { 1536, 4608, 4608 }, // MPEG1
161 static int spdif_header_mpeg(AVFormatContext
*s
, AVPacket
*pkt
)
163 IEC958Context
*ctx
= s
->priv_data
;
164 int version
= (pkt
->data
[1] >> 3) & 3;
165 int layer
= 3 - ((pkt
->data
[1] >> 1) & 3);
166 int extension
= pkt
->data
[2] & 1;
168 if (layer
== 3 || version
== 1) {
169 av_log(s
, AV_LOG_ERROR
, "Wrong MPEG file format\n");
172 av_log(s
, AV_LOG_DEBUG
, "version: %i layer: %i extension: %i\n", version
, layer
, extension
);
173 if (version
== 2 && extension
) {
174 ctx
->data_type
= IEC958_MPEG2_EXT
;
175 ctx
->pkt_offset
= 4608;
177 ctx
->data_type
= mpeg_data_type
[version
& 1][layer
];
178 ctx
->pkt_offset
= mpeg_pkt_offset
[version
& 1][layer
];
180 // TODO Data type dependant info (normal/karaoke, dynamic range control)
184 static int spdif_header_aac(AVFormatContext
*s
, AVPacket
*pkt
)
186 IEC958Context
*ctx
= s
->priv_data
;
187 AACADTSHeaderInfo hdr
;
191 init_get_bits(&gbc
, pkt
->data
, AAC_ADTS_HEADER_SIZE
* 8);
192 ret
= ff_aac_parse_header(&gbc
, &hdr
);
194 av_log(s
, AV_LOG_ERROR
, "Wrong AAC file format\n");
198 ctx
->pkt_offset
= hdr
.samples
<< 2;
199 switch (hdr
.num_aac_frames
) {
201 ctx
->data_type
= IEC958_MPEG2_AAC
;
204 ctx
->data_type
= IEC958_MPEG2_AAC_LSF_2048
;
207 ctx
->data_type
= IEC958_MPEG2_AAC_LSF_4096
;
210 av_log(s
, AV_LOG_ERROR
, "%i samples in AAC frame not supported\n",
214 //TODO Data type dependent info (LC profile/SBR)
218 static int spdif_write_header(AVFormatContext
*s
)
220 IEC958Context
*ctx
= s
->priv_data
;
222 switch (s
->streams
[0]->codec
->codec_id
) {
224 ctx
->header_info
= spdif_header_ac3
;
229 ctx
->header_info
= spdif_header_mpeg
;
232 ctx
->header_info
= spdif_header_dts
;
235 ctx
->header_info
= spdif_header_aac
;
238 av_log(s
, AV_LOG_ERROR
, "codec not supported\n");
248 static int spdif_write_trailer(AVFormatContext
*s
)
250 IEC958Context
*ctx
= s
->priv_data
;
251 av_freep(&ctx
->buffer
);
255 static int spdif_write_packet(struct AVFormatContext
*s
, AVPacket
*pkt
)
257 IEC958Context
*ctx
= s
->priv_data
;
260 ctx
->pkt_size
= FFALIGN(pkt
->size
, 2) << 3;
261 ret
= ctx
->header_info(s
, pkt
);
265 padding
= (ctx
->pkt_offset
- BURST_HEADER_SIZE
- pkt
->size
) >> 1;
267 av_log(s
, AV_LOG_ERROR
, "bitrate is too high\n");
271 put_le16(s
->pb
, SYNCWORD1
); //Pa
272 put_le16(s
->pb
, SYNCWORD2
); //Pb
273 put_le16(s
->pb
, ctx
->data_type
); //Pc
274 put_le16(s
->pb
, ctx
->pkt_size
); //Pd
277 put_buffer(s
->pb
, pkt
->data
, pkt
->size
& ~1);
279 av_fast_malloc(&ctx
->buffer
, &ctx
->buffer_size
, pkt
->size
+ FF_INPUT_BUFFER_PADDING_SIZE
);
281 return AVERROR(ENOMEM
);
282 bswap_buf16((uint16_t *)ctx
->buffer
, (uint16_t *)pkt
->data
, pkt
->size
>> 1);
283 put_buffer(s
->pb
, ctx
->buffer
, pkt
->size
& ~1);
287 put_be16(s
->pb
, pkt
->data
[pkt
->size
- 1]);
289 for (; padding
> 0; padding
--)
292 av_log(s
, AV_LOG_DEBUG
, "type=%x len=%i pkt_offset=%i\n",
293 ctx
->data_type
, pkt
->size
, ctx
->pkt_offset
);
295 put_flush_packet(s
->pb
);
299 AVOutputFormat spdif_muxer
= {
301 NULL_IF_CONFIG_SMALL("IEC958 - S/PDIF (IEC-61937)"),
304 sizeof(IEC958Context
),