| 354 | } |
| 355 | |
| 356 | static int segment_end(AVFormatContext *s, int write_trailer, int is_last) |
| 357 | { |
| 358 | SegmentContext *seg = s->priv_data; |
| 359 | AVFormatContext *oc = seg->avf; |
| 360 | int ret = 0; |
| 361 | AVTimecode tc; |
| 362 | AVRational rate; |
| 363 | AVDictionaryEntry *tcr; |
| 364 | char buf[AV_TIMECODE_STR_SIZE]; |
| 365 | int i; |
| 366 | int err; |
| 367 | |
| 368 | if (!oc || !oc->pb) |
| 369 | return AVERROR(EINVAL); |
| 370 | |
| 371 | av_write_frame(oc, NULL); /* Flush any buffered data (fragmented mp4) */ |
| 372 | if (write_trailer) |
| 373 | ret = av_write_trailer(oc); |
| 374 | |
| 375 | if (ret < 0) |
| 376 | av_log(s, AV_LOG_ERROR, "Failure occurred when ending segment '%s'\n", |
| 377 | oc->url); |
| 378 | |
| 379 | if (seg->list) { |
| 380 | if (seg->list_size || seg->list_type == LIST_TYPE_M3U8) { |
| 381 | SegmentListEntry *entry = av_mallocz(sizeof(*entry)); |
| 382 | if (!entry) { |
| 383 | ret = AVERROR(ENOMEM); |
| 384 | goto end; |
| 385 | } |
| 386 | |
| 387 | /* append new element */ |
| 388 | memcpy(entry, &seg->cur_entry, sizeof(*entry)); |
| 389 | entry->filename = av_strdup(entry->filename); |
| 390 | if (!seg->segment_list_entries) |
| 391 | seg->segment_list_entries = seg->segment_list_entries_end = entry; |
| 392 | else |
| 393 | seg->segment_list_entries_end->next = entry; |
| 394 | seg->segment_list_entries_end = entry; |
| 395 | |
| 396 | /* drop first item */ |
| 397 | if (seg->list_size && seg->segment_count >= seg->list_size) { |
| 398 | entry = seg->segment_list_entries; |
| 399 | seg->segment_list_entries = seg->segment_list_entries->next; |
| 400 | av_freep(&entry->filename); |
| 401 | av_freep(&entry); |
| 402 | } |
| 403 | |
| 404 | if ((ret = segment_list_open(s)) < 0) |
| 405 | goto end; |
| 406 | for (entry = seg->segment_list_entries; entry; entry = entry->next) |
| 407 | segment_list_print_entry(seg->list_pb, seg->list_type, entry, s); |
| 408 | if (seg->list_type == LIST_TYPE_M3U8 && is_last) |
| 409 | avio_printf(seg->list_pb, "#EXT-X-ENDLIST\n"); |
| 410 | ff_format_io_close(s, &seg->list_pb); |
| 411 | if (seg->use_rename) |
| 412 | ff_rename(seg->temp_list_filename, seg->list, s); |
| 413 | } else { |
no test coverage detected