FFmpeg
flvdec.c
Go to the documentation of this file.
1 /*
2  * FLV demuxer
3  * Copyright (c) 2003 The FFmpeg Project
4  *
5  * This demuxer will generate a 1 byte extradata for VP6F content.
6  * It is composed of:
7  * - upper 4 bits: difference between encoded width and visible width
8  * - lower 4 bits: difference between encoded height and visible height
9  *
10  * This file is part of FFmpeg.
11  *
12  * FFmpeg is free software; you can redistribute it and/or
13  * modify it under the terms of the GNU Lesser General Public
14  * License as published by the Free Software Foundation; either
15  * version 2.1 of the License, or (at your option) any later version.
16  *
17  * FFmpeg is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20  * Lesser General Public License for more details.
21  *
22  * You should have received a copy of the GNU Lesser General Public
23  * License along with FFmpeg; if not, write to the Free Software
24  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25  */
26 
27 #include "libavutil/avassert.h"
28 #include "libavutil/avstring.h"
30 #include "libavutil/dict.h"
32 #include "libavutil/opt.h"
33 #include "libavutil/internal.h"
34 #include "libavutil/intfloat.h"
35 #include "libavutil/intreadwrite.h"
36 #include "libavutil/mathematics.h"
37 #include "avformat.h"
38 #include "demux.h"
39 #include "internal.h"
40 #include "flv.h"
41 
42 #define VALIDATE_INDEX_TS_THRESH 2500
43 
44 #define RESYNC_BUFFER_SIZE (1<<20)
45 
46 #define MAX_DEPTH 16 ///< arbitrary limit to prevent unbounded recursion
47 
48 typedef struct FLVContext {
49  const AVClass *class; ///< Class for private options.
50  int trust_metadata; ///< configure streams according onMetaData
51  int trust_datasize; ///< trust data size of FLVTag
52  int dump_full_metadata; ///< Dump full metadata of the onMetadata
53  int wrong_dts; ///< wrong dts due to negative cts
58  struct {
59  int64_t dts;
60  int64_t pos;
61  } validate_index[2];
65 
67 
70 
73  int64_t video_bit_rate;
74  int64_t audio_bit_rate;
75  int64_t *keyframe_times;
79  int64_t last_ts;
80  int64_t time_offset;
81  int64_t time_pos;
82 
83 } FLVContext;
84 
85 /* AMF date type */
86 typedef struct amf_date {
87  double milliseconds;
88  int16_t timezone;
89 } amf_date;
90 
91 static int probe(const AVProbeData *p, int live)
92 {
93  const uint8_t *d = p->buf;
94  unsigned offset = AV_RB32(d + 5);
95 
96  if (d[0] == 'F' &&
97  d[1] == 'L' &&
98  d[2] == 'V' &&
99  d[3] < 5 && d[5] == 0 &&
100  offset + 100 < p->buf_size &&
101  offset > 8) {
102  int is_live = !memcmp(d + offset + 40, "NGINX RTMP", 10);
103 
104  if (live == is_live)
105  return AVPROBE_SCORE_MAX;
106  }
107  return 0;
108 }
109 
110 static int flv_probe(const AVProbeData *p)
111 {
112  return probe(p, 0);
113 }
114 
115 static int live_flv_probe(const AVProbeData *p)
116 {
117  return probe(p, 1);
118 }
119 
120 static int kux_probe(const AVProbeData *p)
121 {
122  const uint8_t *d = p->buf;
123 
124  if (d[0] == 'K' &&
125  d[1] == 'D' &&
126  d[2] == 'K' &&
127  d[3] == 0 &&
128  d[4] == 0) {
129  return AVPROBE_SCORE_EXTENSION + 1;
130  }
131  return 0;
132 }
133 
135 {
136  FLVContext *flv = s->priv_data;
137  AVStream *stream = NULL;
138  unsigned int i = 0;
139 
140  if (flv->last_keyframe_stream_index < 0) {
141  av_log(s, AV_LOG_DEBUG, "keyframe stream hasn't been created\n");
142  return;
143  }
144 
145  av_assert0(flv->last_keyframe_stream_index <= s->nb_streams);
146  stream = s->streams[flv->last_keyframe_stream_index];
147 
148  if (ffstream(stream)->nb_index_entries == 0) {
149  for (i = 0; i < flv->keyframe_count; i++) {
150  av_log(s, AV_LOG_TRACE, "keyframe filepositions = %"PRId64" times = %"PRId64"\n",
153  flv->keyframe_times[i], 0, 0, AVINDEX_KEYFRAME);
154  }
155  } else
156  av_log(s, AV_LOG_WARNING, "Skipping duplicate index\n");
157 
158  if (stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
159  av_freep(&flv->keyframe_times);
161  flv->keyframe_count = 0;
162  }
163 }
164 
166 {
167  FLVContext *flv = s->priv_data;
169  if (!st)
170  return NULL;
172  if (s->nb_streams>=3 ||( s->nb_streams==2
173  && s->streams[0]->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE
174  && s->streams[1]->codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE
175  && s->streams[0]->codecpar->codec_type != AVMEDIA_TYPE_DATA
176  && s->streams[1]->codecpar->codec_type != AVMEDIA_TYPE_DATA))
177  s->ctx_flags &= ~AVFMTCTX_NOHEADER;
179  st->codecpar->bit_rate = flv->audio_bit_rate;
181  }
183  st->codecpar->bit_rate = flv->video_bit_rate;
185  st->avg_frame_rate = flv->framerate;
186  }
187 
188 
189  avpriv_set_pts_info(st, 32, 1, 1000); /* 32 bit pts in ms */
190  flv->last_keyframe_stream_index = s->nb_streams - 1;
192  return st;
193 }
194 
196 {
197  int bits_per_coded_sample = (flags & FLV_AUDIO_SAMPLESIZE_MASK) ? 16 : 8;
198  int flv_codecid = flags & FLV_AUDIO_CODECID_MASK;
199  int codec_id;
200 
201  if (!apar->codec_id && !apar->codec_tag)
202  return 1;
203 
204  if (apar->bits_per_coded_sample != bits_per_coded_sample)
205  return 0;
206 
207  switch (flv_codecid) {
208  // no distinction between S16 and S8 PCM codec flags
209  case FLV_CODECID_PCM:
210  codec_id = bits_per_coded_sample == 8
212 #if HAVE_BIGENDIAN
214 #else
216 #endif
217  return codec_id == apar->codec_id;
218  case FLV_CODECID_PCM_LE:
219  codec_id = bits_per_coded_sample == 8
222  return codec_id == apar->codec_id;
223  case FLV_CODECID_AAC:
224  return apar->codec_id == AV_CODEC_ID_AAC;
225  case FLV_CODECID_ADPCM:
226  return apar->codec_id == AV_CODEC_ID_ADPCM_SWF;
227  case FLV_CODECID_SPEEX:
228  return apar->codec_id == AV_CODEC_ID_SPEEX;
229  case FLV_CODECID_MP3:
230  return apar->codec_id == AV_CODEC_ID_MP3;
234  return apar->codec_id == AV_CODEC_ID_NELLYMOSER;
236  return apar->sample_rate == 8000 &&
239  return apar->sample_rate == 8000 &&
241  default:
242  return apar->codec_tag == (flv_codecid >> FLV_AUDIO_CODECID_OFFSET);
243  }
244 }
245 
247  AVCodecParameters *apar, int flv_codecid)
248 {
249  switch (flv_codecid) {
250  // no distinction between S16 and S8 PCM codec flags
251  case FLV_CODECID_PCM:
252  apar->codec_id = apar->bits_per_coded_sample == 8
254 #if HAVE_BIGENDIAN
256 #else
258 #endif
259  break;
260  case FLV_CODECID_PCM_LE:
261  apar->codec_id = apar->bits_per_coded_sample == 8
264  break;
265  case FLV_CODECID_AAC:
266  apar->codec_id = AV_CODEC_ID_AAC;
267  break;
268  case FLV_CODECID_ADPCM:
270  break;
271  case FLV_CODECID_SPEEX:
272  apar->codec_id = AV_CODEC_ID_SPEEX;
273  apar->sample_rate = 16000;
274  break;
275  case FLV_CODECID_MP3:
276  apar->codec_id = AV_CODEC_ID_MP3;
278  break;
280  // in case metadata does not otherwise declare samplerate
281  apar->sample_rate = 8000;
283  break;
285  apar->sample_rate = 16000;
287  break;
290  break;
292  apar->sample_rate = 8000;
294  break;
296  apar->sample_rate = 8000;
298  break;
299  default:
300  avpriv_request_sample(s, "Audio codec (%x)",
301  flv_codecid >> FLV_AUDIO_CODECID_OFFSET);
302  apar->codec_tag = flv_codecid >> FLV_AUDIO_CODECID_OFFSET;
303  }
304 }
305 
306 static int flv_same_video_codec(AVCodecParameters *vpar, uint32_t flv_codecid)
307 {
308  if (!vpar->codec_id && !vpar->codec_tag)
309  return 1;
310 
311  switch (flv_codecid) {
312  case MKBETAG('h', 'v', 'c', '1'):
313  return vpar->codec_id == AV_CODEC_ID_HEVC;
314  case MKBETAG('a', 'v', '0', '1'):
315  return vpar->codec_id == AV_CODEC_ID_AV1;
316  case MKBETAG('v', 'p', '0', '9'):
317  return vpar->codec_id == AV_CODEC_ID_VP9;
318  case FLV_CODECID_H263:
319  return vpar->codec_id == AV_CODEC_ID_FLV1;
320  case FLV_CODECID_SCREEN:
321  return vpar->codec_id == AV_CODEC_ID_FLASHSV;
322  case FLV_CODECID_SCREEN2:
323  return vpar->codec_id == AV_CODEC_ID_FLASHSV2;
324  case FLV_CODECID_VP6:
325  return vpar->codec_id == AV_CODEC_ID_VP6F;
326  case FLV_CODECID_VP6A:
327  return vpar->codec_id == AV_CODEC_ID_VP6A;
328  case FLV_CODECID_H264:
329  return vpar->codec_id == AV_CODEC_ID_H264;
330  default:
331  return vpar->codec_tag == flv_codecid;
332  }
333 }
334 
336  uint32_t flv_codecid, int read)
337 {
338  FFStream *const vstreami = ffstream(vstream);
339  int ret = 0;
340  AVCodecParameters *par = vstream->codecpar;
341  enum AVCodecID old_codec_id = vstream->codecpar->codec_id;
342 
343  switch (flv_codecid) {
344  case MKBETAG('h', 'v', 'c', '1'):
345  par->codec_id = AV_CODEC_ID_HEVC;
347  break;
348  case MKBETAG('a', 'v', '0', '1'):
349  par->codec_id = AV_CODEC_ID_AV1;
351  break;
352  case MKBETAG('v', 'p', '0', '9'):
353  par->codec_id = AV_CODEC_ID_VP9;
355  break;
356  case FLV_CODECID_H263:
357  par->codec_id = AV_CODEC_ID_FLV1;
358  break;
360  par->codec_id = AV_CODEC_ID_H263;
361  break; // Really mean it this time
362  case FLV_CODECID_SCREEN:
364  break;
365  case FLV_CODECID_SCREEN2:
367  break;
368  case FLV_CODECID_VP6:
369  par->codec_id = AV_CODEC_ID_VP6F;
370  case FLV_CODECID_VP6A:
371  if (flv_codecid == FLV_CODECID_VP6A)
372  par->codec_id = AV_CODEC_ID_VP6A;
373  if (read) {
374  if (par->extradata_size != 1) {
375  ff_alloc_extradata(par, 1);
376  }
377  if (par->extradata)
378  par->extradata[0] = avio_r8(s->pb);
379  else
380  avio_skip(s->pb, 1);
381  }
382  ret = 1; // 1 byte body size adjustment for flv_read_packet()
383  break;
384  case FLV_CODECID_H264:
385  par->codec_id = AV_CODEC_ID_H264;
387  break;
388  case FLV_CODECID_MPEG4:
390  break;
391  default:
392  avpriv_request_sample(s, "Video codec (%x)", flv_codecid);
393  par->codec_tag = flv_codecid;
394  }
395 
396  if (!vstreami->need_context_update && par->codec_id != old_codec_id) {
397  avpriv_request_sample(s, "Changing the codec id midstream");
398  return AVERROR_PATCHWELCOME;
399  }
400 
401  return ret;
402 }
403 
404 static int amf_get_string(AVIOContext *ioc, char *buffer, int buffsize)
405 {
406  int ret;
407  int length = avio_rb16(ioc);
408  if (length >= buffsize) {
409  avio_skip(ioc, length);
410  return -1;
411  }
412 
413  ret = avio_read(ioc, buffer, length);
414  if (ret < 0)
415  return ret;
416  if (ret < length)
417  return AVERROR_INVALIDDATA;
418 
419  buffer[length] = '\0';
420 
421  return length;
422 }
423 
425 {
426  FLVContext *flv = s->priv_data;
427  unsigned int timeslen = 0, fileposlen = 0, i;
428  char str_val[256];
429  int64_t *times = NULL;
430  int64_t *filepositions = NULL;
431  int ret = AVERROR(ENOSYS);
432  int64_t initial_pos = avio_tell(ioc);
433 
434  if (flv->keyframe_count > 0) {
435  av_log(s, AV_LOG_DEBUG, "keyframes have been parsed\n");
436  return 0;
437  }
438  av_assert0(!flv->keyframe_times);
440 
441  if (s->flags & AVFMT_FLAG_IGNIDX)
442  return 0;
443 
444  while (avio_tell(ioc) < max_pos - 2 &&
445  amf_get_string(ioc, str_val, sizeof(str_val)) > 0) {
446  int64_t **current_array;
447  unsigned int arraylen;
448  int factor;
449 
450  // Expect array object in context
451  if (avio_r8(ioc) != AMF_DATA_TYPE_ARRAY)
452  break;
453 
454  arraylen = avio_rb32(ioc);
455  if (arraylen>>28)
456  break;
457 
458  if (!strcmp(KEYFRAMES_TIMESTAMP_TAG , str_val) && !times) {
459  current_array = &times;
460  timeslen = arraylen;
461  factor = 1000;
462  } else if (!strcmp(KEYFRAMES_BYTEOFFSET_TAG, str_val) &&
463  !filepositions) {
464  current_array = &filepositions;
465  fileposlen = arraylen;
466  factor = 1;
467  } else
468  // unexpected metatag inside keyframes, will not use such
469  // metadata for indexing
470  break;
471 
472  if (!(*current_array = av_mallocz(sizeof(**current_array) * arraylen))) {
473  ret = AVERROR(ENOMEM);
474  goto finish;
475  }
476 
477  for (i = 0; i < arraylen && avio_tell(ioc) < max_pos - 1; i++) {
478  double d;
479  if (avio_r8(ioc) != AMF_DATA_TYPE_NUMBER)
480  goto invalid;
481  d = av_int2double(avio_rb64(ioc)) * factor;
482  if (isnan(d) || d < INT64_MIN || d > INT64_MAX)
483  goto invalid;
484  if (avio_feof(ioc))
485  goto invalid;
486  current_array[0][i] = d;
487  }
488  if (times && filepositions) {
489  // All done, exiting at a position allowing amf_parse_object
490  // to finish parsing the object
491  ret = 0;
492  break;
493  }
494  }
495 
496  if (timeslen == fileposlen && fileposlen>1 && max_pos <= filepositions[0]) {
497  for (i = 0; i < FFMIN(2,fileposlen); i++) {
498  flv->validate_index[i].pos = filepositions[i];
499  flv->validate_index[i].dts = times[i];
500  flv->validate_count = i + 1;
501  }
502  flv->keyframe_times = times;
503  flv->keyframe_filepositions = filepositions;
504  flv->keyframe_count = timeslen;
505  times = NULL;
506  filepositions = NULL;
507  } else {
508 invalid:
509  av_log(s, AV_LOG_WARNING, "Invalid keyframes object, skipping.\n");
510  }
511 
512 finish:
513  av_freep(&times);
514  av_freep(&filepositions);
515  avio_seek(ioc, initial_pos, SEEK_SET);
516  return ret;
517 }
518 
520  AVStream *vstream, const char *key,
521  int64_t max_pos, int depth)
522 {
523  AVCodecParameters *apar, *vpar;
524  FLVContext *flv = s->priv_data;
525  AVIOContext *ioc;
526  AMFDataType amf_type;
527  char str_val[1024];
528  double num_val;
529  amf_date date;
530 
531  if (depth > MAX_DEPTH)
532  return AVERROR_PATCHWELCOME;
533 
534  num_val = 0;
535  ioc = s->pb;
536  if (avio_feof(ioc))
537  return AVERROR_EOF;
538  amf_type = avio_r8(ioc);
539 
540  switch (amf_type) {
542  num_val = av_int2double(avio_rb64(ioc));
543  break;
544  case AMF_DATA_TYPE_BOOL:
545  num_val = avio_r8(ioc);
546  break;
548  if (amf_get_string(ioc, str_val, sizeof(str_val)) < 0) {
549  av_log(s, AV_LOG_ERROR, "AMF_DATA_TYPE_STRING parsing failed\n");
550  return -1;
551  }
552  break;
554  if (key &&
555  (ioc->seekable & AVIO_SEEKABLE_NORMAL) &&
556  !strcmp(KEYFRAMES_TAG, key) && depth == 1)
557  if (parse_keyframes_index(s, ioc, max_pos) < 0)
558  av_log(s, AV_LOG_ERROR, "Keyframe index parsing failed\n");
559  else
561  while (avio_tell(ioc) < max_pos - 2 &&
562  amf_get_string(ioc, str_val, sizeof(str_val)) > 0)
563  if (amf_parse_object(s, astream, vstream, str_val, max_pos,
564  depth + 1) < 0)
565  return -1; // if we couldn't skip, bomb out.
566  if (avio_r8(ioc) != AMF_END_OF_OBJECT) {
567  av_log(s, AV_LOG_ERROR, "Missing AMF_END_OF_OBJECT in AMF_DATA_TYPE_OBJECT\n");
568  return -1;
569  }
570  break;
571  case AMF_DATA_TYPE_NULL:
574  break; // these take up no additional space
576  {
577  unsigned v;
578  avio_skip(ioc, 4); // skip 32-bit max array index
579  while (avio_tell(ioc) < max_pos - 2 &&
580  amf_get_string(ioc, str_val, sizeof(str_val)) > 0)
581  // this is the only case in which we would want a nested
582  // parse to not skip over the object
583  if (amf_parse_object(s, astream, vstream, str_val, max_pos,
584  depth + 1) < 0)
585  return -1;
586  v = avio_r8(ioc);
587  if (v != AMF_END_OF_OBJECT) {
588  av_log(s, AV_LOG_ERROR, "Missing AMF_END_OF_OBJECT in AMF_DATA_TYPE_MIXEDARRAY, found %d\n", v);
589  return -1;
590  }
591  break;
592  }
593  case AMF_DATA_TYPE_ARRAY:
594  {
595  unsigned int arraylen, i;
596 
597  arraylen = avio_rb32(ioc);
598  for (i = 0; i < arraylen && avio_tell(ioc) < max_pos - 1; i++)
600  depth + 1) < 0)
601  return -1; // if we couldn't skip, bomb out.
602  }
603  break;
604  case AMF_DATA_TYPE_DATE:
605  // timestamp (double) and UTC offset (int16)
606  date.milliseconds = av_int2double(avio_rb64(ioc));
607  date.timezone = avio_rb16(ioc);
608  break;
609  default: // unsupported type, we couldn't skip
610  av_log(s, AV_LOG_ERROR, "unsupported amf type %d\n", amf_type);
611  return -1;
612  }
613 
614  if (key) {
615  apar = astream ? astream->codecpar : NULL;
616  vpar = vstream ? vstream->codecpar : NULL;
617 
618  // stream info doesn't live any deeper than the first object
619  if (depth == 1) {
620  if (amf_type == AMF_DATA_TYPE_NUMBER ||
621  amf_type == AMF_DATA_TYPE_BOOL) {
622  if (!strcmp(key, "duration"))
623  s->duration = num_val * AV_TIME_BASE;
624  else if (!strcmp(key, "videodatarate") &&
625  0 <= (int)(num_val * 1024.0))
626  flv->video_bit_rate = num_val * 1024.0;
627  else if (!strcmp(key, "audiodatarate") &&
628  0 <= (int)(num_val * 1024.0))
629  flv->audio_bit_rate = num_val * 1024.0;
630  else if (!strcmp(key, "datastream")) {
632  if (!st)
633  return AVERROR(ENOMEM);
635  } else if (!strcmp(key, "framerate")) {
636  flv->framerate = av_d2q(num_val, 1000);
637  if (vstream)
638  vstream->avg_frame_rate = flv->framerate;
639  } else if (flv->trust_metadata) {
640  if (!strcmp(key, "videocodecid") && vpar) {
641  int ret = flv_set_video_codec(s, vstream, num_val, 0);
642  if (ret < 0)
643  return ret;
644  } else if (!strcmp(key, "audiocodecid") && apar) {
645  int id = ((int)num_val) << FLV_AUDIO_CODECID_OFFSET;
646  flv_set_audio_codec(s, astream, apar, id);
647  } else if (!strcmp(key, "audiosamplerate") && apar) {
648  apar->sample_rate = num_val;
649  } else if (!strcmp(key, "audiosamplesize") && apar) {
650  apar->bits_per_coded_sample = num_val;
651  } else if (!strcmp(key, "stereo") && apar) {
652  av_channel_layout_default(&apar->ch_layout, num_val + 1);
653  } else if (!strcmp(key, "width") && vpar) {
654  vpar->width = num_val;
655  } else if (!strcmp(key, "height") && vpar) {
656  vpar->height = num_val;
657  }
658  }
659  }
660  if (amf_type == AMF_DATA_TYPE_STRING) {
661  if (!strcmp(key, "encoder")) {
662  int version = -1;
663  if (1 == sscanf(str_val, "Open Broadcaster Software v0.%d", &version)) {
664  if (version > 0 && version <= 655)
665  flv->broken_sizes = 1;
666  }
667  } else if (!strcmp(key, "metadatacreator")) {
668  if ( !strcmp (str_val, "MEGA")
669  || !strncmp(str_val, "FlixEngine", 10))
670  flv->broken_sizes = 1;
671  }
672  }
673  }
674 
675  if (amf_type == AMF_DATA_TYPE_OBJECT && s->nb_streams == 1 &&
676  ((!apar && !strcmp(key, "audiocodecid")) ||
677  (!vpar && !strcmp(key, "videocodecid"))))
678  s->ctx_flags &= ~AVFMTCTX_NOHEADER; //If there is either audio/video missing, codecid will be an empty object
679 
680  if ((!strcmp(key, "duration") ||
681  !strcmp(key, "filesize") ||
682  !strcmp(key, "width") ||
683  !strcmp(key, "height") ||
684  !strcmp(key, "videodatarate") ||
685  !strcmp(key, "framerate") ||
686  !strcmp(key, "videocodecid") ||
687  !strcmp(key, "audiodatarate") ||
688  !strcmp(key, "audiosamplerate") ||
689  !strcmp(key, "audiosamplesize") ||
690  !strcmp(key, "stereo") ||
691  !strcmp(key, "audiocodecid") ||
692  !strcmp(key, "datastream")) && !flv->dump_full_metadata)
693  return 0;
694 
695  s->event_flags |= AVFMT_EVENT_FLAG_METADATA_UPDATED;
696  if (amf_type == AMF_DATA_TYPE_BOOL) {
697  av_strlcpy(str_val, num_val > 0 ? "true" : "false",
698  sizeof(str_val));
699  av_dict_set(&s->metadata, key, str_val, 0);
700  } else if (amf_type == AMF_DATA_TYPE_NUMBER) {
701  snprintf(str_val, sizeof(str_val), "%.f", num_val);
702  av_dict_set(&s->metadata, key, str_val, 0);
703  } else if (amf_type == AMF_DATA_TYPE_STRING) {
704  av_dict_set(&s->metadata, key, str_val, 0);
705  } else if ( amf_type == AMF_DATA_TYPE_DATE
706  && isfinite(date.milliseconds)
707  && date.milliseconds > INT64_MIN/1000
708  && date.milliseconds < INT64_MAX/1000
709  ) {
710  // timezone is ignored, since there is no easy way to offset the UTC
711  // timestamp into the specified timezone
712  avpriv_dict_set_timestamp(&s->metadata, key, 1000 * (int64_t)date.milliseconds);
713  }
714  }
715 
716  return 0;
717 }
718 
719 #define TYPE_ONTEXTDATA 1
720 #define TYPE_ONCAPTION 2
721 #define TYPE_ONCAPTIONINFO 3
722 #define TYPE_UNKNOWN 9
723 
724 static int flv_read_metabody(AVFormatContext *s, int64_t next_pos)
725 {
726  FLVContext *flv = s->priv_data;
728  AVStream *stream, *astream, *vstream;
729  AVStream av_unused *dstream;
730  AVIOContext *ioc;
731  int i;
732  char buffer[32];
733 
734  astream = NULL;
735  vstream = NULL;
736  dstream = NULL;
737  ioc = s->pb;
738 
739  // first object needs to be "onMetaData" string
740  type = avio_r8(ioc);
741  if (type != AMF_DATA_TYPE_STRING ||
742  amf_get_string(ioc, buffer, sizeof(buffer)) < 0)
743  return TYPE_UNKNOWN;
744 
745  if (!strcmp(buffer, "onTextData"))
746  return TYPE_ONTEXTDATA;
747 
748  if (!strcmp(buffer, "onCaption"))
749  return TYPE_ONCAPTION;
750 
751  if (!strcmp(buffer, "onCaptionInfo"))
752  return TYPE_ONCAPTIONINFO;
753 
754  if (strcmp(buffer, "onMetaData") && strcmp(buffer, "onCuePoint") && strcmp(buffer, "|RtmpSampleAccess")) {
755  av_log(s, AV_LOG_DEBUG, "Unknown type %s\n", buffer);
756  return TYPE_UNKNOWN;
757  }
758 
759  // find the streams now so that amf_parse_object doesn't need to do
760  // the lookup every time it is called.
761  for (i = 0; i < s->nb_streams; i++) {
762  stream = s->streams[i];
763  if (stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
764  vstream = stream;
766  } else if (stream->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
767  astream = stream;
768  if (flv->last_keyframe_stream_index == -1)
770  } else if (stream->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE)
771  dstream = stream;
772  }
773 
774  // parse the second object (we want a mixed array)
775  if (amf_parse_object(s, astream, vstream, buffer, next_pos, 0) < 0)
776  return -1;
777 
778  return 0;
779 }
780 
782 {
783  int flags;
784  FLVContext *flv = s->priv_data;
785  int offset;
786  int pre_tag_size = 0;
787 
788  /* Actual FLV data at 0xe40000 in KUX file */
789  if(!strcmp(s->iformat->name, "kux"))
790  avio_skip(s->pb, 0xe40000);
791 
792  avio_skip(s->pb, 4);
793  flags = avio_r8(s->pb);
794 
796 
797  s->ctx_flags |= AVFMTCTX_NOHEADER;
798 
799  offset = avio_rb32(s->pb);
800  avio_seek(s->pb, offset, SEEK_SET);
801 
802  /* Annex E. The FLV File Format
803  * E.3 TheFLVFileBody
804  * Field Type Comment
805  * PreviousTagSize0 UI32 Always 0
806  * */
807  pre_tag_size = avio_rb32(s->pb);
808  if (pre_tag_size) {
809  av_log(s, AV_LOG_WARNING, "Read FLV header error, input file is not a standard flv format, first PreviousTagSize0 always is 0\n");
810  }
811 
812  s->start_time = 0;
813  flv->sum_flv_tag_size = 0;
814  flv->last_keyframe_stream_index = -1;
815 
816  return 0;
817 }
818 
820 {
821  int i;
822  FLVContext *flv = s->priv_data;
823  for (i=0; i<FLV_STREAM_TYPE_NB; i++)
824  av_freep(&flv->new_extradata[i]);
825  av_freep(&flv->keyframe_times);
827  return 0;
828 }
829 
831 {
832  int ret;
833  if (!size)
834  return 0;
835 
836  if ((ret = ff_get_extradata(s, st->codecpar, s->pb, size)) < 0)
837  return ret;
838  ffstream(st)->need_context_update = 1;
839  return 0;
840 }
841 
842 static int flv_queue_extradata(FLVContext *flv, AVIOContext *pb, int stream,
843  int size)
844 {
845  if (!size)
846  return 0;
847 
848  av_free(flv->new_extradata[stream]);
849  flv->new_extradata[stream] = av_mallocz(size +
851  if (!flv->new_extradata[stream])
852  return AVERROR(ENOMEM);
853  flv->new_extradata_size[stream] = size;
854  avio_read(pb, flv->new_extradata[stream], size);
855  return 0;
856 }
857 
858 static void clear_index_entries(AVFormatContext *s, int64_t pos)
859 {
861  "Found invalid index entries, clearing the index.\n");
862  for (unsigned i = 0; i < s->nb_streams; i++) {
863  FFStream *const sti = ffstream(s->streams[i]);
864  int out = 0;
865  /* Remove all index entries that point to >= pos */
866  for (int j = 0; j < sti->nb_index_entries; j++)
867  if (sti->index_entries[j].pos < pos)
868  sti->index_entries[out++] = sti->index_entries[j];
869  sti->nb_index_entries = out;
870  }
871 }
872 
873 static int amf_skip_tag(AVIOContext *pb, AMFDataType type, int depth)
874 {
875  int nb = -1, ret, parse_name = 1;
876 
877  if (depth > MAX_DEPTH)
878  return AVERROR_PATCHWELCOME;
879 
880  if (avio_feof(pb))
881  return AVERROR_EOF;
882 
883  switch (type) {
885  avio_skip(pb, 8);
886  break;
887  case AMF_DATA_TYPE_BOOL:
888  avio_skip(pb, 1);
889  break;
891  avio_skip(pb, avio_rb16(pb));
892  break;
893  case AMF_DATA_TYPE_ARRAY:
894  parse_name = 0;
896  nb = avio_rb32(pb);
897  if (nb < 0)
898  return AVERROR_INVALIDDATA;
900  while(!pb->eof_reached && (nb-- > 0 || type != AMF_DATA_TYPE_ARRAY)) {
901  if (parse_name) {
902  int size = avio_rb16(pb);
903  if (!size) {
904  avio_skip(pb, 1);
905  break;
906  }
907  avio_skip(pb, size);
908  }
909  if ((ret = amf_skip_tag(pb, avio_r8(pb), depth + 1)) < 0)
910  return ret;
911  }
912  break;
913  case AMF_DATA_TYPE_NULL:
915  break;
916  default:
917  return AVERROR_INVALIDDATA;
918  }
919  return 0;
920 }
921 
923  int64_t dts, int64_t next)
924 {
925  AVIOContext *pb = s->pb;
926  AVStream *st = NULL;
927  char buf[20];
928  int ret = AVERROR_INVALIDDATA;
929  int i, length = -1;
930  int array = 0;
931 
932  switch (avio_r8(pb)) {
933  case AMF_DATA_TYPE_ARRAY:
934  array = 1;
936  avio_seek(pb, 4, SEEK_CUR);
938  break;
939  default:
940  goto skip;
941  }
942 
943  while (array || (ret = amf_get_string(pb, buf, sizeof(buf))) > 0) {
944  AMFDataType type = avio_r8(pb);
945  if (type == AMF_DATA_TYPE_STRING && (array || !strcmp(buf, "text"))) {
946  length = avio_rb16(pb);
947  ret = av_get_packet(pb, pkt, length);
948  if (ret < 0)
949  goto skip;
950  else
951  break;
952  } else {
953  if ((ret = amf_skip_tag(pb, type, 0)) < 0)
954  goto skip;
955  }
956  }
957 
958  if (length < 0) {
960  goto skip;
961  }
962 
963  for (i = 0; i < s->nb_streams; i++) {
964  st = s->streams[i];
966  break;
967  }
968 
969  if (i == s->nb_streams) {
971  if (!st)
972  return AVERROR(ENOMEM);
974  }
975 
976  pkt->dts = dts;
977  pkt->pts = dts;
978  pkt->size = ret;
979 
980  pkt->stream_index = st->index;
982 
983 skip:
984  avio_seek(s->pb, next + 4, SEEK_SET);
985 
986  return ret;
987 }
988 
990 {
991  FLVContext *flv = s->priv_data;
992  int64_t i;
993  int64_t pos = avio_tell(s->pb);
994 
995  for (i=0; !avio_feof(s->pb); i++) {
996  int j = i & (RESYNC_BUFFER_SIZE-1);
997  int j1 = j + RESYNC_BUFFER_SIZE;
998  flv->resync_buffer[j ] =
999  flv->resync_buffer[j1] = avio_r8(s->pb);
1000 
1001  if (i >= 8 && pos) {
1002  uint8_t *d = flv->resync_buffer + j1 - 8;
1003  if (d[0] == 'F' &&
1004  d[1] == 'L' &&
1005  d[2] == 'V' &&
1006  d[3] < 5 && d[5] == 0) {
1007  av_log(s, AV_LOG_WARNING, "Concatenated FLV detected, might fail to demux, decode and seek %"PRId64"\n", flv->last_ts);
1008  flv->time_offset = flv->last_ts + 1;
1009  flv->time_pos = avio_tell(s->pb);
1010  }
1011  }
1012 
1013  if (i > 22) {
1014  unsigned lsize2 = AV_RB32(flv->resync_buffer + j1 - 4);
1015  if (lsize2 >= 11 && lsize2 + 8LL < FFMIN(i, RESYNC_BUFFER_SIZE)) {
1016  unsigned size2 = AV_RB24(flv->resync_buffer + j1 - lsize2 + 1 - 4);
1017  unsigned lsize1 = AV_RB32(flv->resync_buffer + j1 - lsize2 - 8);
1018  if (lsize1 >= 11 && lsize1 + 8LL + lsize2 < FFMIN(i, RESYNC_BUFFER_SIZE)) {
1019  unsigned size1 = AV_RB24(flv->resync_buffer + j1 - lsize1 + 1 - lsize2 - 8);
1020  if (size1 == lsize1 - 11 && size2 == lsize2 - 11) {
1021  avio_seek(s->pb, pos + i - lsize1 - lsize2 - 8, SEEK_SET);
1022  return 1;
1023  }
1024  }
1025  }
1026  }
1027  }
1028  return AVERROR_EOF;
1029 }
1030 
1032 {
1033  FLVContext *flv = s->priv_data;
1034  int ret, i, size, flags;
1035  enum FlvTagType type;
1036  int stream_type=-1;
1037  int64_t next, pos, meta_pos;
1038  int64_t dts, pts = AV_NOPTS_VALUE;
1039  int av_uninit(channels);
1040  int av_uninit(sample_rate);
1041  AVStream *st = NULL;
1042  int last = -1;
1043  int orig_size;
1044  int enhanced_flv = 0;
1045  uint32_t video_codec_id = 0;
1046 
1047 retry:
1048  /* pkt size is repeated at end. skip it */
1049  pos = avio_tell(s->pb);
1050  type = (avio_r8(s->pb) & 0x1F);
1051  orig_size =
1052  size = avio_rb24(s->pb);
1053  flv->sum_flv_tag_size += size + 11LL;
1054  dts = avio_rb24(s->pb);
1055  dts |= (unsigned)avio_r8(s->pb) << 24;
1056  av_log(s, AV_LOG_TRACE, "type:%d, size:%d, last:%d, dts:%"PRId64" pos:%"PRId64"\n", type, size, last, dts, avio_tell(s->pb));
1057  if (avio_feof(s->pb))
1058  return AVERROR_EOF;
1059  avio_skip(s->pb, 3); /* stream id, always 0 */
1060  flags = 0;
1061 
1062  if (flv->validate_next < flv->validate_count) {
1063  int64_t validate_pos = flv->validate_index[flv->validate_next].pos;
1064  if (pos == validate_pos) {
1065  if (FFABS(dts - flv->validate_index[flv->validate_next].dts) <=
1067  flv->validate_next++;
1068  } else {
1069  clear_index_entries(s, validate_pos);
1070  flv->validate_count = 0;
1071  }
1072  } else if (pos > validate_pos) {
1073  clear_index_entries(s, validate_pos);
1074  flv->validate_count = 0;
1075  }
1076  }
1077 
1078  if (size == 0) {
1079  ret = FFERROR_REDO;
1080  goto leave;
1081  }
1082 
1083  next = size + avio_tell(s->pb);
1084 
1085  if (type == FLV_TAG_TYPE_AUDIO) {
1086  stream_type = FLV_STREAM_TYPE_AUDIO;
1087  flags = avio_r8(s->pb);
1088  size--;
1089  } else if (type == FLV_TAG_TYPE_VIDEO) {
1090  stream_type = FLV_STREAM_TYPE_VIDEO;
1091  flags = avio_r8(s->pb);
1092  video_codec_id = flags & FLV_VIDEO_CODECID_MASK;
1093  /*
1094  * Reference Enhancing FLV 2023-03-v1.0.0-B.8
1095  * https://github.com/veovera/enhanced-rtmp/blob/main/enhanced-rtmp-v1.pdf
1096  * */
1097  enhanced_flv = (flags >> 7) & 1;
1098  size--;
1099  if (enhanced_flv) {
1100  video_codec_id = avio_rb32(s->pb);
1101  size -= 4;
1102  }
1104  goto skip;
1105  } else if (type == FLV_TAG_TYPE_META) {
1106  stream_type=FLV_STREAM_TYPE_SUBTITLE;
1107  if (size > 13 + 1 + 4) { // Header-type metadata stuff
1108  int type;
1109  meta_pos = avio_tell(s->pb);
1110  type = flv_read_metabody(s, next);
1111  if (type == 0 && dts == 0 || type < 0) {
1112  if (type < 0 && flv->validate_count &&
1113  flv->validate_index[0].pos > next &&
1114  flv->validate_index[0].pos - 4 < next) {
1115  av_log(s, AV_LOG_WARNING, "Adjusting next position due to index mismatch\n");
1116  next = flv->validate_index[0].pos - 4;
1117  }
1118  goto skip;
1119  } else if (type == TYPE_ONTEXTDATA) {
1120  avpriv_request_sample(s, "OnTextData packet");
1121  return flv_data_packet(s, pkt, dts, next);
1122  } else if (type == TYPE_ONCAPTION) {
1123  return flv_data_packet(s, pkt, dts, next);
1124  } else if (type == TYPE_UNKNOWN) {
1125  stream_type = FLV_STREAM_TYPE_DATA;
1126  }
1127  avio_seek(s->pb, meta_pos, SEEK_SET);
1128  }
1129  } else {
1131  "Skipping flv packet: type %d, size %d, flags %d.\n",
1132  type, size, flags);
1133 skip:
1134  if (avio_seek(s->pb, next, SEEK_SET) != next) {
1135  // This can happen if flv_read_metabody above read past
1136  // next, on a non-seekable input, and the preceding data has
1137  // been flushed out from the IO buffer.
1138  av_log(s, AV_LOG_ERROR, "Unable to seek to the next packet\n");
1139  return AVERROR_INVALIDDATA;
1140  }
1141  ret = FFERROR_REDO;
1142  goto leave;
1143  }
1144 
1145  /* skip empty data packets */
1146  if (!size) {
1147  ret = FFERROR_REDO;
1148  goto leave;
1149  }
1150 
1151  /* now find stream */
1152  for (i = 0; i < s->nb_streams; i++) {
1153  st = s->streams[i];
1154  if (stream_type == FLV_STREAM_TYPE_AUDIO) {
1155  if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO &&
1156  (s->audio_codec_id || flv_same_audio_codec(st->codecpar, flags)))
1157  break;
1158  } else if (stream_type == FLV_STREAM_TYPE_VIDEO) {
1159  if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
1160  (s->video_codec_id || flv_same_video_codec(st->codecpar, video_codec_id)))
1161  break;
1162  } else if (stream_type == FLV_STREAM_TYPE_SUBTITLE) {
1164  break;
1165  } else if (stream_type == FLV_STREAM_TYPE_DATA) {
1167  break;
1168  }
1169  }
1170  if (i == s->nb_streams) {
1172  st = create_stream(s, stream_types[stream_type]);
1173  if (!st)
1174  return AVERROR(ENOMEM);
1175  }
1176  av_log(s, AV_LOG_TRACE, "%d %X %d \n", stream_type, flags, st->discard);
1177 
1178  if (flv->time_pos <= pos) {
1179  dts += flv->time_offset;
1180  }
1181 
1182  if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) &&
1184  stream_type == FLV_STREAM_TYPE_AUDIO))
1186 
1187  if ((st->discard >= AVDISCARD_NONKEY && !((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY || stream_type == FLV_STREAM_TYPE_AUDIO)) ||
1189  st->discard >= AVDISCARD_ALL) {
1190  avio_seek(s->pb, next, SEEK_SET);
1191  ret = FFERROR_REDO;
1192  goto leave;
1193  }
1194 
1195  // if not streamed and no duration from metadata then seek to end to find
1196  // the duration from the timestamps
1197  if ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) &&
1198  (!s->duration || s->duration == AV_NOPTS_VALUE) &&
1199  !flv->searched_for_end) {
1200  int size;
1201  const int64_t pos = avio_tell(s->pb);
1202  // Read the last 4 bytes of the file, this should be the size of the
1203  // previous FLV tag. Use the timestamp of its payload as duration.
1204  int64_t fsize = avio_size(s->pb);
1205 retry_duration:
1206  avio_seek(s->pb, fsize - 4, SEEK_SET);
1207  size = avio_rb32(s->pb);
1208  if (size > 0 && size < fsize) {
1209  // Seek to the start of the last FLV tag at position (fsize - 4 - size)
1210  // but skip the byte indicating the type.
1211  avio_seek(s->pb, fsize - 3 - size, SEEK_SET);
1212  if (size == avio_rb24(s->pb) + 11) {
1213  uint32_t ts = avio_rb24(s->pb);
1214  ts |= (unsigned)avio_r8(s->pb) << 24;
1215  if (ts)
1216  s->duration = ts * (int64_t)AV_TIME_BASE / 1000;
1217  else if (fsize >= 8 && fsize - 8 >= size) {
1218  fsize -= size+4;
1219  goto retry_duration;
1220  }
1221  }
1222  }
1223 
1224  avio_seek(s->pb, pos, SEEK_SET);
1225  flv->searched_for_end = 1;
1226  }
1227 
1228  if (stream_type == FLV_STREAM_TYPE_AUDIO) {
1229  int bits_per_coded_sample;
1231  sample_rate = 44100 << ((flags & FLV_AUDIO_SAMPLERATE_MASK) >>
1233  bits_per_coded_sample = (flags & FLV_AUDIO_SAMPLESIZE_MASK) ? 16 : 8;
1235  !st->codecpar->sample_rate ||
1239  st->codecpar->bits_per_coded_sample = bits_per_coded_sample;
1240  }
1241  if (!st->codecpar->codec_id) {
1242  flv_set_audio_codec(s, st, st->codecpar,
1244  flv->last_sample_rate =
1246  flv->last_channels =
1248  } else {
1250  if (!par) {
1251  ret = AVERROR(ENOMEM);
1252  goto leave;
1253  }
1254  par->sample_rate = sample_rate;
1255  par->bits_per_coded_sample = bits_per_coded_sample;
1257  sample_rate = par->sample_rate;
1259  }
1260  } else if (stream_type == FLV_STREAM_TYPE_VIDEO) {
1261  int ret = flv_set_video_codec(s, st, video_codec_id, 1);
1262  if (ret < 0)
1263  return ret;
1264  size -= ret;
1265  } else if (stream_type == FLV_STREAM_TYPE_SUBTITLE) {
1267  } else if (stream_type == FLV_STREAM_TYPE_DATA) {
1268  st->codecpar->codec_id = AV_CODEC_ID_NONE; // Opaque AMF data
1269  }
1270 
1271  if (st->codecpar->codec_id == AV_CODEC_ID_AAC ||
1275  st->codecpar->codec_id == AV_CODEC_ID_AV1 ||
1276  st->codecpar->codec_id == AV_CODEC_ID_VP9) {
1277  int type = 0;
1278  if (enhanced_flv && stream_type == FLV_STREAM_TYPE_VIDEO) {
1279  type = flags & 0x0F;
1280  } else {
1281  type = avio_r8(s->pb);
1282  size--;
1283  }
1284 
1285  if (size < 0) {
1287  goto leave;
1288  }
1289 
1292  // sign extension
1293  int32_t cts = (avio_rb24(s->pb) + 0xff800000) ^ 0xff800000;
1294  pts = av_sat_add64(dts, cts);
1295  if (cts < 0) { // dts might be wrong
1296  if (!flv->wrong_dts)
1298  "Negative cts, previous timestamps might be wrong.\n");
1299  flv->wrong_dts = 1;
1300  } else if (FFABS(dts - pts) > 1000*60*15) {
1302  "invalid timestamps %"PRId64" %"PRId64"\n", dts, pts);
1303  dts = pts = AV_NOPTS_VALUE;
1304  }
1305  size -= 3;
1306  }
1307  if (type == 0 && (!st->codecpar->extradata || st->codecpar->codec_id == AV_CODEC_ID_AAC ||
1310  AVDictionaryEntry *t;
1311 
1312  if (st->codecpar->extradata) {
1313  if ((ret = flv_queue_extradata(flv, s->pb, stream_type, size)) < 0)
1314  return ret;
1315  ret = FFERROR_REDO;
1316  goto leave;
1317  }
1318  if ((ret = flv_get_extradata(s, st, size)) < 0)
1319  return ret;
1320 
1321  /* Workaround for buggy Omnia A/XE encoder */
1322  t = av_dict_get(s->metadata, "Encoder", NULL, 0);
1323  if (st->codecpar->codec_id == AV_CODEC_ID_AAC && t && !strcmp(t->value, "Omnia A/XE"))
1324  st->codecpar->extradata_size = 2;
1325 
1326  ret = FFERROR_REDO;
1327  goto leave;
1328  }
1329  }
1330 
1331  /* skip empty data packets */
1332  if (!size) {
1333  ret = FFERROR_REDO;
1334  goto leave;
1335  }
1336 
1337  ret = av_get_packet(s->pb, pkt, size);
1338  if (ret < 0)
1339  return ret;
1340  pkt->dts = dts;
1341  pkt->pts = pts == AV_NOPTS_VALUE ? dts : pts;
1342  pkt->stream_index = st->index;
1343  pkt->pos = pos;
1344  if (flv->new_extradata[stream_type]) {
1346  flv->new_extradata[stream_type],
1347  flv->new_extradata_size[stream_type]);
1348  if (ret >= 0) {
1349  flv->new_extradata[stream_type] = NULL;
1350  flv->new_extradata_size[stream_type] = 0;
1351  }
1352  }
1353  if (stream_type == FLV_STREAM_TYPE_AUDIO &&
1354  (sample_rate != flv->last_sample_rate ||
1355  channels != flv->last_channels)) {
1357  flv->last_channels = channels;
1359  }
1360 
1361  if (stream_type == FLV_STREAM_TYPE_AUDIO ||
1363  stream_type == FLV_STREAM_TYPE_SUBTITLE ||
1364  stream_type == FLV_STREAM_TYPE_DATA)
1366 
1367 leave:
1368  last = avio_rb32(s->pb);
1369  if (!flv->trust_datasize) {
1370  if (last != orig_size + 11 && last != orig_size + 10 &&
1371  !avio_feof(s->pb) &&
1372  (last != orig_size || !last) && last != flv->sum_flv_tag_size &&
1373  !flv->broken_sizes) {
1374  av_log(s, AV_LOG_ERROR, "Packet mismatch %d %d %"PRId64"\n", last, orig_size + 11, flv->sum_flv_tag_size);
1375  avio_seek(s->pb, pos + 1, SEEK_SET);
1376  ret = resync(s);
1378  if (ret >= 0) {
1379  goto retry;
1380  }
1381  }
1382  }
1383 
1384  if (ret >= 0)
1385  flv->last_ts = pkt->dts;
1386 
1387  return ret;
1388 }
1389 
1390 static int flv_read_seek(AVFormatContext *s, int stream_index,
1391  int64_t ts, int flags)
1392 {
1393  FLVContext *flv = s->priv_data;
1394  flv->validate_count = 0;
1395  return avio_seek_time(s->pb, stream_index, ts, flags);
1396 }
1397 
1398 #define OFFSET(x) offsetof(FLVContext, x)
1399 #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
1400 static const AVOption options[] = {
1401  { "flv_metadata", "Allocate streams according to the onMetaData array", OFFSET(trust_metadata), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD },
1402  { "flv_full_metadata", "Dump full metadata of the onMetadata", OFFSET(dump_full_metadata), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD },
1403  { "flv_ignore_prevtag", "Ignore the Size of previous tag", OFFSET(trust_datasize), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD },
1404  { "missing_streams", "", OFFSET(missing_streams), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 0xFF, VD | AV_OPT_FLAG_EXPORT | AV_OPT_FLAG_READONLY },
1405  { NULL }
1406 };
1407 
1408 static const AVClass flv_kux_class = {
1409  .class_name = "(live) flv/kux demuxer",
1410  .item_name = av_default_item_name,
1411  .option = options,
1412  .version = LIBAVUTIL_VERSION_INT,
1413 };
1414 
1416  .name = "flv",
1417  .long_name = NULL_IF_CONFIG_SMALL("FLV (Flash Video)"),
1418  .priv_data_size = sizeof(FLVContext),
1419  .read_probe = flv_probe,
1424  .extensions = "flv",
1425  .priv_class = &flv_kux_class,
1426 };
1427 
1429  .name = "live_flv",
1430  .long_name = NULL_IF_CONFIG_SMALL("live RTMP FLV (Flash Video)"),
1431  .priv_data_size = sizeof(FLVContext),
1437  .extensions = "flv",
1438  .priv_class = &flv_kux_class,
1440 };
1441 
1443  .name = "kux",
1444  .long_name = NULL_IF_CONFIG_SMALL("KUX (YouKu)"),
1445  .priv_data_size = sizeof(FLVContext),
1446  .read_probe = kux_probe,
1451  .extensions = "kux",
1452  .priv_class = &flv_kux_class,
1453 };
AV_CODEC_ID_PCM_S16LE
@ AV_CODEC_ID_PCM_S16LE
Definition: codec_id.h:330
FLVContext::audio_bit_rate
int64_t audio_bit_rate
Definition: flvdec.c:74
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: avpacket.c:423
FLV_FRAME_DISP_INTER
@ FLV_FRAME_DISP_INTER
disposable inter frame (H.263 only)
Definition: flv.h:133
AMF_DATA_TYPE_OBJECT_END
@ AMF_DATA_TYPE_OBJECT_END
Definition: flv.h:147
AMF_END_OF_OBJECT
#define AMF_END_OF_OBJECT
Definition: flv.h:53
AVMEDIA_TYPE_SUBTITLE
@ AVMEDIA_TYPE_SUBTITLE
Definition: avutil.h:204
AV_CODEC_ID_VP6F
@ AV_CODEC_ID_VP6F
Definition: codec_id.h:144
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
AVCodecParameters::extradata
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
Definition: codec_par.h:69
FLV_TAG_TYPE_VIDEO
@ FLV_TAG_TYPE_VIDEO
Definition: flv.h:67
FLVContext::pos
int64_t pos
Definition: flvdec.c:60
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame 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. Frame references ownership and permissions
opt.h
AV_OPT_FLAG_READONLY
#define AV_OPT_FLAG_READONLY
The option may not be set through the AVOptions API, only read.
Definition: opt.h:294
AVCodecParameters::codec_type
enum AVMediaType codec_type
General type of the encoded data.
Definition: codec_par.h:51
FLV_FRAME_KEY
@ FLV_FRAME_KEY
key frame (for AVC, a seekable frame)
Definition: flv.h:131
clear_index_entries
static void clear_index_entries(AVFormatContext *s, int64_t pos)
Definition: flvdec.c:858
FLVContext::validate_next
int validate_next
Definition: flvdec.c:62
out
FILE * out
Definition: movenc.c:54
AVCodecParameters
This struct describes the properties of an encoded stream.
Definition: codec_par.h:47
AVFMT_FLAG_IGNIDX
#define AVFMT_FLAG_IGNIDX
Ignore index.
Definition: avformat.h:1235
avformat_new_stream
AVStream * avformat_new_stream(AVFormatContext *s, const struct AVCodec *c)
Add a new stream to a media file.
AV_PKT_DATA_NEW_EXTRADATA
@ AV_PKT_DATA_NEW_EXTRADATA
The AV_PKT_DATA_NEW_EXTRADATA is used to notify the codec or the format that the extradata buffer was...
Definition: packet.h:56
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:57
AVStream::discard
enum AVDiscard discard
Selects which packets can be discarded at will and do not need to be demuxed.
Definition: avformat.h:912
av_int2double
static av_always_inline double av_int2double(uint64_t i)
Reinterpret a 64-bit integer as a double.
Definition: intfloat.h:60
TYPE_ONCAPTIONINFO
#define TYPE_ONCAPTIONINFO
Definition: flvdec.c:721
flv_data_packet
static int flv_data_packet(AVFormatContext *s, AVPacket *pkt, int64_t dts, int64_t next)
Definition: flvdec.c:922
FLV_CODECID_VP6A
@ FLV_CODECID_VP6A
Definition: flv.h:114
dict_internal.h
av_unused
#define av_unused
Definition: attributes.h:131
AV_CODEC_ID_MPEG4
@ AV_CODEC_ID_MPEG4
Definition: codec_id.h:64
FLVContext::time_offset
int64_t time_offset
Definition: flvdec.c:80
FLVContext::trust_metadata
int trust_metadata
configure streams according onMetaData
Definition: flvdec.c:50
flv_read_packet
static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: flvdec.c:1031
TYPE_ONCAPTION
#define TYPE_ONCAPTION
Definition: flvdec.c:720
AVOption
AVOption.
Definition: opt.h:251
AVStream::avg_frame_rate
AVRational avg_frame_rate
Average framerate.
Definition: avformat.h:930
FLVContext::resync_buffer
uint8_t resync_buffer[2 *RESYNC_BUFFER_SIZE]
Definition: flvdec.c:66
amf_date
Definition: flvdec.c:86
AMF_DATA_TYPE_UNDEFINED
@ AMF_DATA_TYPE_UNDEFINED
Definition: flv.h:144
AMF_DATA_TYPE_DATE
@ AMF_DATA_TYPE_DATE
Definition: flv.h:149
flv_set_audio_codec
static void flv_set_audio_codec(AVFormatContext *s, AVStream *astream, AVCodecParameters *apar, int flv_codecid)
Definition: flvdec.c:246
AVCodecParameters::codec_tag
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
Definition: codec_par.h:59
mathematics.h
FLV_CODECID_MP3
@ FLV_CODECID_MP3
Definition: flv.h:99
AVProbeData::buf_size
int buf_size
Size of buf except extra allocated bytes.
Definition: avformat.h:455
FLV_CODECID_ADPCM
@ FLV_CODECID_ADPCM
Definition: flv.h:98
FLVContext::trust_datasize
int trust_datasize
trust data size of FLVTag
Definition: flvdec.c:51
AVChannelLayout::nb_channels
int nb_channels
Number of channels in this layout.
Definition: channel_layout.h:317
intfloat.h
codec_type
enum AVMediaType codec_type
Definition: rtp.c:37
AMF_DATA_TYPE_OBJECT
@ AMF_DATA_TYPE_OBJECT
Definition: flv.h:142
avio_size
int64_t avio_size(AVIOContext *s)
Get the filesize.
Definition: aviobuf.c:370
AV_PKT_FLAG_KEY
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: packet.h:546
sample_rate
sample_rate
Definition: ffmpeg_filter.c:368
options
static const AVOption options[]
Definition: flvdec.c:1400
AVINDEX_KEYFRAME
#define AVINDEX_KEYFRAME
Definition: avformat.h:708
ff_get_extradata
int ff_get_extradata(void *logctx, AVCodecParameters *par, AVIOContext *pb, int size)
Allocate extradata with additional AV_INPUT_BUFFER_PADDING_SIZE at end which is always set to 0 and f...
Definition: demux_utils.c:355
AVPROBE_SCORE_MAX
#define AVPROBE_SCORE_MAX
maximum score
Definition: avformat.h:464
FLVContext::video_bit_rate
int64_t video_bit_rate
Definition: flvdec.c:73
FLVContext::searched_for_end
int searched_for_end
Definition: flvdec.c:64
FLVContext::keyframe_times
int64_t * keyframe_times
Definition: flvdec.c:75
FLVContext::keyframe_filepositions
int64_t * keyframe_filepositions
Definition: flvdec.c:76
avpriv_set_pts_info
void avpriv_set_pts_info(AVStream *st, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
Definition: avformat.c:761
finish
static void finish(void)
Definition: movenc.c:342
OFFSET
#define OFFSET(x)
Definition: flvdec.c:1398
av_packet_add_side_data
int av_packet_add_side_data(AVPacket *pkt, enum AVPacketSideDataType type, uint8_t *data, size_t size)
Wrap an existing array as a packet side data.
Definition: avpacket.c:197
AV_CODEC_ID_SPEEX
@ AV_CODEC_ID_SPEEX
Definition: codec_id.h:477
ffstream
static av_always_inline FFStream * ffstream(AVStream *st)
Definition: internal.h:420
FLVContext::last_ts
int64_t last_ts
Definition: flvdec.c:79
AV_CODEC_ID_PCM_S16BE
@ AV_CODEC_ID_PCM_S16BE
Definition: codec_id.h:331
avio_seek_time
int64_t avio_seek_time(AVIOContext *h, int stream_index, int64_t timestamp, int flags)
Seek to a given timestamp relative to some component stream.
Definition: aviobuf.c:1352
read_seek
static int read_seek(AVFormatContext *ctx, int stream_index, int64_t timestamp, int flags)
Definition: libcdio.c:151
av_add_index_entry
int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp, int size, int distance, int flags)
Add an index entry into a sorted list.
Definition: seek.c:120
FLV_HEADER_FLAG_HASVIDEO
@ FLV_HEADER_FLAG_HASVIDEO
Definition: flv.h:61
TYPE_ONTEXTDATA
#define TYPE_ONTEXTDATA
Definition: flvdec.c:719
flv_read_seek
static int flv_read_seek(AVFormatContext *s, int stream_index, int64_t ts, int flags)
Definition: flvdec.c:1390
read_close
static av_cold int read_close(AVFormatContext *ctx)
Definition: libcdio.c:143
avio_tell
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:513
ff_live_flv_demuxer
const AVInputFormat ff_live_flv_demuxer
Definition: flvdec.c:1428
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
pts
static int64_t pts
Definition: transcode_aac.c:643
AV_CODEC_ID_MP3
@ AV_CODEC_ID_MP3
preferred ID for decoding MPEG audio layer 1, 2 or 3
Definition: codec_id.h:443
FLV_AUDIO_CODECID_OFFSET
#define FLV_AUDIO_CODECID_OFFSET
Definition: flv.h:34
FLV_CODECID_PCM_ALAW
@ FLV_CODECID_PCM_ALAW
Definition: flv.h:104
FLV_CODECID_SPEEX
@ FLV_CODECID_SPEEX
Definition: flv.h:107
VD
#define VD
Definition: flvdec.c:1399
avassert.h
AMFDataType
AMFDataType
Definition: flv.h:138
parse_keyframes_index
static int parse_keyframes_index(AVFormatContext *s, AVIOContext *ioc, int64_t max_pos)
Definition: flvdec.c:424
avio_rb32
unsigned int avio_rb32(AVIOContext *s)
Definition: aviobuf.c:808
AV_LOG_TRACE
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
Definition: log.h:206
pkt
AVPacket * pkt
Definition: movenc.c:59
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
AVInputFormat
Definition: avformat.h:549
VALIDATE_INDEX_TS_THRESH
#define VALIDATE_INDEX_TS_THRESH
Definition: flvdec.c:42
read_packet
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
Definition: avio_read_callback.c:41
av_dict_get
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:62
FLVContext::new_extradata_size
int new_extradata_size[FLV_STREAM_TYPE_NB]
Definition: flvdec.c:55
intreadwrite.h
s
#define s(width, name)
Definition: cbs_vp9.c:198
FLV_CODECID_H264
@ FLV_CODECID_H264
Definition: flv.h:116
AMF_DATA_TYPE_UNSUPPORTED
@ AMF_DATA_TYPE_UNSUPPORTED
Definition: flv.h:151
FLV_CODECID_AAC
@ FLV_CODECID_AAC
Definition: flv.h:106
ff_kux_demuxer
const AVInputFormat ff_kux_demuxer
Definition: flvdec.c:1442
AVInputFormat::name
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:554
AVProbeData::buf
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
Definition: avformat.h:454
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
AV_CODEC_ID_VP9
@ AV_CODEC_ID_VP9
Definition: codec_id.h:220
AVCodecParameters::width
int width
Video only.
Definition: codec_par.h:121
FLV_STREAM_TYPE_VIDEO
@ FLV_STREAM_TYPE_VIDEO
Definition: flv.h:72
FLV_CODECID_PCM_LE
@ FLV_CODECID_PCM_LE
Definition: flv.h:100
create_stream
static AVStream * create_stream(AVFormatContext *s, int codec_type)
Definition: flvdec.c:165
FLVContext::dts
int64_t dts
Definition: flvdec.c:59
amf_skip_tag
static int amf_skip_tag(AVIOContext *pb, AMFDataType type, int depth)
Definition: flvdec.c:873
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:40
FLV_AUDIO_CHANNEL_MASK
#define FLV_AUDIO_CHANNEL_MASK
Definition: flv.h:45
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:201
channels
channels
Definition: aptx.h:31
FLVContext::time_pos
int64_t time_pos
Definition: flvdec.c:81
FLV_CODECID_H263
@ FLV_CODECID_H263
Definition: flv.h:111
isfinite
#define isfinite(x)
Definition: libm.h:359
FLV_CODECID_SCREEN
@ FLV_CODECID_SCREEN
Definition: flv.h:112
AV_CODEC_ID_PCM_MULAW
@ AV_CODEC_ID_PCM_MULAW
Definition: codec_id.h:336
codec_id
enum AVCodecID codec_id
Definition: vaapi_decode.c:389
live_flv_probe
static int live_flv_probe(const AVProbeData *p)
Definition: flvdec.c:115
KEYFRAMES_TIMESTAMP_TAG
#define KEYFRAMES_TIMESTAMP_TAG
Definition: flv.h:56
key
const char * key
Definition: hwcontext_opencl.c:174
AVMEDIA_TYPE_DATA
@ AVMEDIA_TYPE_DATA
Opaque data information usually continuous.
Definition: avutil.h:203
FLVContext::sum_flv_tag_size
int64_t sum_flv_tag_size
Definition: flvdec.c:69
FLV_VIDEO_FRAMETYPE_MASK
#define FLV_VIDEO_FRAMETYPE_MASK
Definition: flv.h:51
fsize
static int64_t fsize(FILE *f)
Definition: audiomatch.c:29
AVDISCARD_BIDIR
@ AVDISCARD_BIDIR
discard all bidirectional frames
Definition: defs.h:216
AV_CODEC_ID_H264
@ AV_CODEC_ID_H264
Definition: codec_id.h:79
TYPE_UNKNOWN
#define TYPE_UNKNOWN
Definition: flvdec.c:722
FLV_CODECID_NELLYMOSER_8KHZ_MONO
@ FLV_CODECID_NELLYMOSER_8KHZ_MONO
Definition: flv.h:102
FFABS
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:65
FFStream::need_parsing
enum AVStreamParseType need_parsing
Definition: internal.h:391
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: defs.h:219
AVFormatContext
Format I/O context.
Definition: avformat.h:1115
AV_CODEC_ID_PCM_ALAW
@ AV_CODEC_ID_PCM_ALAW
Definition: codec_id.h:337
flv_read_close
static int flv_read_close(AVFormatContext *s)
Definition: flvdec.c:819
AV_CODEC_ID_FLASHSV2
@ AV_CODEC_ID_FLASHSV2
Definition: codec_id.h:183
internal.h
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:864
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
read_header
static int read_header(FFV1Context *f)
Definition: ffv1dec.c:550
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:66
add_keyframes_index
static void add_keyframes_index(AVFormatContext *s)
Definition: flvdec.c:134
NULL
#define NULL
Definition: coverity.c:32
ff_flv_demuxer
const AVInputFormat ff_flv_demuxer
Definition: flvdec.c:1415
AVERROR_PATCHWELCOME
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:64
AV_CODEC_ID_AV1
@ AV_CODEC_ID_AV1
Definition: codec_id.h:283
avcodec_parameters_free
void avcodec_parameters_free(AVCodecParameters **ppar)
Free an AVCodecParameters instance and everything associated with it and write NULL to the supplied p...
Definition: codec_par.c:66
AVFMTCTX_NOHEADER
#define AVFMTCTX_NOHEADER
signal that no header is present (streams are added dynamically)
Definition: avformat.h:1066
AMF_DATA_TYPE_BOOL
@ AMF_DATA_TYPE_BOOL
Definition: flv.h:140
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
flv_read_header
static int flv_read_header(AVFormatContext *s)
Definition: flvdec.c:781
isnan
#define isnan(x)
Definition: libm.h:340
flv_same_audio_codec
static int flv_same_audio_codec(AVCodecParameters *apar, int flags)
Definition: flvdec.c:195
FLV_CODECID_NELLYMOSER_16KHZ_MONO
@ FLV_CODECID_NELLYMOSER_16KHZ_MONO
Definition: flv.h:101
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:237
avio_rb64
uint64_t avio_rb64(AVIOContext *s)
Definition: aviobuf.c:955
FFStream::nb_index_entries
int nb_index_entries
Definition: internal.h:256
AVProbeData
This structure contains the data a format has to probe a file.
Definition: avformat.h:452
flv.h
FLV_HEADER_FLAG_HASAUDIO
@ FLV_HEADER_FLAG_HASAUDIO
Definition: flv.h:62
FLVContext::last_channels
int last_channels
Definition: flvdec.c:57
AMF_DATA_TYPE_ARRAY
@ AMF_DATA_TYPE_ARRAY
Definition: flv.h:148
AV_CODEC_ID_FLASHSV
@ AV_CODEC_ID_FLASHSV
Definition: codec_id.h:138
FLVContext::keyframe_count
int keyframe_count
Definition: flvdec.c:72
AVCodecParameters::ch_layout
AVChannelLayout ch_layout
Audio only.
Definition: codec_par.h:206
AV_CODEC_ID_VP6A
@ AV_CODEC_ID_VP6A
Definition: codec_id.h:158
AVPROBE_SCORE_EXTENSION
#define AVPROBE_SCORE_EXTENSION
score for file extension
Definition: avformat.h:462
AVCodecParameters::sample_rate
int sample_rate
Audio only.
Definition: codec_par.h:171
FLVContext::missing_streams
int missing_streams
Definition: flvdec.c:77
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:49
AVCodecParameters::extradata_size
int extradata_size
Size of the extradata content in bytes.
Definition: codec_par.h:73
AV_CODEC_ID_AAC
@ AV_CODEC_ID_AAC
Definition: codec_id.h:444
FLV_CODECID_PCM
@ FLV_CODECID_PCM
Definition: flv.h:97
AVDISCARD_NONKEY
@ AVDISCARD_NONKEY
discard all frames except keyframes
Definition: defs.h:218
AVIOContext
Bytestream IO Context.
Definition: avio.h:166
avio_rb24
unsigned int avio_rb24(AVIOContext *s)
Definition: aviobuf.c:801
AVMediaType
AVMediaType
Definition: avutil.h:199
AVPacket::size
int size
Definition: packet.h:492
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:106
KEYFRAMES_BYTEOFFSET_TAG
#define KEYFRAMES_BYTEOFFSET_TAG
Definition: flv.h:57
AVIOContext::seekable
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
Definition: avio.h:271
FFStream
Definition: internal.h:199
FLV_CODECID_SCREEN2
@ FLV_CODECID_SCREEN2
Definition: flv.h:115
AV_CODEC_ID_H263
@ AV_CODEC_ID_H263
Definition: codec_id.h:56
AV_CODEC_ID_ADPCM_SWF
@ AV_CODEC_ID_ADPCM_SWF
Definition: codec_id.h:382
FLV_FRAME_VIDEO_INFO_CMD
@ FLV_FRAME_VIDEO_INFO_CMD
video info/command frame
Definition: flv.h:135
size
int size
Definition: twinvq_data.h:10344
ff_add_param_change
int ff_add_param_change(AVPacket *pkt, int32_t channels, uint64_t channel_layout, int32_t sample_rate, int32_t width, int32_t height)
Add side data to a packet for changing parameters to the given values.
Definition: demux_utils.c:151
FLV_STREAM_TYPE_DATA
@ FLV_STREAM_TYPE_DATA
Definition: flv.h:75
FLVContext
Definition: flvdec.c:48
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:248
MKBETAG
#define MKBETAG(a, b, c, d)
Definition: macros.h:56
AV_RB32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_RB32
Definition: bytestream.h:96
FLV_TAG_TYPE_AUDIO
@ FLV_TAG_TYPE_AUDIO
Definition: flv.h:66
MAX_DEPTH
#define MAX_DEPTH
arbitrary limit to prevent unbounded recursion
Definition: flvdec.c:46
amf_date::timezone
int16_t timezone
Definition: flvdec.c:88
KEYFRAMES_TAG
#define KEYFRAMES_TAG
Definition: flv.h:55
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:490
avio_r8
int avio_r8(AVIOContext *s)
Definition: aviobuf.c:650
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:497
FLV_CODECID_MPEG4
@ FLV_CODECID_MPEG4
Definition: flv.h:118
version
version
Definition: libkvazaar.c:321
FFERROR_REDO
#define FFERROR_REDO
Returned by demuxers to indicate that data was consumed but discarded (ignored streams or junk data).
Definition: demux.h:62
kux_probe
static int kux_probe(const AVProbeData *p)
Definition: flvdec.c:120
PacketTypeCodedFrames
@ PacketTypeCodedFrames
Definition: flv.h:123
av_channel_layout_default
void av_channel_layout_default(AVChannelLayout *ch_layout, int nb_channels)
Get the default channel layout for a given number of channels.
Definition: channel_layout.c:972
avcodec_parameters_alloc
AVCodecParameters * avcodec_parameters_alloc(void)
Allocate a new AVCodecParameters and set its fields to default values (unknown/invalid/0).
Definition: codec_par.c:56
FLV_STREAM_TYPE_SUBTITLE
@ FLV_STREAM_TYPE_SUBTITLE
Definition: flv.h:74
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:50
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:255
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:484
FLVContext::last_keyframe_stream_index
int last_keyframe_stream_index
Definition: flvdec.c:71
flv_read_metabody
static int flv_read_metabody(AVFormatContext *s, int64_t next_pos)
Definition: flvdec.c:724
internal.h
AVCodecParameters::height
int height
Definition: codec_par.h:122
AV_TIME_BASE
#define AV_TIME_BASE
Internal time base represented as integer.
Definition: avutil.h:254
resync
static int resync(AVFormatContext *s)
Definition: flvdec.c:989
FLVContext::framerate
AVRational framerate
Definition: flvdec.c:78
FLV_CODECID_VP6
@ FLV_CODECID_VP6
Definition: flv.h:113
flv_probe
static int flv_probe(const AVProbeData *p)
Definition: flvdec.c:110
AV_CODEC_ID_HEVC
@ AV_CODEC_ID_HEVC
Definition: codec_id.h:226
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
av_d2q
AVRational av_d2q(double d, int max)
Convert a double precision floating point number to a rational.
Definition: rational.c:106
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:254
FLV_AUDIO_SAMPLERATE_OFFSET
#define FLV_AUDIO_SAMPLERATE_OFFSET
Definition: flv.h:33
demux.h
FLVContext::wrong_dts
int wrong_dts
wrong dts due to negative cts
Definition: flvdec.c:53
FLV_STEREO
@ FLV_STEREO
Definition: flv.h:81
flv_queue_extradata
static int flv_queue_extradata(FLVContext *flv, AVIOContext *pb, int stream, int size)
Definition: flvdec.c:842
AMF_DATA_TYPE_MIXEDARRAY
@ AMF_DATA_TYPE_MIXEDARRAY
Definition: flv.h:146
av_get_packet
int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
Allocate and read the payload of a packet and initialize its fields with default values.
Definition: utils.c:103
AMF_DATA_TYPE_STRING
@ AMF_DATA_TYPE_STRING
Definition: flv.h:141
FLVContext::new_extradata
uint8_t * new_extradata[FLV_STREAM_TYPE_NB]
Definition: flvdec.c:54
av_uninit
#define av_uninit(x)
Definition: attributes.h:154
array
static int array[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:111
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:841
probe
static int probe(const AVProbeData *p, int live)
Definition: flvdec.c:91
flv_kux_class
static const AVClass flv_kux_class
Definition: flvdec.c:1408
avio_seek
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:278
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:71
avio_rb16
unsigned int avio_rb16(AVIOContext *s)
Definition: aviobuf.c:793
av_channel_layout_check
int av_channel_layout_check(const AVChannelLayout *channel_layout)
Check whether a channel layout is valid, i.e.
Definition: channel_layout.c:916
AVSTREAM_PARSE_HEADERS
@ AVSTREAM_PARSE_HEADERS
Only parse headers, do not repack.
Definition: avformat.h:692
pos
unsigned int pos
Definition: spdifenc.c:413
avformat.h
dict.h
AV_CODEC_ID_TEXT
@ AV_CODEC_ID_TEXT
raw UTF-8 text
Definition: codec_id.h:552
FLV_CODECID_REALH263
@ FLV_CODECID_REALH263
Definition: flv.h:117
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: defs.h:40
amf_get_string
static int amf_get_string(AVIOContext *ioc, char *buffer, int buffsize)
Definition: flvdec.c:404
av_sat_add64
#define av_sat_add64
Definition: common.h:138
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:847
channel_layout.h
AV_OPT_FLAG_EXPORT
#define AV_OPT_FLAG_EXPORT
The option is intended for exporting values to the caller.
Definition: opt.h:289
AVIO_SEEKABLE_NORMAL
#define AVIO_SEEKABLE_NORMAL
Seeking works like for a local file.
Definition: avio.h:41
buffer
the frame and frame reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFrame structures Several references can point to the same frame buffer
Definition: filter_design.txt:49
FLV_STREAM_TYPE_AUDIO
@ FLV_STREAM_TYPE_AUDIO
Definition: flv.h:73
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:225
FLV_TAG_TYPE_META
@ FLV_TAG_TYPE_META
Definition: flv.h:68
flv_set_video_codec
static int flv_set_video_codec(AVFormatContext *s, AVStream *vstream, uint32_t flv_codecid, int read)
Definition: flvdec.c:335
FLV_CODECID_NELLYMOSER
@ FLV_CODECID_NELLYMOSER
Definition: flv.h:103
avio_read
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:659
amf_parse_object
static int amf_parse_object(AVFormatContext *s, AVStream *astream, AVStream *vstream, const char *key, int64_t max_pos, int depth)
Definition: flvdec.c:519
AVIndexEntry::pos
int64_t pos
Definition: avformat.h:701
AVIOContext::eof_reached
int eof_reached
true if was unable to read due to error or eof
Definition: avio.h:248
FLV_STREAM_TYPE_NB
@ FLV_STREAM_TYPE_NB
Definition: flv.h:76
flv_same_video_codec
static int flv_same_video_codec(AVCodecParameters *vpar, uint32_t flv_codecid)
Definition: flvdec.c:306
AVPacket::stream_index
int stream_index
Definition: packet.h:493
avio_skip
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition: aviobuf.c:365
factor
static const int factor[16]
Definition: vf_pp7.c:78
FFStream::index_entries
AVIndexEntry * index_entries
Only used if the format does not support seeking natively.
Definition: internal.h:254
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
read_probe
static int read_probe(const AVProbeData *p)
Definition: cdg.c:29
AVCodecParameters::bits_per_coded_sample
int bits_per_coded_sample
The number of bits per sample in the codedwords.
Definition: codec_par.h:97
AVFMT_TS_DISCONT
#define AVFMT_TS_DISCONT
Format allows timestamp discontinuities.
Definition: avformat.h:482
AV_CODEC_ID_PCM_U8
@ AV_CODEC_ID_PCM_U8
Definition: codec_id.h:335
FLV_CODECID_PCM_MULAW
@ FLV_CODECID_PCM_MULAW
Definition: flv.h:105
avpriv_request_sample
#define avpriv_request_sample(...)
Definition: tableprint_vlc.h:36
flv_get_extradata
static int flv_get_extradata(AVFormatContext *s, AVStream *st, int size)
Definition: flvdec.c:830
AMF_DATA_TYPE_NUMBER
@ AMF_DATA_TYPE_NUMBER
Definition: flv.h:139
av_free
#define av_free(p)
Definition: tableprint_vlc.h:33
AVDictionaryEntry
Definition: dict.h:89
AVCodecParameters::codec_id
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: codec_par.h:55
AVPacket
This structure stores compressed data.
Definition: packet.h:468
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Definition: opt.h:244
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
av_dict_set
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
Definition: dict.c:88
FLV_AUDIO_CODECID_MASK
#define FLV_AUDIO_CODECID_MASK
Definition: flv.h:48
AVPacket::pos
int64_t pos
byte position in stream, -1 if unknown
Definition: packet.h:511
FLV_AUDIO_SAMPLERATE_MASK
#define FLV_AUDIO_SAMPLERATE_MASK
Definition: flv.h:47
d
d
Definition: ffmpeg_filter.c:368
int32_t
int32_t
Definition: audioconvert.c:56
FLV_VIDEO_CODECID_MASK
#define FLV_VIDEO_CODECID_MASK
Definition: flv.h:50
AVSTREAM_PARSE_FULL
@ AVSTREAM_PARSE_FULL
full parsing and repack
Definition: avformat.h:691
FFStream::need_context_update
int need_context_update
Whether the internal avctx needs to be updated from codecpar (after a late change to codecpar)
Definition: internal.h:243
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:474
av_strlcpy
size_t av_strlcpy(char *dst, const char *src, size_t size)
Copy the string src to dst, but no more than size - 1 bytes, and null-terminate dst.
Definition: avstring.c:85
AVCodecParameters::bit_rate
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
Definition: codec_par.h:84
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
FLVContext::validate_count
int validate_count
Definition: flvdec.c:63
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
FLV_AUDIO_SAMPLESIZE_MASK
#define FLV_AUDIO_SAMPLESIZE_MASK
Definition: flv.h:46
AVDictionaryEntry::value
char * value
Definition: dict.h:91
avstring.h
FlvTagType
FlvTagType
Definition: flv.h:65
AV_CODEC_ID_FLV1
@ AV_CODEC_ID_FLV1
Definition: codec_id.h:73
amf_date::milliseconds
double milliseconds
Definition: flvdec.c:87
AV_RB24
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_RB24
Definition: bytestream.h:97
int
int
Definition: ffmpeg_filter.c:368
snprintf
#define snprintf
Definition: snprintf.h:34
FLVContext::dump_full_metadata
int dump_full_metadata
Dump full metadata of the onMetadata.
Definition: flvdec.c:52
avpriv_dict_set_timestamp
int avpriv_dict_set_timestamp(AVDictionary **dict, const char *key, int64_t timestamp)
Set a dictionary value to an ISO-8601 compliant timestamp string.
Definition: dict.c:280
skip
static void BS_FUNC() skip(BSCTX *bc, unsigned int n)
Skip n bits in the buffer.
Definition: bitstream_template.h:375
FLVContext::last_sample_rate
int last_sample_rate
Definition: flvdec.c:56
max_pos
static const int32_t max_pos[4]
Size of the MP-MLQ fixed excitation codebooks.
Definition: g723_1dec.c:97
read
static uint32_t BS_FUNC() read(BSCTX *bc, unsigned int n)
Return n bits from the buffer, n has to be in the 0-32 range.
Definition: bitstream_template.h:231
AMF_DATA_TYPE_NULL
@ AMF_DATA_TYPE_NULL
Definition: flv.h:143
AVFMT_EVENT_FLAG_METADATA_UPDATED
#define AVFMT_EVENT_FLAG_METADATA_UPDATED
Definition: avformat.h:1431
RESYNC_BUFFER_SIZE
#define RESYNC_BUFFER_SIZE
Definition: flvdec.c:44
AV_CODEC_ID_NELLYMOSER
@ AV_CODEC_ID_NELLYMOSER
Definition: codec_id.h:475
FLVContext::broken_sizes
int broken_sizes
Definition: flvdec.c:68
FLVContext::validate_index
struct FLVContext::@294 validate_index[2]
ff_alloc_extradata
int ff_alloc_extradata(AVCodecParameters *par, int size)
Allocate extradata with additional AV_INPUT_BUFFER_PADDING_SIZE at end which is always set to 0.
Definition: utils.c:239
avio_feof
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
Definition: aviobuf.c:393