diff --git a/libavformat/mux.c b/libavformat/mux.c
index 7e137e40e4f0bd2a0dc60881a4a06dcca27ac63e..debc6a16b9c442e7a6a1163ed56a1b08213e1665 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