3 * Copyright (c) 2008 Laurent Aimar <fenrir@videolan.org>
4 * Copyright (c) 2009 Baptiste Coudurier <baptiste.coudurier@gmail.com>
6 * This file is part of FFmpeg.
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 #include "libavutil/channel_layout.h"
24 #include "libavutil/intreadwrite.h"
25 #include "libavutil/opt.h"
26 #include "libavutil/log.h"
27 #include "libavutil/reverse.h"
29 #include "codec_internal.h"
32 #define AES3_HEADER_LEN 4
34 typedef struct S302Context
{
39 static int s302m_parse_frame_header(AVCodecContext
*avctx
, const uint8_t *buf
,
43 int frame_size
, channels
, bits
;
45 if (buf_size
<= AES3_HEADER_LEN
) {
46 av_log(avctx
, AV_LOG_ERROR
, "frame is too short\n");
47 return AVERROR_INVALIDDATA
;
60 frame_size
= (h
>> 16) & 0xffff;
61 channels
= ((h
>> 14) & 0x0003) * 2 + 2;
62 bits
= ((h
>> 4) & 0x0003) * 4 + 16;
64 if (AES3_HEADER_LEN
+ frame_size
!= buf_size
|| bits
> 24) {
65 av_log(avctx
, AV_LOG_ERROR
, "frame has invalid header\n");
66 return AVERROR_INVALIDDATA
;
69 /* Set output properties */
70 avctx
->bits_per_raw_sample
= bits
;
72 avctx
->sample_fmt
= AV_SAMPLE_FMT_S32
;
74 avctx
->sample_fmt
= AV_SAMPLE_FMT_S16
;
76 av_channel_layout_uninit(&avctx
->ch_layout
);
79 avctx
->ch_layout
= (AVChannelLayout
)AV_CHANNEL_LAYOUT_STEREO
;
82 avctx
->ch_layout
= (AVChannelLayout
)AV_CHANNEL_LAYOUT_QUAD
;
85 avctx
->ch_layout
= (AVChannelLayout
)AV_CHANNEL_LAYOUT_5POINT1_BACK
;
88 av_channel_layout_from_mask(&avctx
->ch_layout
,
89 AV_CH_LAYOUT_5POINT1_BACK
| AV_CH_LAYOUT_STEREO_DOWNMIX
);
92 avctx
->ch_layout
.order
= AV_CHANNEL_ORDER_UNSPEC
;
93 avctx
->ch_layout
.nb_channels
= channels
;
100 static int s302m_decode_frame(AVCodecContext
*avctx
, AVFrame
*frame
,
101 int *got_frame_ptr
, AVPacket
*avpkt
)
103 S302Context
*s
= avctx
->priv_data
;
104 const uint8_t *buf
= avpkt
->data
;
105 int buf_size
= avpkt
->size
;
106 int block_size
, ret
, channels
;
108 int non_pcm_data_type
= -1;
110 int frame_size
= s302m_parse_frame_header(avctx
, buf
, buf_size
);
114 buf_size
-= AES3_HEADER_LEN
;
115 buf
+= AES3_HEADER_LEN
;
117 /* get output buffer */
118 block_size
= (avctx
->bits_per_raw_sample
+ 4) / 4;
119 channels
= avctx
->ch_layout
.nb_channels
;
120 frame
->nb_samples
= 2 * (buf_size
/ block_size
) / channels
;
121 if ((ret
= ff_get_buffer(avctx
, frame
, 0)) < 0)
124 avctx
->bit_rate
= 48000 * channels
* (avctx
->bits_per_raw_sample
+ 4) +
125 32 * 48000 / frame
->nb_samples
;
126 buf_size
= (frame
->nb_samples
* channels
/ 2) * block_size
;
128 if (avctx
->bits_per_raw_sample
== 24) {
129 uint32_t *o
= (uint32_t *)frame
->data
[0];
130 for (; buf_size
> 6; buf_size
-= 7) {
131 *o
++ = ((unsigned)ff_reverse
[buf
[2]] << 24) |
132 (ff_reverse
[buf
[1]] << 16) |
133 (ff_reverse
[buf
[0]] << 8);
134 *o
++ = ((unsigned)ff_reverse
[buf
[6] & 0xf0] << 28) |
135 (ff_reverse
[buf
[5]] << 20) |
136 (ff_reverse
[buf
[4]] << 12) |
137 (ff_reverse
[buf
[3] & 0x0f] << 4);
140 o
= (uint32_t *)frame
->data
[0];
142 for (i
=0; i
<frame
->nb_samples
* 2 - 6; i
+=2) {
143 if (o
[i
] || o
[i
+1] || o
[i
+2] || o
[i
+3])
145 if (o
[i
+4] == 0x96F87200U
&& o
[i
+5] == 0xA54E1F00) {
146 non_pcm_data_type
= (o
[i
+6] >> 16) & 0x1F;
150 } else if (avctx
->bits_per_raw_sample
== 20) {
151 uint32_t *o
= (uint32_t *)frame
->data
[0];
152 for (; buf_size
> 5; buf_size
-= 6) {
153 *o
++ = ((unsigned)ff_reverse
[buf
[2] & 0xf0] << 28) |
154 (ff_reverse
[buf
[1]] << 20) |
155 (ff_reverse
[buf
[0]] << 12);
156 *o
++ = ((unsigned)ff_reverse
[buf
[5] & 0xf0] << 28) |
157 (ff_reverse
[buf
[4]] << 20) |
158 (ff_reverse
[buf
[3]] << 12);
161 o
= (uint32_t *)frame
->data
[0];
163 for (i
=0; i
<frame
->nb_samples
* 2 - 6; i
+=2) {
164 if (o
[i
] || o
[i
+1] || o
[i
+2] || o
[i
+3])
166 if (o
[i
+4] == 0x6F872000U
&& o
[i
+5] == 0x54E1F000) {
167 non_pcm_data_type
= (o
[i
+6] >> 16) & 0x1F;
172 uint16_t *o
= (uint16_t *)frame
->data
[0];
173 for (; buf_size
> 4; buf_size
-= 5) {
174 *o
++ = (ff_reverse
[buf
[1]] << 8) |
176 *o
++ = (ff_reverse
[buf
[4] & 0xf0] << 12) |
177 (ff_reverse
[buf
[3]] << 4) |
178 (ff_reverse
[buf
[2]] >> 4);
181 o
= (uint16_t *)frame
->data
[0];
183 for (i
=0; i
<frame
->nb_samples
* 2 - 6; i
+=2) {
184 if (o
[i
] || o
[i
+1] || o
[i
+2] || o
[i
+3])
186 if (o
[i
+4] == 0xF872U
&& o
[i
+5] == 0x4E1F) {
187 non_pcm_data_type
= (o
[i
+6] & 0x1F);
193 if (non_pcm_data_type
!= -1) {
194 if (s
->non_pcm_mode
== 3) {
195 av_log(avctx
, AV_LOG_ERROR
,
196 "S302 non PCM mode with data type %d not supported\n",
198 return AVERROR_PATCHWELCOME
;
200 if (s
->non_pcm_mode
& 1) {
205 avctx
->sample_rate
= 48000;
212 #define FLAGS AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_DECODING_PARAM
213 static const AVOption s302m_options
[] = {
214 {"non_pcm_mode", "Chooses what to do with NON-PCM", offsetof(S302Context
, non_pcm_mode
), AV_OPT_TYPE_INT
, {.i64
= 3}, 0, 3, FLAGS
, .unit
= "non_pcm_mode"},
215 {"copy" , "Pass NON-PCM through unchanged" , 0, AV_OPT_TYPE_CONST
, {.i64
= 0}, 0, 3, FLAGS
, .unit
= "non_pcm_mode"},
216 {"drop" , "Drop NON-PCM" , 0, AV_OPT_TYPE_CONST
, {.i64
= 1}, 0, 3, FLAGS
, .unit
= "non_pcm_mode"},
217 {"decode_copy" , "Decode if possible else passthrough", 0, AV_OPT_TYPE_CONST
, {.i64
= 2}, 0, 3, FLAGS
, .unit
= "non_pcm_mode"},
218 {"decode_drop" , "Decode if possible else drop" , 0, AV_OPT_TYPE_CONST
, {.i64
= 3}, 0, 3, FLAGS
, .unit
= "non_pcm_mode"},
222 static const AVClass s302m_class
= {
223 .class_name
= "SMPTE 302M Decoder",
224 .item_name
= av_default_item_name
,
225 .option
= s302m_options
,
226 .version
= LIBAVUTIL_VERSION_INT
,
229 const FFCodec ff_s302m_decoder
= {
231 CODEC_LONG_NAME("SMPTE 302M"),
232 .p
.type
= AVMEDIA_TYPE_AUDIO
,
233 .p
.id
= AV_CODEC_ID_S302M
,
234 .p
.priv_class
= &s302m_class
,
235 .priv_data_size
= sizeof(S302Context
),
236 FF_CODEC_DECODE_CB(s302m_decode_frame
),
237 .p
.capabilities
= AV_CODEC_CAP_CHANNEL_CONF
|