diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2019-07-31 15:50:41 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2019-08-30 12:35:23 +0000 |
commit | 7b2ffa587235a47d4094787d72f38102089f402a (patch) | |
tree | 30e82af9cbab08a7fa028bb18f4f2987a3f74dfa /chromium/third_party/ffmpeg/libavformat | |
parent | d94af01c90575348c4e81a418257f254b6f8d225 (diff) | |
download | qtwebengine-chromium-7b2ffa587235a47d4094787d72f38102089f402a.tar.gz |
BASELINE: Update Chromium to 76.0.3809.94
Change-Id: I321c3f5f929c105aec0f98c5091ef6108822e647
Reviewed-by: Michael BrĂ¼ning <michael.bruning@qt.io>
Diffstat (limited to 'chromium/third_party/ffmpeg/libavformat')
25 files changed, 311 insertions, 111 deletions
diff --git a/chromium/third_party/ffmpeg/libavformat/Makefile b/chromium/third_party/ffmpeg/libavformat/Makefile index c010fc83f97..99be60d184b 100644 --- a/chromium/third_party/ffmpeg/libavformat/Makefile +++ b/chromium/third_party/ffmpeg/libavformat/Makefile @@ -276,6 +276,7 @@ OBJS-$(CONFIG_IVR_DEMUXER) += rmdec.o rm.o rmsipr.o OBJS-$(CONFIG_JACOSUB_DEMUXER) += jacosubdec.o subtitles.o OBJS-$(CONFIG_JACOSUB_MUXER) += jacosubenc.o rawenc.o OBJS-$(CONFIG_JV_DEMUXER) += jvdec.o +OBJS-$(CONFIG_KUX_DEMUXER) += flvdec.o OBJS-$(CONFIG_LATM_MUXER) += latmenc.o rawenc.o OBJS-$(CONFIG_LMLM4_DEMUXER) += lmlm4.o OBJS-$(CONFIG_LOAS_DEMUXER) += loasdec.o rawdec.o diff --git a/chromium/third_party/ffmpeg/libavformat/allformats.c b/chromium/third_party/ffmpeg/libavformat/allformats.c index 73d69cda99c..d316a0529a7 100644 --- a/chromium/third_party/ffmpeg/libavformat/allformats.c +++ b/chromium/third_party/ffmpeg/libavformat/allformats.c @@ -210,6 +210,7 @@ extern AVInputFormat ff_ivr_demuxer; extern AVInputFormat ff_jacosub_demuxer; extern AVOutputFormat ff_jacosub_muxer; extern AVInputFormat ff_jv_demuxer; +extern AVInputFormat ff_kux_demuxer; extern AVOutputFormat ff_latm_muxer; extern AVInputFormat ff_lmlm4_demuxer; extern AVInputFormat ff_loas_demuxer; diff --git a/chromium/third_party/ffmpeg/libavformat/apetag.c b/chromium/third_party/ffmpeg/libavformat/apetag.c index cdc602e1a9c..8cb3f4a23af 100644 --- a/chromium/third_party/ffmpeg/libavformat/apetag.c +++ b/chromium/third_party/ffmpeg/libavformat/apetag.c @@ -29,7 +29,7 @@ #include "apetag.h" #include "internal.h" -#define APE_TAG_FLAG_CONTAINS_HEADER (1 << 31) +#define APE_TAG_FLAG_CONTAINS_HEADER (1U << 31) #define APE_TAG_FLAG_LACKS_FOOTER (1 << 30) #define APE_TAG_FLAG_IS_HEADER (1 << 29) #define APE_TAG_FLAG_IS_BINARY (1 << 1) diff --git a/chromium/third_party/ffmpeg/libavformat/av1.c b/chromium/third_party/ffmpeg/libavformat/av1.c index a0aad436a69..5fde8df97ea 100644 --- a/chromium/third_party/ffmpeg/libavformat/av1.c +++ b/chromium/third_party/ffmpeg/libavformat/av1.c @@ -372,6 +372,7 @@ int ff_isom_write_av1c(AVIOContext *pb, const uint8_t *buf, int size) put_bits(&pbc, 1, seq_params.chroma_subsampling_x); put_bits(&pbc, 1, seq_params.chroma_subsampling_y); put_bits(&pbc, 2, seq_params.chroma_sample_position); + put_bits(&pbc, 8, 0); // padding flush_put_bits(&pbc); avio_write(pb, header, sizeof(header)); diff --git a/chromium/third_party/ffmpeg/libavformat/dashdec.c b/chromium/third_party/ffmpeg/libavformat/dashdec.c index eed149cd1aa..6e3e7e4f1e9 100644 --- a/chromium/third_party/ffmpeg/libavformat/dashdec.c +++ b/chromium/third_party/ffmpeg/libavformat/dashdec.c @@ -1161,6 +1161,34 @@ static int parse_manifest_adaptationset(AVFormatContext *s, const char *url, return 0; } +static int parse_programinformation(AVFormatContext *s, xmlNodePtr node) +{ + xmlChar *val = NULL; + + node = xmlFirstElementChild(node); + while (node) { + if (!av_strcasecmp(node->name, "Title")) { + val = xmlNodeGetContent(node); + if (val) { + av_dict_set(&s->metadata, "Title", val, 0); + } + } else if (!av_strcasecmp(node->name, "Source")) { + val = xmlNodeGetContent(node); + if (val) { + av_dict_set(&s->metadata, "Source", val, 0); + } + } else if (!av_strcasecmp(node->name, "Copyright")) { + val = xmlNodeGetContent(node); + if (val) { + av_dict_set(&s->metadata, "Copyright", val, 0); + } + } + node = xmlNextElementSibling(node); + xmlFree(val); + } + return 0; +} + static int parse_manifest(AVFormatContext *s, const char *url, AVIOContext *in) { DASHContext *c = s->priv_data; @@ -1310,6 +1338,8 @@ static int parse_manifest(AVFormatContext *s, const char *url, AVIOContext *in) if (c->period_start > 0) c->media_presentation_duration = c->period_duration; } + } else if (!av_strcasecmp(node->name, "ProgramInformation")) { + parse_programinformation(s, node); } node = xmlNextElementSibling(node); } diff --git a/chromium/third_party/ffmpeg/libavformat/dashenc.c b/chromium/third_party/ffmpeg/libavformat/dashenc.c index 1b74bce060f..b88d4b34960 100644 --- a/chromium/third_party/ffmpeg/libavformat/dashenc.c +++ b/chromium/third_party/ffmpeg/libavformat/dashenc.c @@ -140,10 +140,13 @@ typedef struct DASHContext { int64_t timeout; int index_correction; char *format_options_str; + int global_sidx; SegmentType segment_type_option; /* segment type as specified in options */ int ignore_io_errors; int lhls; int master_publish_rate; + int nr_of_streams_to_flush; + int nr_of_streams_flushed; } DASHContext; static struct codec_string { @@ -368,7 +371,7 @@ static void set_codec_str(AVFormatContext *s, AVCodecParameters *par, } } -static int flush_dynbuf(OutputStream *os, int *range_length) +static int flush_dynbuf(DASHContext *c, OutputStream *os, int *range_length) { uint8_t *buffer; @@ -380,16 +383,21 @@ static int flush_dynbuf(OutputStream *os, int *range_length) av_write_frame(os->ctx, NULL); avio_flush(os->ctx->pb); - // write out to file - *range_length = avio_close_dyn_buf(os->ctx->pb, &buffer); - os->ctx->pb = NULL; - if (os->out) - avio_write(os->out, buffer + os->written_len, *range_length - os->written_len); - os->written_len = 0; - av_free(buffer); - - // re-open buffer - return avio_open_dyn_buf(&os->ctx->pb); + if (!c->single_file) { + // write out to file + *range_length = avio_close_dyn_buf(os->ctx->pb, &buffer); + os->ctx->pb = NULL; + if (os->out) + avio_write(os->out, buffer + os->written_len, *range_length - os->written_len); + os->written_len = 0; + av_free(buffer); + + // re-open buffer + return avio_open_dyn_buf(&os->ctx->pb); + } else { + *range_length = avio_tell(os->ctx->pb) - os->pos; + return 0; + } } static void set_http_options(AVDictionary **options, DASHContext *c) @@ -508,7 +516,7 @@ static int flush_init_segment(AVFormatContext *s, OutputStream *os) DASHContext *c = s->priv_data; int ret, range_length; - ret = flush_dynbuf(os, &range_length); + ret = flush_dynbuf(c, os, &range_length); if (ret < 0) return ret; @@ -537,8 +545,12 @@ static void dash_free(AVFormatContext *s) return; for (i = 0; i < s->nb_streams; i++) { OutputStream *os = &c->streams[i]; - if (os->ctx && os->ctx->pb) - ffio_free_dyn_buf(&os->ctx->pb); + if (os->ctx && os->ctx->pb) { + if (!c->single_file) + ffio_free_dyn_buf(&os->ctx->pb); + else + avio_close(os->ctx->pb); + } ff_format_io_close(s, &os->out); if (os->ctx) avformat_free_context(os->ctx); @@ -1079,6 +1091,7 @@ static int dash_init(AVFormatContext *s) char *ptr; char basename[1024]; + c->nr_of_streams_to_flush = 0; if (c->single_file_name) c->single_file = 1; if (c->single_file) @@ -1106,6 +1119,16 @@ static int dash_init(AVFormatContext *s) c->lhls = 0; } + if (c->global_sidx && !c->single_file) { + av_log(s, AV_LOG_WARNING, "Global SIDX option will be ignored as single_file is not enabled\n"); + c->global_sidx = 0; + } + + if (c->global_sidx && c->streaming) { + av_log(s, AV_LOG_WARNING, "Global SIDX option will be ignored as streaming is enabled\n"); + c->global_sidx = 0; + } + av_strlcpy(c->dirname, s->url, sizeof(c->dirname)); ptr = strrchr(c->dirname, '/'); if (ptr) { @@ -1180,6 +1203,11 @@ static int dash_init(AVFormatContext *s) "Override -init_seg_name and/or -media_seg_name and/or " "-single_file_name to end with the extension .webm\n"); } + if (c->streaming) { + // Streaming not supported as matroskaenc buffers internally before writing the output + av_log(s, AV_LOG_WARNING, "One or more streams in WebM output format. Streaming option will be ignored\n"); + c->streaming = 0; + } } ctx->oformat = av_guess_format(os->format_name, NULL, NULL); @@ -1201,9 +1229,6 @@ static int dash_init(AVFormatContext *s) ctx->avoid_negative_ts = s->avoid_negative_ts; ctx->flags = s->flags; - if ((ret = avio_open_dyn_buf(&ctx->pb)) < 0) - return ret; - if (c->single_file) { if (os->single_file_name) ff_dash_fill_tmpl_params(os->initfile, sizeof(os->initfile), os->single_file_name, i, 0, os->bit_rate, 0); @@ -1214,7 +1239,14 @@ static int dash_init(AVFormatContext *s) } snprintf(filename, sizeof(filename), "%s%s", c->dirname, os->initfile); set_http_options(&opts, c); - ret = s->io_open(s, &os->out, filename, AVIO_FLAG_WRITE, &opts); + if (!c->single_file) { + if ((ret = avio_open_dyn_buf(&ctx->pb)) < 0) + return ret; + ret = s->io_open(s, &os->out, filename, AVIO_FLAG_WRITE, &opts); + } else { + ctx->url = av_strdup(filename); + ret = avio_open2(&ctx->pb, filename, AVIO_FLAG_WRITE, NULL, &opts); + } av_dict_free(&opts); if (ret < 0) return ret; @@ -1232,8 +1264,12 @@ static int dash_init(AVFormatContext *s) // skip_sidx : Reduce bitrate overhead // skip_trailer : Avoids growing memory usage with time av_dict_set(&opts, "movflags", "frag_every_frame+dash+delay_moov+skip_sidx+skip_trailer", 0); - else - av_dict_set(&opts, "movflags", "frag_custom+dash+delay_moov", 0); + else { + if (c->global_sidx) + av_dict_set(&opts, "movflags", "frag_custom+dash+delay_moov+global_sidx+skip_trailer", 0); + else + av_dict_set(&opts, "movflags", "frag_custom+dash+delay_moov+skip_trailer", 0); + } } else { av_dict_set_int(&opts, "cluster_time_limit", c->seg_duration / 1000, 0); av_dict_set_int(&opts, "cluster_size_limit", 5 * 1024 * 1024, 0); // set a large cluster size limit @@ -1274,12 +1310,18 @@ static int dash_init(AVFormatContext *s) os->max_pts = AV_NOPTS_VALUE; os->last_dts = AV_NOPTS_VALUE; os->segment_index = 1; + + if (s->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) + c->nr_of_streams_to_flush++; } if (!c->has_video && c->seg_duration <= 0) { av_log(s, AV_LOG_WARNING, "no video stream and no seg duration set\n"); return AVERROR(EINVAL); } + + c->nr_of_streams_flushed = 0; + return 0; } @@ -1518,7 +1560,7 @@ static int dash_flush(AVFormatContext *s, int final, int stream) snprintf(os->full_path, sizeof(os->full_path), "%s%s", c->dirname, os->initfile); } - ret = flush_dynbuf(os, &range_length); + ret = flush_dynbuf(c, os, &range_length); if (ret < 0) break; os->packets_written = 0; @@ -1565,8 +1607,39 @@ static int dash_flush(AVFormatContext *s, int final, int stream) } } - if (ret >= 0) + if (final) { + for (i = 0; i < s->nb_streams; i++) { + OutputStream *os = &c->streams[i]; + if (os->ctx && os->ctx_inited) { + int file_size = avio_tell(os->ctx->pb); + av_write_trailer(os->ctx); + if (c->global_sidx) { + int j, start_index, start_number; + int sidx_size = avio_tell(os->ctx->pb) - file_size; + get_start_index_number(os, c, &start_index, &start_number); + if (start_index >= os->nb_segments || + os->segment_type != SEGMENT_TYPE_MP4) + continue; + os->init_range_length += sidx_size; + for (j = start_index; j < os->nb_segments; j++) { + Segment *seg = os->segments[j]; + seg->start_pos += sidx_size; + } + } + + } + } + } + if (ret >= 0) { + if (c->has_video && !final) { + c->nr_of_streams_flushed++; + if (c->nr_of_streams_flushed != c->nr_of_streams_to_flush) + return ret; + + c->nr_of_streams_flushed = 0; + } ret = write_manifest(s, final); + } return ret; } @@ -1735,30 +1808,21 @@ static int dash_write_trailer(AVFormatContext *s) } dash_flush(s, 1, -1); - for (i = 0; i < s->nb_streams; ++i) { - OutputStream *os = &c->streams[i]; - if (os->ctx && os->ctx_inited) { - av_write_trailer(os->ctx); - } - - if (c->remove_at_exit) { + if (c->remove_at_exit) { + for (i = 0; i < s->nb_streams; ++i) { + OutputStream *os = &c->streams[i]; dashenc_delete_media_segments(s, os, os->nb_segments); dashenc_delete_segment_file(s, os->initfile); + if (c->hls_playlist && os->segment_type == SEGMENT_TYPE_MP4) { + char filename[1024]; + get_hls_playlist_name(filename, sizeof(filename), c->dirname, i); + dashenc_delete_file(s, filename); + } } - } - - if (c->remove_at_exit) { dashenc_delete_file(s, s->url); if (c->hls_playlist && c->master_playlist_created) { char filename[1024]; - for (i = 0; i < s->nb_streams; ++i) { - OutputStream *os = &c->streams[i]; - if (os->segment_type == SEGMENT_TYPE_MP4) { - get_hls_playlist_name(filename, sizeof(filename), c->dirname, i); - dashenc_delete_file(s, filename); - } - } snprintf(filename, sizeof(filename), "%smaster.m3u8", c->dirname); dashenc_delete_file(s, filename); } @@ -1816,6 +1880,7 @@ static const AVOption options[] = { { "timeout", "set timeout for socket I/O operations", OFFSET(timeout), AV_OPT_TYPE_DURATION, { .i64 = -1 }, -1, INT_MAX, .flags = E }, { "index_correction", "Enable/Disable segment index correction logic", OFFSET(index_correction), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, E }, { "format_options","set list of options for the container format (mp4/webm) used for dash", OFFSET(format_options_str), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E}, + { "global_sidx", "Write global SIDX atom. Applicable only for single file, mp4 output, non-streaming mode", OFFSET(global_sidx), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, E }, { "dash_segment_type", "set dash segment files type", OFFSET(segment_type_option), AV_OPT_TYPE_INT, {.i64 = SEGMENT_TYPE_AUTO }, 0, SEGMENT_TYPE_NB - 1, E, "segment_type"}, { "auto", "select segment file format based on codec", 0, AV_OPT_TYPE_CONST, {.i64 = SEGMENT_TYPE_AUTO }, 0, UINT_MAX, E, "segment_type"}, { "mp4", "make segment file in ISOBMFF format", 0, AV_OPT_TYPE_CONST, {.i64 = SEGMENT_TYPE_MP4 }, 0, UINT_MAX, E, "segment_type"}, diff --git a/chromium/third_party/ffmpeg/libavformat/file.c b/chromium/third_party/ffmpeg/libavformat/file.c index e613b910102..08c7f8e6dd7 100644 --- a/chromium/third_party/ffmpeg/libavformat/file.c +++ b/chromium/third_party/ffmpeg/libavformat/file.c @@ -73,6 +73,7 @@ typedef struct FileContext { int trunc; int blocksize; int follow; + int seekable; #if HAVE_DIRENT_H DIR *dir; #endif @@ -82,6 +83,7 @@ static const AVOption file_options[] = { { "truncate", "truncate existing files on write", offsetof(FileContext, trunc), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM }, { "blocksize", "set I/O operation maximum block size", offsetof(FileContext, blocksize), AV_OPT_TYPE_INT, { .i64 = INT_MAX }, 1, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM }, { "follow", "Follow a file as it is being written", offsetof(FileContext, follow), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, AV_OPT_FLAG_DECODING_PARAM }, + { "seekable", "Sets if the file is seekable", offsetof(FileContext, seekable), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 0, AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM }, { NULL } }; @@ -238,6 +240,9 @@ static int file_open(URLContext *h, const char *filename, int flags) if (!h->is_streamed && flags & AVIO_FLAG_WRITE) h->min_packet_size = h->max_packet_size = 262144; + if (c->seekable >= 0) + h->is_streamed = !c->seekable; + return 0; } diff --git a/chromium/third_party/ffmpeg/libavformat/flvdec.c b/chromium/third_party/ffmpeg/libavformat/flvdec.c index 445d58d8f7e..b531a39adc8 100644 --- a/chromium/third_party/ffmpeg/libavformat/flvdec.c +++ b/chromium/third_party/ffmpeg/libavformat/flvdec.c @@ -113,6 +113,20 @@ static int live_flv_probe(const AVProbeData *p) return probe(p, 1); } +static int kux_probe(const AVProbeData *p) +{ + const uint8_t *d = p->buf; + + if (d[0] == 'K' && + d[1] == 'D' && + d[2] == 'K' && + d[3] == 0 && + d[4] == 0) { + return AVPROBE_SCORE_EXTENSION + 1; + } + return 0; +} + static void add_keyframes_index(AVFormatContext *s) { FLVContext *flv = s->priv_data; @@ -738,6 +752,10 @@ static int flv_read_header(AVFormatContext *s) int offset; int pre_tag_size = 0; + /* Actual FLV data at 0xe40000 in KUX file */ + if(!strcmp(s->iformat->name, "kux")) + avio_skip(s->pb, 0xe40000); + avio_skip(s->pb, 4); flags = avio_r8(s->pb); @@ -1386,3 +1404,23 @@ AVInputFormat ff_live_flv_demuxer = { .priv_class = &live_flv_class, .flags = AVFMT_TS_DISCONT }; + +static const AVClass kux_class = { + .class_name = "kuxdec", + .item_name = av_default_item_name, + .option = options, + .version = LIBAVUTIL_VERSION_INT, +}; + +AVInputFormat ff_kux_demuxer = { + .name = "kux", + .long_name = NULL_IF_CONFIG_SMALL("KUX (YouKu)"), + .priv_data_size = sizeof(FLVContext), + .read_probe = kux_probe, + .read_header = flv_read_header, + .read_packet = flv_read_packet, + .read_seek = flv_read_seek, + .read_close = flv_read_close, + .extensions = "kux", + .priv_class = &kux_class, +}; diff --git a/chromium/third_party/ffmpeg/libavformat/hashenc.c b/chromium/third_party/ffmpeg/libavformat/hashenc.c index a66db4ae715..06fc085d18b 100644 --- a/chromium/third_party/ffmpeg/libavformat/hashenc.c +++ b/chromium/third_party/ffmpeg/libavformat/hashenc.c @@ -88,7 +88,7 @@ static int hash_write_trailer(struct AVFormatContext *s) #if CONFIG_HASH_MUXER static const AVClass hashenc_class = { - .class_name = "hash encoder class", + .class_name = "hash muxer", .item_name = av_default_item_name, .option = hash_options, .version = LIBAVUTIL_VERSION_INT, @@ -111,7 +111,7 @@ AVOutputFormat ff_hash_muxer = { #if CONFIG_MD5_MUXER static const AVClass md5enc_class = { - .class_name = "MD5 encoder class", + .class_name = "MD5 muxer", .item_name = av_default_item_name, .option = md5_options, .version = LIBAVUTIL_VERSION_INT, @@ -217,7 +217,7 @@ static int framehash_write_trailer(struct AVFormatContext *s) #if CONFIG_FRAMEHASH_MUXER static const AVClass framehash_class = { - .class_name = "frame hash encoder class", + .class_name = "frame hash muxer", .item_name = av_default_item_name, .option = hash_options, .version = LIBAVUTIL_VERSION_INT, @@ -240,7 +240,7 @@ AVOutputFormat ff_framehash_muxer = { #if CONFIG_FRAMEMD5_MUXER static const AVClass framemd5_class = { - .class_name = "frame hash encoder class", + .class_name = "frame MD5 muxer", .item_name = av_default_item_name, .option = md5_options, .version = LIBAVUTIL_VERSION_INT, diff --git a/chromium/third_party/ffmpeg/libavformat/hls.c b/chromium/third_party/ffmpeg/libavformat/hls.c index 4e38d25678c..1b61b4b5c0d 100644 --- a/chromium/third_party/ffmpeg/libavformat/hls.c +++ b/chromium/third_party/ffmpeg/libavformat/hls.c @@ -658,7 +658,7 @@ static int open_url(AVFormatContext *s, AVIOContext **pb, const char *url, } else if (ret < 0) { if (ret != AVERROR_EOF) av_log(s, AV_LOG_WARNING, - "keepalive request failed for '%s', retrying with new connection: %s\n", + "keepalive request failed for '%s' when opening url, retrying with new connection: %s\n", url, av_err2str(ret)); ret = s->io_open(s, pb, url, AVIO_FLAG_READ, &tmp); } @@ -715,7 +715,7 @@ static int parse_playlist(HLSContext *c, const char *url, } else if (ret < 0) { if (ret != AVERROR_EOF) av_log(c->ctx, AV_LOG_WARNING, - "keepalive request failed for '%s', retrying with new connection: %s\n", + "keepalive request failed for '%s' when parsing playlist, retrying with new connection: %s\n", url, av_err2str(ret)); in = NULL; } @@ -2318,14 +2318,14 @@ static const AVOption hls_options[] = { }; static const AVClass hls_class = { - .class_name = "hls,applehttp", + .class_name = "hls demuxer", .item_name = av_default_item_name, .option = hls_options, .version = LIBAVUTIL_VERSION_INT, }; AVInputFormat ff_hls_demuxer = { - .name = "hls,applehttp", + .name = "hls", .long_name = NULL_IF_CONFIG_SMALL("Apple HTTP Live Streaming"), .priv_class = &hls_class, .priv_data_size = sizeof(HLSContext), diff --git a/chromium/third_party/ffmpeg/libavformat/hlsenc.c b/chromium/third_party/ffmpeg/libavformat/hlsenc.c index 5f9a200c6e2..6b913be31c2 100644 --- a/chromium/third_party/ffmpeg/libavformat/hlsenc.c +++ b/chromium/third_party/ffmpeg/libavformat/hlsenc.c @@ -2241,6 +2241,7 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt) new_start_pos = avio_tell(vs->avf->pb); if (hls->segment_type != SEGMENT_TYPE_FMP4) { + avio_flush(oc->pb); vs->size = new_start_pos - vs->start_pos; } else { vs->size = new_start_pos; diff --git a/chromium/third_party/ffmpeg/libavformat/matroskadec.c b/chromium/third_party/ffmpeg/libavformat/matroskadec.c index 44e356e5127..dcb8031fec9 100644 --- a/chromium/third_party/ffmpeg/libavformat/matroskadec.c +++ b/chromium/third_party/ffmpeg/libavformat/matroskadec.c @@ -1207,11 +1207,29 @@ static int ebml_parse_elem(MatroskaDemuxContext *matroska, MatroskaLevel *level = &matroska->levels[matroska->num_levels - 1]; AVIOContext *pb = matroska->ctx->pb; int64_t pos = avio_tell(pb); - if (level->length != EBML_UNKNOWN_LENGTH && - (pos + length) > (level->start + level->length)) { + + if (length != EBML_UNKNOWN_LENGTH && + level->length != EBML_UNKNOWN_LENGTH) { + uint64_t elem_end = pos + length, + level_end = level->start + level->length; + + if (level_end < elem_end) { + av_log(matroska->ctx, AV_LOG_ERROR, + "Element at 0x%"PRIx64" ending at 0x%"PRIx64" exceeds " + "containing master element ending at 0x%"PRIx64"\n", + pos, elem_end, level_end); + return AVERROR_INVALIDDATA; + } + } else if (level->length != EBML_UNKNOWN_LENGTH) { + av_log(matroska->ctx, AV_LOG_ERROR, "Unknown-sized element " + "at 0x%"PRIx64" inside parent with finite size\n", pos); + return AVERROR_INVALIDDATA; + } else if (length == EBML_UNKNOWN_LENGTH && id != MATROSKA_ID_CLUSTER) { + // According to the specifications only clusters and segments + // are allowed to be unknown-sized. av_log(matroska->ctx, AV_LOG_ERROR, - "Invalid length 0x%"PRIx64" > 0x%"PRIx64" in parent\n", - length, level->start + level->length); + "Found unknown-sized element other than a cluster at " + "0x%"PRIx64". Dropping the invalid element.\n", pos); return AVERROR_INVALIDDATA; } } diff --git a/chromium/third_party/ffmpeg/libavformat/matroskaenc.c b/chromium/third_party/ffmpeg/libavformat/matroskaenc.c index b9f99c44639..1c98c0dcebb 100644 --- a/chromium/third_party/ffmpeg/libavformat/matroskaenc.c +++ b/chromium/third_party/ffmpeg/libavformat/matroskaenc.c @@ -694,8 +694,10 @@ static int put_flac_codecpriv(AVFormatContext *s, av_dict_set(&dict, "WAVEFORMATEXTENSIBLE_CHANNEL_MASK", buf, 0); len = ff_vorbiscomment_length(dict, vendor, NULL, 0); - if (len >= ((1<<24) - 4)) + if (len >= ((1<<24) - 4)) { + av_dict_free(&dict); return AVERROR(EINVAL); + } data = av_malloc(len + 4); if (!data) { @@ -2534,7 +2536,8 @@ static int mkv_write_packet(AVFormatContext *s, AVPacket *pkt) // buffer an audio packet to ensure the packet containing the video // keyframe's timecode is contained in the same cluster for WebM if (codec_type == AVMEDIA_TYPE_AUDIO) { - ret = av_packet_ref(&mkv->cur_audio_pkt, pkt); + if (pkt->size > 0) + ret = av_packet_ref(&mkv->cur_audio_pkt, pkt); } else ret = mkv_write_packet_internal(s, pkt, 0); return ret; diff --git a/chromium/third_party/ffmpeg/libavformat/mov.c b/chromium/third_party/ffmpeg/libavformat/mov.c index 942c55d24f3..e40bcf3b86f 100644 --- a/chromium/third_party/ffmpeg/libavformat/mov.c +++ b/chromium/third_party/ffmpeg/libavformat/mov.c @@ -2966,7 +2966,7 @@ static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom) if (duration > 0 && duration <= INT64_MAX - sc->duration_for_fps && - total_sample_count <= INT64_MAX - sc->nb_frames_for_fps + total_sample_count <= INT_MAX - sc->nb_frames_for_fps ) { sc->duration_for_fps += duration; sc->nb_frames_for_fps += total_sample_count; @@ -4923,7 +4923,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom) sc->data_size += sample_size; if (sample_duration <= INT64_MAX - sc->duration_for_fps && - 1 <= INT64_MAX - sc->nb_frames_for_fps + 1 <= INT_MAX - sc->nb_frames_for_fps ) { sc->duration_for_fps += sample_duration; sc->nb_frames_for_fps ++; diff --git a/chromium/third_party/ffmpeg/libavformat/movenc.c b/chromium/third_party/ffmpeg/libavformat/movenc.c index 26cb2e6ea10..46d314ff17d 100644 --- a/chromium/third_party/ffmpeg/libavformat/movenc.c +++ b/chromium/third_party/ffmpeg/libavformat/movenc.c @@ -313,7 +313,7 @@ static int mov_write_amr_tag(AVIOContext *pb, MOVTrack *track) return 0x11; } -static int mov_write_ac3_tag(AVIOContext *pb, MOVTrack *track) +static int mov_write_ac3_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *track) { GetBitContext gbc; PutBitContext pbc; @@ -321,7 +321,7 @@ static int mov_write_ac3_tag(AVIOContext *pb, MOVTrack *track) int fscod, bsid, bsmod, acmod, lfeon, frmsizecod; if (track->vos_len < 7) { - av_log(pb, AV_LOG_ERROR, + av_log(s, AV_LOG_ERROR, "Cannot write moov atom before AC3 packets." " Set the delay_moov flag to fix this.\n"); return AVERROR(EINVAL); @@ -535,7 +535,7 @@ end: } #endif -static int mov_write_eac3_tag(AVIOContext *pb, MOVTrack *track) +static int mov_write_eac3_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *track) { PutBitContext pbc; uint8_t *buf; @@ -543,7 +543,7 @@ static int mov_write_eac3_tag(AVIOContext *pb, MOVTrack *track) int size, i; if (!track->eac3_priv) { - av_log(pb, AV_LOG_ERROR, + av_log(s, AV_LOG_ERROR, "Cannot write moov atom before EAC3 packets parsed.\n"); return AVERROR(EINVAL); } @@ -748,14 +748,14 @@ static int mov_write_dfla_tag(AVIOContext *pb, MOVTrack *track) return update_size(pb, pos); } -static int mov_write_dops_tag(AVIOContext *pb, MOVTrack *track) +static int mov_write_dops_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *track) { int64_t pos = avio_tell(pb); avio_wb32(pb, 0); ffio_wfourcc(pb, "dOps"); avio_w8(pb, 0); /* Version */ if (track->par->extradata_size < 19) { - av_log(pb, AV_LOG_ERROR, "invalid extradata size\n"); + av_log(s, AV_LOG_ERROR, "invalid extradata size\n"); return AVERROR_INVALIDDATA; } /* extradata contains an Ogg OpusHead, other than byte-ordering and @@ -825,9 +825,9 @@ static int mov_write_wave_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *tra } else if (track->par->codec_id == AV_CODEC_ID_AMR_NB) { mov_write_amr_tag(pb, track); } else if (track->par->codec_id == AV_CODEC_ID_AC3) { - mov_write_ac3_tag(pb, track); + mov_write_ac3_tag(s, pb, track); } else if (track->par->codec_id == AV_CODEC_ID_EAC3) { - mov_write_eac3_tag(pb, track); + mov_write_eac3_tag(s, pb, track); } else if (track->par->codec_id == AV_CODEC_ID_ALAC || track->par->codec_id == AV_CODEC_ID_QDM2) { mov_write_extradata_tag(pb, track); @@ -1134,9 +1134,9 @@ static int mov_write_audio_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContex else if (track->par->codec_id == AV_CODEC_ID_AMR_NB) ret = mov_write_amr_tag(pb, track); else if (track->par->codec_id == AV_CODEC_ID_AC3) - ret = mov_write_ac3_tag(pb, track); + ret = mov_write_ac3_tag(s, pb, track); else if (track->par->codec_id == AV_CODEC_ID_EAC3) - ret = mov_write_eac3_tag(pb, track); + ret = mov_write_eac3_tag(s, pb, track); else if (track->par->codec_id == AV_CODEC_ID_ALAC) ret = mov_write_extradata_tag(pb, track); else if (track->par->codec_id == AV_CODEC_ID_WMAPRO) @@ -1144,7 +1144,7 @@ static int mov_write_audio_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContex else if (track->par->codec_id == AV_CODEC_ID_FLAC) ret = mov_write_dfla_tag(pb, track); else if (track->par->codec_id == AV_CODEC_ID_OPUS) - ret = mov_write_dops_tag(pb, track); + ret = mov_write_dops_tag(s, pb, track); else if (track->vos_len > 0) ret = mov_write_glbl_tag(pb, track); @@ -1691,12 +1691,12 @@ static int mov_write_subtitle_tag(AVIOContext *pb, MOVTrack *track) return update_size(pb, pos); } -static int mov_write_st3d_tag(AVIOContext *pb, AVStereo3D *stereo_3d) +static int mov_write_st3d_tag(AVFormatContext *s, AVIOContext *pb, AVStereo3D *stereo_3d) { int8_t stereo_mode; if (stereo_3d->flags != 0) { - av_log(pb, AV_LOG_WARNING, "Unsupported stereo_3d flags %x. st3d not written.\n", stereo_3d->flags); + av_log(s, AV_LOG_WARNING, "Unsupported stereo_3d flags %x. st3d not written.\n", stereo_3d->flags); return 0; } @@ -1711,7 +1711,7 @@ static int mov_write_st3d_tag(AVIOContext *pb, AVStereo3D *stereo_3d) stereo_mode = 2; break; default: - av_log(pb, AV_LOG_WARNING, "Unsupported stereo_3d type %s. st3d not written.\n", av_stereo3d_type_name(stereo_3d->type)); + av_log(s, AV_LOG_WARNING, "Unsupported stereo_3d type %s. st3d not written.\n", av_stereo3d_type_name(stereo_3d->type)); return 0; } avio_wb32(pb, 13); /* size */ @@ -1729,7 +1729,7 @@ static int mov_write_sv3d_tag(AVFormatContext *s, AVIOContext *pb, AVSphericalMa if (spherical_mapping->projection != AV_SPHERICAL_EQUIRECTANGULAR && spherical_mapping->projection != AV_SPHERICAL_EQUIRECTANGULAR_TILE && spherical_mapping->projection != AV_SPHERICAL_CUBEMAP) { - av_log(pb, AV_LOG_WARNING, "Unsupported projection %d. sv3d not written.\n", spherical_mapping->projection); + av_log(s, AV_LOG_WARNING, "Unsupported projection %d. sv3d not written.\n", spherical_mapping->projection); return 0; } @@ -1807,27 +1807,25 @@ static int mov_write_pasp_tag(AVIOContext *pb, MOVTrack *track) return 16; } -static int mov_write_gama_tag(AVIOContext *pb, MOVTrack *track, double gamma) +static int mov_write_gama_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *track, double gamma) { uint32_t gama = 0; - if (gamma <= 0.0) - { + if (gamma <= 0.0) { gamma = avpriv_get_gamma_from_trc(track->par->color_trc); } - av_log(pb, AV_LOG_DEBUG, "gamma value %g\n", gamma); + av_log(s, AV_LOG_DEBUG, "gamma value %g\n", gamma); if (gamma > 1e-6) { gama = (uint32_t)lrint((double)(1<<16) * gamma); - av_log(pb, AV_LOG_DEBUG, "writing gama value %"PRId32"\n", gama); + av_log(s, AV_LOG_DEBUG, "writing gama value %"PRId32"\n", gama); av_assert0(track->mode == MODE_MOV); avio_wb32(pb, 12); ffio_wfourcc(pb, "gama"); avio_wb32(pb, gama); return 12; - } - else { - av_log(pb, AV_LOG_WARNING, "gamma value unknown, unable to write gama atom\n"); + } else { + av_log(s, AV_LOG_WARNING, "gamma value unknown, unable to write gama atom\n"); } return 0; } @@ -1941,7 +1939,7 @@ static void find_compressor(char * compressor_name, int len, MOVTrack *track) } } -static int mov_write_video_tag(AVIOContext *pb, MOVMuxContext *mov, MOVTrack *track) +static int mov_write_video_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext *mov, MOVTrack *track) { int64_t pos = avio_tell(pb); char compressor_name[32] = { 0 }; @@ -2076,7 +2074,7 @@ static int mov_write_video_tag(AVIOContext *pb, MOVMuxContext *mov, MOVTrack *tr if (mov->flags & FF_MOV_FLAG_WRITE_GAMA) { if (track->mode == MODE_MOV) - mov_write_gama_tag(pb, track, mov->gamma); + mov_write_gama_tag(s, pb, track, mov->gamma); else av_log(mov->fc, AV_LOG_WARNING, "Not writing 'gama' atom. Format is not MOV.\n"); } @@ -2092,7 +2090,7 @@ static int mov_write_video_tag(AVIOContext *pb, MOVMuxContext *mov, MOVTrack *tr AVSphericalMapping* spherical_mapping = (AVSphericalMapping*)av_stream_get_side_data(track->st, AV_PKT_DATA_SPHERICAL, NULL); if (stereo_3d) - mov_write_st3d_tag(pb, stereo_3d); + mov_write_st3d_tag(s, pb, stereo_3d); if (spherical_mapping) mov_write_sv3d_tag(mov->fc, pb, spherical_mapping); } @@ -2233,7 +2231,7 @@ static int mov_write_stsd_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext avio_wb32(pb, 0); /* version & flags */ avio_wb32(pb, 1); /* entry count */ if (track->par->codec_type == AVMEDIA_TYPE_VIDEO) - ret = mov_write_video_tag(pb, mov, track); + ret = mov_write_video_tag(s, pb, mov, track); else if (track->par->codec_type == AVMEDIA_TYPE_AUDIO) ret = mov_write_audio_tag(s, pb, mov, track); else if (track->par->codec_type == AVMEDIA_TYPE_SUBTITLE) @@ -6381,7 +6379,7 @@ static int mov_write_header(AVFormatContext *s) nb_tracks++; } - if (mov->mode == MODE_MOV || mov->mode == MODE_MP4) + if (mov->nb_meta_tmcd) tmcd_track = nb_tracks; for (i = 0; i < s->nb_streams; i++) { @@ -6745,9 +6743,8 @@ static int mov_write_trailer(AVFormatContext *s) avio_seek(pb, mov->reserved_header_pos, SEEK_SET); mov_write_sidx_tags(pb, mov, -1, 0); avio_seek(pb, end, SEEK_SET); - avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_TRAILER); - mov_write_mfra_tag(pb, mov); - } else if (!(mov->flags & FF_MOV_FLAG_SKIP_TRAILER)) { + } + if (!(mov->flags & FF_MOV_FLAG_SKIP_TRAILER)) { avio_write_marker(s->pb, AV_NOPTS_VALUE, AVIO_DATA_MARKER_TRAILER); mov_write_mfra_tag(pb, mov); } diff --git a/chromium/third_party/ffmpeg/libavformat/mpegenc.c b/chromium/third_party/ffmpeg/libavformat/mpegenc.c index 1389288b7f9..43ebc46e0eb 100644 --- a/chromium/third_party/ffmpeg/libavformat/mpegenc.c +++ b/chromium/third_party/ffmpeg/libavformat/mpegenc.c @@ -407,6 +407,16 @@ static av_cold int mpeg_mux_init(AVFormatContext *ctx) stream->lpcm_header[2] = 0x80; stream->id = lpcm_id++; stream->lpcm_align = st->codecpar->channels * st->codecpar->bits_per_coded_sample / 8; + } else if (st->codecpar->codec_id == AV_CODEC_ID_MLP || + st->codecpar->codec_id == AV_CODEC_ID_TRUEHD) { + av_log(ctx, AV_LOG_ERROR, "Support for muxing audio codec %s not implemented.\n", + avcodec_get_name(st->codecpar->codec_id)); + return AVERROR_PATCHWELCOME; + } else if (st->codecpar->codec_id != AV_CODEC_ID_MP1 && + st->codecpar->codec_id != AV_CODEC_ID_MP2 && + st->codecpar->codec_id != AV_CODEC_ID_MP3) { + av_log(ctx, AV_LOG_ERROR, "Unsupported audio codec. Must be one of mp1, mp2, mp3, 16-bit pcm_dvd, pcm_s16be, ac3 or dts.\n"); + goto fail; } else { stream->id = mpa_id++; } diff --git a/chromium/third_party/ffmpeg/libavformat/mxfdec.c b/chromium/third_party/ffmpeg/libavformat/mxfdec.c index 1ba8ecd4a62..3ea8de1666c 100644 --- a/chromium/third_party/ffmpeg/libavformat/mxfdec.c +++ b/chromium/third_party/ffmpeg/libavformat/mxfdec.c @@ -654,6 +654,7 @@ static int mxf_read_primer_pack(void *arg, AVIOContext *pb, int tag, int size, U static int mxf_read_partition_pack(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset) { MXFContext *mxf = arg; + AVFormatContext *s = mxf->fc; MXFPartition *partition, *tmp_part; UID op; uint64_t footer_partition; @@ -718,6 +719,12 @@ static int mxf_read_partition_pack(void *arg, AVIOContext *pb, int tag, int size } nb_essence_containers = avio_rb32(pb); + if (partition->type == Header) { + char str[36]; + snprintf(str, sizeof(str), "%08x.%08x.%08x.%08x", AV_RB32(&op[0]), AV_RB32(&op[4]), AV_RB32(&op[8]), AV_RB32(&op[12])); + av_dict_set(&s->metadata, "operational_pattern_ul", str, 0); + } + if (partition->this_partition && partition->previous_partition == partition->this_partition) { av_log(mxf->fc, AV_LOG_ERROR, diff --git a/chromium/third_party/ffmpeg/libavformat/oggparsevorbis.c b/chromium/third_party/ffmpeg/libavformat/oggparsevorbis.c index bcfd246b8dc..43f05f928ac 100644 --- a/chromium/third_party/ffmpeg/libavformat/oggparsevorbis.c +++ b/chromium/third_party/ffmpeg/libavformat/oggparsevorbis.c @@ -44,7 +44,7 @@ static int ogm_chapter(AVFormatContext *as, uint8_t *key, uint8_t *val) int i, cnum, h, m, s, ms, keylen = strlen(key); AVChapter *chapter = NULL; - if (keylen < 9 || sscanf(key, "CHAPTER%03d", &cnum) != 1) + if (keylen < 9 || av_strncasecmp(key, "CHAPTER", 7) || sscanf(key+7, "%03d", &cnum) != 1) return 0; if (keylen <= 10) { @@ -55,7 +55,7 @@ static int ogm_chapter(AVFormatContext *as, uint8_t *key, uint8_t *val) ms + 1000 * (s + 60 * (m + 60 * h)), AV_NOPTS_VALUE, NULL); av_free(val); - } else if (!strcmp(key + keylen - 4, "NAME")) { + } else if (!av_strcasecmp(key + keylen - 4, "NAME")) { for (i = 0; i < as->nb_chapters; i++) if (as->chapters[i]->id == cnum) { chapter = as->chapters[i]; @@ -91,7 +91,7 @@ int ff_vorbis_comment(AVFormatContext *as, AVDictionary **m, const uint8_t *p = buf; const uint8_t *end = buf + size; int updates = 0; - unsigned n, j; + unsigned n; int s; /* must have vendor_length and user_comment_list_length */ @@ -139,8 +139,7 @@ int ff_vorbis_comment(AVFormatContext *as, AVDictionary **m, return AVERROR(ENOMEM); } - for (j = 0; j < tl; j++) - tt[j] = av_toupper(t[j]); + memcpy(tt, t, tl); tt[tl] = 0; memcpy(ct, v, vl); diff --git a/chromium/third_party/ffmpeg/libavformat/riff.c b/chromium/third_party/ffmpeg/libavformat/riff.c index a8594b06075..0f5cd62547f 100644 --- a/chromium/third_party/ffmpeg/libavformat/riff.c +++ b/chromium/third_party/ffmpeg/libavformat/riff.c @@ -477,8 +477,15 @@ const AVCodecTag ff_codec_bmp_tags[] = { { AV_CODEC_ID_RASC, MKTAG('R', 'A', 'S', 'C') }, { AV_CODEC_ID_HYMT, MKTAG('H', 'Y', 'M', 'T') }, { AV_CODEC_ID_ARBC, MKTAG('A', 'R', 'B', 'C') }, + { AV_CODEC_ID_AGM, MKTAG('A', 'G', 'M', '0') }, + { AV_CODEC_ID_AGM, MKTAG('A', 'G', 'M', '1') }, { AV_CODEC_ID_AGM, MKTAG('A', 'G', 'M', '2') }, { AV_CODEC_ID_AGM, MKTAG('A', 'G', 'M', '3') }, + { AV_CODEC_ID_AGM, MKTAG('A', 'G', 'M', '4') }, + { AV_CODEC_ID_AGM, MKTAG('A', 'G', 'M', '5') }, + { AV_CODEC_ID_AGM, MKTAG('A', 'G', 'M', '6') }, + { AV_CODEC_ID_AGM, MKTAG('A', 'G', 'M', '7') }, + { AV_CODEC_ID_LSCR, MKTAG('L', 'S', 'C', 'R') }, { AV_CODEC_ID_NONE, 0 } }; @@ -599,5 +606,6 @@ const AVCodecGuid ff_codec_wav_guids[] = { { AV_CODEC_ID_ATRAC9, { 0xD2, 0x42, 0xE1, 0x47, 0xBA, 0x36, 0x8D, 0x4D, 0x88, 0xFC, 0x61, 0x65, 0x4F, 0x8C, 0x83, 0x6C } }, { AV_CODEC_ID_EAC3, { 0xAF, 0x87, 0xFB, 0xA7, 0x02, 0x2D, 0xFB, 0x42, 0xA4, 0xD4, 0x05, 0xCD, 0x93, 0x84, 0x3B, 0xDD } }, { AV_CODEC_ID_MP2, { 0x2B, 0x80, 0x6D, 0xE0, 0x46, 0xDB, 0xCF, 0x11, 0xB4, 0xD1, 0x00, 0x80, 0x5F, 0x6C, 0xBB, 0xEA } }, + { AV_CODEC_ID_ADPCM_AGM,{ 0x82, 0xEC, 0x1F, 0x6A, 0xCA, 0xDB, 0x19, 0x45, 0xBD, 0xE7, 0x56, 0xD3, 0xB3, 0xEF, 0x98, 0x1D } }, { AV_CODEC_ID_NONE } }; diff --git a/chromium/third_party/ffmpeg/libavformat/riffdec.c b/chromium/third_party/ffmpeg/libavformat/riffdec.c index b448f9116fd..5523b31adce 100644 --- a/chromium/third_party/ffmpeg/libavformat/riffdec.c +++ b/chromium/third_party/ffmpeg/libavformat/riffdec.c @@ -58,7 +58,7 @@ enum AVCodecID ff_codec_guid_get_id(const AVCodecGuid *guids, ff_asf_guid guid) * an openended structure. */ -static void parse_waveformatex(AVIOContext *pb, AVCodecParameters *par) +static void parse_waveformatex(AVFormatContext *s, AVIOContext *pb, AVCodecParameters *par) { ff_asf_guid subformat; int bps; @@ -81,7 +81,7 @@ static void parse_waveformatex(AVIOContext *pb, AVCodecParameters *par) } else { par->codec_id = ff_codec_guid_get_id(ff_codec_wav_guids, subformat); if (!par->codec_id) - av_log(pb, AV_LOG_WARNING, + av_log(s, AV_LOG_WARNING, "unknown subformat:"FF_PRI_GUID"\n", FF_ARG_GUID(subformat)); } @@ -140,7 +140,7 @@ int ff_get_wav_header(AVFormatContext *s, AVIOContext *pb, size -= 18; cbSize = FFMIN(size, cbSize); if (cbSize >= 22 && id == 0xfffe) { /* WAVEFORMATEXTENSIBLE */ - parse_waveformatex(pb, par); + parse_waveformatex(s, pb, par); cbSize -= 22; size -= 22; } diff --git a/chromium/third_party/ffmpeg/libavformat/rtsp.c b/chromium/third_party/ffmpeg/libavformat/rtsp.c index 033095905d1..8349840c96f 100644 --- a/chromium/third_party/ffmpeg/libavformat/rtsp.c +++ b/chromium/third_party/ffmpeg/libavformat/rtsp.c @@ -1744,6 +1744,9 @@ redirect: char httpname[1024]; char sessioncookie[17]; char headers[1024]; + AVDictionary *options = NULL; + + av_dict_set_int(&options, "timeout", rt->stimeout, 0); ff_url_join(httpname, sizeof(httpname), https_tunnel ? "https" : "http", auth, host, port, "%s", path); snprintf(sessioncookie, sizeof(sessioncookie), "%08x%08x", @@ -1774,7 +1777,8 @@ redirect: } /* complete the connection */ - if (ffurl_connect(rt->rtsp_hd, NULL)) { + if (ffurl_connect(rt->rtsp_hd, &options)) { + av_dict_free(&options); err = AVERROR(EIO); goto fail; } @@ -1818,10 +1822,12 @@ redirect: ff_http_init_auth_state(rt->rtsp_hd_out, rt->rtsp_hd); /* complete the connection */ - if (ffurl_connect(rt->rtsp_hd_out, NULL)) { + if (ffurl_connect(rt->rtsp_hd_out, &options)) { + av_dict_free(&options); err = AVERROR(EIO); goto fail; } + av_dict_free(&options); } else { int ret; /* open the tcp connection */ diff --git a/chromium/third_party/ffmpeg/libavformat/utils.c b/chromium/third_party/ffmpeg/libavformat/utils.c index 257fb3e2a09..39c118f9e89 100644 --- a/chromium/third_party/ffmpeg/libavformat/utils.c +++ b/chromium/third_party/ffmpeg/libavformat/utils.c @@ -1397,8 +1397,8 @@ static void compute_pkt_fields(AVFormatContext *s, AVStream *st, st->cur_dts = pkt->dts; if (s->debug & FF_FDEBUG_TS) - av_log(s, AV_LOG_DEBUG, "OUTdelayed:%d/%d pts:%s, dts:%s cur_dts:%s\n", - presentation_delayed, delay, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts)); + av_log(s, AV_LOG_DEBUG, "OUTdelayed:%d/%d pts:%s, dts:%s cur_dts:%s st:%d (%d)\n", + presentation_delayed, delay, av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts), st->index, st->id); /* update flags */ if (st->codecpar->codec_type == AVMEDIA_TYPE_DATA || is_intra_only(st->codecpar->codec_id)) @@ -4725,7 +4725,7 @@ void av_url_split(char *proto, int proto_size, char *hostname, int hostname_size, int *port_ptr, char *path, int path_size, const char *url) { - const char *p, *ls, *ls2, *at, *at2, *col, *brk; + const char *p, *ls, *ls2, *ls3, *at, *at2, *col, *brk; if (port_ptr) *port_ptr = -1; @@ -4755,6 +4755,9 @@ void av_url_split(char *proto, int proto_size, /* separate path from hostname */ ls = strchr(p, '/'); ls2 = strchr(p, '?'); + ls3 = strchr(p, '@'); + if (ls3 && ls3 > ls && (!ls2 || ls2 > ls3)) + ls = strchr(ls3, '/'); if (!ls) ls = ls2; else if (ls && ls2) diff --git a/chromium/third_party/ffmpeg/libavformat/vc1dec.c b/chromium/third_party/ffmpeg/libavformat/vc1dec.c index f4101ae5947..fdbb05d6d84 100644 --- a/chromium/third_party/ffmpeg/libavformat/vc1dec.c +++ b/chromium/third_party/ffmpeg/libavformat/vc1dec.c @@ -26,7 +26,7 @@ static int vc1_probe(const AVProbeData *p) { - int seq = 0, entry = 0, frame = 0, i; + int seq = 0, entry = 0, invalid = 0, frame = 0, i; for (i = 0; i < p->buf_size + 5; i++) { uint32_t code = AV_RB32(p->buf + i); @@ -39,16 +39,19 @@ static int vc1_probe(const AVProbeData *p) profile = (p->buf[i] & 0xc0) >> 6; if (profile != PROFILE_ADVANCED) { seq = 0; + invalid++; continue; } level = (p->buf[i] & 0x38) >> 3; if (level >= 5) { seq = 0; + invalid++; continue; } chromaformat = (p->buf[i] & 0x6) >> 1; if (chromaformat != 1) { seq = 0; + invalid++; continue; } seq++; @@ -56,8 +59,10 @@ static int vc1_probe(const AVProbeData *p) break; } case VC1_CODE_ENTRYPOINT: - if (!seq) + if (!seq) { + invalid++; continue; + } entry++; i += 2; break; @@ -71,9 +76,9 @@ static int vc1_probe(const AVProbeData *p) } } - if (frame > 1) + if (frame > 1 && frame >> 1 > invalid) return AVPROBE_SCORE_EXTENSION / 2 + 1; - if (frame == 1) + if (frame >= 1) return AVPROBE_SCORE_EXTENSION / 4; return 0; } diff --git a/chromium/third_party/ffmpeg/libavformat/version.h b/chromium/third_party/ffmpeg/libavformat/version.h index 69d3f691f0c..150a72e27d7 100644 --- a/chromium/third_party/ffmpeg/libavformat/version.h +++ b/chromium/third_party/ffmpeg/libavformat/version.h @@ -32,8 +32,8 @@ // Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium) // Also please add any ticket numbers that you believe might be affected here #define LIBAVFORMAT_VERSION_MAJOR 58 -#define LIBAVFORMAT_VERSION_MINOR 26 -#define LIBAVFORMAT_VERSION_MICRO 101 +#define LIBAVFORMAT_VERSION_MINOR 27 +#define LIBAVFORMAT_VERSION_MICRO 103 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ LIBAVFORMAT_VERSION_MINOR, \ diff --git a/chromium/third_party/ffmpeg/libavformat/wavdec.c b/chromium/third_party/ffmpeg/libavformat/wavdec.c index 8c717564ecf..3e493e74d83 100644 --- a/chromium/third_party/ffmpeg/libavformat/wavdec.c +++ b/chromium/third_party/ffmpeg/libavformat/wavdec.c @@ -235,9 +235,9 @@ static inline int wav_parse_bext_string(AVFormatContext *s, const char *key, char temp[257]; int ret; - av_assert0(length <= sizeof(temp)); - if ((ret = avio_read(s->pb, temp, length)) < 0) - return ret; + av_assert0(length < sizeof(temp)); + if ((ret = avio_read(s->pb, temp, length)) != length) + return ret < 0 ? ret : AVERROR_INVALIDDATA; temp[length] = 0; @@ -306,8 +306,10 @@ static int wav_parse_bext_tag(AVFormatContext *s, int64_t size) if (!(coding_history = av_malloc(size + 1))) return AVERROR(ENOMEM); - if ((ret = avio_read(s->pb, coding_history, size)) < 0) - return ret; + if ((ret = avio_read(s->pb, coding_history, size)) != size) { + av_free(coding_history); + return ret < 0 ? ret : AVERROR_INVALIDDATA; + } coding_history[size] = 0; if ((ret = av_dict_set(&s->metadata, "coding_history", coding_history, |