Commit aef670cf authored by Andreas Rheinhardt's avatar Andreas Rheinhardt

avformat/webm_chunk: Open AVIOContext before initializing sub-muxer

The description of AVOutputFormat.init contains the statement that "this
method must not write output". Due to this, the webm_chunk muxer defers
opening the AVIOContext for the child muxer until avformat_write_header(),
i.e. there is no AVIOContext when the sub-muxer's avformat_init_output()
is called. But this violates the documentation of said function which
requires the AVFormatContext to have an already opened AVIOContext.
This commit fixes this.
Signed-off-by: 's avatarAndreas Rheinhardt <andreas.rheinhardt@gmail.com>
parent a5572f5a
...@@ -44,6 +44,7 @@ typedef struct WebMChunkContext { ...@@ -44,6 +44,7 @@ typedef struct WebMChunkContext {
uint64_t duration_written; uint64_t duration_written;
int64_t prev_pts; int64_t prev_pts;
AVFormatContext *avf; AVFormatContext *avf;
int header_written;
} WebMChunkContext; } WebMChunkContext;
static int webm_chunk_init(AVFormatContext *s) static int webm_chunk_init(AVFormatContext *s)
...@@ -101,6 +102,15 @@ static int webm_chunk_init(AVFormatContext *s) ...@@ -101,6 +102,15 @@ static int webm_chunk_init(AVFormatContext *s)
avpriv_set_pts_info(st, ost->pts_wrap_bits, ost->time_base.num, avpriv_set_pts_info(st, ost->pts_wrap_bits, ost->time_base.num,
ost->time_base.den); ost->time_base.den);
if (wc->http_method)
if ((ret = av_dict_set(&dict, "method", wc->http_method, 0)) < 0)
return ret;
ret = s->io_open(s, &oc->pb, oc->url, AVIO_FLAG_WRITE, &dict);
av_dict_free(&dict);
if (ret < 0)
return ret;
oc->pb->seekable = 0;
if ((ret = av_dict_set_int(&dict, "dash", 1, 0)) < 0 || if ((ret = av_dict_set_int(&dict, "dash", 1, 0)) < 0 ||
(ret = av_dict_set_int(&dict, "cluster_time_limit", (ret = av_dict_set_int(&dict, "cluster_time_limit",
wc->chunk_duration, 0)) < 0 || wc->chunk_duration, 0)) < 0 ||
...@@ -147,19 +157,10 @@ static int webm_chunk_write_header(AVFormatContext *s) ...@@ -147,19 +157,10 @@ static int webm_chunk_write_header(AVFormatContext *s)
WebMChunkContext *wc = s->priv_data; WebMChunkContext *wc = s->priv_data;
AVFormatContext *oc = wc->avf; AVFormatContext *oc = wc->avf;
int ret; int ret;
AVDictionary *options = NULL;
if (wc->http_method)
if ((ret = av_dict_set(&options, "method", wc->http_method, 0)) < 0)
return ret;
ret = s->io_open(s, &oc->pb, oc->url, AVIO_FLAG_WRITE, &options);
av_dict_free(&options);
if (ret < 0)
return ret;
oc->pb->seekable = 0;
ret = avformat_write_header(oc, NULL); ret = avformat_write_header(oc, NULL);
ff_format_io_close(s, &oc->pb); ff_format_io_close(s, &oc->pb);
wc->header_written = 1;
if (ret < 0) if (ret < 0)
return ret; return ret;
return 0; return 0;
...@@ -270,7 +271,10 @@ static void webm_chunk_deinit(AVFormatContext *s) ...@@ -270,7 +271,10 @@ static void webm_chunk_deinit(AVFormatContext *s)
if (!wc->avf) if (!wc->avf)
return; return;
ffio_free_dyn_buf(&wc->avf->pb); if (wc->header_written)
ffio_free_dyn_buf(&wc->avf->pb);
else
ff_format_io_close(s, &wc->avf->pb);
avformat_free_context(wc->avf); avformat_free_context(wc->avf);
wc->avf = NULL; wc->avf = NULL;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment