FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
riffenc.c
Go to the documentation of this file.
1 /*
2  * RIFF muxing functions
3  * Copyright (c) 2000 Fabrice Bellard
4  *
5  * This file is part of FFmpeg.
6  *
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.
11  *
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.
16  *
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
20  */
21 
22 #include "libavutil/dict.h"
23 #include "libavutil/log.h"
24 #include "libavutil/mathematics.h"
25 #include "libavcodec/avcodec.h"
26 #include "libavcodec/bytestream.h"
27 #include "avformat.h"
28 #include "avio_internal.h"
29 #include "riff.h"
30 
31 int64_t ff_start_tag(AVIOContext *pb, const char *tag)
32 {
33  ffio_wfourcc(pb, tag);
34  avio_wl32(pb, -1);
35  return avio_tell(pb);
36 }
37 
38 void ff_end_tag(AVIOContext *pb, int64_t start)
39 {
40  int64_t pos;
41 
42  av_assert0((start&1) == 0);
43 
44  pos = avio_tell(pb);
45  if (pos & 1)
46  avio_w8(pb, 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);
50 }
51 
52 /* WAVEFORMATEX header */
53 /* returns the size or -1 on error */
55 {
56  int bps, blkalign, bytespersec, frame_size;
57  int hdrsize;
58  int64_t hdrstart = avio_tell(pb);
59  int waveformatextensible;
60  uint8_t temp[256];
61  uint8_t *riff_extradata = temp;
62  uint8_t *riff_extradata_start = temp;
63 
64  if (!enc->codec_tag || enc->codec_tag > 0xffff)
65  return -1;
66 
67  /* We use the known constant frame size for the codec if known, otherwise
68  * fall back on using AVCodecContext.frame_size, which is not as reliable
69  * for indicating packet duration. */
70  frame_size = av_get_audio_frame_duration(enc, enc->block_align);
71 
72  waveformatextensible = (enc->channels > 2 && enc->channel_layout) ||
73  enc->sample_rate > 48000 ||
74  enc->codec_id == AV_CODEC_ID_EAC3 ||
76 
77  if (waveformatextensible)
78  avio_wl16(pb, 0xfffe);
79  else
80  avio_wl16(pb, enc->codec_tag);
81 
82  avio_wl16(pb, enc->channels);
83  avio_wl32(pb, enc->sample_rate);
84  if (enc->codec_id == AV_CODEC_ID_ATRAC3 ||
85  enc->codec_id == AV_CODEC_ID_G723_1 ||
86  enc->codec_id == AV_CODEC_ID_MP2 ||
87  enc->codec_id == AV_CODEC_ID_MP3 ||
88  enc->codec_id == AV_CODEC_ID_GSM_MS) {
89  bps = 0;
90  } else {
91  if (!(bps = av_get_bits_per_sample(enc->codec_id))) {
92  if (enc->bits_per_coded_sample)
93  bps = enc->bits_per_coded_sample;
94  else
95  bps = 16; // default to 16
96  }
97  }
98  if (bps != enc->bits_per_coded_sample && enc->bits_per_coded_sample) {
100  "requested bits_per_coded_sample (%d) "
101  "and actually stored (%d) differ\n",
102  enc->bits_per_coded_sample, bps);
103  }
104 
105  if (enc->codec_id == AV_CODEC_ID_MP2) {
106  blkalign = (144 * enc->bit_rate - 1)/enc->sample_rate + 1;
107  } else if (enc->codec_id == AV_CODEC_ID_MP3) {
108  blkalign = 576 * (enc->sample_rate <= (24000 + 32000)/2 ? 1 : 2);
109  } else if (enc->codec_id == AV_CODEC_ID_AC3) {
110  blkalign = 3840; /* maximum bytes per frame */
111  } else if (enc->codec_id == AV_CODEC_ID_AAC) {
112  blkalign = 768 * enc->channels; /* maximum bytes per frame */
113  } else if (enc->codec_id == AV_CODEC_ID_G723_1) {
114  blkalign = 24;
115  } else if (enc->block_align != 0) { /* specified by the codec */
116  blkalign = enc->block_align;
117  } else
118  blkalign = bps * enc->channels / av_gcd(8, bps);
119  if (enc->codec_id == AV_CODEC_ID_PCM_U8 ||
125  bytespersec = enc->sample_rate * blkalign;
126  } else if (enc->codec_id == AV_CODEC_ID_G723_1) {
127  bytespersec = 800;
128  } else {
129  bytespersec = enc->bit_rate / 8;
130  }
131  avio_wl32(pb, bytespersec); /* bytes per second */
132  avio_wl16(pb, blkalign); /* block align */
133  avio_wl16(pb, bps); /* bits per sample */
134  if (enc->codec_id == AV_CODEC_ID_MP3) {
135  bytestream_put_le16(&riff_extradata, 1); /* wID */
136  bytestream_put_le32(&riff_extradata, 2); /* fdwFlags */
137  bytestream_put_le16(&riff_extradata, 1152); /* nBlockSize */
138  bytestream_put_le16(&riff_extradata, 1); /* nFramesPerBlock */
139  bytestream_put_le16(&riff_extradata, 1393); /* nCodecDelay */
140  } else if (enc->codec_id == AV_CODEC_ID_MP2) {
141  /* fwHeadLayer */
142  bytestream_put_le16(&riff_extradata, 2);
143  /* dwHeadBitrate */
144  bytestream_put_le32(&riff_extradata, enc->bit_rate);
145  /* fwHeadMode */
146  bytestream_put_le16(&riff_extradata, enc->channels == 2 ? 1 : 8);
147  /* fwHeadModeExt */
148  bytestream_put_le16(&riff_extradata, 0);
149  /* wHeadEmphasis */
150  bytestream_put_le16(&riff_extradata, 1);
151  /* fwHeadFlags */
152  bytestream_put_le16(&riff_extradata, 16);
153  /* dwPTSLow */
154  bytestream_put_le32(&riff_extradata, 0);
155  /* dwPTSHigh */
156  bytestream_put_le32(&riff_extradata, 0);
157  } else if (enc->codec_id == AV_CODEC_ID_G723_1) {
158  bytestream_put_le32(&riff_extradata, 0x9ace0002); /* extradata needed for msacm g723.1 codec */
159  bytestream_put_le32(&riff_extradata, 0xaea2f732);
160  bytestream_put_le16(&riff_extradata, 0xacde);
161  } else if (enc->codec_id == AV_CODEC_ID_GSM_MS ||
163  /* wSamplesPerBlock */
164  bytestream_put_le16(&riff_extradata, frame_size);
165  } else if (enc->extradata_size) {
166  riff_extradata_start = enc->extradata;
167  riff_extradata = enc->extradata + enc->extradata_size;
168  }
169  /* write WAVEFORMATEXTENSIBLE extensions */
170  if (waveformatextensible) {
171  int write_channel_mask = !(flags & FF_PUT_WAV_HEADER_SKIP_CHANNELMASK) &&
173  enc->channel_layout < 0x40000);
174  /* 22 is WAVEFORMATEXTENSIBLE size */
175  avio_wl16(pb, riff_extradata - riff_extradata_start + 22);
176  /* ValidBitsPerSample || SamplesPerBlock || Reserved */
177  avio_wl16(pb, bps);
178  /* dwChannelMask */
179  avio_wl32(pb, write_channel_mask ? enc->channel_layout : 0);
180  /* GUID + next 3 */
181  if (enc->codec_id == AV_CODEC_ID_EAC3) {
183  } else {
184  avio_wl32(pb, enc->codec_tag);
185  avio_wl32(pb, 0x00100000);
186  avio_wl32(pb, 0xAA000080);
187  avio_wl32(pb, 0x719B3800);
188  }
189  } else if ((flags & FF_PUT_WAV_HEADER_FORCE_WAVEFORMATEX) ||
190  enc->codec_tag != 0x0001 /* PCM */ ||
191  riff_extradata - riff_extradata_start) {
192  /* WAVEFORMATEX */
193  avio_wl16(pb, riff_extradata - riff_extradata_start); /* cbSize */
194  } /* else PCMWAVEFORMAT */
195  avio_write(pb, riff_extradata_start, riff_extradata - riff_extradata_start);
196  hdrsize = avio_tell(pb) - hdrstart;
197  if (hdrsize & 1) {
198  hdrsize++;
199  avio_w8(pb, 0);
200  }
201 
202  return hdrsize;
203 }
204 
205 /* BITMAPINFOHEADER header */
207  const AVCodecTag *tags, int for_asf, int ignore_extradata)
208 {
209  int keep_height = enc->extradata_size >= 9 &&
210  !memcmp(enc->extradata + enc->extradata_size - 9, "BottomUp", 9);
211  int extradata_size = enc->extradata_size - 9*keep_height;
212 
213  /* size */
214  avio_wl32(pb, 40 + (ignore_extradata ? 0 :extradata_size));
215  avio_wl32(pb, enc->width);
216  //We always store RGB TopDown
217  avio_wl32(pb, enc->codec_tag || keep_height ? enc->height : -enc->height);
218  /* planes */
219  avio_wl16(pb, 1);
220  /* depth */
222  /* compression type */
223  avio_wl32(pb, enc->codec_tag);
224  avio_wl32(pb, (enc->width * enc->height * (enc->bits_per_coded_sample ? enc->bits_per_coded_sample : 24)+7) / 8);
225  avio_wl32(pb, 0);
226  avio_wl32(pb, 0);
227  avio_wl32(pb, 0);
228  avio_wl32(pb, 0);
229 
230  if (!ignore_extradata) {
231  avio_write(pb, enc->extradata, extradata_size);
232 
233  if (!for_asf && extradata_size & 1)
234  avio_w8(pb, 0);
235  }
236 }
237 
238 void ff_parse_specific_params(AVStream *st, int *au_rate,
239  int *au_ssize, int *au_scale)
240 {
241  AVCodecContext *codec = st->codec;
242  int gcd;
243  int audio_frame_size;
244 
245  /* We use the known constant frame size for the codec if known, otherwise
246  * fall back on using AVCodecContext.frame_size, which is not as reliable
247  * for indicating packet duration. */
248  audio_frame_size = av_get_audio_frame_duration(codec, 0);
249  if (!audio_frame_size)
250  audio_frame_size = codec->frame_size;
251 
252  *au_ssize = codec->block_align;
253  if (audio_frame_size && codec->sample_rate) {
254  *au_scale = audio_frame_size;
255  *au_rate = codec->sample_rate;
256  } else if (codec->codec_type == AVMEDIA_TYPE_VIDEO ||
257  codec->codec_type == AVMEDIA_TYPE_DATA ||
258  codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
259  *au_scale = st->time_base.num;
260  *au_rate = st->time_base.den;
261  } else {
262  *au_scale = codec->block_align ? codec->block_align * 8 : 8;
263  *au_rate = codec->bit_rate ? codec->bit_rate :
264  8 * codec->sample_rate;
265  }
266  gcd = av_gcd(*au_scale, *au_rate);
267  *au_scale /= gcd;
268  *au_rate /= gcd;
269 }
270 
271 void ff_riff_write_info_tag(AVIOContext *pb, const char *tag, const char *str)
272 {
273  size_t len = strlen(str);
274  if (len > 0 && len < UINT32_MAX) {
275  len++;
276  ffio_wfourcc(pb, tag);
277  avio_wl32(pb, len);
278  avio_put_str(pb, str);
279  if (len & 1)
280  avio_w8(pb, 0);
281  }
282 }
283 
284 static const char riff_tags[][5] = {
285  "IARL", "IART", "ICMS", "ICMT", "ICOP", "ICRD", "ICRP", "IDIM", "IDPI",
286  "IENG", "IGNR", "IKEY", "ILGT", "ILNG", "IMED", "INAM", "IPLT", "IPRD",
287  "IPRT", "ITRK", "ISBJ", "ISFT", "ISHP", "ISMP", "ISRC", "ISRF", "ITCH",
288  { 0 }
289 };
290 
292 {
293  int i;
294 
295  for (i = 0; *riff_tags[i]; i++)
297  return 1;
298 
299  return 0;
300 }
301 
303 {
304  AVIOContext *pb = s->pb;
305  int i;
306  int64_t list_pos;
307  AVDictionaryEntry *t = NULL;
308 
310 
311  /* writing empty LIST is not nice and may cause problems */
312  if (!riff_has_valid_tags(s))
313  return;
314 
315  list_pos = ff_start_tag(pb, "LIST");
316  ffio_wfourcc(pb, "INFO");
317  for (i = 0; *riff_tags[i]; i++)
318  if ((t = av_dict_get(s->metadata, riff_tags[i],
320  ff_riff_write_info_tag(s->pb, t->key, t->value);
321  ff_end_tag(pb, list_pos);
322 }
323 
325 {
326  av_assert0(sizeof(*g) == 16);
327  avio_write(s, *g, sizeof(*g));
328 }
329 
330 const ff_asf_guid *ff_get_codec_guid(enum AVCodecID id, const AVCodecGuid *av_guid)
331 {
332  int i;
333  for (i = 0; av_guid[i].id != AV_CODEC_ID_NONE; i++) {
334  if (id == av_guid[i].id)
335  return &(av_guid[i].guid);
336  }
337  return NULL;
338 }
#define NULL
Definition: coverity.c:32
void avio_wl16(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:424
const char * s
Definition: avisynth_c.h:631
Bytestream IO Context.
Definition: avio.h:111
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:182
int64_t bit_rate
the average bitrate
Definition: avcodec.h:1597
int ff_put_wav_header(AVIOContext *pb, AVCodecContext *enc, int flags)
Write WAVEFORMAT header structure.
Definition: riffenc.c:54
else temp
Definition: vf_mcdeint.c:259
const char * g
Definition: vf_curves.c:108
enum AVCodecID id
Definition: riff.h:92
ff_asf_guid guid
Definition: riff.h:93
int num
numerator
Definition: rational.h:44
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:208
int block_align
number of bytes per packet if constant and known or 0 Used by some WAV based audio codecs...
Definition: avcodec.h:2324
void ff_parse_specific_params(AVStream *st, int *au_rate, int *au_ssize, int *au_scale)
Definition: riffenc.c:238
const AVCodecGuid ff_codec_wav_guids[]
Definition: riff.c:528
Format I/O context.
Definition: avformat.h:1314
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
Public dictionary API.
void ff_put_guid(AVIOContext *s, const ff_asf_guid *g)
Definition: riffenc.c:324
void avio_wl32(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:324
uint8_t
Opaque data information usually continuous.
Definition: avutil.h:195
void ff_put_bmp_header(AVIOContext *pb, AVCodecContext *enc, const AVCodecTag *tags, int for_asf, int ignore_extradata)
Definition: riffenc.c:206
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
Definition: avcodec.h:1647
AVDictionaryEntry * av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
Definition: dict.c:39
uint32_t tag
Definition: movenc.c:1348
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:442
int bits_per_coded_sample
bits per sample/pixel from the demuxer (needed for huffyuv).
Definition: avcodec.h:2917
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
Definition: aviobuf.c:182
static av_always_inline void ffio_wfourcc(AVIOContext *pb, const uint8_t *s)
Definition: avio_internal.h:67
#define FFALIGN(x, a)
Definition: macros.h:48
#define av_log(a,...)
void ff_riff_write_info(AVFormatContext *s)
Write all recognized RIFF tags from s->metadata.
Definition: riffenc.c:302
const ff_asf_guid * ff_get_codec_guid(enum AVCodecID id, const AVCodecGuid *av_guid)
Definition: riffenc.c:330
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: avcodec.h:101
#define AV_DICT_MATCH_CASE
Only get an entry with exact-case key match.
Definition: dict.h:71
AVDictionary * metadata
Metadata that applies to the whole file.
Definition: avformat.h:1528
int av_get_bits_per_sample(enum AVCodecID codec_id)
Return codec bits per sample.
Definition: utils.c:3006
preferred ID for decoding MPEG audio layer 1, 2 or 3
Definition: avcodec.h:420
int64_t av_gcd(int64_t a, int64_t b)
Compute the greatest common divisor of a and b.
Definition: mathematics.c:37
uint64_t channel_layout
Audio channel layout.
Definition: avcodec.h:2338
AVCodecContext * codec
Codec context associated with this stream.
Definition: avformat.h:896
int width
picture width / height.
Definition: avcodec.h:1711
void ff_end_tag(AVIOContext *pb, int64_t start)
Definition: riffenc.c:38
internal header for RIFF based (de)muxers do NOT include this in end user applications ...
void ff_riff_write_info_tag(AVIOContext *pb, const char *tag, const char *str)
Write a single RIFF info tag.
Definition: riffenc.c:271
int avio_put_str(AVIOContext *s, const char *str)
Write a NULL-terminated string.
Definition: aviobuf.c:340
uint8_t ff_asf_guid[16]
Definition: riff.h:89
Stream structure.
Definition: avformat.h:877
int frame_size
Number of samples per channel in an audio frame.
Definition: avcodec.h:2307
int frame_size
Definition: mxfenc.c:1821
Libavcodec external API header.
enum AVMediaType codec_type
Definition: avcodec.h:1540
int64_t ff_start_tag(AVIOContext *pb, const char *tag)
Definition: riffenc.c:31
enum AVCodecID codec_id
Definition: avcodec.h:1549
int sample_rate
samples per second
Definition: avcodec.h:2287
AVIOContext * pb
I/O context.
Definition: avformat.h:1356
static const char riff_tags[][5]
Definition: riffenc.c:284
void avio_w8(AVIOContext *s, int b)
Definition: aviobuf.c:160
main external API structure.
Definition: avcodec.h:1532
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
Definition: avcodec.h:1564
static int riff_has_valid_tags(AVFormatContext *s)
Definition: riffenc.c:291
int extradata_size
Definition: avcodec.h:1648
#define FF_COMPLIANCE_NORMAL
Definition: avcodec.h:2744
int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes)
Return audio frame duration.
Definition: utils.c:3024
const AVMetadataConv ff_riff_info_conv[]
Definition: riff.c:501
static int flags
Definition: cpu.c:47
Main libavformat public API header.
char * key
Definition: dict.h:87
int den
denominator
Definition: rational.h:45
unsigned bps
Definition: movenc.c:1349
void ff_metadata_conv(AVDictionary **pm, const AVMetadataConv *d_conv, const AVMetadataConv *s_conv)
Definition: metadata.c:26
char * value
Definition: dict.h:88
int len
int channels
number of audio channels
Definition: avcodec.h:2288
#define FF_PUT_WAV_HEADER_SKIP_CHANNELMASK
Tell ff_put_wav_header() to write an empty channel mask.
Definition: riff.h:58
void INT64 start
Definition: avisynth_c.h:553
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
Definition: avformat.h:919
int strict_std_compliance
strictly follow the standard (MPEG4, ...).
Definition: avcodec.h:2741
#define FF_PUT_WAV_HEADER_FORCE_WAVEFORMATEX
Tell ff_put_wav_header() to use WAVEFORMATEX even for PCM codecs.
Definition: riff.h:53