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