[PATCH 1/6] mpegts: add channel specific languages into metadata

Anssi Hannula anssi.hannula
Fri Jul 16 03:00:02 CEST 2010


---
 libavformat/mpegts.c |   33 ++++++++++++++++++++++++++++-----
 1 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
index b160090..c561942 100644
--- a/libavformat/mpegts.c
+++ b/libavformat/mpegts.c
@@ -994,11 +994,34 @@ static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len
                 av_metadata_set2(&st->metadata, "language", language, 0);
                 break;
             case 0x0a: /* ISO 639 language descriptor */
-                language[0] = get8(&p, desc_end);
-                language[1] = get8(&p, desc_end);
-                language[2] = get8(&p, desc_end);
-                language[3] = 0;
-                av_metadata_set2(&st->metadata, "language", language, 0);
+                if (desc_len >= 8 && desc_len % 4 == 0) {
+                    /* each channel has its own tag */
+                    int tags = FFMIN(desc_len / 4, 10);
+                    char *all_langs = av_malloc(tags * 4);
+                    for (int ch = 0; ch < tags; ch++) {
+                        char *language_key = av_strdup("channel0/language");
+                        if (!language_key)
+                            break;
+                        language_key[7] = '0' + ch;
+                        language[0] = all_langs[ch * 4 + 0] = get8(&p, desc_end);
+                        language[1] = all_langs[ch * 4 + 1] = get8(&p, desc_end);
+                        language[2] = all_langs[ch * 4 + 2] = get8(&p, desc_end);
+                        language[3] = 0;
+                        all_langs[ch * 4 + 3] = (ch + 1 == tags) ? 0 : '+';
+                        av_metadata_set2(&st->metadata, language_key, language,
+                                         AV_METADATA_DONT_STRDUP_KEY);
+                        p++;
+                    }
+                    all_langs[tags * 4 - 1] = 0;
+                    av_metadata_set2(&st->metadata, "language", all_langs,
+                                     AV_METADATA_DONT_STRDUP_VAL);
+                } else {
+                    language[0] = get8(&p, desc_end);
+                    language[1] = get8(&p, desc_end);
+                    language[2] = get8(&p, desc_end);
+                    language[3] = 0;
+                    av_metadata_set2(&st->metadata, "language", language, 0);
+                }
                 break;
             case 0x05: /* registration descriptor */
                 st->codec->codec_tag = bytestream_get_le32(&p);
-- 
1.7.1


--Boundary-00=_ZzOQMxVxT486NZ+
Content-Type: text/plain;
  charset="iso-8859-15";
  name="0002-mpegts-parse-audio_type-into-metadata.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: inline;
	filename="0002-mpegts-parse-audio_type-into-metadata.patch"




More information about the ffmpeg-devel mailing list