mov: Implement parsing of the "HandlerName" from the MP4 HDLR atom
This atom typically is used for a track title. The handler name is stored as a Pascal string in the QT specs (first byte is the length of the string), so do not export it. A second length check based on the first character is added to avoid overwriting an already specified handler_name (it happens with YouTube videos for instance, the handler_name get masked), or specifying an empty string metadata. The Pascal string fix and the second length check are written by Clément Bœsch <clement.boesch@smartjog.com>. Signed-off-by: Vittorio Giovara <vittorio.giovara@gmail.com> Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
This commit is contained in:
parent
27b99d929f
commit
e3528d2a7b
@ -558,6 +558,8 @@ static int mov_read_hdlr(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
|||||||
AVStream *st;
|
AVStream *st;
|
||||||
uint32_t type;
|
uint32_t type;
|
||||||
uint32_t av_unused ctype;
|
uint32_t av_unused ctype;
|
||||||
|
int64_t title_size;
|
||||||
|
char *title_str;
|
||||||
|
|
||||||
if (c->fc->nb_streams < 1) // meta before first trak
|
if (c->fc->nb_streams < 1) // meta before first trak
|
||||||
return 0;
|
return 0;
|
||||||
@ -587,6 +589,20 @@ static int mov_read_hdlr(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
|||||||
avio_rb32(pb); /* component flags */
|
avio_rb32(pb); /* component flags */
|
||||||
avio_rb32(pb); /* component flags mask */
|
avio_rb32(pb); /* component flags mask */
|
||||||
|
|
||||||
|
title_size = atom.size - 24;
|
||||||
|
if (title_size > 0) {
|
||||||
|
title_str = av_malloc(title_size + 1); /* Add null terminator */
|
||||||
|
if (!title_str)
|
||||||
|
return AVERROR(ENOMEM);
|
||||||
|
avio_read(pb, title_str, title_size);
|
||||||
|
title_str[title_size] = 0;
|
||||||
|
if (title_str[0]) {
|
||||||
|
int off = (!c->isom && title_str[0] == title_size - 1);
|
||||||
|
av_dict_set(&st->metadata, "handler_name", title_str + off, 0);
|
||||||
|
}
|
||||||
|
av_freep(&title_str);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user