FFmpeg
segment.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2011, Luca Barbato
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
8  * License 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 GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 /**
22  * @file generic segmenter
23  * M3U8 specification can be find here:
24  * @url{http://tools.ietf.org/id/draft-pantos-http-live-streaming}
25  */
26 
27 #include <float.h>
28 #include <time.h>
29 
30 #include "avformat.h"
31 #include "avio_internal.h"
32 #include "internal.h"
33 
34 #include "libavutil/avassert.h"
35 #include "libavutil/internal.h"
36 #include "libavutil/log.h"
37 #include "libavutil/opt.h"
38 #include "libavutil/avstring.h"
39 #include "libavutil/parseutils.h"
40 #include "libavutil/mathematics.h"
41 #include "libavutil/time.h"
42 #include "libavutil/timecode.h"
44 #include "libavutil/timestamp.h"
45 
46 typedef struct SegmentListEntry {
47  int index;
49  int64_t start_pts;
50  int64_t offset_pts;
51  char *filename;
53  int64_t last_duration;
55 
56 typedef enum {
61  LIST_TYPE_EXT, ///< deprecated
64 } ListType;
65 
66 #define SEGMENT_LIST_FLAG_CACHE 1
67 #define SEGMENT_LIST_FLAG_LIVE 2
68 
69 typedef struct SegmentContext {
70  const AVClass *class; /**< Class for private options. */
71  int segment_idx; ///< index of the segment file to write, starting from 0
72  int segment_idx_wrap; ///< number after which the index wraps
73  int segment_idx_wrap_nb; ///< number of time the index has wraped
74  int segment_count; ///< number of segment files already written
77  char *format; ///< format to use for output segment files
79  char *list; ///< filename for the segment list file
80  int list_flags; ///< flags affecting list generation
81  int list_size; ///< number of entries for the segment list file
82 
83  int is_nullctx; ///< whether avf->pb is a nullctx
84  int use_clocktime; ///< flag to cut segments at regular clock time
85  int64_t clocktime_offset; //< clock offset for cutting the segments at regular clock time
86  int64_t clocktime_wrap_duration; //< wrapping duration considered for starting a new segment
87  int64_t last_val; ///< remember last time for wrap around detection
89  int header_written; ///< whether we've already called avformat_write_header
90 
91  char *entry_prefix; ///< prefix to add to list entry filenames
92  int list_type; ///< set the list type
93  AVIOContext *list_pb; ///< list file put-byte context
94  int64_t time; ///< segment duration
95  int use_strftime; ///< flag to expand filename with strftime
96  int increment_tc; ///< flag to increment timecode if found
97 
98  char *times_str; ///< segment times specification string
99  int64_t *times; ///< list of segment interval specification
100  int nb_times; ///< number of elments in the times array
101 
102  char *frames_str; ///< segment frame numbers specification string
103  int *frames; ///< list of frame number specification
104  int nb_frames; ///< number of elments in the frames array
105  int frame_count; ///< total number of reference frames
106  int segment_frame_count; ///< number of reference frames in the segment
107 
108  int64_t time_delta;
109  int individual_header_trailer; /**< Set by a private option. */
110  int write_header_trailer; /**< Set by a private option. */
111  char *header_filename; ///< filename to write the output header to
112 
113  int reset_timestamps; ///< reset timestamps at the beginning of each segment
114  int64_t initial_offset; ///< initial timestamps offset, expressed in microseconds
115  char *reference_stream_specifier; ///< reference stream specifier
119 
121  char temp_list_filename[1024];
122 
127 
128 static void print_csv_escaped_str(AVIOContext *ctx, const char *str)
129 {
130  int needs_quoting = !!str[strcspn(str, "\",\n\r")];
131 
132  if (needs_quoting)
133  avio_w8(ctx, '"');
134 
135  for (; *str; str++) {
136  if (*str == '"')
137  avio_w8(ctx, '"');
138  avio_w8(ctx, *str);
139  }
140  if (needs_quoting)
141  avio_w8(ctx, '"');
142 }
143 
145 {
146  SegmentContext *seg = s->priv_data;
147  AVFormatContext *oc;
148  int i;
149  int ret;
150 
152  if (ret < 0)
153  return ret;
154  oc = seg->avf;
155 
156  oc->interrupt_callback = s->interrupt_callback;
157  oc->max_delay = s->max_delay;
158  av_dict_copy(&oc->metadata, s->metadata, 0);
159  oc->opaque = s->opaque;
160  oc->io_close = s->io_close;
161  oc->io_close2 = s->io_close2;
162  oc->io_open = s->io_open;
163  oc->flags = s->flags;
164 
165  for (i = 0; i < s->nb_streams; i++) {
166  AVStream *st, *ist = s->streams[i];
167  AVCodecParameters *ipar = ist->codecpar, *opar;
168 
169  if (!(st = avformat_new_stream(oc, NULL)))
170  return AVERROR(ENOMEM);
172  if (ret < 0)
173  return ret;
174  opar = st->codecpar;
175  if (!oc->oformat->codec_tag ||
176  av_codec_get_id (oc->oformat->codec_tag, ipar->codec_tag) == opar->codec_id ||
177  av_codec_get_tag(oc->oformat->codec_tag, ipar->codec_id) <= 0) {
178  opar->codec_tag = ipar->codec_tag;
179  } else {
180  opar->codec_tag = 0;
181  }
182  }
183 
184  return 0;
185 }
186 
188 {
189  SegmentContext *seg = s->priv_data;
190  AVFormatContext *oc = seg->avf;
191  size_t size;
192  int ret;
193  char buf[1024];
194  char *new_name;
195 
196  if (seg->segment_idx_wrap)
197  seg->segment_idx %= seg->segment_idx_wrap;
198  if (seg->use_strftime) {
199  time_t now0;
200  struct tm *tm, tmpbuf;
201  time(&now0);
202  tm = localtime_r(&now0, &tmpbuf);
203  if (!strftime(buf, sizeof(buf), s->url, tm)) {
204  av_log(oc, AV_LOG_ERROR, "Could not get segment filename with strftime\n");
205  return AVERROR(EINVAL);
206  }
207  } else if (av_get_frame_filename(buf, sizeof(buf),
208  s->url, seg->segment_idx) < 0) {
209  av_log(oc, AV_LOG_ERROR, "Invalid segment filename template '%s'\n", s->url);
210  return AVERROR(EINVAL);
211  }
212  new_name = av_strdup(buf);
213  if (!new_name)
214  return AVERROR(ENOMEM);
215  ff_format_set_url(oc, new_name);
216 
217  /* copy modified name in list entry */
218  size = strlen(av_basename(oc->url)) + 1;
219  if (seg->entry_prefix)
220  size += strlen(seg->entry_prefix);
221 
222  if ((ret = av_reallocp(&seg->cur_entry.filename, size)) < 0)
223  return ret;
224  snprintf(seg->cur_entry.filename, size, "%s%s",
225  seg->entry_prefix ? seg->entry_prefix : "",
226  av_basename(oc->url));
227 
228  return 0;
229 }
230 
232 {
233  SegmentContext *seg = s->priv_data;
234  AVFormatContext *oc = seg->avf;
235  int err = 0;
236 
237  if (write_header) {
239  seg->avf = NULL;
240  if ((err = segment_mux_init(s)) < 0)
241  return err;
242  oc = seg->avf;
243  }
244 
245  seg->segment_idx++;
246  if ((seg->segment_idx_wrap) && (seg->segment_idx % seg->segment_idx_wrap == 0))
247  seg->segment_idx_wrap_nb++;
248 
249  if ((err = set_segment_filename(s)) < 0)
250  return err;
251 
252  if ((err = s->io_open(s, &oc->pb, oc->url, AVIO_FLAG_WRITE, NULL)) < 0) {
253  av_log(s, AV_LOG_ERROR, "Failed to open segment '%s'\n", oc->url);
254  return err;
255  }
256  if (!seg->individual_header_trailer)
257  oc->pb->seekable = 0;
258 
259  if (oc->oformat->priv_class && oc->priv_data)
260  av_opt_set(oc->priv_data, "mpegts_flags", "+resend_headers", 0);
261 
262  if (write_header) {
265  av_dict_set(&options, "fflags", "-autobsf", 0);
266  err = avformat_write_header(oc, &options);
268  if (err < 0)
269  return err;
270  }
271 
272  seg->segment_frame_count = 0;
273  return 0;
274 }
275 
277 {
278  SegmentContext *seg = s->priv_data;
279  int ret;
280 
281  snprintf(seg->temp_list_filename, sizeof(seg->temp_list_filename), seg->use_rename ? "%s.tmp" : "%s", seg->list);
282  ret = s->io_open(s, &seg->list_pb, seg->temp_list_filename, AVIO_FLAG_WRITE, NULL);
283  if (ret < 0) {
284  av_log(s, AV_LOG_ERROR, "Failed to open segment list '%s'\n", seg->list);
285  return ret;
286  }
287 
288  if (seg->list_type == LIST_TYPE_M3U8 && seg->segment_list_entries) {
289  SegmentListEntry *entry;
290  double max_duration = 0;
291 
292  avio_printf(seg->list_pb, "#EXTM3U\n");
293  avio_printf(seg->list_pb, "#EXT-X-VERSION:3\n");
294  avio_printf(seg->list_pb, "#EXT-X-MEDIA-SEQUENCE:%d\n", seg->segment_list_entries->index);
295  avio_printf(seg->list_pb, "#EXT-X-ALLOW-CACHE:%s\n",
296  seg->list_flags & SEGMENT_LIST_FLAG_CACHE ? "YES" : "NO");
297 
298  av_log(s, AV_LOG_VERBOSE, "EXT-X-MEDIA-SEQUENCE:%d\n",
300 
301  for (entry = seg->segment_list_entries; entry; entry = entry->next)
302  max_duration = FFMAX(max_duration, entry->end_time - entry->start_time);
303  avio_printf(seg->list_pb, "#EXT-X-TARGETDURATION:%"PRId64"\n", (int64_t)ceil(max_duration));
304  } else if (seg->list_type == LIST_TYPE_FFCONCAT) {
305  avio_printf(seg->list_pb, "ffconcat version 1.0\n");
306  }
307 
308  return ret;
309 }
310 
311 static void segment_list_print_entry(AVIOContext *list_ioctx,
312  ListType list_type,
313  const SegmentListEntry *list_entry,
314  void *log_ctx)
315 {
316  switch (list_type) {
317  case LIST_TYPE_FLAT:
318  avio_printf(list_ioctx, "%s\n", list_entry->filename);
319  break;
320  case LIST_TYPE_CSV:
321  case LIST_TYPE_EXT:
322  print_csv_escaped_str(list_ioctx, list_entry->filename);
323  avio_printf(list_ioctx, ",%f,%f\n", list_entry->start_time, list_entry->end_time);
324  break;
325  case LIST_TYPE_M3U8:
326  avio_printf(list_ioctx, "#EXTINF:%f,\n%s\n",
327  list_entry->end_time - list_entry->start_time, list_entry->filename);
328  break;
329  case LIST_TYPE_FFCONCAT:
330  {
331  char *buf;
332  if (av_escape(&buf, list_entry->filename, NULL, AV_ESCAPE_MODE_AUTO, AV_ESCAPE_FLAG_WHITESPACE) < 0) {
333  av_log(log_ctx, AV_LOG_WARNING,
334  "Error writing list entry '%s' in list file\n", list_entry->filename);
335  return;
336  }
337  avio_printf(list_ioctx, "file %s\n", buf);
338  av_free(buf);
339  break;
340  }
341  default:
342  av_assert0(!"Invalid list type");
343  }
344 }
345 
346 static int segment_end(AVFormatContext *s, int write_trailer, int is_last)
347 {
348  SegmentContext *seg = s->priv_data;
349  AVFormatContext *oc = seg->avf;
350  int ret = 0;
351  AVTimecode tc;
352  AVRational rate;
353  AVDictionaryEntry *tcr;
354  char buf[AV_TIMECODE_STR_SIZE];
355  int i;
356  int err;
357 
358  if (!oc || !oc->pb)
359  return AVERROR(EINVAL);
360 
361  av_write_frame(oc, NULL); /* Flush any buffered data (fragmented mp4) */
362  if (write_trailer)
363  ret = av_write_trailer(oc);
364 
365  if (ret < 0)
366  av_log(s, AV_LOG_ERROR, "Failure occurred when ending segment '%s'\n",
367  oc->url);
368 
369  if (seg->list) {
370  if (seg->list_size || seg->list_type == LIST_TYPE_M3U8) {
371  SegmentListEntry *entry = av_mallocz(sizeof(*entry));
372  if (!entry) {
373  ret = AVERROR(ENOMEM);
374  goto end;
375  }
376 
377  /* append new element */
378  memcpy(entry, &seg->cur_entry, sizeof(*entry));
379  entry->filename = av_strdup(entry->filename);
380  if (!seg->segment_list_entries)
382  else
383  seg->segment_list_entries_end->next = entry;
384  seg->segment_list_entries_end = entry;
385 
386  /* drop first item */
387  if (seg->list_size && seg->segment_count >= seg->list_size) {
388  entry = seg->segment_list_entries;
390  av_freep(&entry->filename);
391  av_freep(&entry);
392  }
393 
394  if ((ret = segment_list_open(s)) < 0)
395  goto end;
396  for (entry = seg->segment_list_entries; entry; entry = entry->next)
397  segment_list_print_entry(seg->list_pb, seg->list_type, entry, s);
398  if (seg->list_type == LIST_TYPE_M3U8 && is_last)
399  avio_printf(seg->list_pb, "#EXT-X-ENDLIST\n");
400  ff_format_io_close(s, &seg->list_pb);
401  if (seg->use_rename)
402  ff_rename(seg->temp_list_filename, seg->list, s);
403  } else {
405  avio_flush(seg->list_pb);
406  }
407  }
408 
409  av_log(s, AV_LOG_VERBOSE, "segment:'%s' count:%d ended\n",
410  seg->avf->url, seg->segment_count);
411  seg->segment_count++;
412 
413  if (seg->increment_tc) {
414  tcr = av_dict_get(s->metadata, "timecode", NULL, 0);
415  if (tcr) {
416  /* search the first video stream */
417  for (i = 0; i < s->nb_streams; i++) {
418  if (s->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
419  rate = s->streams[i]->avg_frame_rate;/* Get fps from the video stream */
420  err = av_timecode_init_from_string(&tc, rate, tcr->value, s);
421  if (err < 0) {
422  av_log(s, AV_LOG_WARNING, "Could not increment global timecode, error occurred during timecode creation.\n");
423  break;
424  }
425  tc.start += (int)((seg->cur_entry.end_time - seg->cur_entry.start_time) * av_q2d(rate));/* increment timecode */
426  av_dict_set(&s->metadata, "timecode",
427  av_timecode_make_string(&tc, buf, 0), 0);
428  break;
429  }
430  }
431  } else {
432  av_log(s, AV_LOG_WARNING, "Could not increment global timecode, no global timecode metadata found.\n");
433  }
434  for (i = 0; i < s->nb_streams; i++) {
435  if (s->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
436  char st_buf[AV_TIMECODE_STR_SIZE];
437  AVTimecode st_tc;
438  AVRational st_rate = s->streams[i]->avg_frame_rate;
439  AVDictionaryEntry *st_tcr = av_dict_get(s->streams[i]->metadata, "timecode", NULL, 0);
440  if (st_tcr) {
441  if ((av_timecode_init_from_string(&st_tc, st_rate, st_tcr->value, s) < 0)) {
442  av_log(s, AV_LOG_WARNING, "Could not increment stream %d timecode, error occurred during timecode creation.\n", i);
443  continue;
444  }
445  st_tc.start += (int)((seg->cur_entry.end_time - seg->cur_entry.start_time) * av_q2d(st_rate)); // increment timecode
446  av_dict_set(&s->streams[i]->metadata, "timecode", av_timecode_make_string(&st_tc, st_buf, 0), 0);
447  }
448  }
449  }
450  }
451 
452 end:
453  ff_format_io_close(oc, &oc->pb);
454 
455  return ret;
456 }
457 
458 static int parse_times(void *log_ctx, int64_t **times, int *nb_times,
459  const char *times_str)
460 {
461  char *p;
462  int i, ret = 0;
463  char *times_str1 = av_strdup(times_str);
464  char *saveptr = NULL;
465 
466  if (!times_str1)
467  return AVERROR(ENOMEM);
468 
469 #define FAIL(err) ret = err; goto end
470 
471  *nb_times = 1;
472  for (p = times_str1; *p; p++)
473  if (*p == ',')
474  (*nb_times)++;
475 
476  *times = av_malloc_array(*nb_times, sizeof(**times));
477  if (!*times) {
478  av_log(log_ctx, AV_LOG_ERROR, "Could not allocate forced times array\n");
479  FAIL(AVERROR(ENOMEM));
480  }
481 
482  p = times_str1;
483  for (i = 0; i < *nb_times; i++) {
484  int64_t t;
485  char *tstr = av_strtok(p, ",", &saveptr);
486  p = NULL;
487 
488  if (!tstr || !tstr[0]) {
489  av_log(log_ctx, AV_LOG_ERROR, "Empty time specification in times list %s\n",
490  times_str);
491  FAIL(AVERROR(EINVAL));
492  }
493 
494  ret = av_parse_time(&t, tstr, 1);
495  if (ret < 0) {
496  av_log(log_ctx, AV_LOG_ERROR,
497  "Invalid time duration specification '%s' in times list %s\n", tstr, times_str);
498  FAIL(AVERROR(EINVAL));
499  }
500  (*times)[i] = t;
501 
502  /* check on monotonicity */
503  if (i && (*times)[i-1] > (*times)[i]) {
504  av_log(log_ctx, AV_LOG_ERROR,
505  "Specified time %f is smaller than the last time %f\n",
506  (float)((*times)[i])/1000000, (float)((*times)[i-1])/1000000);
507  FAIL(AVERROR(EINVAL));
508  }
509  }
510 
511 end:
512  av_free(times_str1);
513  return ret;
514 }
515 
516 static int parse_frames(void *log_ctx, int **frames, int *nb_frames,
517  const char *frames_str)
518 {
519  const char *p;
520  int i;
521 
522  *nb_frames = 1;
523  for (p = frames_str; *p; p++)
524  if (*p == ',')
525  (*nb_frames)++;
526 
527  *frames = av_malloc_array(*nb_frames, sizeof(**frames));
528  if (!*frames) {
529  av_log(log_ctx, AV_LOG_ERROR, "Could not allocate forced frames array\n");
530  return AVERROR(ENOMEM);
531  }
532 
533  p = frames_str;
534  for (i = 0; i < *nb_frames; i++) {
535  long int f;
536  char *tailptr;
537 
538  if (*p == '\0' || *p == ',') {
539  av_log(log_ctx, AV_LOG_ERROR, "Empty frame specification in frame list %s\n",
540  frames_str);
541  return AVERROR(EINVAL);
542  }
543  f = strtol(p, &tailptr, 10);
544  if (*tailptr != '\0' && *tailptr != ',' || f <= 0 || f >= INT_MAX) {
545  av_log(log_ctx, AV_LOG_ERROR,
546  "Invalid argument '%s', must be a positive integer < INT_MAX\n",
547  p);
548  return AVERROR(EINVAL);
549  }
550  if (*tailptr == ',')
551  tailptr++;
552  p = tailptr;
553  (*frames)[i] = f;
554 
555  /* check on monotonicity */
556  if (i && (*frames)[i-1] > (*frames)[i]) {
557  av_log(log_ctx, AV_LOG_ERROR,
558  "Specified frame %d is smaller than the last frame %d\n",
559  (*frames)[i], (*frames)[i-1]);
560  return AVERROR(EINVAL);
561  }
562  }
563 
564  return 0;
565 }
566 
568 {
569  int buf_size = 32768;
570  uint8_t *buf = av_malloc(buf_size);
571  if (!buf)
572  return AVERROR(ENOMEM);
573  *ctx = avio_alloc_context(buf, buf_size, 1, NULL, NULL, NULL, NULL);
574  if (!*ctx) {
575  av_free(buf);
576  return AVERROR(ENOMEM);
577  }
578  return 0;
579 }
580 
581 static void close_null_ctxp(AVIOContext **pb)
582 {
583  av_freep(&(*pb)->buffer);
584  avio_context_free(pb);
585 }
586 
588 {
589  SegmentContext *seg = s->priv_data;
590  int ret, i;
591 
592  seg->reference_stream_index = -1;
593  if (!strcmp(seg->reference_stream_specifier, "auto")) {
594  /* select first index of type with highest priority */
595  int type_index_map[AVMEDIA_TYPE_NB];
596  static const enum AVMediaType type_priority_list[] = {
602  };
603  enum AVMediaType type;
604 
605  for (i = 0; i < AVMEDIA_TYPE_NB; i++)
606  type_index_map[i] = -1;
607 
608  /* select first index for each type */
609  for (i = 0; i < s->nb_streams; i++) {
610  type = s->streams[i]->codecpar->codec_type;
611  if ((unsigned)type < AVMEDIA_TYPE_NB && type_index_map[type] == -1
612  /* ignore attached pictures/cover art streams */
613  && !(s->streams[i]->disposition & AV_DISPOSITION_ATTACHED_PIC))
614  type_index_map[type] = i;
615  }
616 
617  for (i = 0; i < FF_ARRAY_ELEMS(type_priority_list); i++) {
618  type = type_priority_list[i];
619  if ((seg->reference_stream_index = type_index_map[type]) >= 0)
620  break;
621  }
622  } else {
623  for (i = 0; i < s->nb_streams; i++) {
624  ret = avformat_match_stream_specifier(s, s->streams[i],
626  if (ret < 0)
627  return ret;
628  if (ret > 0) {
629  seg->reference_stream_index = i;
630  break;
631  }
632  }
633  }
634 
635  if (seg->reference_stream_index < 0) {
636  av_log(s, AV_LOG_ERROR, "Could not select stream matching identifier '%s'\n",
638  return AVERROR(EINVAL);
639  }
640 
641  return 0;
642 }
643 
645 {
646  SegmentContext *seg = s->priv_data;
647  SegmentListEntry *cur;
648 
649  ff_format_io_close(s, &seg->list_pb);
650  if (seg->avf) {
651  if (seg->is_nullctx)
652  close_null_ctxp(&seg->avf->pb);
653  else
654  ff_format_io_close(s, &seg->avf->pb);
656  seg->avf = NULL;
657  }
658  av_freep(&seg->times);
659  av_freep(&seg->frames);
660  av_freep(&seg->cur_entry.filename);
661 
662  cur = seg->segment_list_entries;
663  while (cur) {
664  SegmentListEntry *next = cur->next;
665  av_freep(&cur->filename);
666  av_free(cur);
667  cur = next;
668  }
669 }
670 
672 {
673  SegmentContext *seg = s->priv_data;
674  AVFormatContext *oc = seg->avf;
676  int ret;
677  int i;
678 
679  seg->segment_count = 0;
680  if (!seg->write_header_trailer)
681  seg->individual_header_trailer = 0;
682 
683  if (seg->header_filename) {
684  seg->write_header_trailer = 1;
685  seg->individual_header_trailer = 0;
686  }
687 
688  if (seg->initial_offset > 0) {
689  av_log(s, AV_LOG_WARNING, "NOTE: the option initial_offset is deprecated,"
690  "you can use output_ts_offset instead of it\n");
691  }
692 
693  if ((seg->time != 2000000) + !!seg->times_str + !!seg->frames_str > 1) {
695  "segment_time, segment_times, and segment_frames options "
696  "are mutually exclusive, select just one of them\n");
697  return AVERROR(EINVAL);
698  }
699 
700  if (seg->times_str) {
701  if ((ret = parse_times(s, &seg->times, &seg->nb_times, seg->times_str)) < 0)
702  return ret;
703  } else if (seg->frames_str) {
704  if ((ret = parse_frames(s, &seg->frames, &seg->nb_frames, seg->frames_str)) < 0)
705  return ret;
706  } else {
707  if (seg->use_clocktime) {
708  if (seg->time <= 0) {
709  av_log(s, AV_LOG_ERROR, "Invalid negative segment_time with segment_atclocktime option set\n");
710  return AVERROR(EINVAL);
711  }
712  seg->clocktime_offset = seg->time - (seg->clocktime_offset % seg->time);
713  }
714  }
715 
716  if (seg->list) {
717  if (seg->list_type == LIST_TYPE_UNDEFINED) {
718  if (av_match_ext(seg->list, "csv" )) seg->list_type = LIST_TYPE_CSV;
719  else if (av_match_ext(seg->list, "ext" )) seg->list_type = LIST_TYPE_EXT;
720  else if (av_match_ext(seg->list, "m3u8")) seg->list_type = LIST_TYPE_M3U8;
721  else if (av_match_ext(seg->list, "ffcat,ffconcat")) seg->list_type = LIST_TYPE_FFCONCAT;
722  else seg->list_type = LIST_TYPE_FLAT;
723  }
724  if (!seg->list_size && seg->list_type != LIST_TYPE_M3U8) {
725  if ((ret = segment_list_open(s)) < 0)
726  return ret;
727  } else {
728  const char *proto = avio_find_protocol_name(seg->list);
729  seg->use_rename = proto && !strcmp(proto, "file");
730  }
731  }
732 
733  if (seg->list_type == LIST_TYPE_EXT)
734  av_log(s, AV_LOG_WARNING, "'ext' list type option is deprecated in favor of 'csv'\n");
735 
736  if ((ret = select_reference_stream(s)) < 0)
737  return ret;
738  av_log(s, AV_LOG_VERBOSE, "Selected stream id:%d type:%s\n",
740  av_get_media_type_string(s->streams[seg->reference_stream_index]->codecpar->codec_type));
741 
742  seg->oformat = av_guess_format(seg->format, s->url, NULL);
743 
744  if (!seg->oformat)
746  if (seg->oformat->flags & AVFMT_NOFILE) {
747  av_log(s, AV_LOG_ERROR, "format %s not supported.\n",
748  seg->oformat->name);
749  return AVERROR(EINVAL);
750  }
751 
752  if ((ret = segment_mux_init(s)) < 0)
753  return ret;
754 
755  if ((ret = set_segment_filename(s)) < 0)
756  return ret;
757  oc = seg->avf;
758 
759  if (seg->write_header_trailer) {
760  if ((ret = s->io_open(s, &oc->pb,
761  seg->header_filename ? seg->header_filename : oc->url,
762  AVIO_FLAG_WRITE, NULL)) < 0) {
763  av_log(s, AV_LOG_ERROR, "Failed to open segment '%s'\n", oc->url);
764  return ret;
765  }
766  if (!seg->individual_header_trailer)
767  oc->pb->seekable = 0;
768  } else {
769  if ((ret = open_null_ctx(&oc->pb)) < 0)
770  return ret;
771  seg->is_nullctx = 1;
772  }
773 
775  av_dict_set(&options, "fflags", "-autobsf", 0);
777  if (av_dict_count(options)) {
779  "Some of the provided format options are not recognized\n");
781  return AVERROR(EINVAL);
782  }
784 
785  if (ret < 0) {
786  return ret;
787  }
788  seg->segment_frame_count = 0;
789 
790  av_assert0(s->nb_streams == oc->nb_streams);
793  if (ret < 0)
794  return ret;
795  seg->header_written = 1;
796  }
797 
798  for (i = 0; i < s->nb_streams; i++) {
799  AVStream *inner_st = oc->streams[i];
800  AVStream *outer_st = s->streams[i];
801  avpriv_set_pts_info(outer_st, inner_st->pts_wrap_bits, inner_st->time_base.num, inner_st->time_base.den);
802  }
803 
804  if (oc->avoid_negative_ts > 0 && s->avoid_negative_ts < 0)
805  s->avoid_negative_ts = 1;
806 
807  return ret;
808 }
809 
811 {
812  SegmentContext *seg = s->priv_data;
813  AVFormatContext *oc = seg->avf;
814  int ret;
815 
816  if (!seg->header_written) {
818  if (ret < 0)
819  return ret;
820  }
821 
822  if (!seg->write_header_trailer || seg->header_filename) {
823  if (seg->header_filename) {
824  av_write_frame(oc, NULL);
825  ff_format_io_close(oc, &oc->pb);
826  } else {
827  close_null_ctxp(&oc->pb);
828  seg->is_nullctx = 0;
829  }
830  if ((ret = oc->io_open(oc, &oc->pb, oc->url, AVIO_FLAG_WRITE, NULL)) < 0)
831  return ret;
832  if (!seg->individual_header_trailer)
833  oc->pb->seekable = 0;
834  }
835 
836  return 0;
837 }
838 
840 {
841  SegmentContext *seg = s->priv_data;
842  AVStream *st = s->streams[pkt->stream_index];
843  int64_t end_pts = INT64_MAX, offset;
844  int start_frame = INT_MAX;
845  int ret;
846  struct tm ti;
847  int64_t usecs;
848  int64_t wrapped_val;
849 
850  if (!seg->avf || !seg->avf->pb)
851  return AVERROR(EINVAL);
852 
853  if (!st->codecpar->extradata_size) {
854  size_t pkt_extradata_size;
855  uint8_t *pkt_extradata = av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, &pkt_extradata_size);
856  if (pkt_extradata && pkt_extradata_size > 0) {
857  ret = ff_alloc_extradata(st->codecpar, pkt_extradata_size);
858  if (ret < 0) {
859  av_log(s, AV_LOG_WARNING, "Unable to add extradata to stream. Output segments may be invalid.\n");
860  goto calc_times;
861  }
862  memcpy(st->codecpar->extradata, pkt_extradata, pkt_extradata_size);
863  }
864  }
865 
866 calc_times:
867  if (seg->times) {
868  end_pts = seg->segment_count < seg->nb_times ?
869  seg->times[seg->segment_count] : INT64_MAX;
870  } else if (seg->frames) {
871  start_frame = seg->segment_count < seg->nb_frames ?
872  seg->frames[seg->segment_count] : INT_MAX;
873  } else {
874  if (seg->use_clocktime) {
875  int64_t avgt = av_gettime();
876  time_t sec = avgt / 1000000;
877  localtime_r(&sec, &ti);
878  usecs = (int64_t)(ti.tm_hour * 3600 + ti.tm_min * 60 + ti.tm_sec) * 1000000 + (avgt % 1000000);
879  wrapped_val = (usecs + seg->clocktime_offset) % seg->time;
880  if (wrapped_val < seg->last_val && wrapped_val < seg->clocktime_wrap_duration)
881  seg->cut_pending = 1;
882  seg->last_val = wrapped_val;
883  } else {
884  end_pts = seg->time * (seg->segment_count + 1);
885  }
886  }
887 
888  ff_dlog(s, "packet stream:%d pts:%s pts_time:%s duration_time:%s is_key:%d frame:%d\n",
892  pkt->stream_index == seg->reference_stream_index ? seg->frame_count : -1);
893 
894  if (pkt->stream_index == seg->reference_stream_index &&
896  (seg->segment_frame_count > 0 || seg->write_empty) &&
897  (seg->cut_pending || seg->frame_count >= start_frame ||
898  (pkt->pts != AV_NOPTS_VALUE &&
900  end_pts - seg->time_delta, AV_TIME_BASE_Q) >= 0))) {
901  /* sanitize end time in case last packet didn't have a defined duration */
902  if (seg->cur_entry.last_duration == 0)
903  seg->cur_entry.end_time = (double)pkt->pts * av_q2d(st->time_base);
904 
905  if ((ret = segment_end(s, seg->individual_header_trailer, 0)) < 0)
906  goto fail;
907 
908  if ((ret = segment_start(s, seg->individual_header_trailer)) < 0)
909  goto fail;
910 
911  seg->cut_pending = 0;
913  seg->cur_entry.start_time = (double)pkt->pts * av_q2d(st->time_base);
916 
917  if (seg->times || (!seg->frames && !seg->use_clocktime) && seg->write_empty)
918  goto calc_times;
919  }
920 
921  if (pkt->stream_index == seg->reference_stream_index) {
922  if (pkt->pts != AV_NOPTS_VALUE)
923  seg->cur_entry.end_time =
924  FFMAX(seg->cur_entry.end_time, (double)(pkt->pts + pkt->duration) * av_q2d(st->time_base));
926  }
927 
928  if (seg->segment_frame_count == 0) {
929  av_log(s, AV_LOG_VERBOSE, "segment:'%s' starts with packet stream:%d pts:%s pts_time:%s frame:%d\n",
930  seg->avf->url, pkt->stream_index,
932  }
933 
934  av_log(s, AV_LOG_DEBUG, "stream:%d start_pts_time:%s pts:%s pts_time:%s dts:%s dts_time:%s",
935  pkt->stream_index,
939 
940  /* compute new timestamps */
943  if (pkt->pts != AV_NOPTS_VALUE)
944  pkt->pts += offset;
945  if (pkt->dts != AV_NOPTS_VALUE)
946  pkt->dts += offset;
947 
948  av_log(s, AV_LOG_DEBUG, " -> pts:%s pts_time:%s dts:%s dts_time:%s\n",
951 
954 
955 fail:
956  /* Use st->index here as the packet returned from ff_write_chained()
957  * is blank if interleaving has been used. */
958  if (st->index == seg->reference_stream_index) {
959  seg->frame_count++;
960  seg->segment_frame_count++;
961  }
962 
963  return ret;
964 }
965 
967 {
968  SegmentContext *seg = s->priv_data;
969  AVFormatContext *oc = seg->avf;
970  int ret;
971 
972  if (!oc)
973  return 0;
974 
975  if (!seg->write_header_trailer) {
976  if ((ret = segment_end(s, 0, 1)) < 0)
977  return ret;
978  if ((ret = open_null_ctx(&oc->pb)) < 0)
979  return ret;
980  seg->is_nullctx = 1;
981  ret = av_write_trailer(oc);
982  } else {
983  ret = segment_end(s, 1, 1);
984  }
985  return ret;
986 }
987 
989  const AVPacket *pkt)
990 {
991  SegmentContext *seg = s->priv_data;
992  AVFormatContext *oc = seg->avf;
993  if (oc->oformat->check_bitstream) {
994  AVStream *const ost = oc->streams[st->index];
995  int ret = oc->oformat->check_bitstream(oc, ost, pkt);
996  if (ret == 1) {
997  FFStream *const sti = ffstream(st);
998  FFStream *const osti = ffstream(ost);
999  sti->bsfc = osti->bsfc;
1000  osti->bsfc = NULL;
1001  }
1002  return ret;
1003  }
1004  return 1;
1005 }
1006 
1007 #define OFFSET(x) offsetof(SegmentContext, x)
1008 #define E AV_OPT_FLAG_ENCODING_PARAM
1009 static const AVOption options[] = {
1010  { "reference_stream", "set reference stream", OFFSET(reference_stream_specifier), AV_OPT_TYPE_STRING, {.str = "auto"}, 0, 0, E },
1011  { "segment_format", "set container format used for the segments", OFFSET(format), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E },
1012  { "segment_format_options", "set list of options for the container format used for the segments", OFFSET(format_options), AV_OPT_TYPE_DICT, {.str = NULL}, 0, 0, E },
1013  { "segment_list", "set the segment list filename", OFFSET(list), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E },
1014  { "segment_header_filename", "write a single file containing the header", OFFSET(header_filename), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E },
1015 
1016  { "segment_list_flags","set flags affecting segment list generation", OFFSET(list_flags), AV_OPT_TYPE_FLAGS, {.i64 = SEGMENT_LIST_FLAG_CACHE }, 0, UINT_MAX, E, "list_flags"},
1017  { "cache", "allow list caching", 0, AV_OPT_TYPE_CONST, {.i64 = SEGMENT_LIST_FLAG_CACHE }, INT_MIN, INT_MAX, E, "list_flags"},
1018  { "live", "enable live-friendly list generation (useful for HLS)", 0, AV_OPT_TYPE_CONST, {.i64 = SEGMENT_LIST_FLAG_LIVE }, INT_MIN, INT_MAX, E, "list_flags"},
1019 
1020  { "segment_list_size", "set the maximum number of playlist entries", OFFSET(list_size), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, E },
1021 
1022  { "segment_list_type", "set the segment list type", OFFSET(list_type), AV_OPT_TYPE_INT, {.i64 = LIST_TYPE_UNDEFINED}, -1, LIST_TYPE_NB-1, E, "list_type" },
1023  { "flat", "flat format", 0, AV_OPT_TYPE_CONST, {.i64=LIST_TYPE_FLAT }, INT_MIN, INT_MAX, E, "list_type" },
1024  { "csv", "csv format", 0, AV_OPT_TYPE_CONST, {.i64=LIST_TYPE_CSV }, INT_MIN, INT_MAX, E, "list_type" },
1025  { "ext", "extended format", 0, AV_OPT_TYPE_CONST, {.i64=LIST_TYPE_EXT }, INT_MIN, INT_MAX, E, "list_type" },
1026  { "ffconcat", "ffconcat format", 0, AV_OPT_TYPE_CONST, {.i64=LIST_TYPE_FFCONCAT }, INT_MIN, INT_MAX, E, "list_type" },
1027  { "m3u8", "M3U8 format", 0, AV_OPT_TYPE_CONST, {.i64=LIST_TYPE_M3U8 }, INT_MIN, INT_MAX, E, "list_type" },
1028  { "hls", "Apple HTTP Live Streaming compatible", 0, AV_OPT_TYPE_CONST, {.i64=LIST_TYPE_M3U8 }, INT_MIN, INT_MAX, E, "list_type" },
1029 
1030  { "segment_atclocktime", "set segment to be cut at clocktime", OFFSET(use_clocktime), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, E},
1031  { "segment_clocktime_offset", "set segment clocktime offset", OFFSET(clocktime_offset), AV_OPT_TYPE_DURATION, {.i64 = 0}, 0, 86400000000LL, E},
1032  { "segment_clocktime_wrap_duration", "set segment clocktime wrapping duration", OFFSET(clocktime_wrap_duration), AV_OPT_TYPE_DURATION, {.i64 = INT64_MAX}, 0, INT64_MAX, E},
1033  { "segment_time", "set segment duration", OFFSET(time),AV_OPT_TYPE_DURATION, {.i64 = 2000000}, INT64_MIN, INT64_MAX, E },
1034  { "segment_time_delta","set approximation value used for the segment times", OFFSET(time_delta), AV_OPT_TYPE_DURATION, {.i64 = 0}, 0, INT64_MAX, E },
1035  { "segment_times", "set segment split time points", OFFSET(times_str),AV_OPT_TYPE_STRING,{.str = NULL}, 0, 0, E },
1036  { "segment_frames", "set segment split frame numbers", OFFSET(frames_str),AV_OPT_TYPE_STRING,{.str = NULL}, 0, 0, E },
1037  { "segment_wrap", "set number after which the index wraps", OFFSET(segment_idx_wrap), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, E },
1038  { "segment_list_entry_prefix", "set base url prefix for segments", OFFSET(entry_prefix), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E },
1039  { "segment_start_number", "set the sequence number of the first segment", OFFSET(segment_idx), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, E },
1040  { "segment_wrap_number", "set the number of wrap before the first segment", OFFSET(segment_idx_wrap_nb), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, E },
1041  { "strftime", "set filename expansion with strftime at segment creation", OFFSET(use_strftime), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, E },
1042  { "increment_tc", "increment timecode between each segment", OFFSET(increment_tc), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, E },
1043  { "break_non_keyframes", "allow breaking segments on non-keyframes", OFFSET(break_non_keyframes), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, E },
1044 
1045  { "individual_header_trailer", "write header/trailer to each segment", OFFSET(individual_header_trailer), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, E },
1046  { "write_header_trailer", "write a header to the first segment and a trailer to the last one", OFFSET(write_header_trailer), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, E },
1047  { "reset_timestamps", "reset timestamps at the beginning of each segment", OFFSET(reset_timestamps), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, E },
1048  { "initial_offset", "set initial timestamp offset", OFFSET(initial_offset), AV_OPT_TYPE_DURATION, {.i64 = 0}, -INT64_MAX, INT64_MAX, E },
1049  { "write_empty_segments", "allow writing empty 'filler' segments", OFFSET(write_empty), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, E },
1050  { NULL },
1051 };
1052 
1053 static const AVClass seg_class = {
1054  .class_name = "(stream) segment muxer",
1055  .item_name = av_default_item_name,
1056  .option = options,
1057  .version = LIBAVUTIL_VERSION_INT,
1058 };
1059 
1060 #if CONFIG_SEGMENT_MUXER
1062  .name = "segment",
1063  .long_name = NULL_IF_CONFIG_SMALL("segment"),
1064  .priv_data_size = sizeof(SegmentContext),
1066  .init = seg_init,
1070  .deinit = seg_free,
1072  .priv_class = &seg_class,
1073 };
1074 #endif
1075 
1076 #if CONFIG_STREAM_SEGMENT_MUXER
1078  .name = "stream_segment,ssegment",
1079  .long_name = NULL_IF_CONFIG_SMALL("streaming segment muxer"),
1080  .priv_data_size = sizeof(SegmentContext),
1081  .flags = AVFMT_NOFILE,
1082  .init = seg_init,
1086  .deinit = seg_free,
1088  .priv_class = &seg_class,
1089 };
1090 #endif
SEGMENT_LIST_FLAG_LIVE
#define SEGMENT_LIST_FLAG_LIVE
Definition: segment.c:67
SegmentContext::write_header_trailer
int write_header_trailer
Set by a private option.
Definition: segment.c:110
ost
OutputStream * ost
Definition: ffmpeg_filter.c:160
SegmentListEntry::index
int index
Definition: segment.c:47
AVMEDIA_TYPE_SUBTITLE
@ AVMEDIA_TYPE_SUBTITLE
Definition: avutil.h:204
av_codec_get_id
enum AVCodecID av_codec_get_id(const struct AVCodecTag *const *tags, unsigned int tag)
Get the AVCodecID for the given codec tag tag.
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
LIST_TYPE_UNDEFINED
@ LIST_TYPE_UNDEFINED
Definition: segment.c:57
AV_TIMECODE_STR_SIZE
#define AV_TIMECODE_STR_SIZE
Definition: timecode.h:33
SegmentContext::clocktime_wrap_duration
int64_t clocktime_wrap_duration
Definition: segment.c:86
AVCodecParameters::extradata
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
Definition: codec_par.h:74
SegmentContext::avf
AVFormatContext * avf
Definition: segment.c:76
AVOutputFormat::name
const char * name
Definition: avformat.h:504
AVSTREAM_INIT_IN_WRITE_HEADER
#define AVSTREAM_INIT_IN_WRITE_HEADER
stream parameters initialized in avformat_write_header
Definition: avformat.h:2286
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
avformat_new_stream
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
Definition: utils.c:768
SegmentContext::list_pb
AVIOContext * list_pb
list file put-byte context
Definition: segment.c:93
av_compare_ts
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:146
AVCodecParameters
This struct describes the properties of an encoded stream.
Definition: codec_par.h:52
segment_start
static int segment_start(AVFormatContext *s, int write_header)
Definition: segment.c:231
AV_DISPOSITION_ATTACHED_PIC
#define AV_DISPOSITION_ATTACHED_PIC
The stream is stored in the file as an attached picture/"cover art" (e.g.
Definition: avformat.h:873
av_dict_count
int av_dict_count(const AVDictionary *m)
Get number of entries in dictionary.
Definition: dict.c:35
LIST_TYPE_CSV
@ LIST_TYPE_CSV
Definition: segment.c:59
SegmentContext::use_clocktime
int use_clocktime
flag to cut segments at regular clock time
Definition: segment.c:84
avio_context_free
void avio_context_free(AVIOContext **s)
Free the supplied IO context and everything associated with it.
Definition: aviobuf.c:152
AV_TIME_BASE_Q
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition: avutil.h:260
check_bitstream
static int check_bitstream(AVFormatContext *s, FFStream *sti, AVPacket *pkt)
Definition: mux.c:1097
SegmentContext::list_type
int list_type
set the list type
Definition: segment.c:92
SegmentContext::nb_frames
int nb_frames
number of elments in the frames array
Definition: segment.c:104
SegmentContext::segment_idx_wrap
int segment_idx_wrap
number after which the index wraps
Definition: segment.c:72
AVFormatContext::streams
AVStream ** streams
A list of all streams in the file.
Definition: avformat.h:1268
deinit
static void deinit(AVFormatContext *s)
Definition: chromaprint.c:50
segment_mux_init
static int segment_mux_init(AVFormatContext *s)
Definition: segment.c:144
AVOption
AVOption.
Definition: opt.h:247
ist
ifilter ist
Definition: ffmpeg_filter.c:177
SegmentContext::segment_count
int segment_count
number of segment files already written
Definition: segment.c:74
SegmentContext::times_str
char * times_str
segment times specification string
Definition: segment.c:98
ff_stream_segment_muxer
const AVOutputFormat ff_stream_segment_muxer
SegmentContext::break_non_keyframes
int break_non_keyframes
Definition: segment.c:117
AV_OPT_TYPE_DURATION
@ AV_OPT_TYPE_DURATION
Definition: opt.h:238
SegmentContext::frames_str
char * frames_str
segment frame numbers specification string
Definition: segment.c:102
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:196
float.h
FFStream::bsfc
AVBSFContext * bsfc
bitstream filter to run on stream
Definition: internal.h:210
AVPacket::duration
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
Definition: packet.h:391
AVCodecParameters::codec_tag
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
Definition: codec_par.h:64
mathematics.h
AVDictionary
Definition: dict.c:30
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
FAIL
#define FAIL(err)
avformat_init_output
av_warn_unused_result int avformat_init_output(AVFormatContext *s, AVDictionary **options)
Allocate the stream private data and initialize the codec, but do not write the header.
Definition: mux.c:456
SegmentContext::cur_entry
SegmentListEntry cur_entry
Definition: segment.c:123
SegmentContext::list
char * list
filename for the segment list file
Definition: segment.c:79
av_get_frame_filename
int av_get_frame_filename(char *buf, int buf_size, const char *path, int number)
Definition: utils.c:1044
SegmentListEntry::next
struct SegmentListEntry * next
Definition: segment.c:52
AV_PKT_FLAG_KEY
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: packet.h:428
av_basename
const char * av_basename(const char *path)
Thread safe basename.
Definition: avstring.c:260
SegmentContext::time
int64_t time
segment duration
Definition: segment.c:94
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:31
SegmentContext::use_rename
int use_rename
Definition: segment.c:120
init
static int init
Definition: av_tx.c:47
SegmentContext::temp_list_filename
char temp_list_filename[1024]
Definition: segment.c:121
SegmentContext::is_nullctx
int is_nullctx
whether avf->pb is a nullctx
Definition: segment.c:83
segment_end
static int segment_end(AVFormatContext *s, int write_trailer, int is_last)
Definition: segment.c:346
AVFormatContext::interrupt_callback
AVIOInterruptCB interrupt_callback
Custom interrupt callbacks for the I/O layer.
Definition: avformat.h:1467
ff_segment_muxer
const AVOutputFormat ff_segment_muxer
SegmentListEntry
Definition: segment.c:46
SegmentContext::nb_times
int nb_times
number of elments in the times array
Definition: segment.c:100
parse_frames
static int parse_frames(void *log_ctx, int **frames, int *nb_frames, const char *frames_str)
Definition: segment.c:516
seg_write_header
static int seg_write_header(AVFormatContext *s)
Definition: segment.c:810
ffstream
static av_always_inline FFStream * ffstream(AVStream *st)
Definition: internal.h:431
av_escape
int av_escape(char **dst, const char *src, const char *special_chars, enum AVEscapeMode mode, int flags)
Escape string in src, and put the escaped string in an allocated string in *dst, which must be freed ...
Definition: avstring.c:335
fail
#define fail()
Definition: checkasm.h:128
frames
if it could not because there are no more frames
Definition: filter_design.txt:266
timecode.h
SegmentContext::reference_stream_index
int reference_stream_index
Definition: segment.c:116
AVTimecode::start
int start
timecode frame start (first base frame number)
Definition: timecode.h:42
av_timecode_make_string
char * av_timecode_make_string(const AVTimecode *tc, char *buf, int framenum)
Load timecode string in buf.
Definition: timecode.c:102
SegmentContext::oformat
const AVOutputFormat * oformat
Definition: segment.c:75
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
av_opt_set
int av_opt_set(void *obj, const char *name, const char *val, int search_flags)
Definition: opt.c:468
close_null_ctxp
static void close_null_ctxp(AVIOContext **pb)
Definition: segment.c:581
SegmentContext::cut_pending
int cut_pending
Definition: segment.c:88
AV_ESCAPE_FLAG_WHITESPACE
#define AV_ESCAPE_FLAG_WHITESPACE
Consider spaces special and escape them even in the middle of the string.
Definition: avstring.h:338
ff_rename
int ff_rename(const char *url_src, const char *url_dst, void *logctx)
Wrap ffurl_move() and log if error happens.
Definition: avio.c:665
AVRational::num
int num
Numerator.
Definition: rational.h:59
select_reference_stream
static int select_reference_stream(AVFormatContext *s)
Definition: segment.c:587
seg_check_bitstream
static int seg_check_bitstream(AVFormatContext *s, AVStream *st, const AVPacket *pkt)
Definition: segment.c:988
SegmentContext::use_strftime
int use_strftime
flag to expand filename with strftime
Definition: segment.c:95
avassert.h
SegmentContext::reset_timestamps
int reset_timestamps
reset timestamps at the beginning of each segment
Definition: segment.c:113
ceil
static __device__ float ceil(float a)
Definition: cuda_runtime.h:176
SegmentContext::frame_count
int frame_count
total number of reference frames
Definition: segment.c:105
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
AVFormatContext::metadata
AVDictionary * metadata
Metadata that applies to the whole file.
Definition: avformat.h:1429
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
SegmentListEntry::offset_pts
int64_t offset_pts
Definition: segment.c:50
SegmentContext::format
char * format
format to use for output segment files
Definition: segment.c:77
ff_write_chained
int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt, AVFormatContext *src, int interleave)
Write a packet to another muxer than the one the user originally intended.
Definition: mux.c:1335
seg_write_trailer
static int seg_write_trailer(struct AVFormatContext *s)
Definition: segment.c:966
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:40
s
#define s(width, name)
Definition: cbs_vp9.c:257
AVFormatContext::flags
int flags
Flags modifying the (de)muxer behaviour.
Definition: avformat.h:1318
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
av_q2d
static double av_q2d(AVRational a)
Convert an AVRational to a double.
Definition: rational.h:104
av_strtok
char * av_strtok(char *s, const char *delim, char **saveptr)
Split the string into several tokens which can be accessed by successive calls to av_strtok().
Definition: avstring.c:186
av_match_ext
int av_match_ext(const char *filename, const char *extensions)
Return a positive value if the given filename has one of the given extensions, 0 otherwise.
Definition: format.c:38
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
AVMEDIA_TYPE_NB
@ AVMEDIA_TYPE_NB
Definition: avutil.h:206
AVIO_FLAG_WRITE
#define AVIO_FLAG_WRITE
write-only
Definition: avio.h:622
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:201
ctx
AVFormatContext * ctx
Definition: movenc.c:48
SegmentContext::write_empty
int write_empty
Definition: segment.c:118
SegmentListEntry::last_duration
int64_t last_duration
Definition: segment.c:53
av_rescale_q
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
Definition: mathematics.c:141
AVOutputFormat::codec_tag
const struct AVCodecTag *const * codec_tag
List of supported codec_id-codec_tag pairs, ordered by "better choice first".
Definition: avformat.h:529
AVFormatContext::opaque
void * opaque
User data.
Definition: avformat.h:1706
AVMEDIA_TYPE_DATA
@ AVMEDIA_TYPE_DATA
Opaque data information usually continuous.
Definition: avutil.h:203
f
#define f(width, name)
Definition: cbs_vp9.c:255
avformat_write_header
av_warn_unused_result int avformat_write_header(AVFormatContext *s, AVDictionary **options)
Allocate the stream private data and write the stream header to an output media file.
Definition: mux.c:477
SegmentListEntry::start_pts
int64_t start_pts
Definition: segment.c:49
time_internal.h
if
if(ret)
Definition: filter_design.txt:179
seg_init
static int seg_init(AVFormatContext *s)
Definition: segment.c:671
avio_flush
void avio_flush(AVIOContext *s)
Force flushing of buffered data.
Definition: aviobuf.c:252
AVFormatContext
Format I/O context.
Definition: avformat.h:1200
internal.h
SegmentContext::format_options
AVDictionary * format_options
Definition: segment.c:78
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:1095
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:66
AVStream::time_base
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
Definition: avformat.h:965
NULL
#define NULL
Definition: coverity.c:32
write_trailer
static int write_trailer(AVFormatContext *s1)
Definition: v4l2enc.c:98
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
LIST_TYPE_EXT
@ LIST_TYPE_EXT
deprecated
Definition: segment.c:61
AV_OPT_TYPE_DICT
@ AV_OPT_TYPE_DICT
Definition: opt.h:231
SegmentContext::frames
int * frames
list of frame number specification
Definition: segment.c:103
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:235
AVFormatContext::pb
AVIOContext * pb
I/O context.
Definition: avformat.h:1242
parseutils.h
list
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 list
Definition: filter_design.txt:25
av_parse_time
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:589
time.h
avio_w8
void avio_w8(AVIOContext *s, int b)
Definition: aviobuf.c:210
set_segment_filename
static int set_segment_filename(AVFormatContext *s)
Definition: segment.c:187
AVOutputFormat::priv_class
const AVClass * priv_class
AVClass for the private context.
Definition: avformat.h:532
av_write_frame
int av_write_frame(AVFormatContext *s, AVPacket *pkt)
Write a packet to an output media file.
Definition: mux.c:1216
AV_ESCAPE_MODE_AUTO
@ AV_ESCAPE_MODE_AUTO
Use auto-selected escaping mode.
Definition: avstring.h:324
seg_write_packet
static int seg_write_packet(AVFormatContext *s, AVPacket *pkt)
Definition: segment.c:839
segment_list_open
static int segment_list_open(AVFormatContext *s)
Definition: segment.c:276
SegmentContext::clocktime_offset
int64_t clocktime_offset
Definition: segment.c:85
OFFSET
#define OFFSET(x)
Definition: segment.c:1007
AVCodecParameters::extradata_size
int extradata_size
Size of the extradata content in bytes.
Definition: codec_par.h:78
AVFormatContext::nb_streams
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
Definition: avformat.h:1256
AVOutputFormat::flags
int flags
can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_GLOBALHEADER, AVFMT_NOTIMESTAMPS,...
Definition: avformat.h:523
ff_dlog
#define ff_dlog(a,...)
Definition: tableprint_vlc.h:29
SegmentContext::entry_prefix
char * entry_prefix
prefix to add to list entry filenames
Definition: segment.c:91
LIST_TYPE_FLAT
@ LIST_TYPE_FLAT
Definition: segment.c:58
SegmentContext::increment_tc
int increment_tc
flag to increment timecode if found
Definition: segment.c:96
print_csv_escaped_str
static void print_csv_escaped_str(AVIOContext *ctx, const char *str)
Definition: segment.c:128
SegmentContext::segment_list_entries_end
SegmentListEntry * segment_list_entries_end
Definition: segment.c:125
AVIOContext
Bytestream IO Context.
Definition: avio.h:161
av_ts2timestr
#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
AVMediaType
AVMediaType
Definition: avutil.h:199
avformat_match_stream_specifier
int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st, const char *spec)
Check if the stream st contained in s is matched by the stream specifier spec.
Definition: utils.c:1542
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:117
av_codec_get_tag
unsigned int av_codec_get_tag(const struct AVCodecTag *const *tags, enum AVCodecID id)
Get the codec tag for the given codec id id.
AVIOContext::seekable
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
Definition: avio.h:262
FFStream
Definition: internal.h:193
localtime_r
#define localtime_r
Definition: time_internal.h:46
SegmentContext::time_delta
int64_t time_delta
Definition: segment.c:108
AVFormatContext::url
char * url
input or output URL.
Definition: avformat.h:1283
size
int size
Definition: twinvq_data.h:10344
av_reallocp
int av_reallocp(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory through a pointer to a pointer.
Definition: mem.c:185
SegmentContext
Definition: f_segment.c:35
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:248
seg_free
static void seg_free(AVFormatContext *s)
Definition: segment.c:644
format
ofilter format
Definition: ffmpeg_filter.c:172
AVFMT_NOFILE
#define AVFMT_NOFILE
Demuxer will use avio_open, no opened file should be provided by the caller.
Definition: avformat.h:464
LIST_TYPE_NB
@ LIST_TYPE_NB
Definition: segment.c:63
SegmentContext::header_written
int header_written
whether we've already called avformat_write_header
Definition: segment.c:89
ListType
ListType
Definition: segment.c:56
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:372
SegmentContext::segment_frame_count
int segment_frame_count
number of reference frames in the segment
Definition: segment.c:106
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:379
av_dict_free
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
Definition: dict.c:203
LIST_TYPE_M3U8
@ LIST_TYPE_M3U8
Definition: segment.c:60
SegmentContext::segment_idx_wrap_nb
int segment_idx_wrap_nb
number of time the index has wraped
Definition: segment.c:73
AVOutputFormat::interleave_packet
int(* interleave_packet)(struct AVFormatContext *s, AVPacket *pkt, int flush, int has_packet)
A format-specific function for interleavement.
Definition: avformat.h:577
SegmentListEntry::end_time
double end_time
Definition: segment.c:48
SegmentContext::last_val
int64_t last_val
remember last time for wrap around detection
Definition: segment.c:87
write_packet
static void write_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost, int unqueue)
Definition: ffmpeg.c:727
av_write_trailer
int av_write_trailer(AVFormatContext *s)
Write the stream trailer to an output media file and free the file private data.
Definition: mux.c:1278
SegmentContext::segment_idx
int segment_idx
index of the segment file to write, starting from 0
Definition: segment.c:71
SegmentContext::reference_stream_specifier
char * reference_stream_specifier
reference stream specifier
Definition: segment.c:115
log.h
AVFMT_GLOBALHEADER
#define AVFMT_GLOBALHEADER
Format wants global header.
Definition: avformat.h:474
AVOutputFormat
Definition: avformat.h:503
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:271
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:366
avio_internal.h
SegmentListEntry::start_time
double start_time
Definition: segment.c:48
av_packet_get_side_data
uint8_t * av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type, size_t *size)
Get side information from packet.
Definition: avpacket.c:253
internal.h
AVERROR_MUXER_NOT_FOUND
#define AVERROR_MUXER_NOT_FOUND
Muxer not found.
Definition: error.h:62
av_malloc_array
#define av_malloc_array(a, b)
Definition: tableprint_vlc.h:32
AVFormatContext::avoid_negative_ts
int avoid_negative_ts
Avoid negative timestamps during muxing.
Definition: avformat.h:1532
AVMEDIA_TYPE_ATTACHMENT
@ AVMEDIA_TYPE_ATTACHMENT
Opaque data information usually sparse.
Definition: avutil.h:205
avio_alloc_context
AVIOContext * avio_alloc_context(unsigned char *buffer, int buffer_size, int write_flag, void *opaque, int(*read_packet)(void *opaque, uint8_t *buf, int buf_size), int(*write_packet)(void *opaque, uint8_t *buf, int buf_size), int64_t(*seek)(void *opaque, int64_t offset, int whence))
Allocate and initialize an AVIOContext for buffered I/O.
Definition: aviobuf.c:135
AVFormatContext::max_delay
int max_delay
Definition: avformat.h:1312
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:263
SegmentContext::list_size
int list_size
number of entries for the segment list file
Definition: segment.c:81
SegmentContext::segment_list_entries
SegmentListEntry * segment_list_entries
Definition: segment.c:124
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:935
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
AVFormatContext::oformat
const struct AVOutputFormat * oformat
The output container format.
Definition: avformat.h:1219
avformat.h
E
#define E
Definition: segment.c:1008
ff_format_set_url
void ff_format_set_url(AVFormatContext *s, char *url)
Set AVFormatContext url field to the provided pointer.
Definition: utils.c:2002
avio_printf
int avio_printf(AVIOContext *s, const char *fmt,...) av_printf_format(2
Writes a formatted string to the context.
av_get_media_type_string
const char * av_get_media_type_string(enum AVMediaType media_type)
Return a string describing the media_type enum, NULL if media_type is unknown.
Definition: utils.c:71
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:943
ff_stream_encode_params_copy
int ff_stream_encode_params_copy(AVStream *dst, const AVStream *src)
Copy encoding parameters from source to destination stream.
Definition: utils.c:586
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:55
AVRational::den
int den
Denominator.
Definition: rational.h:60
options
static const AVOption options[]
Definition: segment.c:1009
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:224
segment_list_print_entry
static void segment_list_print_entry(AVIOContext *list_ioctx, ListType list_type, const SegmentListEntry *list_entry, void *log_ctx)
Definition: segment.c:311
avformat_free_context
void avformat_free_context(AVFormatContext *s)
Free an AVFormatContext and all its streams.
Definition: utils.c:688
SegmentContext::header_filename
char * header_filename
filename to write the output header to
Definition: segment.c:111
AVFormatContext::io_close
void(* io_close)(struct AVFormatContext *s, AVIOContext *pb)
A callback for closing the streams opened with AVFormatContext.io_open().
Definition: avformat.h:1766
AVFormatContext::io_open
int(* io_open)(struct AVFormatContext *s, AVIOContext **pb, const char *url, int flags, AVDictionary **options)
A callback for opening new IO streams.
Definition: avformat.h:1760
SegmentContext::individual_header_trailer
int individual_header_trailer
Set by a private option.
Definition: segment.c:109
SegmentContext::list_flags
int list_flags
flags affecting list generation
Definition: segment.c:80
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: utils.c:1195
AVPacket::stream_index
int stream_index
Definition: packet.h:375
seg_class
static const AVClass seg_class
Definition: segment.c:1053
SegmentContext::times
int64_t * times
list of segment interval specification
Definition: segment.c:99
av_gettime
int64_t av_gettime(void)
Get the current time in microseconds.
Definition: time.c:39
tc
#define tc
Definition: regdef.h:69
av_strdup
char * av_strdup(const char *s)
Duplicate a string.
Definition: mem.c:279
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
av_guess_format
const AVOutputFormat * av_guess_format(const char *short_name, const char *filename, const char *mime_type)
Return the output format in the list of registered output formats which best matches the provided par...
Definition: format.c:51
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
AVDictionaryEntry
Definition: dict.h:79
AVCodecParameters::codec_id
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: codec_par.h:60
AVPacket
This structure stores compressed data.
Definition: packet.h:350
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Definition: opt.h:241
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
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:70
av_dict_copy
int av_dict_copy(AVDictionary **dst, const AVDictionary *src, int flags)
Copy entries from one AVDictionary struct into another.
Definition: dict.c:217
SEGMENT_LIST_FLAG_CACHE
#define SEGMENT_LIST_FLAG_CACHE
Definition: segment.c:66
AVFormatContext::io_close2
int(* io_close2)(struct AVFormatContext *s, AVIOContext *pb)
A callback for closing the streams opened with AVFormatContext.io_open().
Definition: avformat.h:1807
parse_times
static int parse_times(void *log_ctx, int64_t **times, int *nb_times, const char *times_str)
Definition: segment.c:458
avio_find_protocol_name
const char * avio_find_protocol_name(const char *url)
Return the name of the protocol that will handle the passed URL.
Definition: avio.c:467
AV_OPT_TYPE_FLAGS
@ AV_OPT_TYPE_FLAGS
Definition: opt.h:223
convert_header.str
string str
Definition: convert_header.py:20
timestamp.h
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:561
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
SegmentContext::initial_offset
int64_t initial_offset
initial timestamps offset, expressed in microseconds
Definition: segment.c:114
av_ts2str
#define av_ts2str(ts)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition: timestamp.h:54
av_timecode_init_from_string
int av_timecode_init_from_string(AVTimecode *tc, AVRational rate, const char *str, void *log_ctx)
Parse timecode representation (hh:mm:ss[:;.
Definition: timecode.c:250
AVDictionaryEntry::value
char * value
Definition: dict.h:81
avstring.h
AV_OPT_TYPE_STRING
@ AV_OPT_TYPE_STRING
Definition: opt.h:228
write_header
static void write_header(FFV1Context *f)
Definition: ffv1enc.c:347
AVTimecode
Definition: timecode.h:41
avformat_alloc_output_context2
int avformat_alloc_output_context2(AVFormatContext **ctx, const AVOutputFormat *oformat, const char *format_name, const char *filename)
Allocate an AVFormatContext for an output format.
Definition: mux.c:136
AVStream::pts_wrap_bits
int pts_wrap_bits
Number of bits in timestamps.
Definition: avformat.h:1104
int
int
Definition: ffmpeg_filter.c:153
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Definition: opt.h:233
snprintf
#define snprintf
Definition: snprintf.h:34
AVFormatContext::priv_data
void * priv_data
Format private data.
Definition: avformat.h:1228
AVOutputFormat::check_bitstream
int(* check_bitstream)(struct AVFormatContext *s, struct AVStream *st, const AVPacket *pkt)
Set up any necessary bitstream filtering and extract any extra data needed for the global header.
Definition: avformat.h:639
open_null_ctx
static int open_null_ctx(AVIOContext **ctx)
Definition: segment.c:567
ff_format_io_close
int ff_format_io_close(AVFormatContext *s, AVIOContext **pb)
Definition: utils.c:1847
LIST_TYPE_FFCONCAT
@ LIST_TYPE_FFCONCAT
Definition: segment.c:62
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:451
SegmentListEntry::filename
char * filename
Definition: segment.c:51