Merge commit '87a3ea3192bf5e4aafa08bca8686a2b577eae818'
authorMichael Niedermayer <michaelni@gmx.at>
Wed, 30 Apr 2014 18:12:17 +0000 (20:12 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Wed, 30 Apr 2014 18:14:50 +0000 (20:14 +0200)
* commit '87a3ea3192bf5e4aafa08bca8686a2b577eae818':
  segment: Report the current media sequence

Conflicts:
libavformat/segment.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavformat/segment.c

@@@ -224,77 -151,8 +224,80 @@@ static int segment_start(AVFormatContex
      return 0;
  }
  
 -static int segment_end(AVFormatContext *oc, int write_trailer)
 +static int segment_list_open(AVFormatContext *s)
  {
 +    SegmentContext *seg = s->priv_data;
 +    int ret;
 +
 +    ret = avio_open2(&seg->list_pb, seg->list, AVIO_FLAG_WRITE,
 +                     &s->interrupt_callback, NULL);
 +    if (ret < 0) {
 +        av_log(s, AV_LOG_ERROR, "Failed to open segment list '%s'\n", seg->list);
 +        return ret;
 +    }
 +
 +    if (seg->list_type == LIST_TYPE_M3U8 && seg->segment_list_entries) {
 +        SegmentListEntry *entry;
 +        double max_duration = 0;
 +
 +        avio_printf(seg->list_pb, "#EXTM3U\n");
 +        avio_printf(seg->list_pb, "#EXT-X-VERSION:3\n");
 +        avio_printf(seg->list_pb, "#EXT-X-MEDIA-SEQUENCE:%d\n", seg->segment_list_entries->index);
 +        avio_printf(seg->list_pb, "#EXT-X-ALLOW-CACHE:%s\n",
 +                    seg->list_flags & SEGMENT_LIST_FLAG_CACHE ? "YES" : "NO");
 +
++        av_log(s, AV_LOG_VERBOSE, "EXT-X-MEDIA-SEQUENCE:%d\n",
++               seg->segment_list_entries->index);
++
 +        for (entry = seg->segment_list_entries; entry; entry = entry->next)
 +            max_duration = FFMAX(max_duration, entry->end_time - entry->start_time);
 +        avio_printf(seg->list_pb, "#EXT-X-TARGETDURATION:%"PRId64"\n", (int64_t)ceil(max_duration));
 +    } else if (seg->list_type == LIST_TYPE_FFCONCAT) {
 +        avio_printf(seg->list_pb, "ffconcat version 1.0\n");
 +    }
 +
 +    return ret;
 +}
 +
 +static void segment_list_print_entry(AVIOContext      *list_ioctx,
 +                                     ListType          list_type,
 +                                     const SegmentListEntry *list_entry,
 +                                     void *log_ctx)
 +{
 +    switch (list_type) {
 +    case LIST_TYPE_FLAT:
 +        avio_printf(list_ioctx, "%s\n", list_entry->filename);
 +        break;
 +    case LIST_TYPE_CSV:
 +    case LIST_TYPE_EXT:
 +        print_csv_escaped_str(list_ioctx, list_entry->filename);
 +        avio_printf(list_ioctx, ",%f,%f\n", list_entry->start_time, list_entry->end_time);
 +        break;
 +    case LIST_TYPE_M3U8:
 +        avio_printf(list_ioctx, "#EXTINF:%f,\n%s\n",
 +                    list_entry->end_time - list_entry->start_time, list_entry->filename);
 +        break;
 +    case LIST_TYPE_FFCONCAT:
 +    {
 +        char *buf;
 +        if (av_escape(&buf, list_entry->filename, NULL, AV_ESCAPE_MODE_AUTO, AV_ESCAPE_FLAG_WHITESPACE) < 0) {
 +            av_log(log_ctx, AV_LOG_WARNING,
 +                   "Error writing list entry '%s' in list file\n", list_entry->filename);
 +            return;
 +        }
 +        avio_printf(list_ioctx, "file %s\n", buf);
 +        av_free(buf);
 +        break;
 +    }
 +    default:
 +        av_assert0(!"Invalid list type");
 +    }
 +}
 +
 +static int segment_end(AVFormatContext *s, int write_trailer, int is_last)
 +{
 +    SegmentContext *seg = s->priv_data;
 +    AVFormatContext *oc = seg->avf;
      int ret = 0;
  
      av_write_frame(oc, NULL); /* Flush any buffered data (fragmented mp4) */