Browse code

vqf: recognize more metadata chunks

Do not create tags for non-char chunks.
Create readable tag for DSIZ chunk.

Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>

Paul B Mahol authored on 2012/01/08 02:31:31
Showing 1 changed files
... ...
@@ -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