2 * RIFF muxing functions
3 * Copyright (c) 2000 Fabrice Bellard
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
22 #include "libavutil/channel_layout.h"
23 #include "libavutil/dict.h"
24 #include "libavutil/log.h"
25 #include "libavutil/mathematics.h"
26 #include "libavcodec/bytestream.h"
28 #include "avio_internal.h"
31 int64_t ff_start_tag(AVIOContext
*pb
, const char *tag
)
33 ffio_wfourcc(pb
, tag
);
38 void ff_end_tag(AVIOContext
*pb
, int64_t start
)
42 av_assert0((start
&1) == 0);
47 avio_seek(pb
, start
- 4, SEEK_SET
);
48 avio_wl32(pb
, (uint32_t)(pos
- start
));
49 avio_seek(pb
, FFALIGN(pos
, 2), SEEK_SET
);
52 /* WAVEFORMATEX header */
53 /* returns the size or -1 on error */
54 int ff_put_wav_header(AVFormatContext
*s
, AVIOContext
*pb
,
55 AVCodecParameters
*par
, int flags
)
57 int bps
, blkalign
, bytespersec
, frame_size
;
59 int64_t hdrstart
= avio_tell(pb
);
60 int waveformatextensible
;
62 uint8_t *riff_extradata
= temp
;
63 uint8_t *riff_extradata_start
= temp
;
65 if (!par
->codec_tag
|| par
->codec_tag
> 0xffff)
68 if (par
->codec_id
== AV_CODEC_ID_ADPCM_SWF
&& par
->block_align
== 0) {
69 av_log(s
, AV_LOG_ERROR
, "%s can only be written to WAVE with a constant frame size\n",
70 avcodec_get_name(par
->codec_id
));
71 return AVERROR(EINVAL
);
74 /* We use the known constant frame size for the codec if known, otherwise
75 * fall back on using AVCodecParameters.frame_size, which is not as reliable
76 * for indicating packet duration. */
77 frame_size
= av_get_audio_frame_duration2(par
, par
->block_align
);
79 waveformatextensible
= (par
->ch_layout
.order
== AV_CHANNEL_ORDER_NATIVE
&&
80 av_channel_layout_compare(&par
->ch_layout
, &(AVChannelLayout
)AV_CHANNEL_LAYOUT_MONO
) &&
81 av_channel_layout_compare(&par
->ch_layout
, &(AVChannelLayout
)AV_CHANNEL_LAYOUT_STEREO
)) ||
82 par
->sample_rate
> 48000 ||
83 par
->codec_id
== AV_CODEC_ID_EAC3
|| par
->codec_id
== AV_CODEC_ID_DFPWM
||
84 (av_get_bits_per_sample(par
->codec_id
) > 16 && par
->codec_tag
!= 0x0003);
86 if (waveformatextensible
)
87 avio_wl16(pb
, 0xfffe);
89 avio_wl16(pb
, par
->codec_tag
);
91 avio_wl16(pb
, par
->ch_layout
.nb_channels
);
92 avio_wl32(pb
, par
->sample_rate
);
93 if (par
->codec_id
== AV_CODEC_ID_ATRAC3
||
94 par
->codec_id
== AV_CODEC_ID_G723_1
||
95 par
->codec_id
== AV_CODEC_ID_G728
||
96 par
->codec_id
== AV_CODEC_ID_MP2
||
97 par
->codec_id
== AV_CODEC_ID_MP3
||
98 par
->codec_id
== AV_CODEC_ID_GSM_MS
) {
101 if (!(bps
= av_get_bits_per_sample(par
->codec_id
))) {
102 if (par
->bits_per_coded_sample
)
103 bps
= par
->bits_per_coded_sample
;
105 bps
= 16; // default to 16
108 if (bps
!= par
->bits_per_coded_sample
&& par
->bits_per_coded_sample
) {
109 av_log(s
, AV_LOG_WARNING
,
110 "requested bits_per_coded_sample (%d) "
111 "and actually stored (%d) differ\n",
112 par
->bits_per_coded_sample
, bps
);
115 if (par
->codec_id
== AV_CODEC_ID_MP2
) {
116 blkalign
= (144 * par
->bit_rate
- 1)/par
->sample_rate
+ 1;
117 } else if (par
->codec_id
== AV_CODEC_ID_MP3
) {
118 blkalign
= 576 * (par
->sample_rate
<= (24000 + 32000)/2 ? 1 : 2);
119 } else if (par
->codec_id
== AV_CODEC_ID_AC3
) {
120 blkalign
= 3840; /* maximum bytes per frame */
121 } else if (par
->codec_id
== AV_CODEC_ID_AAC
) {
122 blkalign
= 768 * par
->ch_layout
.nb_channels
; /* maximum bytes per frame */
123 } else if (par
->codec_id
== AV_CODEC_ID_G723_1
) {
125 } else if (par
->block_align
!= 0) { /* specified by the codec */
126 blkalign
= par
->block_align
;
128 blkalign
= bps
* par
->ch_layout
.nb_channels
/ av_gcd(8, bps
);
129 if (par
->codec_id
== AV_CODEC_ID_PCM_U8
||
130 par
->codec_id
== AV_CODEC_ID_PCM_S24LE
||
131 par
->codec_id
== AV_CODEC_ID_PCM_S32LE
||
132 par
->codec_id
== AV_CODEC_ID_PCM_F32LE
||
133 par
->codec_id
== AV_CODEC_ID_PCM_F64LE
||
134 par
->codec_id
== AV_CODEC_ID_PCM_S16LE
) {
135 bytespersec
= par
->sample_rate
* blkalign
;
136 } else if (par
->codec_id
== AV_CODEC_ID_G723_1
) {
139 bytespersec
= par
->bit_rate
/ 8;
141 avio_wl32(pb
, bytespersec
); /* bytes per second */
142 avio_wl16(pb
, blkalign
); /* block align */
143 avio_wl16(pb
, bps
); /* bits per sample */
144 if (par
->codec_id
== AV_CODEC_ID_MP3
) {
145 bytestream_put_le16(&riff_extradata
, 1); /* wID */
146 bytestream_put_le32(&riff_extradata
, 2); /* fdwFlags */
147 bytestream_put_le16(&riff_extradata
, 1152); /* nBlockSize */
148 bytestream_put_le16(&riff_extradata
, 1); /* nFramesPerBlock */
149 bytestream_put_le16(&riff_extradata
, 1393); /* nCodecDelay */
150 } else if (par
->codec_id
== AV_CODEC_ID_MP2
) {
152 bytestream_put_le16(&riff_extradata
, 2);
154 bytestream_put_le32(&riff_extradata
, par
->bit_rate
);
156 bytestream_put_le16(&riff_extradata
, par
->ch_layout
.nb_channels
== 2 ? 1 : 8);
158 bytestream_put_le16(&riff_extradata
, 0);
160 bytestream_put_le16(&riff_extradata
, 1);
162 bytestream_put_le16(&riff_extradata
, 16);
164 bytestream_put_le32(&riff_extradata
, 0);
166 bytestream_put_le32(&riff_extradata
, 0);
167 } else if (par
->codec_id
== AV_CODEC_ID_G723_1
) {
168 bytestream_put_le32(&riff_extradata
, 0x9ace0002); /* extradata needed for msacm g723.1 codec */
169 bytestream_put_le32(&riff_extradata
, 0xaea2f732);
170 bytestream_put_le16(&riff_extradata
, 0xacde);
171 } else if (par
->codec_id
== AV_CODEC_ID_GSM_MS
||
172 par
->codec_id
== AV_CODEC_ID_ADPCM_IMA_WAV
) {
173 /* wSamplesPerBlock */
174 bytestream_put_le16(&riff_extradata
, frame_size
);
175 } else if (par
->extradata_size
) {
176 riff_extradata_start
= par
->extradata
;
177 riff_extradata
= par
->extradata
+ par
->extradata_size
;
179 /* write WAVEFORMATEXTENSIBLE extensions */
180 if (waveformatextensible
) {
181 int write_channel_mask
= !(flags
& FF_PUT_WAV_HEADER_SKIP_CHANNELMASK
) &&
182 (s
->strict_std_compliance
< FF_COMPLIANCE_NORMAL
||
183 par
->ch_layout
.u
.mask
< 0x40000);
184 /* 22 is WAVEFORMATEXTENSIBLE size */
185 avio_wl16(pb
, riff_extradata
- riff_extradata_start
+ 22);
186 /* ValidBitsPerSample || SamplesPerBlock || Reserved */
189 avio_wl32(pb
, write_channel_mask
? par
->ch_layout
.u
.mask
: 0);
191 if (par
->codec_id
== AV_CODEC_ID_EAC3
|| par
->codec_id
== AV_CODEC_ID_DFPWM
) {
192 ff_put_guid(pb
, ff_get_codec_guid(par
->codec_id
, ff_codec_wav_guids
));
194 avio_wl32(pb
, par
->codec_tag
);
195 avio_wl32(pb
, 0x00100000);
196 avio_wl32(pb
, 0xAA000080);
197 avio_wl32(pb
, 0x719B3800);
199 } else if ((flags
& FF_PUT_WAV_HEADER_FORCE_WAVEFORMATEX
) ||
200 par
->codec_tag
!= 0x0001 /* PCM */ ||
201 riff_extradata
- riff_extradata_start
) {
203 if (par
->codec_tag
== 0x1610) {
204 /* HEAACWAVEFORMAT */
205 avio_wl16(pb
, par
->extradata_size
+ 12); /* cbSize */
206 avio_wl16(pb
, !par
->extradata_size
); // wPayloadType, 0 = Raw, 1 = ADTS
207 avio_wl16(pb
, 0xFE); // wAudioProfileLevelIndication, 0xFE = unspecified
208 avio_wl16(pb
, 0); // wStructType, 0 = AudioSpecificConfig()
209 avio_wl16(pb
, 0); // wReserved1
210 avio_wl32(pb
, 0); // dwReserved2
211 } else if (par
->codec_tag
== 0xFF && !par
->extradata_size
) {
212 av_log(s
, AV_LOG_ERROR
, "ADTS is only supported with codec tag 0x1610\n");
213 return AVERROR(EINVAL
);
215 avio_wl16(pb
, riff_extradata
- riff_extradata_start
); /* cbSize */
216 } /* else PCMWAVEFORMAT */
217 avio_write(pb
, riff_extradata_start
, riff_extradata
- riff_extradata_start
);
218 hdrsize
= avio_tell(pb
) - hdrstart
;
227 /* BITMAPINFOHEADER header */
228 void ff_put_bmp_header(AVIOContext
*pb
, AVCodecParameters
*par
,
229 int for_asf
, int ignore_extradata
, int rgb_frame_is_flipped
)
231 int flipped_extradata
= (par
->extradata_size
>= 9 &&
232 !memcmp(par
->extradata
+ par
->extradata_size
- 9, "BottomUp", 9));
233 int keep_height
= flipped_extradata
|| rgb_frame_is_flipped
;
234 int extradata_size
= par
->extradata_size
- 9*flipped_extradata
;
235 enum AVPixelFormat pix_fmt
= par
->format
;
238 if (pix_fmt
== AV_PIX_FMT_NONE
&& par
->bits_per_coded_sample
== 1)
239 pix_fmt
= AV_PIX_FMT_MONOWHITE
;
240 pal_avi
= !for_asf
&&
241 (pix_fmt
== AV_PIX_FMT_PAL8
||
242 pix_fmt
== AV_PIX_FMT_MONOWHITE
||
243 pix_fmt
== AV_PIX_FMT_MONOBLACK
);
245 /* Size (not including the size of the color table or color masks) */
246 avio_wl32(pb
, 40 + (ignore_extradata
|| pal_avi
? 0 : extradata_size
));
247 avio_wl32(pb
, par
->width
);
248 //We always store RGB TopDown
249 avio_wl32(pb
, par
->codec_tag
|| keep_height
? par
->height
: -par
->height
);
253 avio_wl16(pb
, par
->bits_per_coded_sample
? par
->bits_per_coded_sample
: 24);
254 /* compression type */
255 // MSRLE compatibility with Media Player 3.1 and Windows 95
256 avio_wl32(pb
, par
->codec_id
== AV_CODEC_ID_MSRLE
? 1 : par
->codec_tag
);
257 avio_wl32(pb
, (par
->width
* par
->height
* (par
->bits_per_coded_sample
? par
->bits_per_coded_sample
: 24)+7) / 8);
260 /* Number of color indices in the color table that are used.
261 * A value of 0 means 2^biBitCount indices, but this doesn't work
262 * with Windows Media Player and files containing xxpc chunks. */
263 // MSRLE on Windows 95 requires a zero here
264 avio_wl32(pb
, pal_avi
&& par
->codec_id
!= AV_CODEC_ID_MSRLE
? 1 << par
->bits_per_coded_sample
: 0);
267 if (!ignore_extradata
) {
268 if (par
->extradata_size
) {
269 avio_write(pb
, par
->extradata
, extradata_size
);
270 if (!for_asf
&& extradata_size
& 1)
272 } else if (pal_avi
) {
274 for (i
= 0; i
< 1 << par
->bits_per_coded_sample
; i
++) {
275 /* Initialize 1 bpp palette to black & white */
276 if (i
== 0 && pix_fmt
== AV_PIX_FMT_MONOWHITE
)
277 avio_wl32(pb
, 0xffffff);
278 else if (i
== 1 && pix_fmt
== AV_PIX_FMT_MONOBLACK
)
279 avio_wl32(pb
, 0xffffff);
287 void ff_parse_specific_params(AVStream
*st
, int *au_rate
,
288 int *au_ssize
, int *au_scale
)
290 AVCodecParameters
*par
= st
->codecpar
;
292 int audio_frame_size
;
294 audio_frame_size
= av_get_audio_frame_duration2(par
, 0);
295 if (!audio_frame_size
)
296 audio_frame_size
= par
->frame_size
;
298 *au_ssize
= par
->block_align
;
299 if (audio_frame_size
&& par
->sample_rate
) {
300 *au_scale
= audio_frame_size
;
301 *au_rate
= par
->sample_rate
;
302 } else if (par
->codec_type
== AVMEDIA_TYPE_VIDEO
||
303 par
->codec_type
== AVMEDIA_TYPE_DATA
||
304 par
->codec_type
== AVMEDIA_TYPE_SUBTITLE
) {
305 *au_scale
= st
->time_base
.num
;
306 *au_rate
= st
->time_base
.den
;
308 *au_scale
= par
->block_align
? par
->block_align
* 8 : 8;
309 *au_rate
= par
->bit_rate
? par
->bit_rate
:
310 8 * par
->sample_rate
;
312 gcd
= av_gcd(*au_scale
, *au_rate
);
317 void ff_riff_write_info_tag(AVIOContext
*pb
, const char *tag
, const char *str
)
319 size_t len
= strlen(str
);
320 if (len
> 0 && len
< UINT32_MAX
) {
322 ffio_wfourcc(pb
, tag
);
324 avio_put_str(pb
, str
);
330 static const char riff_tags
[][5] = {
331 "IARL", "IART", "IAS1", "IAS2", "IAS3", "IAS4", "IAS5", "IAS6", "IAS7",
332 "IAS8", "IAS9", "ICMS", "ICMT", "ICOP", "ICRD", "ICRP", "IDIM", "IDPI",
333 "IENG", "IGNR", "IKEY", "ILGT", "ILNG", "IMED", "INAM", "IPLT", "IPRD",
334 "IPRT", "ITRK", "ISBJ", "ISFT", "ISHP", "ISMP", "ISRC", "ISRF", "ITCH",
338 static int riff_has_valid_tags(AVFormatContext
*s
)
342 for (i
= 0; *riff_tags
[i
]; i
++)
343 if (av_dict_get(s
->metadata
, riff_tags
[i
], NULL
, AV_DICT_MATCH_CASE
))
349 void ff_riff_write_info(AVFormatContext
*s
)
351 AVIOContext
*pb
= s
->pb
;
354 AVDictionaryEntry
*t
= NULL
;
356 ff_metadata_conv(&s
->metadata
, ff_riff_info_conv
, NULL
);
358 /* writing empty LIST is not nice and may cause problems */
359 if (!riff_has_valid_tags(s
))
362 list_pos
= ff_start_tag(pb
, "LIST");
363 ffio_wfourcc(pb
, "INFO");
364 for (i
= 0; *riff_tags
[i
]; i
++)
365 if ((t
= av_dict_get(s
->metadata
, riff_tags
[i
],
366 NULL
, AV_DICT_MATCH_CASE
)))
367 ff_riff_write_info_tag(s
->pb
, t
->key
, t
->value
);
368 ff_end_tag(pb
, list_pos
);
371 void ff_put_guid(AVIOContext
*s
, const ff_asf_guid
*g
)
373 av_assert0(sizeof(*g
) == 16);
374 avio_write(s
, *g
, sizeof(*g
));
377 const ff_asf_guid
*ff_get_codec_guid(enum AVCodecID id
, const AVCodecGuid
*av_guid
)
380 for (i
= 0; av_guid
[i
].id
!= AV_CODEC_ID_NONE
; i
++) {
381 if (id
== av_guid
[i
].id
)
382 return &(av_guid
[i
].guid
);