libavformat/flvenc.c
Go to the documentation of this file.
1 /*
2  * FLV muxer
3  * Copyright (c) 2003 The FFmpeg Project
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/intreadwrite.h"
23 #include "libavutil/dict.h"
24 #include "libavutil/intfloat.h"
25 #include "libavutil/avassert.h"
26 #include "avc.h"
27 #include "avformat.h"
28 #include "flv.h"
29 #include "internal.h"
30 #include "metadata.h"
31 
32 
33 static const AVCodecTag flv_video_codec_ids[] = {
40  { AV_CODEC_ID_VP6, FLV_CODECID_VP6 },
43  { AV_CODEC_ID_NONE, 0 }
44 };
45 
46 static const AVCodecTag flv_audio_codec_ids[] = {
48  { AV_CODEC_ID_PCM_U8, FLV_CODECID_PCM >> FLV_AUDIO_CODECID_OFFSET },
49  { AV_CODEC_ID_PCM_S16BE, FLV_CODECID_PCM >> FLV_AUDIO_CODECID_OFFSET },
50  { AV_CODEC_ID_PCM_S16LE, FLV_CODECID_PCM_LE >> FLV_AUDIO_CODECID_OFFSET },
51  { AV_CODEC_ID_ADPCM_SWF, FLV_CODECID_ADPCM >> FLV_AUDIO_CODECID_OFFSET },
52  { AV_CODEC_ID_AAC, FLV_CODECID_AAC >> FLV_AUDIO_CODECID_OFFSET },
53  { AV_CODEC_ID_NELLYMOSER, FLV_CODECID_NELLYMOSER >> FLV_AUDIO_CODECID_OFFSET },
54  { AV_CODEC_ID_PCM_MULAW, FLV_CODECID_PCM_MULAW >> FLV_AUDIO_CODECID_OFFSET },
55  { AV_CODEC_ID_PCM_ALAW, FLV_CODECID_PCM_ALAW >> FLV_AUDIO_CODECID_OFFSET },
56  { AV_CODEC_ID_SPEEX, FLV_CODECID_SPEEX >> FLV_AUDIO_CODECID_OFFSET },
57  { AV_CODEC_ID_NONE, 0 }
58 };
59 
60 typedef struct FLVContext {
61  int reserved;
62  int64_t duration_offset;
63  int64_t filesize_offset;
64  int64_t duration;
65  int64_t delay; ///< first dts delay (needed for AVC & Speex)
66 } FLVContext;
67 
68 typedef struct FLVStreamContext {
69  int64_t last_ts; ///< last timestamp for each stream
71 
73 {
76 
77  if (enc->codec_id == AV_CODEC_ID_AAC) // specs force these parameters
80  else if (enc->codec_id == AV_CODEC_ID_SPEEX) {
81  if (enc->sample_rate != 16000) {
83  "FLV only supports wideband (16kHz) Speex audio\n");
84  return AVERROR(EINVAL);
85  }
86  if (enc->channels != 1) {
87  av_log(s, AV_LOG_ERROR, "FLV only supports mono Speex audio\n");
88  return AVERROR(EINVAL);
89  }
91  } else {
92  switch (enc->sample_rate) {
93  case 44100:
94  flags |= FLV_SAMPLERATE_44100HZ;
95  break;
96  case 22050:
97  flags |= FLV_SAMPLERATE_22050HZ;
98  break;
99  case 11025:
100  flags |= FLV_SAMPLERATE_11025HZ;
101  break;
102  case 16000: // nellymoser only
103  case 8000: // nellymoser only
104  case 5512: // not MP3
105  if (enc->codec_id != AV_CODEC_ID_MP3) {
106  flags |= FLV_SAMPLERATE_SPECIAL;
107  break;
108  }
109  default:
110  av_log(s, AV_LOG_ERROR,
111  "FLV does not support sample rate %d, "
112  "choose from (44100, 22050, 11025)\n", enc->sample_rate);
113  return AVERROR(EINVAL);
114  }
115  }
116 
117  if (enc->channels > 1)
118  flags |= FLV_STEREO;
119 
120  switch (enc->codec_id) {
121  case AV_CODEC_ID_MP3:
123  break;
124  case AV_CODEC_ID_PCM_U8:
126  break;
129  break;
132  break;
135  break;
137  if (enc->sample_rate == 8000)
139  else if (enc->sample_rate == 16000)
141  else
143  break;
146  break;
149  break;
150  case 0:
151  flags |= enc->codec_tag << 4;
152  break;
153  default:
154  av_log(s, AV_LOG_ERROR, "Audio codec '%s' not compatible with FLV\n",
155  avcodec_get_name(enc->codec_id));
156  return AVERROR(EINVAL);
157  }
158 
159  return flags;
160 }
161 
162 static void put_amf_string(AVIOContext *pb, const char *str)
163 {
164  size_t len = strlen(str);
165  avio_wb16(pb, len);
166  avio_write(pb, str, len);
167 }
168 
169 static void put_avc_eos_tag(AVIOContext *pb, unsigned ts)
170 {
172  avio_wb24(pb, 5); /* Tag Data Size */
173  avio_wb24(pb, ts); /* lower 24 bits of timestamp in ms */
174  avio_w8(pb, (ts >> 24) & 0x7F); /* MSB of ts in ms */
175  avio_wb24(pb, 0); /* StreamId = 0 */
176  avio_w8(pb, 23); /* ub[4] FrameType = 1, ub[4] CodecId = 7 */
177  avio_w8(pb, 2); /* AVC end of sequence */
178  avio_wb24(pb, 0); /* Always 0 for AVC EOS. */
179  avio_wb32(pb, 16); /* Size of FLV tag */
180 }
181 
182 static void put_amf_double(AVIOContext *pb, double d)
183 {
185  avio_wb64(pb, av_double2int(d));
186 }
187 
188 static void put_amf_bool(AVIOContext *pb, int b)
189 {
191  avio_w8(pb, !!b);
192 }
193 
195 {
196  AVIOContext *pb = s->pb;
197  FLVContext *flv = s->priv_data;
198  AVCodecContext *audio_enc = NULL, *video_enc = NULL, *data_enc = NULL;
199  int i, metadata_count = 0;
200  double framerate = 0.0;
201  int64_t metadata_size_pos, data_size, metadata_count_pos;
203 
204  for (i = 0; i < s->nb_streams; i++) {
205  AVCodecContext *enc = s->streams[i]->codec;
206  FLVStreamContext *sc;
207  switch (enc->codec_type) {
208  case AVMEDIA_TYPE_VIDEO:
209  if (s->streams[i]->avg_frame_rate.den &&
210  s->streams[i]->avg_frame_rate.num) {
211  framerate = av_q2d(s->streams[i]->avg_frame_rate);
212  } else {
213  framerate = 1 / av_q2d(s->streams[i]->codec->time_base);
214  }
215  if (video_enc) {
216  av_log(s, AV_LOG_ERROR,
217  "at most one video stream is supported in flv\n");
218  return AVERROR(EINVAL);
219  }
220  video_enc = enc;
221  if (enc->codec_tag == 0) {
222  av_log(s, AV_LOG_ERROR, "Video codec '%s' for stream %d is not compatible with FLV\n",
223  avcodec_get_name(enc->codec_id), i);
224  return AVERROR(EINVAL);
225  }
226  break;
227  case AVMEDIA_TYPE_AUDIO:
228  if (audio_enc) {
229  av_log(s, AV_LOG_ERROR,
230  "at most one audio stream is supported in flv\n");
231  return AVERROR(EINVAL);
232  }
233  audio_enc = enc;
234  if (get_audio_flags(s, enc) < 0)
235  return AVERROR_INVALIDDATA;
236  break;
237  case AVMEDIA_TYPE_DATA:
238  if (enc->codec_id != AV_CODEC_ID_TEXT) {
239  av_log(s, AV_LOG_ERROR, "Data codec '%s' for stream %d is not compatible with FLV\n",
240  avcodec_get_name(enc->codec_id), i);
241  return AVERROR_INVALIDDATA;
242  }
243  data_enc = enc;
244  break;
245  default:
246  av_log(s, AV_LOG_ERROR, "Codec type '%s' for stream %d is not compatible with FLV\n",
248  return AVERROR(EINVAL);
249  }
250  avpriv_set_pts_info(s->streams[i], 32, 1, 1000); /* 32 bit pts in ms */
251 
252  sc = av_mallocz(sizeof(FLVStreamContext));
253  if (!sc)
254  return AVERROR(ENOMEM);
255  s->streams[i]->priv_data = sc;
256  sc->last_ts = -1;
257  }
258 
259  flv->delay = AV_NOPTS_VALUE;
260 
261  avio_write(pb, "FLV", 3);
262  avio_w8(pb, 1);
263  avio_w8(pb, FLV_HEADER_FLAG_HASAUDIO * !!audio_enc +
264  FLV_HEADER_FLAG_HASVIDEO * !!video_enc);
265  avio_wb32(pb, 9);
266  avio_wb32(pb, 0);
267 
268  for (i = 0; i < s->nb_streams; i++)
269  if (s->streams[i]->codec->codec_tag == 5) {
270  avio_w8(pb, 8); // message type
271  avio_wb24(pb, 0); // include flags
272  avio_wb24(pb, 0); // time stamp
273  avio_wb32(pb, 0); // reserved
274  avio_wb32(pb, 11); // size
275  flv->reserved = 5;
276  }
277 
278  /* write meta_tag */
279  avio_w8(pb, 18); // tag type META
280  metadata_size_pos = avio_tell(pb);
281  avio_wb24(pb, 0); // size of data part (sum of all parts below)
282  avio_wb24(pb, 0); // timestamp
283  avio_wb32(pb, 0); // reserved
284 
285  /* now data of data_size size */
286 
287  /* first event name as a string */
289  put_amf_string(pb, "onMetaData"); // 12 bytes
290 
291  /* mixed array (hash) with size and string/type/data tuples */
293  metadata_count_pos = avio_tell(pb);
294  metadata_count = 5 * !!video_enc +
295  5 * !!audio_enc +
296  1 * !!data_enc +
297  2; // +2 for duration and file size
298 
299  avio_wb32(pb, metadata_count);
300 
301  put_amf_string(pb, "duration");
302  flv->duration_offset= avio_tell(pb);
303 
304  // fill in the guessed duration, it'll be corrected later if incorrect
306 
307  if (video_enc) {
308  put_amf_string(pb, "width");
309  put_amf_double(pb, video_enc->width);
310 
311  put_amf_string(pb, "height");
312  put_amf_double(pb, video_enc->height);
313 
314  put_amf_string(pb, "videodatarate");
315  put_amf_double(pb, video_enc->bit_rate / 1024.0);
316 
317  put_amf_string(pb, "framerate");
318  put_amf_double(pb, framerate);
319 
320  put_amf_string(pb, "videocodecid");
321  put_amf_double(pb, video_enc->codec_tag);
322  }
323 
324  if (audio_enc) {
325  put_amf_string(pb, "audiodatarate");
326  put_amf_double(pb, audio_enc->bit_rate / 1024.0);
327 
328  put_amf_string(pb, "audiosamplerate");
329  put_amf_double(pb, audio_enc->sample_rate);
330 
331  put_amf_string(pb, "audiosamplesize");
332  put_amf_double(pb, audio_enc->codec_id == AV_CODEC_ID_PCM_U8 ? 8 : 16);
333 
334  put_amf_string(pb, "stereo");
335  put_amf_bool(pb, audio_enc->channels == 2);
336 
337  put_amf_string(pb, "audiocodecid");
338  put_amf_double(pb, audio_enc->codec_tag);
339  }
340 
341  if (data_enc) {
342  put_amf_string(pb, "datastream");
343  put_amf_double(pb, 0.0);
344  }
345 
346  while ((tag = av_dict_get(s->metadata, "", tag, AV_DICT_IGNORE_SUFFIX))) {
347  if( !strcmp(tag->key, "width")
348  ||!strcmp(tag->key, "height")
349  ||!strcmp(tag->key, "videodatarate")
350  ||!strcmp(tag->key, "framerate")
351  ||!strcmp(tag->key, "videocodecid")
352  ||!strcmp(tag->key, "audiodatarate")
353  ||!strcmp(tag->key, "audiosamplerate")
354  ||!strcmp(tag->key, "audiosamplesize")
355  ||!strcmp(tag->key, "stereo")
356  ||!strcmp(tag->key, "audiocodecid")
357  ||!strcmp(tag->key, "duration")
358  ||!strcmp(tag->key, "onMetaData")
359  ){
360  av_log(s, AV_LOG_DEBUG, "Ignoring metadata for %s\n", tag->key);
361  continue;
362  }
363  put_amf_string(pb, tag->key);
365  put_amf_string(pb, tag->value);
366  metadata_count++;
367  }
368 
369  put_amf_string(pb, "filesize");
370  flv->filesize_offset = avio_tell(pb);
371  put_amf_double(pb, 0); // delayed write
372 
373  put_amf_string(pb, "");
375 
376  /* write total size of tag */
377  data_size = avio_tell(pb) - metadata_size_pos - 10;
378 
379  avio_seek(pb, metadata_count_pos, SEEK_SET);
380  avio_wb32(pb, metadata_count);
381 
382  avio_seek(pb, metadata_size_pos, SEEK_SET);
383  avio_wb24(pb, data_size);
384  avio_skip(pb, data_size + 10 - 3);
385  avio_wb32(pb, data_size + 11);
386 
387  for (i = 0; i < s->nb_streams; i++) {
388  AVCodecContext *enc = s->streams[i]->codec;
389  if (enc->codec_id == AV_CODEC_ID_AAC || enc->codec_id == AV_CODEC_ID_H264 || enc->codec_id == AV_CODEC_ID_MPEG4) {
390  int64_t pos;
393  avio_wb24(pb, 0); // size patched later
394  avio_wb24(pb, 0); // ts
395  avio_w8(pb, 0); // ts ext
396  avio_wb24(pb, 0); // streamid
397  pos = avio_tell(pb);
398  if (enc->codec_id == AV_CODEC_ID_AAC) {
399  avio_w8(pb, get_audio_flags(s, enc));
400  avio_w8(pb, 0); // AAC sequence header
401  avio_write(pb, enc->extradata, enc->extradata_size);
402  } else {
403  avio_w8(pb, enc->codec_tag | FLV_FRAME_KEY); // flags
404  avio_w8(pb, 0); // AVC sequence header
405  avio_wb24(pb, 0); // composition time
407  }
408  data_size = avio_tell(pb) - pos;
409  avio_seek(pb, -data_size - 10, SEEK_CUR);
410  avio_wb24(pb, data_size);
411  avio_skip(pb, data_size + 10 - 3);
412  avio_wb32(pb, data_size + 11); // previous tag size
413  }
414  }
415 
416  return 0;
417 }
418 
420 {
421  int64_t file_size;
422 
423  AVIOContext *pb = s->pb;
424  FLVContext *flv = s->priv_data;
425  int i;
426 
427  /* Add EOS tag */
428  for (i = 0; i < s->nb_streams; i++) {
429  AVCodecContext *enc = s->streams[i]->codec;
430  FLVStreamContext *sc = s->streams[i]->priv_data;
431  if (enc->codec_type == AVMEDIA_TYPE_VIDEO &&
433  put_avc_eos_tag(pb, sc->last_ts);
434  }
435 
436  file_size = avio_tell(pb);
437 
438  /* update information */
439  if (avio_seek(pb, flv->duration_offset, SEEK_SET) < 0)
440  av_log(s, AV_LOG_WARNING, "Failed to update header with correct duration.\n");
441  else
442  put_amf_double(pb, flv->duration / (double)1000);
443  if (avio_seek(pb, flv->filesize_offset, SEEK_SET) < 0)
444  av_log(s, AV_LOG_WARNING, "Failed to update header with correct filesize.\n");
445  else
446  put_amf_double(pb, file_size);
447 
448  avio_seek(pb, file_size, SEEK_SET);
449  return 0;
450 }
451 
453 {
454  AVIOContext *pb = s->pb;
455  AVCodecContext *enc = s->streams[pkt->stream_index]->codec;
456  FLVContext *flv = s->priv_data;
458  unsigned ts;
459  int size = pkt->size;
460  uint8_t *data = NULL;
461  int flags = -1, flags_size, ret;
462 
463  if (enc->codec_id == AV_CODEC_ID_VP6 || enc->codec_id == AV_CODEC_ID_VP6F ||
465  flags_size = 2;
466  else if (enc->codec_id == AV_CODEC_ID_H264 || enc->codec_id == AV_CODEC_ID_MPEG4)
467  flags_size = 5;
468  else
469  flags_size = 1;
470 
471  switch (enc->codec_type) {
472  case AVMEDIA_TYPE_VIDEO:
474 
475  flags = enc->codec_tag;
476  if (flags == 0) {
477  av_log(s, AV_LOG_ERROR,
478  "Video codec '%s' is not compatible with FLV\n",
479  avcodec_get_name(enc->codec_id));
480  return AVERROR(EINVAL);
481  }
482 
484  break;
485  case AVMEDIA_TYPE_AUDIO:
486  flags = get_audio_flags(s, enc);
487 
488  av_assert0(size);
489 
491  break;
492  case AVMEDIA_TYPE_DATA:
494  break;
495  default:
496  return AVERROR(EINVAL);
497  }
498 
499  if (enc->codec_id == AV_CODEC_ID_H264 || enc->codec_id == AV_CODEC_ID_MPEG4) {
500  /* check if extradata looks like mp4 formated */
501  if (enc->extradata_size > 0 && *(uint8_t*)enc->extradata != 1)
502  if ((ret = ff_avc_parse_nal_units_buf(pkt->data, &data, &size)) < 0)
503  return ret;
504  } else if (enc->codec_id == AV_CODEC_ID_AAC && pkt->size > 2 &&
505  (AV_RB16(pkt->data) & 0xfff0) == 0xfff0) {
506  if (!s->streams[pkt->stream_index]->nb_frames) {
507  av_log(s, AV_LOG_ERROR, "Malformed AAC bitstream detected: "
508  "use audio bitstream filter 'aac_adtstoasc' to fix it "
509  "('-bsf:a aac_adtstoasc' option with ffmpeg)\n");
510  return AVERROR_INVALIDDATA;
511  }
512  av_log(s, AV_LOG_WARNING, "aac bitstream error\n");
513  }
514 
515  if (flv->delay == AV_NOPTS_VALUE)
516  flv->delay = -pkt->dts;
517 
518  if (pkt->dts < -flv->delay) {
520  "Packets are not in the proper order with respect to DTS\n");
521  return AVERROR(EINVAL);
522  }
523 
524  ts = pkt->dts + flv->delay; // add delay to force positive dts
525 
526  /* check Speex packet duration */
527  if (enc->codec_id == AV_CODEC_ID_SPEEX && ts - sc->last_ts > 160)
528  av_log(s, AV_LOG_WARNING, "Warning: Speex stream has more than "
529  "8 frames per packet. Adobe Flash "
530  "Player cannot handle this!\n");
531 
532  if (sc->last_ts < ts)
533  sc->last_ts = ts;
534 
535  avio_wb24(pb, size + flags_size);
536  avio_wb24(pb, ts);
537  avio_w8(pb, (ts >> 24) & 0x7F); // timestamps are 32 bits _signed_
538  avio_wb24(pb, flv->reserved);
539 
540  if (enc->codec_type == AVMEDIA_TYPE_DATA) {
541  int data_size;
542  int metadata_size_pos = avio_tell(pb);
544  put_amf_string(pb, "onTextData");
546  avio_wb32(pb, 2);
547  put_amf_string(pb, "type");
549  put_amf_string(pb, "Text");
550  put_amf_string(pb, "text");
552  put_amf_string(pb, pkt->data);
553  put_amf_string(pb, "");
555  /* write total size of tag */
556  data_size = avio_tell(pb) - metadata_size_pos;
557  avio_seek(pb, metadata_size_pos - 10, SEEK_SET);
558  avio_wb24(pb, data_size);
559  avio_seek(pb, data_size + 10 - 3, SEEK_CUR);
560  avio_wb32(pb, data_size + 11);
561  } else {
562  av_assert1(flags>=0);
563  avio_w8(pb,flags);
564  if (enc->codec_id == AV_CODEC_ID_VP6)
565  avio_w8(pb,0);
566  if (enc->codec_id == AV_CODEC_ID_VP6F || enc->codec_id == AV_CODEC_ID_VP6A)
567  avio_w8(pb, enc->extradata_size ? enc->extradata[0] : 0);
568  else if (enc->codec_id == AV_CODEC_ID_AAC)
569  avio_w8(pb,1); // AAC raw
570  else if (enc->codec_id == AV_CODEC_ID_H264 || enc->codec_id == AV_CODEC_ID_MPEG4) {
571  avio_w8(pb,1); // AVC NALU
572  avio_wb24(pb,pkt->pts - pkt->dts);
573  }
574 
575  avio_write(pb, data ? data : pkt->data, size);
576 
577  avio_wb32(pb, size + flags_size + 11); // previous tag size
578  flv->duration = FFMAX(flv->duration,
579  pkt->pts + flv->delay + pkt->duration);
580  }
581 
582  av_free(data);
583 
584  return pb->error;
585 }
586 
588  .name = "flv",
589  .long_name = NULL_IF_CONFIG_SMALL("FLV (Flash Video)"),
590  .mime_type = "video/x-flv",
591  .extensions = "flv",
592  .priv_data_size = sizeof(FLVContext),
594  .video_codec = AV_CODEC_ID_FLV1,
598  .codec_tag = (const AVCodecTag* const []) {
600  },
603 };
void avio_wb64(AVIOContext *s, uint64_t val)
Definition: aviobuf.c:361
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:205
static const AVCodecTag flv_audio_codec_ids[]
const char * s
Definition: avisynth_c.h:668
#define CONFIG_LIBMP3LAME
Definition: config.h:321
Bytestream IO Context.
Definition: avio.h:68
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
AVOutputFormat ff_flv_muxer
int64_t delay
first dts delay (needed for AVC & Speex)
void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:154
static int write_packet(AVFormatContext *s, AVPacket *pkt)
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:199
static av_always_inline uint64_t av_double2int(double f)
Reinterpret a double as a 64-bit integer.
Definition: intfloat.h:70
void * priv_data
Definition: avformat.h:663
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition: aviobuf.c:256
AVDictionaryEntry * av_dict_get(AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
Definition: dict.c:39
static int get_audio_flags(AVFormatContext *s, AVCodecContext *enc)
#define AVFMT_TS_NONSTRICT
Format does not require strictly increasing timestamps, but they must still be monotonic.
Definition: avformat.h:363
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
set threshold d
static const AVCodecTag flv_video_codec_ids[]
Format I/O context.
Definition: avformat.h:944
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
internal metadata API header see avformat.h or the public API!
Public dictionary API.
uint8_t
Opaque data information usually continuous.
Definition: avutil.h:145
static AVPacket pkt
Definition: demuxing.c:56
#define b
Definition: input.c:42
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
AVStream ** streams
Definition: avformat.h:992
static double av_q2d(AVRational a)
Convert rational to double.
Definition: rational.h:69
uint8_t * data
uint32_t tag
Definition: movenc.c:894
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:248
int bits_per_coded_sample
bits per sample/pixel from the demuxer (needed for huffyuv).
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
Definition: aviobuf.c:173
struct FLVContext FLVContext
int duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
static int write_trailer(AVFormatContext *s)
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
static int flv_write_trailer(AVFormatContext *s)
inter frame (for AVC, a non-seekable frame)
AVDictionary * metadata
Definition: avformat.h:1092
void av_free(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc(). ...
Definition: mem.c:183
#define AV_RB16
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Spectrum Plot time data
preferred ID for decoding MPEG audio layer 1, 2 or 3
simple assert() macros that are a bit more flexible than ISO C assert().
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
AVRational avg_frame_rate
Average framerate.
Definition: avformat.h:716
#define FFMAX(a, b)
Definition: common.h:56
int ff_avc_parse_nal_units_buf(const uint8_t *buf_in, uint8_t **buf, int *size)
Definition: avc.c:92
int size
int flags
A combination of AV_PKT_FLAG values.
AVCodecContext * codec
Codec context associated with this stream.
Definition: avformat.h:662
unsigned int nb_streams
A list of all streams in the file.
Definition: avformat.h:991
#define FLV_AUDIO_CODECID_OFFSET
int bit_rate
the average bitrate
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:53
#define AV_TIME_BASE
Internal time base represented as integer.
Definition: avutil.h:196
static int flv_write_packet(AVFormatContext *s, AVPacket *pkt)
ret
Definition: avfilter.c:821
#define AVFMT_GLOBALHEADER
Format wants global header.
Definition: avformat.h:351
void avio_wb24(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:385
signifies 5512Hz and 8000Hz in the case of NELLYMOSER
const char * name
Definition: avformat.h:378
const char * avcodec_get_name(enum AVCodecID id)
Get the name of a codec.
key frame (for AVC, a seekable frame)
NULL
Definition: eval.c:55
FLV common header.
enum AVMediaType codec_type
enum AVCodecID codec_id
int sample_rate
samples per second
AVIOContext * pb
I/O context.
Definition: avformat.h:977
static int flv_write_header(AVFormatContext *s)
void avio_w8(AVIOContext *s, int b)
Definition: aviobuf.c:151
main external API structure.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> (&#39;D&#39;<<24) + (&#39;C&#39;<<16) + (&#39;B&#39;<<8) + &#39;A&#39;).
static void put_amf_string(AVIOContext *pb, const char *str)
static void put_amf_double(AVIOContext *pb, double d)
synthesis window for stochastic i
int error
contains the error code or 0 if no error happened
Definition: avio.h:102
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
#define AMF_END_OF_OBJECT
static void put_amf_bool(AVIOContext *pb, int b)
void avio_wb16(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:373
const char * av_get_media_type_string(enum AVMediaType media_type)
Return a string describing the media_type enum, NULL if media_type is unknown.
static int flags
Definition: cpu.c:23
Main libavformat public API header.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:162
int64_t duration_offset
raw UTF-8 text
int64_t nb_frames
number of frames in this stream if known or 0
Definition: avformat.h:698
char * key
Definition: dict.h:81
int den
denominator
Definition: rational.h:45
static void put_avc_eos_tag(AVIOContext *pb, unsigned ts)
#define AVFMT_VARIABLE_FPS
Format allows variable fps.
Definition: avformat.h:355
char * value
Definition: dict.h:82
int len
int channels
number of audio channels
void * priv_data
Format private data.
Definition: avformat.h:964
static void write_header(FFV1Context *f)
Definition: ffv1enc.c:470
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed...
void avio_wb32(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:299
int64_t duration
Decoding: duration of the stream, in AV_TIME_BASE fractional seconds.
Definition: avformat.h:1009
#define AV_DICT_IGNORE_SUFFIX
Definition: dict.h:68
int64_t filesize_offset
struct FLVStreamContext FLVStreamContext
This structure stores compressed data.
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
int64_t last_ts
last timestamp for each stream
int ff_isom_write_avcc(AVIOContext *pb, const uint8_t *data, int len)
Definition: avc.c:106
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:190