FFmpeg
concatdec.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2012 Nicolas George
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public License
8  * as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with FFmpeg; if not, write to the Free Software Foundation, Inc.,
18  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #include "libavutil/avassert.h"
22 #include "libavutil/avstring.h"
23 #include "libavutil/bprint.h"
24 #include "libavutil/intreadwrite.h"
25 #include "libavutil/opt.h"
26 #include "libavutil/parseutils.h"
27 #include "libavutil/timestamp.h"
28 #include "avformat.h"
29 #include "internal.h"
30 #include "url.h"
31 
32 typedef enum ConcatMatchMode {
36 
37 typedef struct ConcatStream {
40 } ConcatStream;
41 
42 typedef struct {
43  char *url;
44  int64_t start_time;
45  int64_t file_start_time;
46  int64_t file_inpoint;
47  int64_t duration;
48  int64_t user_duration;
49  int64_t next_dts;
51  int64_t inpoint;
52  int64_t outpoint;
55 } ConcatFile;
56 
57 typedef struct {
58  AVClass *class;
61  unsigned nb_files;
63  int safe;
64  int seekable;
65  int eof;
67  unsigned auto_convert;
70 
71 static int concat_probe(const AVProbeData *probe)
72 {
73  return memcmp(probe->buf, "ffconcat version 1.0", 20) ?
75 }
76 
77 static char *get_keyword(uint8_t **cursor)
78 {
79  char *ret = *cursor += strspn(*cursor, SPACE_CHARS);
80  *cursor += strcspn(*cursor, SPACE_CHARS);
81  if (**cursor) {
82  *((*cursor)++) = 0;
83  *cursor += strspn(*cursor, SPACE_CHARS);
84  }
85  return ret;
86 }
87 
88 static int safe_filename(const char *f)
89 {
90  const char *start = f;
91 
92  for (; *f; f++) {
93  /* A-Za-z0-9_- */
94  if (!((unsigned)((*f | 32) - 'a') < 26 ||
95  (unsigned)(*f - '0') < 10 || *f == '_' || *f == '-')) {
96  if (f == start)
97  return 0;
98  else if (*f == '/')
99  start = f + 1;
100  else if (*f != '.')
101  return 0;
102  }
103  }
104  return 1;
105 }
106 
107 #define FAIL(retcode) do { ret = (retcode); goto fail; } while(0)
108 
109 static int add_file(AVFormatContext *avf, char *filename, ConcatFile **rfile,
110  unsigned *nb_files_alloc)
111 {
112  ConcatContext *cat = avf->priv_data;
113  ConcatFile *file;
114  char *url = NULL;
115  const char *proto;
116  size_t url_len, proto_len;
117  int ret;
118 
119  if (cat->safe > 0 && !safe_filename(filename)) {
120  av_log(avf, AV_LOG_ERROR, "Unsafe file name '%s'\n", filename);
121  FAIL(AVERROR(EPERM));
122  }
123 
124  proto = avio_find_protocol_name(filename);
125  proto_len = proto ? strlen(proto) : 0;
126  if (proto && !memcmp(filename, proto, proto_len) &&
127  (filename[proto_len] == ':' || filename[proto_len] == ',')) {
128  url = filename;
129  filename = NULL;
130  } else {
131  url_len = strlen(avf->url) + strlen(filename) + 16;
132  if (!(url = av_malloc(url_len)))
133  FAIL(AVERROR(ENOMEM));
134  ff_make_absolute_url(url, url_len, avf->url, filename);
135  av_freep(&filename);
136  }
137 
138  if (cat->nb_files >= *nb_files_alloc) {
139  size_t n = FFMAX(*nb_files_alloc * 2, 16);
140  ConcatFile *new_files;
141  if (n <= cat->nb_files || n > SIZE_MAX / sizeof(*cat->files) ||
142  !(new_files = av_realloc(cat->files, n * sizeof(*cat->files))))
143  FAIL(AVERROR(ENOMEM));
144  cat->files = new_files;
145  *nb_files_alloc = n;
146  }
147 
148  file = &cat->files[cat->nb_files++];
149  memset(file, 0, sizeof(*file));
150  *rfile = file;
151 
152  file->url = url;
153  file->start_time = AV_NOPTS_VALUE;
154  file->duration = AV_NOPTS_VALUE;
155  file->next_dts = AV_NOPTS_VALUE;
156  file->inpoint = AV_NOPTS_VALUE;
157  file->outpoint = AV_NOPTS_VALUE;
159 
160  return 0;
161 
162 fail:
163  av_free(url);
164  av_free(filename);
165  return ret;
166 }
167 
168 static int copy_stream_props(AVStream *st, AVStream *source_st)
169 {
170  int ret;
171 
172  if (st->codecpar->codec_id || !source_st->codecpar->codec_id) {
173  if (st->codecpar->extradata_size < source_st->codecpar->extradata_size) {
174  ret = ff_alloc_extradata(st->codecpar,
175  source_st->codecpar->extradata_size);
176  if (ret < 0)
177  return ret;
178  }
179  memcpy(st->codecpar->extradata, source_st->codecpar->extradata,
180  source_st->codecpar->extradata_size);
181  return 0;
182  }
183  if ((ret = avcodec_parameters_copy(st->codecpar, source_st->codecpar)) < 0)
184  return ret;
185  st->r_frame_rate = source_st->r_frame_rate;
186  st->avg_frame_rate = source_st->avg_frame_rate;
187  st->sample_aspect_ratio = source_st->sample_aspect_ratio;
188  avpriv_set_pts_info(st, 64, source_st->time_base.num, source_st->time_base.den);
189 
190  av_dict_copy(&st->metadata, source_st->metadata, 0);
191  return 0;
192 }
193 
194 static int detect_stream_specific(AVFormatContext *avf, int idx)
195 {
196  ConcatContext *cat = avf->priv_data;
197  AVStream *st = cat->avf->streams[idx];
198  ConcatStream *cs = &cat->cur_file->streams[idx];
199  const AVBitStreamFilter *filter;
200  AVBSFContext *bsf;
201  int ret;
202 
203  if (cat->auto_convert && st->codecpar->codec_id == AV_CODEC_ID_H264) {
204  if (!st->codecpar->extradata_size ||
205  (st->codecpar->extradata_size >= 3 && AV_RB24(st->codecpar->extradata) == 1) ||
206  (st->codecpar->extradata_size >= 4 && AV_RB32(st->codecpar->extradata) == 1))
207  return 0;
208  av_log(cat->avf, AV_LOG_INFO,
209  "Auto-inserting h264_mp4toannexb bitstream filter\n");
210  filter = av_bsf_get_by_name("h264_mp4toannexb");
211  if (!filter) {
212  av_log(avf, AV_LOG_ERROR, "h264_mp4toannexb bitstream filter "
213  "required for H.264 streams\n");
214  return AVERROR_BSF_NOT_FOUND;
215  }
216  ret = av_bsf_alloc(filter, &bsf);
217  if (ret < 0)
218  return ret;
219  cs->bsf = bsf;
220 
221  ret = avcodec_parameters_copy(bsf->par_in, st->codecpar);
222  if (ret < 0)
223  return ret;
224 
225  ret = av_bsf_init(bsf);
226  if (ret < 0)
227  return ret;
228 
229  ret = avcodec_parameters_copy(st->codecpar, bsf->par_out);
230  if (ret < 0)
231  return ret;
232  }
233  return 0;
234 }
235 
237 {
238  ConcatContext *cat = avf->priv_data;
239  AVStream *st;
240  int i, ret;
241 
242  for (i = cat->cur_file->nb_streams; i < cat->avf->nb_streams; i++) {
243  if (i < avf->nb_streams) {
244  st = avf->streams[i];
245  } else {
246  if (!(st = avformat_new_stream(avf, NULL)))
247  return AVERROR(ENOMEM);
248  }
249  if ((ret = copy_stream_props(st, cat->avf->streams[i])) < 0)
250  return ret;
252  }
253  return 0;
254 }
255 
257 {
258  ConcatContext *cat = avf->priv_data;
259  AVStream *st;
260  int i, j, ret;
261 
262  for (i = cat->cur_file->nb_streams; i < cat->avf->nb_streams; i++) {
263  st = cat->avf->streams[i];
264  for (j = 0; j < avf->nb_streams; j++) {
265  if (avf->streams[j]->id == st->id) {
266  av_log(avf, AV_LOG_VERBOSE,
267  "Match slave stream #%d with stream #%d id 0x%x\n",
268  i, j, st->id);
269  if ((ret = copy_stream_props(avf->streams[j], st)) < 0)
270  return ret;
271  cat->cur_file->streams[i].out_stream_index = j;
272  }
273  }
274  }
275  return 0;
276 }
277 
279 {
280  ConcatContext *cat = avf->priv_data;
281  ConcatStream *map;
282  int i, ret;
283 
284  if (cat->cur_file->nb_streams >= cat->avf->nb_streams)
285  return 0;
286  map = av_realloc(cat->cur_file->streams,
287  cat->avf->nb_streams * sizeof(*map));
288  if (!map)
289  return AVERROR(ENOMEM);
290  cat->cur_file->streams = map;
291  memset(map + cat->cur_file->nb_streams, 0,
292  (cat->avf->nb_streams - cat->cur_file->nb_streams) * sizeof(*map));
293 
294  for (i = cat->cur_file->nb_streams; i < cat->avf->nb_streams; i++) {
295  map[i].out_stream_index = -1;
296  if ((ret = detect_stream_specific(avf, i)) < 0)
297  return ret;
298  }
299  switch (cat->stream_match_mode) {
300  case MATCH_ONE_TO_ONE:
301  ret = match_streams_one_to_one(avf);
302  break;
303  case MATCH_EXACT_ID:
304  ret = match_streams_exact_id(avf);
305  break;
306  default:
307  ret = AVERROR_BUG;
308  }
309  if (ret < 0)
310  return ret;
311  cat->cur_file->nb_streams = cat->avf->nb_streams;
312  return 0;
313 }
314 
316 {
317  if (file->user_duration != AV_NOPTS_VALUE)
318  return file->user_duration;
319  if (file->outpoint != AV_NOPTS_VALUE)
320  return file->outpoint - file->file_inpoint;
321  if (avf->duration > 0)
322  return avf->duration - (file->file_inpoint - file->file_start_time);
323  if (file->next_dts != AV_NOPTS_VALUE)
324  return file->next_dts - file->file_inpoint;
325  return AV_NOPTS_VALUE;
326 }
327 
328 static int open_file(AVFormatContext *avf, unsigned fileno)
329 {
330  ConcatContext *cat = avf->priv_data;
331  ConcatFile *file = &cat->files[fileno];
332  int ret;
333 
334  if (cat->avf)
335  avformat_close_input(&cat->avf);
336 
337  cat->avf = avformat_alloc_context();
338  if (!cat->avf)
339  return AVERROR(ENOMEM);
340 
341  cat->avf->flags |= avf->flags & ~AVFMT_FLAG_CUSTOM_IO;
343 
344  if ((ret = ff_copy_whiteblacklists(cat->avf, avf)) < 0)
345  return ret;
346 
347  if ((ret = avformat_open_input(&cat->avf, file->url, NULL, NULL)) < 0 ||
348  (ret = avformat_find_stream_info(cat->avf, NULL)) < 0) {
349  av_log(avf, AV_LOG_ERROR, "Impossible to open '%s'\n", file->url);
350  avformat_close_input(&cat->avf);
351  return ret;
352  }
353  cat->cur_file = file;
354  file->start_time = !fileno ? 0 :
355  cat->files[fileno - 1].start_time +
356  cat->files[fileno - 1].duration;
357  file->file_start_time = (cat->avf->start_time == AV_NOPTS_VALUE) ? 0 : cat->avf->start_time;
358  file->file_inpoint = (file->inpoint == AV_NOPTS_VALUE) ? file->file_start_time : file->inpoint;
359  file->duration = get_best_effort_duration(file, cat->avf);
360 
361  if (cat->segment_time_metadata) {
362  av_dict_set_int(&file->metadata, "lavf.concatdec.start_time", file->start_time, 0);
363  if (file->duration != AV_NOPTS_VALUE)
364  av_dict_set_int(&file->metadata, "lavf.concatdec.duration", file->duration, 0);
365  }
366 
367  if ((ret = match_streams(avf)) < 0)
368  return ret;
369  if (file->inpoint != AV_NOPTS_VALUE) {
370  if ((ret = avformat_seek_file(cat->avf, -1, INT64_MIN, file->inpoint, file->inpoint, 0)) < 0)
371  return ret;
372  }
373  return 0;
374 }
375 
377 {
378  ConcatContext *cat = avf->priv_data;
379  unsigned i, j;
380 
381  for (i = 0; i < cat->nb_files; i++) {
382  av_freep(&cat->files[i].url);
383  for (j = 0; j < cat->files[i].nb_streams; j++) {
384  if (cat->files[i].streams[j].bsf)
385  av_bsf_free(&cat->files[i].streams[j].bsf);
386  }
387  av_freep(&cat->files[i].streams);
388  av_dict_free(&cat->files[i].metadata);
389  }
390  if (cat->avf)
391  avformat_close_input(&cat->avf);
392  av_freep(&cat->files);
393  return 0;
394 }
395 
397 {
398  ConcatContext *cat = avf->priv_data;
399  AVBPrint bp;
400  uint8_t *cursor, *keyword;
401  int line = 0, i;
402  unsigned nb_files_alloc = 0;
403  ConcatFile *file = NULL;
404  int64_t ret, time = 0;
405 
407 
408  while ((ret = ff_read_line_to_bprint_overwrite(avf->pb, &bp)) >= 0) {
409  line++;
410  cursor = bp.str;
411  keyword = get_keyword(&cursor);
412  if (!*keyword || *keyword == '#')
413  continue;
414 
415  if (!strcmp(keyword, "file")) {
416  char *filename = av_get_token((const char **)&cursor, SPACE_CHARS);
417  if (!filename) {
418  av_log(avf, AV_LOG_ERROR, "Line %d: filename required\n", line);
420  }
421  if ((ret = add_file(avf, filename, &file, &nb_files_alloc)) < 0)
422  goto fail;
423  } else if (!strcmp(keyword, "duration") || !strcmp(keyword, "inpoint") || !strcmp(keyword, "outpoint")) {
424  char *dur_str = get_keyword(&cursor);
425  int64_t dur;
426  if (!file) {
427  av_log(avf, AV_LOG_ERROR, "Line %d: %s without file\n",
428  line, keyword);
430  }
431  if ((ret = av_parse_time(&dur, dur_str, 1)) < 0) {
432  av_log(avf, AV_LOG_ERROR, "Line %d: invalid %s '%s'\n",
433  line, keyword, dur_str);
434  goto fail;
435  }
436  if (!strcmp(keyword, "duration"))
437  file->user_duration = dur;
438  else if (!strcmp(keyword, "inpoint"))
439  file->inpoint = dur;
440  else if (!strcmp(keyword, "outpoint"))
441  file->outpoint = dur;
442  } else if (!strcmp(keyword, "file_packet_metadata")) {
443  char *metadata;
444  if (!file) {
445  av_log(avf, AV_LOG_ERROR, "Line %d: %s without file\n",
446  line, keyword);
448  }
449  metadata = av_get_token((const char **)&cursor, SPACE_CHARS);
450  if (!metadata) {
451  av_log(avf, AV_LOG_ERROR, "Line %d: packet metadata required\n", line);
453  }
454  if ((ret = av_dict_parse_string(&file->metadata, metadata, "=", "", 0)) < 0) {
455  av_log(avf, AV_LOG_ERROR, "Line %d: failed to parse metadata string\n", line);
456  av_freep(&metadata);
458  }
459  av_freep(&metadata);
460  } else if (!strcmp(keyword, "stream")) {
461  if (!avformat_new_stream(avf, NULL))
462  FAIL(AVERROR(ENOMEM));
463  } else if (!strcmp(keyword, "exact_stream_id")) {
464  if (!avf->nb_streams) {
465  av_log(avf, AV_LOG_ERROR, "Line %d: exact_stream_id without stream\n",
466  line);
468  }
469  avf->streams[avf->nb_streams - 1]->id =
470  strtol(get_keyword(&cursor), NULL, 0);
471  } else if (!strcmp(keyword, "ffconcat")) {
472  char *ver_kw = get_keyword(&cursor);
473  char *ver_val = get_keyword(&cursor);
474  if (strcmp(ver_kw, "version") || strcmp(ver_val, "1.0")) {
475  av_log(avf, AV_LOG_ERROR, "Line %d: invalid version\n", line);
477  }
478  if (cat->safe < 0)
479  cat->safe = 1;
480  } else {
481  av_log(avf, AV_LOG_ERROR, "Line %d: unknown keyword '%s'\n",
482  line, keyword);
484  }
485  }
486  if (ret != AVERROR_EOF && ret < 0)
487  goto fail;
488  if (!cat->nb_files)
490 
491  for (i = 0; i < cat->nb_files; i++) {
492  if (cat->files[i].start_time == AV_NOPTS_VALUE)
493  cat->files[i].start_time = time;
494  else
495  time = cat->files[i].start_time;
496  if (cat->files[i].user_duration == AV_NOPTS_VALUE) {
497  if (cat->files[i].inpoint == AV_NOPTS_VALUE || cat->files[i].outpoint == AV_NOPTS_VALUE)
498  break;
499  cat->files[i].user_duration = cat->files[i].outpoint - cat->files[i].inpoint;
500  }
501  cat->files[i].duration = cat->files[i].user_duration;
502  time += cat->files[i].user_duration;
503  }
504  if (i == cat->nb_files) {
505  avf->duration = time;
506  cat->seekable = 1;
507  }
508 
511  if ((ret = open_file(avf, 0)) < 0)
512  goto fail;
513  av_bprint_finalize(&bp, NULL);
514  return 0;
515 
516 fail:
517  av_bprint_finalize(&bp, NULL);
518  concat_read_close(avf);
519  return ret;
520 }
521 
523 {
524  ConcatContext *cat = avf->priv_data;
525  unsigned fileno = cat->cur_file - cat->files;
526 
528 
529  if (++fileno >= cat->nb_files) {
530  cat->eof = 1;
531  return AVERROR_EOF;
532  }
533  return open_file(avf, fileno);
534 }
535 
537 {
538  int ret;
539 
540  if (cs->bsf) {
541  ret = av_bsf_send_packet(cs->bsf, pkt);
542  if (ret < 0) {
543  av_log(avf, AV_LOG_ERROR, "h264_mp4toannexb filter "
544  "failed to send input packet\n");
545  av_packet_unref(pkt);
546  return ret;
547  }
548 
549  while (!ret)
550  ret = av_bsf_receive_packet(cs->bsf, pkt);
551 
552  if (ret < 0 && (ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)) {
553  av_log(avf, AV_LOG_ERROR, "h264_mp4toannexb filter "
554  "failed to receive output packet\n");
555  return ret;
556  }
557  }
558  return 0;
559 }
560 
561 /* Returns true if the packet dts is greater or equal to the specified outpoint. */
563 {
564  if (cat->cur_file->outpoint != AV_NOPTS_VALUE && pkt->dts != AV_NOPTS_VALUE) {
565  return av_compare_ts(pkt->dts, cat->avf->streams[pkt->stream_index]->time_base,
566  cat->cur_file->outpoint, AV_TIME_BASE_Q) >= 0;
567  }
568  return 0;
569 }
570 
572 {
573  ConcatContext *cat = avf->priv_data;
574  int ret;
575  int64_t delta;
576  ConcatStream *cs;
577  AVStream *st;
578 
579  if (cat->eof)
580  return AVERROR_EOF;
581 
582  if (!cat->avf)
583  return AVERROR(EIO);
584 
585  while (1) {
586  ret = av_read_frame(cat->avf, pkt);
587  if (ret == AVERROR_EOF) {
588  if ((ret = open_next_file(avf)) < 0)
589  return ret;
590  continue;
591  }
592  if (ret < 0)
593  return ret;
594  if ((ret = match_streams(avf)) < 0) {
595  av_packet_unref(pkt);
596  return ret;
597  }
598  if (packet_after_outpoint(cat, pkt)) {
599  av_packet_unref(pkt);
600  if ((ret = open_next_file(avf)) < 0)
601  return ret;
602  continue;
603  }
604  cs = &cat->cur_file->streams[pkt->stream_index];
605  if (cs->out_stream_index < 0) {
606  av_packet_unref(pkt);
607  continue;
608  }
609  break;
610  }
611  if ((ret = filter_packet(avf, cs, pkt)))
612  return ret;
613 
614  st = cat->avf->streams[pkt->stream_index];
615  av_log(avf, AV_LOG_DEBUG, "file:%d stream:%d pts:%s pts_time:%s dts:%s dts_time:%s",
616  (unsigned)(cat->cur_file - cat->files), pkt->stream_index,
617  av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, &st->time_base),
618  av_ts2str(pkt->dts), av_ts2timestr(pkt->dts, &st->time_base));
619 
620  delta = av_rescale_q(cat->cur_file->start_time - cat->cur_file->file_inpoint,
622  cat->avf->streams[pkt->stream_index]->time_base);
623  if (pkt->pts != AV_NOPTS_VALUE)
624  pkt->pts += delta;
625  if (pkt->dts != AV_NOPTS_VALUE)
626  pkt->dts += delta;
627  av_log(avf, AV_LOG_DEBUG, " -> pts:%s pts_time:%s dts:%s dts_time:%s\n",
628  av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, &st->time_base),
629  av_ts2str(pkt->dts), av_ts2timestr(pkt->dts, &st->time_base));
630  if (cat->cur_file->metadata) {
631  uint8_t* metadata;
632  int metadata_len;
633  char* packed_metadata = av_packet_pack_dictionary(cat->cur_file->metadata, &metadata_len);
634  if (!packed_metadata)
635  return AVERROR(ENOMEM);
636  if (!(metadata = av_packet_new_side_data(pkt, AV_PKT_DATA_STRINGS_METADATA, metadata_len))) {
637  av_freep(&packed_metadata);
638  return AVERROR(ENOMEM);
639  }
640  memcpy(metadata, packed_metadata, metadata_len);
641  av_freep(&packed_metadata);
642  }
643 
644  if (cat->cur_file->duration == AV_NOPTS_VALUE && st->cur_dts != AV_NOPTS_VALUE) {
645  int64_t next_dts = av_rescale_q(st->cur_dts, st->time_base, AV_TIME_BASE_Q);
646  if (cat->cur_file->next_dts == AV_NOPTS_VALUE || next_dts > cat->cur_file->next_dts) {
647  cat->cur_file->next_dts = next_dts;
648  }
649  }
650 
651  pkt->stream_index = cs->out_stream_index;
652  return ret;
653 }
654 
655 static void rescale_interval(AVRational tb_in, AVRational tb_out,
656  int64_t *min_ts, int64_t *ts, int64_t *max_ts)
657 {
658  *ts = av_rescale_q (* ts, tb_in, tb_out);
659  *min_ts = av_rescale_q_rnd(*min_ts, tb_in, tb_out,
661  *max_ts = av_rescale_q_rnd(*max_ts, tb_in, tb_out,
663 }
664 
665 static int try_seek(AVFormatContext *avf, int stream,
666  int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
667 {
668  ConcatContext *cat = avf->priv_data;
669  int64_t t0 = cat->cur_file->start_time - cat->cur_file->file_inpoint;
670 
671  ts -= t0;
672  min_ts = min_ts == INT64_MIN ? INT64_MIN : min_ts - t0;
673  max_ts = max_ts == INT64_MAX ? INT64_MAX : max_ts - t0;
674  if (stream >= 0) {
675  if (stream >= cat->avf->nb_streams)
676  return AVERROR(EIO);
678  &min_ts, &ts, &max_ts);
679  }
680  return avformat_seek_file(cat->avf, stream, min_ts, ts, max_ts, flags);
681 }
682 
683 static int real_seek(AVFormatContext *avf, int stream,
684  int64_t min_ts, int64_t ts, int64_t max_ts, int flags, AVFormatContext *cur_avf)
685 {
686  ConcatContext *cat = avf->priv_data;
687  int ret, left, right;
688 
689  if (stream >= 0) {
690  if (stream >= avf->nb_streams)
691  return AVERROR(EINVAL);
693  &min_ts, &ts, &max_ts);
694  }
695 
696  left = 0;
697  right = cat->nb_files;
698 
699  /* Always support seek to start */
700  if (ts <= 0)
701  right = 1;
702  else if (!cat->seekable)
703  return AVERROR(ESPIPE); /* XXX: can we use it? */
704 
705  while (right - left > 1) {
706  int mid = (left + right) / 2;
707  if (ts < cat->files[mid].start_time)
708  right = mid;
709  else
710  left = mid;
711  }
712 
713  if (cat->cur_file != &cat->files[left]) {
714  if ((ret = open_file(avf, left)) < 0)
715  return ret;
716  } else {
717  cat->avf = cur_avf;
718  }
719 
720  ret = try_seek(avf, stream, min_ts, ts, max_ts, flags);
721  if (ret < 0 &&
722  left < cat->nb_files - 1 &&
723  cat->files[left + 1].start_time < max_ts) {
724  if (cat->cur_file == &cat->files[left])
725  cat->avf = NULL;
726  if ((ret = open_file(avf, left + 1)) < 0)
727  return ret;
728  ret = try_seek(avf, stream, min_ts, ts, max_ts, flags);
729  }
730  return ret;
731 }
732 
733 static int concat_seek(AVFormatContext *avf, int stream,
734  int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
735 {
736  ConcatContext *cat = avf->priv_data;
737  ConcatFile *cur_file_saved = cat->cur_file;
738  AVFormatContext *cur_avf_saved = cat->avf;
739  int ret;
740 
741  if (flags & (AVSEEK_FLAG_BYTE | AVSEEK_FLAG_FRAME))
742  return AVERROR(ENOSYS);
743  cat->avf = NULL;
744  if ((ret = real_seek(avf, stream, min_ts, ts, max_ts, flags, cur_avf_saved)) < 0) {
745  if (cat->cur_file != cur_file_saved) {
746  if (cat->avf)
747  avformat_close_input(&cat->avf);
748  }
749  cat->avf = cur_avf_saved;
750  cat->cur_file = cur_file_saved;
751  } else {
752  if (cat->cur_file != cur_file_saved) {
753  avformat_close_input(&cur_avf_saved);
754  }
755  cat->eof = 0;
756  }
757  return ret;
758 }
759 
760 #define OFFSET(x) offsetof(ConcatContext, x)
761 #define DEC AV_OPT_FLAG_DECODING_PARAM
762 
763 static const AVOption options[] = {
764  { "safe", "enable safe mode",
765  OFFSET(safe), AV_OPT_TYPE_BOOL, {.i64 = 1}, -1, 1, DEC },
766  { "auto_convert", "automatically convert bitstream format",
767  OFFSET(auto_convert), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, DEC },
768  { "segment_time_metadata", "output file segment start time and duration as packet metadata",
769  OFFSET(segment_time_metadata), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, DEC },
770  { NULL }
771 };
772 
773 static const AVClass concat_class = {
774  .class_name = "concat demuxer",
775  .item_name = av_default_item_name,
776  .option = options,
777  .version = LIBAVUTIL_VERSION_INT,
778 };
779 
780 
782  .name = "concat",
783  .long_name = NULL_IF_CONFIG_SMALL("Virtual concatenation script"),
784  .priv_data_size = sizeof(ConcatContext),
789  .read_seek2 = concat_seek,
790  .priv_class = &concat_class,
791 };
static int64_t get_best_effort_duration(ConcatFile *file, AVFormatContext *avf)
Definition: concatdec.c:315
void av_bsf_free(AVBSFContext **ctx)
Free a bitstream filter context and everything associated with it; write NULL into the supplied point...
Definition: bsf.c:35
#define NULL
Definition: coverity.c:32
void ff_make_absolute_url(char *buf, int size, const char *base, const char *rel)
Convert a relative url into an absolute url, given a base url.
Definition: url.c:80
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
int64_t next_dts
Definition: concatdec.c:49
AVCodecParameters * par_out
Parameters of the output stream.
Definition: avcodec.h:5827
AVIOInterruptCB interrupt_callback
Custom interrupt callbacks for the I/O layer.
Definition: avformat.h:1635
AVOption.
Definition: opt.h:246
void * av_realloc(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory.
Definition: mem.c:135
static int concat_read_close(AVFormatContext *avf)
Definition: concatdec.c:376
ConcatMatchMode
Definition: concatdec.c:32
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
#define DEC
Definition: concatdec.c:761
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.
Definition: utils.c:4931
int av_parse_time(int64_t *timeval, const char *timestr, int duration)
Parse timestr and return in *time a corresponding number of microseconds.
Definition: parseutils.c:587
int ff_copy_whiteblacklists(AVFormatContext *dst, const AVFormatContext *src)
Copies the whilelists from one context to the other.
Definition: utils.c:164
#define FAIL(retcode)
Definition: concatdec.c:107
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: avcodec.h:3987
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown)
Definition: avformat.h:942
static void rescale_interval(AVRational tb_in, AVRational tb_out, int64_t *min_ts, int64_t *ts, int64_t *max_ts)
Definition: concatdec.c:655
int num
Numerator.
Definition: rational.h:59
The bitstream filter state.
Definition: avcodec.h:5793
AVDictionary * metadata
Definition: concatdec.c:53
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:191
const AVBitStreamFilter * av_bsf_get_by_name(const char *name)
AVBSFContext * bsf
Definition: concatdec.c:38
int av_dict_copy(AVDictionary **dst, const AVDictionary *src, int flags)
Copy entries from one AVDictionary struct into another.
Definition: dict.c:217
int avformat_open_input(AVFormatContext **ps, const char *url, ff_const59 AVInputFormat *fmt, AVDictionary **options)
Open an input stream and read the header.
Definition: utils.c:537
static AVPacket pkt
static const AVOption options[]
Definition: concatdec.c:763
int av_bsf_init(AVBSFContext *ctx)
Prepare the filter for use, after all the parameters and options have been set.
Definition: bsf.c:137
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
Definition: bprint.c:235
int64_t outpoint
Definition: concatdec.c:52
Format I/O context.
Definition: avformat.h:1357
int av_bsf_alloc(const AVBitStreamFilter *filter, AVBSFContext **ctx)
Allocate a context for a given bitstream filter.
Definition: bsf.c:82
int64_t cur_dts
Definition: avformat.h:1083
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:72
int av_bsf_receive_packet(AVBSFContext *ctx, AVPacket *pkt)
Retrieve a filtered packet.
Definition: bsf.c:217
static int concat_seek(AVFormatContext *avf, int stream, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
Definition: concatdec.c:733
ConcatStream * streams
Definition: concatdec.c:50
static int64_t start_time
Definition: ffplay.c:331
uint8_t
Round toward +infinity.
Definition: mathematics.h:83
static int nb_streams
Definition: ffprobe.c:281
#define av_malloc(s)
float delta
static int match_streams(AVFormatContext *avf)
Definition: concatdec.c:278
AVOptions.
timestamp utils, mostly useful for debugging/logging purposes
#define f(width, name)
Definition: cbs_vp9.c:255
int id
Format-specific stream ID.
Definition: avformat.h:887
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
Definition: utils.c:4504
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:87
AVStream ** streams
A list of all streams in the file.
Definition: avformat.h:1425
#define t0
Definition: regdef.h:28
AVFormatContext * avformat_alloc_context(void)
Allocate an AVFormatContext.
Definition: options.c:144
AVInputFormat ff_concat_demuxer
Definition: concatdec.c:781
int flags
Flags modifying the (de)muxer behaviour.
Definition: avformat.h:1488
#define AVERROR_EOF
End of file.
Definition: error.h:55
static av_cold int read_close(AVFormatContext *ctx)
Definition: libcdio.c:145
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:192
#define av_log(a,...)
int64_t inpoint
Definition: concatdec.c:51
Writing a table generator This documentation is preliminary Parts of the API are not good and should be changed Basic concepts A table generator consists of two files
Definition: tablegen.txt:8
static int concat_read_header(AVFormatContext *avf)
Definition: concatdec.c:396
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
Definition: mathematics.c:142
int out_stream_index
Definition: concatdec.c:39
int segment_time_metadata
Definition: concatdec.c:68
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:259
int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src)
Copy the contents of src to dst.
Definition: utils.c:2043
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
#define AV_BPRINT_SIZE_UNLIMITED
filter_frame For filters that do not use the this method is called when a frame is pushed to the filter s input It can be called at any time except in a reentrant way If the input frame is enough to produce then the filter should push the output frames on the output link immediately As an exception to the previous rule if the input frame is enough to produce several output frames then the filter needs output only at least one per link The additional frames can be left buffered in the filter
unsigned auto_convert
Definition: concatdec.c:67
#define av_ts2timestr(ts, tb)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition: timestamp.h:76
int64_t ff_read_line_to_bprint_overwrite(AVIOContext *s, AVBPrint *bp)
Read a whole line of text from AVIOContext to an AVBPrint buffer overwriting its contents.
Definition: aviobuf.c:867
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:186
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
Definition: bprint.c:69
char * url
input or output URL.
Definition: avformat.h:1453
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:197
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values. ...
Definition: dict.c:203
Definition: graph2dot.c:48
simple assert() macros that are a bit more flexible than ISO C assert().
AVRational avg_frame_rate
Average framerate.
Definition: avformat.h:953
#define FFMAX(a, b)
Definition: common.h:94
#define fail()
Definition: checkasm.h:122
static int concat_probe(const AVProbeData *probe)
Definition: concatdec.c:71
char * av_get_token(const char **buf, const char *term)
Unescape the given string until a non escaped terminating char, and return the token corresponding to...
Definition: avstring.c:149
int64_t file_start_time
Definition: concatdec.c:45
int av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b)
Compare two timestamps each in its own time base.
Definition: mathematics.c:147
int extradata_size
Size of the extradata content in bytes.
Definition: avcodec.h:4005
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
Definition: avformat.h:448
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
Definition: avformat.h:1413
static int match_streams_one_to_one(AVFormatContext *avf)
Definition: concatdec.c:236
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:3323
static int try_seek(AVFormatContext *avf, int stream, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
Definition: concatdec.c:665
static int packet_after_outpoint(ConcatContext *cat, AVPacket *pkt)
Definition: concatdec.c:562
static int filter_packet(AVFormatContext *avf, ConcatStream *cs, AVPacket *pkt)
Definition: concatdec.c:536
static const AVClass concat_class
Definition: concatdec.c:773
int av_bsf_send_packet(AVBSFContext *ctx, AVPacket *pkt)
Submit a packet for filtering.
Definition: bsf.c:190
static int open_file(AVFormatContext *avf, unsigned fileno)
Definition: concatdec.c:328
#define AVERROR_BSF_NOT_FOUND
Bitstream filter not found.
Definition: error.h:49
int n
Definition: avisynth_c.h:760
AVDictionary * metadata
Definition: avformat.h:944
#define AVFMT_FLAG_CUSTOM_IO
The caller has supplied a custom AVIOContext, don&#39;t avio_close() it.
Definition: avformat.h:1496
ConcatMatchMode stream_match_mode
Definition: concatdec.c:66
#define cat(a, bpp, b)
Definition: vp9dsp_init.h:29
static int read_header(FFV1Context *f)
Definition: ffv1dec.c:530
Stream structure.
Definition: avformat.h:880
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
Definition: avio_reading.c:42
int av_dict_parse_string(AVDictionary **pm, const char *str, const char *key_val_sep, const char *pairs_sep, int flags)
Parse the key/value pairs list and add the parsed entries to a dictionary.
Definition: dict.c:180
ConcatFile * cur_file
Definition: concatdec.c:60
#define AV_LOG_INFO
Standard information.
Definition: log.h:187
A list of zero terminated key/value strings.
Definition: avcodec.h:1328
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:87
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition: avutil.h:260
AVIOContext * pb
I/O context.
Definition: avformat.h:1399
ConcatFile * files
Definition: concatdec.c:59
uint8_t * av_packet_pack_dictionary(AVDictionary *dict, int *size)
Pack a dictionary for use in side_data.
Definition: avpacket.c:488
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: avpacket.c:599
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2]...the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so...,+,-,+,-,+,+,-,+,-,+,...hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32-hcoeff[1]-hcoeff[2]-...a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2}an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||.........intra?||||:Block01:yes no||||:Block02:.................||||:Block03::y DC::ref index:||||:Block04::cb DC::motion x:||||.........:cr DC::motion y:||||.................|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------------------------------|||Y subbands||Cb subbands||Cr subbands||||------||------||------|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||------||------||------||||------||------||------|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||------||------||------||||------||------||------|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||------||------||------||||------||------||------|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------------------------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction------------|\Dequantization-------------------\||Reference frames|\IDWT|--------------|Motion\|||Frame 0||Frame 1||Compensation.OBMC v-------|--------------|--------------.\------> Frame n output Frame Frame<----------------------------------/|...|-------------------Range Coder:============Binary Range Coder:-------------------The implemented range coder is an adapted version based upon"Range encoding: an algorithm for removing redundancy from a digitised message."by G.N.N.Martin.The symbols encoded by the Snow range coder are bits(0|1).The associated probabilities are not fix but change depending on the symbol mix seen so far.bit seen|new state---------+-----------------------------------------------0|256-state_transition_table[256-old_state];1|state_transition_table[old_state];state_transition_table={0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:-------------------------FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1.the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled left
Definition: snow.txt:206
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Definition: error.h:50
int nb_streams
Definition: concatdec.c:54
Describe the class of an AVClass context structure.
Definition: log.h:67
#define SPACE_CHARS
Definition: internal.h:352
Rational number (pair of numerator and denominator).
Definition: rational.h:58
#define AVSEEK_FLAG_BYTE
seeking based on position in bytes
Definition: avformat.h:2518
const VDPAUPixFmtMap * map
static int match_streams_exact_id(AVFormatContext *avf)
Definition: concatdec.c:256
unsigned nb_files
Definition: concatdec.c:61
This structure contains the data a format has to probe a file.
Definition: avformat.h:446
misc parsing utilities
int av_read_frame(AVFormatContext *s, AVPacket *pkt)
Return the next frame of a stream.
Definition: utils.c:1779
Round toward -infinity.
Definition: mathematics.h:82
int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
Seek to timestamp ts.
Definition: utils.c:2547
const char * avio_find_protocol_name(const char *url)
Return the name of the protocol that will handle the passed URL.
Definition: avio.c:472
int64_t start_time
Definition: concatdec.c:44
#define flags(name, subs,...)
Definition: cbs_av1.c:564
static int concat_read_packet(AVFormatContext *avf, AVPacket *pkt)
Definition: concatdec.c:571
int64_t start_time
Position of the first frame of the component, in AV_TIME_BASE fractional seconds. ...
Definition: avformat.h:1462
static int read_probe(const AVProbeData *pd)
Definition: jvdec.c:55
char * url
Definition: concatdec.c:43
static int probe(const AVProbeData *p)
Definition: act.c:36
#define AVPROBE_SCORE_MAX
maximum score
Definition: avformat.h:458
Main libavformat public API header.
static char * get_keyword(uint8_t **cursor)
Definition: concatdec.c:77
int64_t user_duration
Definition: concatdec.c:48
int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
Read packets of a media file to get stream information.
Definition: utils.c:3602
int av_dict_set_int(AVDictionary **pm, const char *key, int64_t value, int flags)
Convenience wrapper for av_dict_set that converts the value to a string and stores it...
Definition: dict.c:147
int den
Denominator.
Definition: rational.h:60
void avformat_close_input(AVFormatContext **s)
Close an opened input AVFormatContext.
Definition: utils.c:4476
Flag telling rescaling functions to pass INT64_MIN/MAX through unchanged, avoiding special cases for ...
Definition: mathematics.h:108
static int open_next_file(AVFormatContext *avf)
Definition: concatdec.c:522
#define av_free(p)
static int copy_stream_props(AVStream *st, AVStream *source_st)
Definition: concatdec.c:168
int64_t duration
Definition: concatdec.c:47
#define av_ts2str(ts)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition: timestamp.h:54
void * priv_data
Format private data.
Definition: avformat.h:1385
#define AVSEEK_FLAG_FRAME
seeking based on frame number
Definition: avformat.h:2520
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
Definition: avcodec.h:4001
static int real_seek(AVFormatContext *avf, int stream, int64_t min_ts, int64_t ts, int64_t max_ts, int flags, AVFormatContext *cur_avf)
Definition: concatdec.c:683
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed...
Definition: avcodec.h:1493
#define OFFSET(x)
Definition: concatdec.c:760
int64_t duration
Duration of the stream, in AV_TIME_BASE fractional seconds.
Definition: avformat.h:1472
static int add_file(AVFormatContext *avf, char *filename, ConcatFile **rfile, unsigned *nb_files_alloc)
Definition: concatdec.c:109
#define av_freep(p)
void INT64 start
Definition: avisynth_c.h:766
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:654
unbuffered private I/O API
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:1027
int64_t av_rescale_q_rnd(int64_t a, AVRational bq, AVRational cq, enum AVRounding rnd)
Rescale a 64-bit integer by 2 rational numbers with specified rounding.
Definition: mathematics.c:134
static int detect_stream_specific(AVFormatContext *avf, int idx)
Definition: concatdec.c:194
static int safe_filename(const char *f)
Definition: concatdec.c:88
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, int size)
Allocate new information of a packet.
Definition: avpacket.c:329
int stream_index
Definition: avcodec.h:1496
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
Definition: avformat.h:909
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
AVRational r_frame_rate
Real base framerate of the stream.
Definition: avformat.h:1004
int64_t file_inpoint
Definition: concatdec.c:46
This structure stores compressed data.
Definition: avcodec.h:1471
AVCodecParameters * par_in
Parameters of the input stream.
Definition: avcodec.h:5821
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: avcodec.h:1487
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:248
AVFormatContext * avf
Definition: concatdec.c:62