diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-10-02 20:48:56 +0400 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-10-02 20:48:56 +0400 |
commit | dd78e1090b4cae3fbaa71e266c4b6b2f82ea9b7c (patch) | |
tree | 18259ca73351256eb40623d0c1cc320d9c04c1aa /libavformat/mux.c | |
parent | 6cbbf4a274d42f92cdd2e98e83e95e23cbfbf976 (diff) | |
parent | 1e46c63eb72be752e044ba32257d77f35cbd9dac (diff) |
Merge commit '1e46c63eb72be752e044ba32257d77f35cbd9dac'
* commit '1e46c63eb72be752e044ba32257d77f35cbd9dac':
avformat: refactor avformat_write_header
Conflicts:
libavformat/mux.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/mux.c')
-rw-r--r-- | libavformat/mux.c | 57 |
1 files changed, 40 insertions, 17 deletions
diff --git a/libavformat/mux.c b/libavformat/mux.c index 7e137e40e4..debc6a16b9 100644 --- a/libavformat/mux.c +++ b/libavformat/mux.c @@ -199,7 +199,8 @@ static int validate_codec_tag(AVFormatContext *s, AVStream *st) return 1; } -int avformat_write_header(AVFormatContext *s, AVDictionary **options) + +static int init_muxer(AVFormatContext *s, AVDictionary **options) { int ret = 0, i; AVStream *st; @@ -317,14 +318,23 @@ int avformat_write_header(AVFormatContext *s, AVDictionary **options) av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0); } - if (s->oformat->write_header) { - ret = s->oformat->write_header(s); - if (ret >= 0 && s->pb && s->pb->error < 0) - ret = s->pb->error; - if (ret < 0) - goto fail; + if (options) { + av_dict_free(options); + *options = tmp; } + return 0; + +fail: + av_dict_free(&tmp); + return ret; +} + +static int init_pts(AVFormatContext *s) +{ + int i; + AVStream *st; + /* init PTS generation */ for (i = 0; i < s->nb_streams; i++) { int64_t den = AV_NOPTS_VALUE; @@ -341,22 +351,35 @@ int avformat_write_header(AVFormatContext *s, AVDictionary **options) break; } if (den != AV_NOPTS_VALUE) { - if (den <= 0) { - ret = AVERROR_INVALIDDATA; - goto fail; - } + if (den <= 0) + return AVERROR_INVALIDDATA; + frac_init(&st->pts, 0, 0, den); } } - if (options) { - av_dict_free(options); - *options = tmp; + return 0; +} + +int avformat_write_header(AVFormatContext *s, AVDictionary **options) +{ + int ret = 0; + + if (ret = init_muxer(s, options)) + return ret; + + if (s->oformat->write_header) { + ret = s->oformat->write_header(s); + if (ret >= 0 && s->pb && s->pb->error < 0) + ret = s->pb->error; + if (ret < 0) + return ret; } + + if ((ret = init_pts(s) < 0)) + return ret; + return 0; -fail: - av_dict_free(&tmp); - return ret; } //FIXME merge with compute_pkt_fields |