summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/demuxers/demux_qt.c45
1 files changed, 24 insertions, 21 deletions
diff --git a/src/demuxers/demux_qt.c b/src/demuxers/demux_qt.c
index 1b82a288d..1aa736870 100644
--- a/src/demuxers/demux_qt.c
+++ b/src/demuxers/demux_qt.c
@@ -729,50 +729,53 @@ static int is_qt_file(input_plugin_t *qt_file) {
/* parse out a meta data atom */
static void parse_meta_atom(qt_info *info, unsigned char *meta_atom) {
- int i;
- unsigned int meta_atom_size = BE_32(&meta_atom[0]);
- qt_atom current_atom;
- int string_size;
+ uint32_t i = 4;
+ uint32_t meta_atom_size = BE_32(&meta_atom[0]);
- for (i = 0; i < meta_atom_size - 4; i++) {
- current_atom = BE_32(&meta_atom[i]);
-
- if (current_atom == ART_ATOM) {
- string_size = BE_32(&meta_atom[i + 4]) - 16 + 1;
+ while ( i < meta_atom_size ) {
+ qt_atom current_atom = BE_32(&meta_atom[i]);
+ uint32_t sub_atom_size = BE_32(&meta_atom[i + 4]);
+ uint32_t string_size = sub_atom_size - 16 + 1;
+
+ switch (current_atom) {
+ case ART_ATOM:
info->artist = xine_xmalloc(string_size);
strncpy(info->artist, &meta_atom[i + 20], string_size - 1);
info->artist[string_size - 1] = 0;
- } else if (current_atom == NAM_ATOM) {
- string_size = BE_32(&meta_atom[i + 4]) - 16 + 1;
+ break;
+ case NAM_ATOM:
info->name = xine_xmalloc(string_size);
strncpy(info->name, &meta_atom[i + 20], string_size - 1);
info->name[string_size - 1] = 0;
- } else if (current_atom == ALB_ATOM) {
- string_size = BE_32(&meta_atom[i + 4]) - 16 + 1;
+ break;
+ case ALB_ATOM:
info->album = xine_xmalloc(string_size);
strncpy(info->album, &meta_atom[i + 20], string_size - 1);
info->album[string_size - 1] = 0;
- } else if (current_atom == GEN_ATOM) {
- string_size = BE_32(&meta_atom[i + 4]) - 16 + 1;
+ break;
+ case GEN_ATOM:
info->genre = xine_xmalloc(string_size);
strncpy(info->genre, &meta_atom[i + 20], string_size - 1);
info->genre[string_size - 1] = 0;
- } else if (current_atom == TOO_ATOM) {
- string_size = BE_32(&meta_atom[i + 4]) - 16 + 1;
+ break;
+ case TOO_ATOM:
info->comment = xine_xmalloc(string_size);
strncpy(info->comment, &meta_atom[i + 20], string_size - 1);
info->comment[string_size - 1] = 0;
- } else if (current_atom == WRT_ATOM) {
- string_size = BE_32(&meta_atom[i + 4]) - 16 + 1;
+ break;
+ case WRT_ATOM:
info->composer = xine_xmalloc(string_size);
strncpy(info->composer, &meta_atom[i + 20], string_size - 1);
info->composer[string_size - 1] = 0;
- } else if (current_atom == DAY_ATOM) {
- string_size = BE_32(&meta_atom[i + 4]) - 16 + 1;
+ break;
+ case DAY_ATOM:
info->year = xine_xmalloc(string_size);
strncpy(info->year, &meta_atom[i + 20], string_size - 1);
info->year[string_size - 1] = 0;
+ break;
}
+
+ i += sub_atom_size;
}
}