3 * Copyright (c) 2010 Anssi Hannula <anssi.hannula at iki.fi>
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
24 * IEC 61937 demuxer, used for compressed data in S/PDIF
25 * @author Anssi Hannula
30 #include "libavcodec/ac3.h"
31 #include "libavcodec/aacadtsdec.h"
33 static int spdif_get_offset_and_codec(AVFormatContext
*s
,
34 enum IEC61937DataType data_type
,
35 const char *buf
, int *offset
,
36 enum AVCodecID
*codec
)
38 AACADTSHeaderInfo aac_hdr
;
41 switch (data_type
& 0xff) {
43 *offset
= AC3_FRAME_SIZE
<< 2;
44 *codec
= AV_CODEC_ID_AC3
;
46 case IEC61937_MPEG1_LAYER1
:
47 *offset
= spdif_mpeg_pkt_offset
[1][0];
48 *codec
= AV_CODEC_ID_MP1
;
50 case IEC61937_MPEG1_LAYER23
:
51 *offset
= spdif_mpeg_pkt_offset
[1][0];
52 *codec
= AV_CODEC_ID_MP3
;
54 case IEC61937_MPEG2_EXT
:
56 *codec
= AV_CODEC_ID_MP3
;
58 case IEC61937_MPEG2_AAC
:
59 init_get_bits(&gbc
, buf
, AAC_ADTS_HEADER_SIZE
* 8);
60 if (avpriv_aac_parse_header(&gbc
, &aac_hdr
) < 0) {
61 if (s
) /* be silent during a probe */
62 av_log(s
, AV_LOG_ERROR
, "Invalid AAC packet in IEC 61937\n");
63 return AVERROR_INVALIDDATA
;
65 *offset
= aac_hdr
.samples
<< 2;
66 *codec
= AV_CODEC_ID_AAC
;
68 case IEC61937_MPEG2_LAYER1_LSF
:
69 *offset
= spdif_mpeg_pkt_offset
[0][0];
70 *codec
= AV_CODEC_ID_MP1
;
72 case IEC61937_MPEG2_LAYER2_LSF
:
73 *offset
= spdif_mpeg_pkt_offset
[0][1];
74 *codec
= AV_CODEC_ID_MP2
;
76 case IEC61937_MPEG2_LAYER3_LSF
:
77 *offset
= spdif_mpeg_pkt_offset
[0][2];
78 *codec
= AV_CODEC_ID_MP3
;
82 *codec
= AV_CODEC_ID_DTS
;
86 *codec
= AV_CODEC_ID_DTS
;
90 *codec
= AV_CODEC_ID_DTS
;
93 if (s
) { /* be silent during a probe */
94 avpriv_request_sample(s
, "Data type 0x%04x in IEC 61937",
97 return AVERROR_PATCHWELCOME
;
102 /* Largest offset between bursts we currently handle, i.e. AAC with
103 aac_hdr.samples = 4096 */
104 #define SPDIF_MAX_OFFSET 16384
106 static int spdif_probe(AVProbeData
*p
)
108 enum AVCodecID codec
;
109 return ff_spdif_probe (p
->buf
, p
->buf_size
, &codec
);
112 int ff_spdif_probe(const uint8_t *p_buf
, int buf_size
, enum AVCodecID
*codec
)
114 const uint8_t *buf
= p_buf
;
115 const uint8_t *probe_end
= p_buf
+ FFMIN(2 * SPDIF_MAX_OFFSET
, buf_size
- 1);
116 const uint8_t *expected_code
= buf
+ 7;
119 int consecutive_codes
= 0;
122 for (; buf
< probe_end
; buf
++) {
123 state
= (state
<< 8) | *buf
;
125 if (state
== (AV_BSWAP16C(SYNCWORD1
) << 16 | AV_BSWAP16C(SYNCWORD2
))
129 if (buf
== expected_code
) {
130 if (++consecutive_codes
>= 2)
131 return AVPROBE_SCORE_MAX
;
133 consecutive_codes
= 0;
135 if (buf
+ 4 + AAC_ADTS_HEADER_SIZE
> p_buf
+ buf_size
)
138 /* continue probing to find more sync codes */
139 probe_end
= FFMIN(buf
+ SPDIF_MAX_OFFSET
, p_buf
+ buf_size
- 1);
141 /* skip directly to the next sync code */
142 if (!spdif_get_offset_and_codec(NULL
, (buf
[2] << 8) | buf
[1],
143 &buf
[5], &offset
, codec
)) {
144 if (buf
+ offset
>= p_buf
+ buf_size
)
146 expected_code
= buf
+ offset
;
147 buf
= expected_code
- 7;
156 /* good amount of sync codes but with unexpected offsets */
157 return AVPROBE_SCORE_EXTENSION
;
159 /* some sync codes were found */
160 return AVPROBE_SCORE_EXTENSION
/ 4;
163 static int spdif_read_header(AVFormatContext
*s
)
165 s
->ctx_flags
|= AVFMTCTX_NOHEADER
;
169 int ff_spdif_read_packet(AVFormatContext
*s
, AVPacket
*pkt
)
171 AVIOContext
*pb
= s
->pb
;
172 enum IEC61937DataType data_type
;
173 enum AVCodecID codec_id
;
175 int pkt_size_bits
, offset
, ret
;
177 while (state
!= (AV_BSWAP16C(SYNCWORD1
) << 16 | AV_BSWAP16C(SYNCWORD2
))) {
178 state
= (state
<< 8) | avio_r8(pb
);
183 data_type
= avio_rl16(pb
);
184 pkt_size_bits
= avio_rl16(pb
);
186 if (pkt_size_bits
% 16)
187 avpriv_request_sample(s
, "Packet not ending at a 16-bit boundary");
189 ret
= av_new_packet(pkt
, FFALIGN(pkt_size_bits
, 16) >> 3);
193 pkt
->pos
= avio_tell(pb
) - BURST_HEADER_SIZE
;
195 if (avio_read(pb
, pkt
->data
, pkt
->size
) < pkt
->size
) {
199 ff_spdif_bswap_buf16((uint16_t *)pkt
->data
, (uint16_t *)pkt
->data
, pkt
->size
>> 1);
201 ret
= spdif_get_offset_and_codec(s
, data_type
, pkt
->data
,
208 /* skip over the padding to the beginning of the next frame */
209 avio_skip(pb
, offset
- pkt
->size
- BURST_HEADER_SIZE
);
211 if (!s
->nb_streams
) {
212 /* first packet, create a stream */
213 AVStream
*st
= avformat_new_stream(s
, NULL
);
216 return AVERROR(ENOMEM
);
218 st
->codec
->codec_type
= AVMEDIA_TYPE_AUDIO
;
219 st
->codec
->codec_id
= codec_id
;
220 } else if (codec_id
!= s
->streams
[0]->codec
->codec_id
) {
221 avpriv_report_missing_feature(s
, "Codec change in IEC 61937");
222 return AVERROR_PATCHWELCOME
;
225 if (!s
->bit_rate
&& s
->streams
[0]->codec
->sample_rate
)
226 /* stream bitrate matches 16-bit stereo PCM bitrate for currently
228 s
->bit_rate
= 2 * 16 * s
->streams
[0]->codec
->sample_rate
;
233 AVInputFormat ff_spdif_demuxer
= {
235 .long_name
= NULL_IF_CONFIG_SMALL("IEC 61937 (compressed data in S/PDIF)"),
236 .read_probe
= spdif_probe
,
237 .read_header
= spdif_read_header
,
238 .read_packet
= ff_spdif_read_packet
,
239 .flags
= AVFMT_GENERIC_INDEX
,