summaryrefslogtreecommitdiff
authorJian Wang <jian.wang@amlogic.com>2017-05-25 13:21:33 (GMT)
committer Zhi Zhou <zhi.zhou@amlogic.com>2017-06-02 02:10:57 (GMT)
commit5ffd53299b6757239059db0c676a274ad37d164a (patch)
treed5603249b1481336572692d43f61e6306547e495
parent2419075a08754809225980b9079ec501e1b7d705 (diff)
downloadffmpeg-5ffd53299b6757239059db0c676a274ad37d164a.zip
ffmpeg-5ffd53299b6757239059db0c676a274ad37d164a.tar.gz
ffmpeg-5ffd53299b6757239059db0c676a274ad37d164a.tar.bz2
PD#142611: cts: fix id3 str error and add mov id32
Change-Id: I543e4f5aabef2a104ebf6355e774b49a3ccade9d
Diffstat
-rw-r--r--libavformat/id3v2.c33
-rw-r--r--libavformat/mov.c31
2 files changed, 64 insertions, 0 deletions
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 }
};