[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