|
|
@@ -65,6 +65,11 @@ static int chunk_mux_init(AVFormatContext *s) |
|
|
|
AVDictionary *dict = NULL; |
|
|
|
int ret; |
|
|
|
|
|
|
|
if (!wc->header_filename) { |
|
|
|
av_log(s, AV_LOG_ERROR, "No header filename provided\n"); |
|
|
|
return AVERROR(EINVAL); |
|
|
|
} |
|
|
|
|
|
|
|
oformat = av_guess_format("webm", s->url, "video/webm"); |
|
|
|
if (!oformat) |
|
|
|
return AVERROR_MUXER_NOT_FOUND; |
|
|
@@ -74,6 +79,9 @@ static int chunk_mux_init(AVFormatContext *s) |
|
|
|
return ret; |
|
|
|
oc = wc->avf; |
|
|
|
|
|
|
|
ff_format_set_url(oc, wc->header_filename); |
|
|
|
wc->header_filename = NULL; |
|
|
|
|
|
|
|
oc->interrupt_callback = s->interrupt_callback; |
|
|
|
oc->max_delay = s->max_delay; |
|
|
|
oc->flags = s->flags & ~AVFMT_FLAG_FLUSH_PACKETS; |
|
|
@@ -120,30 +128,17 @@ static int chunk_mux_init(AVFormatContext *s) |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
static int get_chunk_filename(AVFormatContext *s, int is_header, char filename[MAX_FILENAME_SIZE]) |
|
|
|
static int get_chunk_filename(AVFormatContext *s, char filename[MAX_FILENAME_SIZE]) |
|
|
|
{ |
|
|
|
WebMChunkContext *wc = s->priv_data; |
|
|
|
if (!filename) { |
|
|
|
return AVERROR(EINVAL); |
|
|
|
} |
|
|
|
if (is_header) { |
|
|
|
int len; |
|
|
|
if (!wc->header_filename) { |
|
|
|
av_log(s, AV_LOG_ERROR, "No header filename provided\n"); |
|
|
|
return AVERROR(EINVAL); |
|
|
|
} |
|
|
|
len = av_strlcpy(filename, wc->header_filename, MAX_FILENAME_SIZE); |
|
|
|
if (len >= MAX_FILENAME_SIZE) { |
|
|
|
av_log(s, AV_LOG_ERROR, "Header filename too long\n"); |
|
|
|
return AVERROR(EINVAL); |
|
|
|
} |
|
|
|
} else { |
|
|
|
if (av_get_frame_filename(filename, MAX_FILENAME_SIZE, |
|
|
|
s->url, wc->chunk_index - 1) < 0) { |
|
|
|
av_log(s, AV_LOG_ERROR, "Invalid chunk filename template '%s'\n", s->url); |
|
|
|
return AVERROR(EINVAL); |
|
|
|
} |
|
|
|
} |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
@@ -153,8 +148,6 @@ static int webm_chunk_write_header(AVFormatContext *s) |
|
|
|
AVFormatContext *oc = NULL; |
|
|
|
int ret; |
|
|
|
AVDictionary *options = NULL; |
|
|
|
char oc_filename[MAX_FILENAME_SIZE]; |
|
|
|
char *oc_url; |
|
|
|
|
|
|
|
// DASH Streams can only have either one track per file. |
|
|
|
if (s->nb_streams != 1) { return AVERROR_INVALIDDATA; } |
|
|
@@ -166,13 +159,6 @@ static int webm_chunk_write_header(AVFormatContext *s) |
|
|
|
if (ret < 0) |
|
|
|
return ret; |
|
|
|
oc = wc->avf; |
|
|
|
ret = get_chunk_filename(s, 1, oc_filename); |
|
|
|
if (ret < 0) |
|
|
|
return ret; |
|
|
|
oc_url = av_strdup(oc_filename); |
|
|
|
if (!oc_url) |
|
|
|
return AVERROR(ENOMEM); |
|
|
|
ff_format_set_url(oc, oc_url); |
|
|
|
if (wc->http_method) |
|
|
|
av_dict_set(&options, "method", wc->http_method, 0); |
|
|
|
ret = s->io_open(s, &oc->pb, oc->url, AVIO_FLAG_WRITE, &options); |
|
|
@@ -220,7 +206,7 @@ static int chunk_end(AVFormatContext *s, int flush) |
|
|
|
av_write_frame(oc, NULL); |
|
|
|
buffer_size = avio_close_dyn_buf(oc->pb, &buffer); |
|
|
|
oc->pb = NULL; |
|
|
|
ret = get_chunk_filename(s, 0, filename); |
|
|
|
ret = get_chunk_filename(s, filename); |
|
|
|
if (ret < 0) |
|
|
|
goto fail; |
|
|
|
if (wc->http_method) |
|
|
|