Do not create tags for non-char chunks.
Create readable tag for DSIZ chunk.
Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
... | ... |
@@ -24,6 +24,7 @@ |
24 | 24 |
#include "libavutil/intreadwrite.h" |
25 | 25 |
#include "libavutil/dict.h" |
26 | 26 |
#include "libavutil/mathematics.h" |
27 |
+#include "riff.h" |
|
27 | 28 |
|
28 | 29 |
typedef struct VqfContext { |
29 | 30 |
int frame_bit_len; |
... | ... |
@@ -45,11 +46,11 @@ static int vqf_probe(AVProbeData *probe_packet) |
45 | 45 |
return AVPROBE_SCORE_MAX/2; |
46 | 46 |
} |
47 | 47 |
|
48 |
-static void add_metadata(AVFormatContext *s, const char *tag, |
|
48 |
+static void add_metadata(AVFormatContext *s, uint32_t tag, |
|
49 | 49 |
unsigned int tag_len, unsigned int remaining) |
50 | 50 |
{ |
51 | 51 |
int len = FFMIN(tag_len, remaining); |
52 |
- char *buf; |
|
52 |
+ char *buf, key[5] = {0}; |
|
53 | 53 |
|
54 | 54 |
if (len == UINT_MAX) |
55 | 55 |
return; |
... | ... |
@@ -59,9 +60,32 @@ static void add_metadata(AVFormatContext *s, const char *tag, |
59 | 59 |
return; |
60 | 60 |
avio_read(s->pb, buf, len); |
61 | 61 |
buf[len] = 0; |
62 |
- av_dict_set(&s->metadata, tag, buf, AV_DICT_DONT_STRDUP_VAL); |
|
62 |
+ AV_WL32(key, tag); |
|
63 |
+ av_dict_set(&s->metadata, key, buf, AV_DICT_DONT_STRDUP_VAL); |
|
63 | 64 |
} |
64 | 65 |
|
66 |
+static const AVMetadataConv vqf_metadata_conv[] = { |
|
67 |
+ { "(c) ", "copyright" }, |
|
68 |
+ { "ARNG", "arranger" }, |
|
69 |
+ { "AUTH", "author" }, |
|
70 |
+ { "BAND", "band" }, |
|
71 |
+ { "CDCT", "conductor" }, |
|
72 |
+ { "COMT", "comment" }, |
|
73 |
+ { "FILE", "filename" }, |
|
74 |
+ { "GENR", "genre" }, |
|
75 |
+ { "LABL", "publisher" }, |
|
76 |
+ { "MUSC", "composer" }, |
|
77 |
+ { "NAME", "title" }, |
|
78 |
+ { "NOTE", "note" }, |
|
79 |
+ { "PROD", "producer" }, |
|
80 |
+ { "PRSN", "personnel" }, |
|
81 |
+ { "REMX", "remixer" }, |
|
82 |
+ { "SING", "singer" }, |
|
83 |
+ { "TRCK", "track" }, |
|
84 |
+ { "WORD", "words" }, |
|
85 |
+ { 0 }, |
|
86 |
+}; |
|
87 |
+ |
|
65 | 88 |
static int vqf_read_header(AVFormatContext *s, AVFormatParameters *ap) |
66 | 89 |
{ |
67 | 90 |
VqfContext *c = s->priv_data; |
... | ... |
@@ -110,41 +134,25 @@ static int vqf_read_header(AVFormatContext *s, AVFormatParameters *ap) |
110 | 110 |
|
111 | 111 |
st->codec->bit_rate = read_bitrate*1000; |
112 | 112 |
break; |
113 |
- case MKTAG('N','A','M','E'): |
|
114 |
- add_metadata(s, "title" , len, header_size); |
|
115 |
- break; |
|
116 |
- case MKTAG('(','c',')',' '): |
|
117 |
- add_metadata(s, "copyright", len, header_size); |
|
118 |
- break; |
|
119 |
- case MKTAG('A','U','T','H'): |
|
120 |
- add_metadata(s, "author" , len, header_size); |
|
121 |
- break; |
|
122 |
- case MKTAG('A','L','B','M'): |
|
123 |
- add_metadata(s, "album" , len, header_size); |
|
124 |
- break; |
|
125 |
- case MKTAG('T','R','C','K'): |
|
126 |
- add_metadata(s, "track" , len, header_size); |
|
127 |
- break; |
|
128 |
- case MKTAG('C','O','M','T'): |
|
129 |
- add_metadata(s, "comment" , len, header_size); |
|
130 |
- break; |
|
131 |
- case MKTAG('F','I','L','E'): |
|
132 |
- add_metadata(s, "filename" , len, header_size); |
|
133 |
- break; |
|
134 |
- case MKTAG('D','S','I','Z'): |
|
135 |
- add_metadata(s, "size" , len, header_size); |
|
136 |
- break; |
|
137 |
- case MKTAG('D','A','T','E'): |
|
138 |
- add_metadata(s, "date" , len, header_size); |
|
113 |
+ case MKTAG('D','S','I','Z'): // size of compressed data |
|
114 |
+ { |
|
115 |
+ char buf[8] = {0}; |
|
116 |
+ int size = avio_rb32(s->pb); |
|
117 |
+ |
|
118 |
+ snprintf(buf, sizeof(buf), "%d", size); |
|
119 |
+ av_dict_set(&s->metadata, "size", buf, 0); |
|
120 |
+ } |
|
139 | 121 |
break; |
140 |
- case MKTAG('G','E','N','R'): |
|
141 |
- add_metadata(s, "genre" , len, header_size); |
|
122 |
+ case MKTAG('Y','E','A','R'): // recording date |
|
123 |
+ case MKTAG('E','N','C','D'): // compression date |
|
124 |
+ case MKTAG('E','X','T','R'): // reserved |
|
125 |
+ case MKTAG('_','Y','M','H'): // reserved |
|
126 |
+ case MKTAG('_','N','T','T'): // reserved |
|
127 |
+ case MKTAG('_','I','D','3'): // reserved for ID3 tags |
|
128 |
+ avio_skip(s->pb, FFMIN(len, header_size)); |
|
142 | 129 |
break; |
143 | 130 |
default: |
144 |
- av_log(s, AV_LOG_ERROR, "Unknown chunk: %c%c%c%c\n", |
|
145 |
- ((char*)&chunk_tag)[0], ((char*)&chunk_tag)[1], |
|
146 |
- ((char*)&chunk_tag)[2], ((char*)&chunk_tag)[3]); |
|
147 |
- avio_skip(s->pb, FFMIN(len, header_size)); |
|
131 |
+ add_metadata(s, chunk_tag, len, header_size); |
|
148 | 132 |
break; |
149 | 133 |
} |
150 | 134 |
|
... | ... |
@@ -201,6 +209,8 @@ static int vqf_read_header(AVFormatContext *s, AVFormatParameters *ap) |
201 | 201 |
st->codec->extradata_size = 12; |
202 | 202 |
memcpy(st->codec->extradata, comm_chunk, 12); |
203 | 203 |
|
204 |
+ ff_metadata_conv_ctx(s, NULL, vqf_metadata_conv); |
|
205 |
+ |
|
204 | 206 |
return 0; |
205 | 207 |
} |
206 | 208 |
|