| 465 | } |
| 466 | |
| 467 | int avformat_write_header(AVFormatContext *s, AVDictionary **options) |
| 468 | { |
| 469 | FormatContextInternal *const fci = ff_fc_internal(s); |
| 470 | int already_initialized = fci->initialized; |
| 471 | int streams_already_initialized = fci->streams_initialized; |
| 472 | int ret = 0; |
| 473 | |
| 474 | if (!already_initialized) |
| 475 | if ((ret = avformat_init_output(s, options)) < 0) |
| 476 | return ret; |
| 477 | |
| 478 | if (ffofmt(s->oformat)->write_header) { |
| 479 | if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb) |
| 480 | avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_HEADER); |
| 481 | ret = ffofmt(s->oformat)->write_header(s); |
| 482 | if (ret >= 0 && s->pb && s->pb->error < 0) |
| 483 | ret = s->pb->error; |
| 484 | if (ret < 0) |
| 485 | goto fail; |
| 486 | flush_if_needed(s); |
| 487 | } |
| 488 | if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb) |
| 489 | avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_UNKNOWN); |
| 490 | |
| 491 | if (!fci->streams_initialized) { |
| 492 | if ((ret = init_pts(s)) < 0) |
| 493 | goto fail; |
| 494 | } |
| 495 | |
| 496 | return streams_already_initialized; |
| 497 | |
| 498 | fail: |
| 499 | deinit_muxer(s); |
| 500 | return ret; |
| 501 | } |
| 502 | |
| 503 | #define AV_PKT_FLAG_UNCODED_FRAME 0x2000 |
| 504 | |