On Sat, 29 Nov 2014, Vittorio Giovara wrote:
These tags describe the product and quicktime library version respectively.
Originate from Adobe Premiere, but some other products also use them.
Contrary to other tags, they contain 'raw' data which is not be
interpreted as iso639 or mac strings.
Based on a patch by Peter Ross <[email protected]>.
---
Now without the new parsing function. I can restore the previous version if
preferred.
Vittorio
libavformat/mov.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/libavformat/mov.c b/libavformat/mov.c
index e634af4..0310544 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -258,8 +258,11 @@ static int mov_read_udta_string(MOVContext *c, AVIOContext
*pb, MOVAtom atom)
uint16_t langcode = 0;
uint32_t data_type = 0, str_size, str_size_alloc;
int (*parse)(MOVContext*, AVIOContext*, unsigned, const char*) = NULL;
+ int raw = 0;
switch (atom.type) {
+ case MKTAG( '@','P','R','M'): key = "premiere_version"; raw = 1; break;
+ case MKTAG( '@','P','R','Q'): key = "quicktime_version"; raw = 1; break;
case MKTAG( 'a','A','R','T'): key = "album_artist"; break;
case MKTAG( 'c','p','r','t'): key = "copyright"; break;
case MKTAG( 'd','e','s','c'): key = "description"; break;
@@ -318,7 +321,7 @@ static int mov_read_udta_string(MOVContext *c, AVIOContext
*pb, MOVAtom atom)
}
}
} else return 0;
- } else if (atom.size > 4 && key && !c->itunes_metadata) {
+ } else if (atom.size > 4 && key && !c->itunes_metadata && !raw) {
str_size = avio_rb16(pb); // string length
langcode = avio_rb16(pb);
ff_mov_lang_to_iso639(langcode, language);
@@ -340,7 +342,7 @@ static int mov_read_udta_string(MOVContext *c, AVIOContext
*pb, MOVAtom atom)
return AVERROR_INVALIDDATA;
// allocate twice as much as worst-case
- str_size_alloc = str_size * 2;
+ str_size_alloc = raw ? str_size : str_size * 2;
str = av_malloc(str_size_alloc);
if (!str)
return AVERROR(ENOMEM);
@@@ -345,7 +348,7 @@ static int mov_read_udta_string(MOVContext *c, AVIOContext
*pb, MOVAtom atom)
if (parse)
parse(c, pb, str_size, key);
else {
- if (data_type == 3 || (data_type == 0 && (langcode < 0x400 || langcode
== 0x7fff))) { // MAC Encoded
+ if (!raw && (data_type == 3 || (data_type == 0 && (langcode < 0x400 ||
langcode == 0x7fff)))) { // MAC Encoded
mov_read_mac_string(c, pb, str_size, str, str_size_alloc);
} else {
avio_read(pb, str, str_size);
If the patch would have included more context, you'd see how this creates
an off-by-one bug. The following line outside of the patch context is:
str[str_size] = 0;
Now in this case, the 'str' buffer is allocated to a size of
str_size_alloc, which is equal to str_size.
Not sure whether I prefer this or the previous version though, perhaps
this one is better.
// Martin
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel