From 2668cb6e31f4ef3cd59ffe2cf143c9c535141c6e Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Mon, 19 Oct 2026 21:21:04 +0200 Subject: [PATCH] avformat/asfdec_f: export stream-specific metadata in the stream Store such entries in the metadata of the corresponding stream. Signed-off-by: Michael Niedermayer --- libavformat/asfdec_f.c | 15 ++++++++++++++- libavformat/rtpdec_asf.c | 4 ++++ tests/fate/microsoft.mak | 6 +++++- tests/ref/fate/asf-stream-metadata | 19 +++++++++++++++++++ 4 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 tests/ref/fate/asf-stream-metadata diff --git a/libavformat/asfdec_f.c b/libavformat/asfdec_f.c index 158c70d295..4c9925bc39 100644 --- a/libavformat/asfdec_f.c +++ b/libavformat/asfdec_f.c @@ -70,6 +70,8 @@ typedef struct ASFStream { int payload_ext_ct; ASFPayload payload[8]; + + AVDictionary *metadata; } ASFStream; typedef struct ASFContext { @@ -645,7 +647,9 @@ static int asf_read_metadata(AVFormatContext *s) if(stream_num < 128) asf->dar[stream_num].den = aspect_y; } else { - get_tag(s, &s->metadata, name, value_type, value_len); + get_tag(s, stream_num > 0 && stream_num < 128 ? &asf->streams[stream_num].metadata + : &s->metadata, + name, value_type, value_len); } av_freep(&name); } @@ -818,6 +822,10 @@ static int asf_read_header(AVFormatContext *s) int stream_num = asf->asfid2avid[i]; if (stream_num >= 0) { AVStream *st = s->streams[stream_num]; + int ret = av_dict_copy(&st->metadata, asf->streams[i].metadata, 0); + if (ret < 0) + return ret; + ff_metadata_conv(&st->metadata, NULL, ff_asf_metadata_conv); if (!st->codecpar->bit_rate) st->codecpar->bit_rate = asf->stream_bitrates[i]; if (asf->dar[i].num > 0 && asf->dar[i].den > 0) { @@ -1431,7 +1439,11 @@ static void skip_to_key(AVFormatContext *s) static int asf_read_close(AVFormatContext *s) { + ASFContext *asf = s->priv_data; + asf_reset_header(s); + for (int i = 0; i < 128; i++) + av_dict_free(&asf->streams[i].metadata); return 0; } @@ -1618,6 +1630,7 @@ const FFInputFormat ff_asf_demuxer = { .p.flags = AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH, .p.priv_class = &asf_class, .priv_data_size = sizeof(ASFContext), + .flags_internal = FF_INFMT_FLAG_INIT_CLEANUP, .read_probe = asf_probe, .read_header = asf_read_header, .read_packet = asf_read_packet, diff --git a/libavformat/rtpdec_asf.c b/libavformat/rtpdec_asf.c index 7489c174bc..eb7bd93cdf 100644 --- a/libavformat/rtpdec_asf.c +++ b/libavformat/rtpdec_asf.c @@ -169,6 +169,10 @@ static int asfrtp_parse_sdp_line(AVFormatContext *s, int stream_index, for (i = 0; i < rt->asf_ctx->nb_streams; i++) { if (s->streams[stream_index]->id == rt->asf_ctx->streams[i]->id) { + int ret = av_dict_copy(&s->streams[stream_index]->metadata, + rt->asf_ctx->streams[i]->metadata, 0); + if (ret < 0) + return ret; avcodec_parameters_copy(s->streams[stream_index]->codecpar, rt->asf_ctx->streams[i]->codecpar); ffstream(s->streams[stream_index])->need_parsing = diff --git a/tests/fate/microsoft.mak b/tests/fate/microsoft.mak index 8d8e92575a..006ad34840 100644 --- a/tests/fate/microsoft.mak +++ b/tests/fate/microsoft.mak @@ -83,7 +83,11 @@ fate-vc1: $(FATE_VC1-yes) FATE_MICROSOFT-$(call ALLYES, PIPE_PROTOCOL ASF_DEMUXER FRAMECRC_MUXER) += fate-asf-repldata fate-asf-repldata: CMD = framecrc -i $(TARGET_SAMPLES)/asf/bug821-2.asf -c copy +FATE_MICROSOFT_FFPROBE-$(CONFIG_ASF_DEMUXER) += fate-asf-stream-metadata +fate-asf-stream-metadata: CMD = probe -show_entries format_tags:stream_tags $(TARGET_SAMPLES)/wmv8/wmv8_x8intra.wmv + FATE_MICROSOFT += $(FATE_MICROSOFT-yes) FATE_SAMPLES_FFMPEG += $(FATE_MICROSOFT) -fate-microsoft: $(FATE_MICROSOFT) +FATE_SAMPLES_FFPROBE += $(FATE_MICROSOFT_FFPROBE-yes) +fate-microsoft: $(FATE_MICROSOFT) $(FATE_MICROSOFT_FFPROBE-yes) diff --git a/tests/ref/fate/asf-stream-metadata b/tests/ref/fate/asf-stream-metadata new file mode 100644 index 0000000000..495a30ad64 --- /dev/null +++ b/tests/ref/fate/asf-stream-metadata @@ -0,0 +1,19 @@ +[STREAM] +TAG:IsVBR=0 +TAG:DeviceConformanceTemplate=L2 +TAG:WM/WMADRCPeakReference=8322 +TAG:WM/WMADRCAverageReference=1228 +TAG:NumberOfFrames=110 +TAG:language=eng +[/STREAM] +[STREAM] +TAG:IsVBR=0 +TAG:DeviceConformanceTemplate=@ +TAG:language=eng +[/STREAM] +[FORMAT] +TAG:creation_time=2003-12-12T01:31:27.640000Z +TAG:WMFSDKVersion=9.00.00.2980 +TAG:WMFSDKNeeded=0.0.0.0000 +TAG:IsVBR=0 +[/FORMAT]