Originally committed as revision 25821 to svn://svn.ffmpeg.org/ffmpeg/trunk
| ... | ... |
@@ -301,6 +301,42 @@ static void avi_metadata_creation_time(AVMetadata **metadata, char *date) |
| 301 | 301 |
} |
| 302 | 302 |
} |
| 303 | 303 |
|
| 304 |
+static void avi_read_nikon(AVFormatContext *s, uint64_t end) |
|
| 305 |
+{
|
|
| 306 |
+ while (url_ftell(s->pb) < end) {
|
|
| 307 |
+ uint32_t tag = get_le32(s->pb); |
|
| 308 |
+ uint32_t size = get_le32(s->pb); |
|
| 309 |
+ switch (tag) {
|
|
| 310 |
+ case MKTAG('n', 'c', 't', 'g'): { /* Nikon Tags */
|
|
| 311 |
+ uint64_t tag_end = url_ftell(s->pb) + size; |
|
| 312 |
+ while (url_ftell(s->pb) < tag_end) {
|
|
| 313 |
+ uint16_t tag = get_le16(s->pb); |
|
| 314 |
+ uint16_t size = get_le16(s->pb); |
|
| 315 |
+ const char *name = NULL; |
|
| 316 |
+ char buffer[64] = {0};
|
|
| 317 |
+ size -= get_buffer(s->pb, buffer, |
|
| 318 |
+ FFMIN(size, sizeof(buffer)-1)); |
|
| 319 |
+ switch (tag) {
|
|
| 320 |
+ case 0x03: name = "maker"; break; |
|
| 321 |
+ case 0x04: name = "model"; break; |
|
| 322 |
+ case 0x13: name = "creation_time"; |
|
| 323 |
+ if (buffer[4] == ':' && buffer[7] == ':') |
|
| 324 |
+ buffer[4] = buffer[7] = '-'; |
|
| 325 |
+ break; |
|
| 326 |
+ } |
|
| 327 |
+ if (name) |
|
| 328 |
+ av_metadata_set2(&s->metadata, name, buffer, 0); |
|
| 329 |
+ url_fskip(s->pb, size); |
|
| 330 |
+ } |
|
| 331 |
+ break; |
|
| 332 |
+ } |
|
| 333 |
+ default: |
|
| 334 |
+ url_fskip(s->pb, size); |
|
| 335 |
+ break; |
|
| 336 |
+ } |
|
| 337 |
+ } |
|
| 338 |
+} |
|
| 339 |
+ |
|
| 304 | 340 |
static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap) |
| 305 | 341 |
{
|
| 306 | 342 |
AVIContext *avi = s->priv_data; |
| ... | ... |
@@ -354,6 +390,8 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap) |
| 354 | 354 |
} |
| 355 | 355 |
else if (tag1 == MKTAG('I', 'N', 'F', 'O'))
|
| 356 | 356 |
avi_read_info(s, list_end); |
| 357 |
+ else if (tag1 == MKTAG('n', 'c', 'd', 't'))
|
|
| 358 |
+ avi_read_nikon(s, list_end); |
|
| 357 | 359 |
|
| 358 | 360 |
break; |
| 359 | 361 |
case MKTAG('I', 'D', 'I', 'T'): {
|