[FFmpeg-devel] [PATCH 2/4] mpegts: add channel specific languages into metadata

Anssi Hannula anssi.hannula
Sat Feb 12 19:24:39 CET 2011


---
 libavformat/mpegts.c |   27 +++++++++++++++++++++++++++
 1 files changed, 27 insertions(+), 0 deletions(-)

diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
index 0e2f71c..f852957 100644
--- a/libavformat/mpegts.c
+++ b/libavformat/mpegts.c
@@ -949,6 +949,32 @@ int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type
         av_metadata_set2(&st->metadata, "language", language, 0);
         break;
     case 0x0a: /* ISO 639 language descriptor */
+        if (desc_len >= 8 && desc_len % 4 == 0) {
+            /* channel-specific language tags */
+            int ch;
+            int tag_count = FFMIN(desc_len / 4, 10);
+            char *combined_lang = av_malloc(tag_count * 4);
+            if (!combined_lang)
+                break;
+            for (ch = 0; ch < tag_count; ch++) {
+                char *language_key = av_strdup("channel0/language");
+                if (!language_key)
+                    break;
+                language_key[7] = '0' + ch;
+                language[0] = combined_lang[ch * 4 + 0] = get8(pp, desc_end);
+                language[1] = combined_lang[ch * 4 + 1] = get8(pp, desc_end);
+                language[2] = combined_lang[ch * 4 + 2] = get8(pp, desc_end);
+                language[3] = 0;
+                combined_lang[ch * 4 + 3] = '+';
+                av_metadata_set2(&st->metadata, language_key, language,
+                                 AV_METADATA_DONT_STRDUP_KEY);
+                if (get8(pp, desc_end))
+                    av_log_ask_for_sample(fc, "Multiple languages and non-zero audio_type.");
+            }
+            combined_lang[tag_count * 4 - 1] = 0;
+            av_metadata_set2(&st->metadata, "language", combined_lang,
+                             AV_METADATA_DONT_STRDUP_VAL);
+        } else {
         language[0] = get8(pp, desc_end);
         language[1] = get8(pp, desc_end);
         language[2] = get8(pp, desc_end);
@@ -960,6 +986,7 @@ int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type
             case 0x03: st->disposition |= AV_DISPOSITION_VISUAL_IMPAIRED; break;
             default: break;
         }
+        }
         break;
     case 0x05: /* registration descriptor */
         st->codec->codec_tag = bytestream_get_le32(pp);
-- 
1.7.3




More information about the ffmpeg-devel mailing list