[FFmpeg-devel] [PATCH] avformat/asfenc: write group_mutual_exclusion_objects on multiple languages
Marton Balint
cus at passwd.hu
Sun Feb 7 23:02:56 CET 2016
Improves streaming compatibility with Windows Media Services. Also tested for
compatilbility in Windows Media Player, Windows Media ASF Viewer and VLC.
Signed-off-by: Marton Balint <cus at passwd.hu>
---
libavformat/asf.c | 8 ++++++++
libavformat/asf.h | 2 ++
libavformat/asfenc.c | 15 +++++++++++++++
3 files changed, 25 insertions(+)
diff --git a/libavformat/asf.c b/libavformat/asf.c
index 455ca4d..719cae9 100644
--- a/libavformat/asf.c
+++ b/libavformat/asf.c
@@ -147,6 +147,14 @@ const ff_asf_guid ff_asf_extended_stream_properties_object = {
0xcb, 0xa5, 0xe6, 0x14, 0x72, 0xc6, 0x32, 0x43, 0x83, 0x99, 0xa9, 0x69, 0x52, 0x06, 0x5b, 0x5a
};
+const ff_asf_guid ff_asf_group_mutual_exclusion_object = {
+ 0x40, 0x5a, 0x46, 0xd1, 0x79, 0x5a, 0x38, 0x43, 0xb7, 0x1b, 0xe3, 0x6b, 0x8f, 0xd6, 0xc2, 0x49
+};
+
+const ff_asf_guid ff_asf_mutex_language = {
+ 0x00, 0x2a, 0xe2, 0xd6, 0xda, 0x35, 0xd1, 0x11, 0x90, 0x34, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xbe
+};
+
/* List of official tags at http://msdn.microsoft.com/en-us/library/dd743066(VS.85).aspx */
const AVMetadataConv ff_asf_metadata_conv[] = {
{ "WM/AlbumArtist", "album_artist" },
diff --git a/libavformat/asf.h b/libavformat/asf.h
index 914ddef..43288dd 100644
--- a/libavformat/asf.h
+++ b/libavformat/asf.h
@@ -100,6 +100,8 @@ extern const ff_asf_guid ff_asf_content_encryption;
extern const ff_asf_guid ff_asf_ext_content_encryption;
extern const ff_asf_guid ff_asf_digital_signature;
extern const ff_asf_guid ff_asf_extended_stream_properties_object;
+extern const ff_asf_guid ff_asf_group_mutual_exclusion_object;
+extern const ff_asf_guid ff_asf_mutex_language;
extern const AVMetadataConv ff_asf_metadata_conv[];
diff --git a/libavformat/asfenc.c b/libavformat/asfenc.c
index a6a8242..3317133 100644
--- a/libavformat/asfenc.c
+++ b/libavformat/asfenc.c
@@ -396,6 +396,7 @@ static int asf_write_header1(AVFormatContext *s, int64_t file_size,
int64_t header_offset, cur_pos, hpos;
int bit_rate;
int64_t duration;
+ int language_counts[128] = { 0 };
ff_metadata_conv(&s->metadata, ff_asf_metadata_conv, NULL);
@@ -447,6 +448,7 @@ static int asf_write_header1(AVFormatContext *s, int64_t file_size,
asf->streams[n].stream_language_index = asf->nb_languages;
asf->nb_languages++;
}
+ language_counts[asf->streams[n].stream_language_index]++;
}
} else {
asf->streams[n].stream_language_index = 128;
@@ -496,6 +498,19 @@ static int asf_write_header1(AVFormatContext *s, int64_t file_size,
}
end_header(pb, hpos2);
+ if (asf->nb_languages > 1) {
+ hpos2 = put_header(pb, &ff_asf_group_mutual_exclusion_object);
+ ff_put_guid(pb, &ff_asf_mutex_language);
+ avio_wl16(pb, asf->nb_languages);
+ for (i = 0; i < asf->nb_languages; i++) {
+ avio_wl16(pb, language_counts[i]);
+ for (n = 0; n < s->nb_streams; n++)
+ if (asf->streams[n].stream_language_index == i)
+ avio_wl16(pb, n + 1);
+ }
+ end_header(pb, hpos2);
+ }
+
for (n = 0; n < s->nb_streams; n++) {
int64_t es_pos;
if (asf->streams[n].stream_language_index > 127)
--
2.6.2
More information about the ffmpeg-devel
mailing list