| 281 | } |
| 282 | |
| 283 | static int segment_list_open(AVFormatContext *s) |
| 284 | { |
| 285 | SegmentContext *seg = s->priv_data; |
| 286 | int ret; |
| 287 | |
| 288 | av_freep(&seg->temp_list_filename); |
| 289 | seg->temp_list_filename = av_asprintf(seg->use_rename ? "%s.tmp" : "%s", seg->list); |
| 290 | if (!seg->temp_list_filename) |
| 291 | return AVERROR(ENOMEM); |
| 292 | ret = s->io_open(s, &seg->list_pb, seg->temp_list_filename, AVIO_FLAG_WRITE, NULL); |
| 293 | if (ret < 0) { |
| 294 | av_log(s, AV_LOG_ERROR, "Failed to open segment list '%s'\n", seg->list); |
| 295 | return ret; |
| 296 | } |
| 297 | |
| 298 | if (seg->list_type == LIST_TYPE_M3U8 && seg->segment_list_entries) { |
| 299 | SegmentListEntry *entry; |
| 300 | double max_duration = 0; |
| 301 | |
| 302 | avio_printf(seg->list_pb, "#EXTM3U\n"); |
| 303 | avio_printf(seg->list_pb, "#EXT-X-VERSION:3\n"); |
| 304 | avio_printf(seg->list_pb, "#EXT-X-MEDIA-SEQUENCE:%d\n", seg->segment_list_entries->index); |
| 305 | avio_printf(seg->list_pb, "#EXT-X-ALLOW-CACHE:%s\n", |
| 306 | seg->list_flags & SEGMENT_LIST_FLAG_CACHE ? "YES" : "NO"); |
| 307 | |
| 308 | av_log(s, AV_LOG_VERBOSE, "EXT-X-MEDIA-SEQUENCE:%d\n", |
| 309 | seg->segment_list_entries->index); |
| 310 | |
| 311 | for (entry = seg->segment_list_entries; entry; entry = entry->next) |
| 312 | max_duration = FFMAX(max_duration, entry->end_time - entry->start_time); |
| 313 | avio_printf(seg->list_pb, "#EXT-X-TARGETDURATION:%"PRId64"\n", (int64_t)ceil(max_duration)); |
| 314 | } else if (seg->list_type == LIST_TYPE_FFCONCAT) { |
| 315 | avio_printf(seg->list_pb, "ffconcat version 1.0\n"); |
| 316 | } |
| 317 | |
| 318 | return ret; |
| 319 | } |
| 320 | |
| 321 | static void segment_list_print_entry(AVIOContext *list_ioctx, |
| 322 | ListType list_type, |
no test coverage detected