annotate apetag.c @ 6114:10c9d304794f libavformat

Do not attempt to seek to index for streamed files and if the user explicitly requested us not to read the index.
author reimar
date Tue, 08 Jun 2010 19:31:08 +0000
parents 08cd1179a20d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2548
276257e703af Monkey Audio decoder
kostya
parents:
diff changeset
1 /*
5134
6c0318c8a127 Move APE tag parsing into separate module.
kostya
parents: 5133
diff changeset
2 * APE tag handling
2548
276257e703af Monkey Audio decoder
kostya
parents:
diff changeset
3 * Copyright (c) 2007 Benjamin Zores <ben@geexbox.org>
276257e703af Monkey Audio decoder
kostya
parents:
diff changeset
4 * based upon libdemac from Dave Chapman.
276257e703af Monkey Audio decoder
kostya
parents:
diff changeset
5 *
276257e703af Monkey Audio decoder
kostya
parents:
diff changeset
6 * This file is part of FFmpeg.
276257e703af Monkey Audio decoder
kostya
parents:
diff changeset
7 *
276257e703af Monkey Audio decoder
kostya
parents:
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
276257e703af Monkey Audio decoder
kostya
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
276257e703af Monkey Audio decoder
kostya
parents:
diff changeset
10 * License as published by the Free Software Foundation; either
276257e703af Monkey Audio decoder
kostya
parents:
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
276257e703af Monkey Audio decoder
kostya
parents:
diff changeset
12 *
276257e703af Monkey Audio decoder
kostya
parents:
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
276257e703af Monkey Audio decoder
kostya
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
276257e703af Monkey Audio decoder
kostya
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
276257e703af Monkey Audio decoder
kostya
parents:
diff changeset
16 * Lesser General Public License for more details.
276257e703af Monkey Audio decoder
kostya
parents:
diff changeset
17 *
276257e703af Monkey Audio decoder
kostya
parents:
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
276257e703af Monkey Audio decoder
kostya
parents:
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
276257e703af Monkey Audio decoder
kostya
parents:
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
276257e703af Monkey Audio decoder
kostya
parents:
diff changeset
21 */
276257e703af Monkey Audio decoder
kostya
parents:
diff changeset
22
4201
7d2f3f1b68d8 Fix build: Add intreadwrite.h and bswap.h #includes where necessary.
diego
parents: 3908
diff changeset
23 #include "libavutil/intreadwrite.h"
2548
276257e703af Monkey Audio decoder
kostya
parents:
diff changeset
24 #include "avformat.h"
5722
8e0b6203dfb5 Include apetag.h which contains the prototype for ff_ape_parse_tag().
cehoyos
parents: 5464
diff changeset
25 #include "apetag.h"
2548
276257e703af Monkey Audio decoder
kostya
parents:
diff changeset
26
2556
cb131102b256 disable loads of debug messages to reduce object size
aurel
parents: 2554
diff changeset
27 #define ENABLE_DEBUG 0
cb131102b256 disable loads of debug messages to reduce object size
aurel
parents: 2554
diff changeset
28
2554
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
29 #define APE_TAG_VERSION 2000
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
30 #define APE_TAG_FOOTER_BYTES 32
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
31 #define APE_TAG_FLAG_CONTAINS_HEADER (1 << 31)
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
32 #define APE_TAG_FLAG_IS_HEADER (1 << 29)
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
33
5133
1df917933244 Do not use internals of ByteIOContext during APE tags parsing.
kostya
parents: 5132
diff changeset
34 static int ape_tag_read_field(AVFormatContext *s)
2554
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
35 {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2568
diff changeset
36 ByteIOContext *pb = s->pb;
5446
4211f91f69b1 Use AV_METADATA_DONT_STRDUP* / use av_malloced metadata instead of strduped
michael
parents: 5301
diff changeset
37 uint8_t key[1024], *value;
5133
1df917933244 Do not use internals of ByteIOContext during APE tags parsing.
kostya
parents: 5132
diff changeset
38 uint32_t size, flags;
5464
ab9e31e90d3c Remove unused variable, fixes the warning:
diego
parents: 5446
diff changeset
39 int i, c;
2554
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
40
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
41 size = get_le32(pb); /* field size */
5133
1df917933244 Do not use internals of ByteIOContext during APE tags parsing.
kostya
parents: 5132
diff changeset
42 flags = get_le32(pb); /* field flags */
1df917933244 Do not use internals of ByteIOContext during APE tags parsing.
kostya
parents: 5132
diff changeset
43 for (i = 0; i < sizeof(key) - 1; i++) {
1df917933244 Do not use internals of ByteIOContext during APE tags parsing.
kostya
parents: 5132
diff changeset
44 c = get_byte(pb);
1df917933244 Do not use internals of ByteIOContext during APE tags parsing.
kostya
parents: 5132
diff changeset
45 if (c < 0x20 || c > 0x7E)
1df917933244 Do not use internals of ByteIOContext during APE tags parsing.
kostya
parents: 5132
diff changeset
46 break;
1df917933244 Do not use internals of ByteIOContext during APE tags parsing.
kostya
parents: 5132
diff changeset
47 else
1df917933244 Do not use internals of ByteIOContext during APE tags parsing.
kostya
parents: 5132
diff changeset
48 key[i] = c;
1df917933244 Do not use internals of ByteIOContext during APE tags parsing.
kostya
parents: 5132
diff changeset
49 }
1df917933244 Do not use internals of ByteIOContext during APE tags parsing.
kostya
parents: 5132
diff changeset
50 key[i] = 0;
1df917933244 Do not use internals of ByteIOContext during APE tags parsing.
kostya
parents: 5132
diff changeset
51 if (c != 0) {
1df917933244 Do not use internals of ByteIOContext during APE tags parsing.
kostya
parents: 5132
diff changeset
52 av_log(s, AV_LOG_WARNING, "Invalid APE tag key '%s'.\n", key);
1df917933244 Do not use internals of ByteIOContext during APE tags parsing.
kostya
parents: 5132
diff changeset
53 return -1;
1df917933244 Do not use internals of ByteIOContext during APE tags parsing.
kostya
parents: 5132
diff changeset
54 }
5446
4211f91f69b1 Use AV_METADATA_DONT_STRDUP* / use av_malloced metadata instead of strduped
michael
parents: 5301
diff changeset
55 if (size >= UINT_MAX)
4211f91f69b1 Use AV_METADATA_DONT_STRDUP* / use av_malloced metadata instead of strduped
michael
parents: 5301
diff changeset
56 return -1;
4211f91f69b1 Use AV_METADATA_DONT_STRDUP* / use av_malloced metadata instead of strduped
michael
parents: 5301
diff changeset
57 value = av_malloc(size+1);
4211f91f69b1 Use AV_METADATA_DONT_STRDUP* / use av_malloced metadata instead of strduped
michael
parents: 5301
diff changeset
58 if (!value)
5930
08cd1179a20d Replace all remaining occurrences of AVERROR_NOMEM with
stefano
parents: 5722
diff changeset
59 return AVERROR(ENOMEM);
5446
4211f91f69b1 Use AV_METADATA_DONT_STRDUP* / use av_malloced metadata instead of strduped
michael
parents: 5301
diff changeset
60 get_buffer(pb, value, size);
4211f91f69b1 Use AV_METADATA_DONT_STRDUP* / use av_malloced metadata instead of strduped
michael
parents: 5301
diff changeset
61 value[size] = 0;
4211f91f69b1 Use AV_METADATA_DONT_STRDUP* / use av_malloced metadata instead of strduped
michael
parents: 5301
diff changeset
62 av_metadata_set2(&s->metadata, key, value, AV_METADATA_DONT_STRDUP_VAL);
5133
1df917933244 Do not use internals of ByteIOContext during APE tags parsing.
kostya
parents: 5132
diff changeset
63 return 0;
2554
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
64 }
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
65
5134
6c0318c8a127 Move APE tag parsing into separate module.
kostya
parents: 5133
diff changeset
66 void ff_ape_parse_tag(AVFormatContext *s)
2554
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
67 {
2771
d52c718e83f9 Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents: 2568
diff changeset
68 ByteIOContext *pb = s->pb;
2554
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
69 int file_size = url_fsize(pb);
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
70 uint32_t val, fields, tag_bytes;
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
71 uint8_t buf[8];
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
72 int i;
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
73
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
74 if (file_size < APE_TAG_FOOTER_BYTES)
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
75 return;
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
76
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
77 url_fseek(pb, file_size - APE_TAG_FOOTER_BYTES, SEEK_SET);
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
78
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
79 get_buffer(pb, buf, 8); /* APETAGEX */
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
80 if (strncmp(buf, "APETAGEX", 8)) {
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
81 return;
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
82 }
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
83
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
84 val = get_le32(pb); /* APE tag version */
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
85 if (val > APE_TAG_VERSION) {
4506
dfb8f047b552 Add a context to av_log() calls and extend ape_dumpinfo prototype to do that.
benoit
parents: 4201
diff changeset
86 av_log(s, AV_LOG_ERROR, "Unsupported tag version. (>=%d)\n", APE_TAG_VERSION);
2554
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
87 return;
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
88 }
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
89
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
90 tag_bytes = get_le32(pb); /* tag size */
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
91 if (tag_bytes - APE_TAG_FOOTER_BYTES > (1024 * 1024 * 16)) {
4506
dfb8f047b552 Add a context to av_log() calls and extend ape_dumpinfo prototype to do that.
benoit
parents: 4201
diff changeset
92 av_log(s, AV_LOG_ERROR, "Tag size is way too big\n");
2554
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
93 return;
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
94 }
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
95
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
96 fields = get_le32(pb); /* number of fields */
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
97 if (fields > 65536) {
4506
dfb8f047b552 Add a context to av_log() calls and extend ape_dumpinfo prototype to do that.
benoit
parents: 4201
diff changeset
98 av_log(s, AV_LOG_ERROR, "Too many tag fields (%d)\n", fields);
2554
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
99 return;
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
100 }
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
101
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
102 val = get_le32(pb); /* flags */
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
103 if (val & APE_TAG_FLAG_IS_HEADER) {
4506
dfb8f047b552 Add a context to av_log() calls and extend ape_dumpinfo prototype to do that.
benoit
parents: 4201
diff changeset
104 av_log(s, AV_LOG_ERROR, "APE Tag is a header\n");
2554
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
105 return;
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
106 }
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
107
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
108 url_fseek(pb, file_size - tag_bytes, SEEK_SET);
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
109
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
110 for (i=0; i<fields; i++)
5133
1df917933244 Do not use internals of ByteIOContext during APE tags parsing.
kostya
parents: 5132
diff changeset
111 if (ape_tag_read_field(s) < 0) break;
2554
2d6bfd63d606 monkey audio demuxer now can parse ape tags
ben
parents: 2548
diff changeset
112 }