From 5ffd53299b6757239059db0c676a274ad37d164a Mon Sep 17 00:00:00 2001 From: Jian Wang Date: Thu, 25 May 2017 13:21:33 +0000 Subject: PD#142611: cts: fix id3 str error and add mov id32 Change-Id: I543e4f5aabef2a104ebf6355e774b49a3ccade9d --- diff --git a/libavformat/id3v2.c b/libavformat/id3v2.c index f7fa3ef..d4f1390 100644 --- a/libavformat/id3v2.c +++ b/libavformat/id3v2.c @@ -255,11 +255,18 @@ static int decode_str(AVFormatContext *s, AVIOContext *pb, int encoding, switch (encoding) { case ID3v2_ENCODING_ISO8859: +#if 0 while (left && ch) { ch = avio_r8(pb); PUT_UTF8(ch, tmp, avio_w8(dynbuf, tmp);) left--; } +#endif + while (left && ch) { + ch = avio_r8(pb); + avio_w8(dynbuf, ch); + left--; + } break; case ID3v2_ENCODING_UTF16BOM: @@ -281,6 +288,32 @@ static int decode_str(AVFormatContext *s, AVIOContext *pb, int encoding, *maxread = left; return AVERROR_INVALIDDATA; } + + int i = 0; + int len = left / 2; + int tlen = left; + int eightBit = 1; + uint16_t *framedata = malloc(left+1); + memset(framedata, 0, left+1); + for (i = 0; i < len; i++) { + framedata[i] = get(pb); + left -= 2; + if (framedata[i] > 0xff) { + eightBit = 0; + } + } + if (eightBit) { + for (i = 0; i < len; i++) { + avio_w8(dynbuf, framedata[i]); + } + free(framedata); + break; + } + else { + free(framedata); + left = tlen - left; + avio_seek(pb, -left, SEEK_CUR); + } // fall-through case ID3v2_ENCODING_UTF16BE: diff --git a/libavformat/mov.c b/libavformat/mov.c index 7730833..cd5627b 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -56,6 +56,7 @@ #include "isom.h" #include "libavcodec/get_bits.h" #include "id3v1.h" +#include "id3v2.h" #include "mov_chan.h" #include "replaygain.h" @@ -5161,6 +5162,35 @@ static int mov_read_dfla(MOVContext *c, AVIOContext *pb, MOVAtom atom) return 0; } +static void mov_id32_date2year(AVDictionary **m) +{ + AVDictionaryEntry *t = NULL; + if (t = av_dict_get(*m, "date", t, AV_DICT_MATCH_CASE)) { + av_dict_set(m, "year", t->value, 0); + av_log(NULL, AV_LOG_INFO, "[%s:%d] date:%s\n", __FUNCTION__, __LINE__, t->value); + } +} +static int mov_read_id32(MOVContext *c, AVIOContext *pb, MOVAtom atom) +{ + int ret = 0; + ID3v2ExtraMeta *id3v2_extra_meta = NULL; + int len = atom.size; + avio_skip(pb, 6); // version+flags+pad+language + len -=6 ; + ff_id3v2_read(c->fc, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta, len); + + if (id3v2_extra_meta) { + if ((ret = ff_id3v2_parse_apic(c->fc, &id3v2_extra_meta)) < 0) { + ff_id3v2_free_extra_meta(&id3v2_extra_meta); + return ret; + } + ff_id3v2_free_extra_meta(&id3v2_extra_meta); + } + + mov_id32_date2year(&c->fc->metadata); + + return 0; +} static int mov_seek_auxiliary_info(MOVContext *c, MOVStreamContext *sc, int64_t index) { size_t auxiliary_info_seek_offset = 0; @@ -5347,6 +5377,7 @@ static const MOVParseTableEntry mov_default_parse_table[] = { { MKTAG('d','f','L','a'), mov_read_dfla }, { MKTAG('s','t','3','d'), mov_read_st3d }, /* stereoscopic 3D video box */ { MKTAG('s','v','3','d'), mov_read_sv3d }, /* spherical video box */ +{ MKTAG('I','D','3','2'), mov_read_id32 }, /* id32 video box */ { 0, NULL } }; -- cgit