]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/nsvdec.c
Extract rotation in MOV metadata
[ffmpeg] / libavformat / nsvdec.c
index 4b294d359174a196da054deba4c6b646e6d42a1e..8d22520e80815504d5b1be6584e32b68fa60eaed 100644 (file)
@@ -20,6 +20,7 @@
  */
 #include "avformat.h"
 #include "riff.h"
+#include "libavutil/dict.h"
 
 //#define DEBUG
 //#define DEBUG_DUMP_INDEX // XXX dumbdriving-271.nsv breaks with it commented!!
@@ -267,7 +268,8 @@ static int nsv_parse_NSVf_header(AVFormatContext *s, AVFormatParameters *ap)
 {
     NSVContext *nsv = s->priv_data;
     AVIOContext *pb = s->pb;
-    unsigned int file_size, size;
+    unsigned int av_unused file_size;
+    unsigned int size;
     int64_t duration;
     int strings_size;
     int table_entries;
@@ -327,7 +329,7 @@ static int nsv_parse_NSVf_header(AVFormatContext *s, AVFormatParameters *ap)
                 break;
             *p++ = '\0';
             av_dlog(s, "NSV NSVf INFO: %s='%s'\n", token, value);
-            av_metadata_set2(&s->metadata, token, value, 0);
+            av_dict_set(&s->metadata, token, value, 0);
         }
         av_free(strings);
     }
@@ -546,7 +548,7 @@ static int nsv_read_chunk(AVFormatContext *s, int fill_header)
     uint32_t vsize;
     uint16_t asize;
     uint16_t auxsize;
-    uint32_t auxtag;
+    uint32_t av_unused auxtag;
 
     av_dlog(s, "%s(%d)\n", __FUNCTION__, fill_header);
 
@@ -737,6 +739,9 @@ static int nsv_read_close(AVFormatContext *s)
 static int nsv_probe(AVProbeData *p)
 {
     int i;
+    int score;
+    int vsize, asize, auxcount;
+    score = 0;
     av_dlog(NULL, "nsv_probe(), buf_size %d\n", p->buf_size);
     /* check file header */
     /* streamed files might not have any header */
@@ -749,14 +754,25 @@ static int nsv_probe(AVProbeData *p)
     /* sometimes even the first header is at 9KB or something :^) */
     for (i = 1; i < p->buf_size - 3; i++) {
         if (p->buf[i+0] == 'N' && p->buf[i+1] == 'S' &&
-            p->buf[i+2] == 'V' && p->buf[i+3] == 's')
-            return AVPROBE_SCORE_MAX-20;
+            p->buf[i+2] == 'V' && p->buf[i+3] == 's') {
+            score = AVPROBE_SCORE_MAX/5;
+            /* Get the chunk size and check if at the end we are getting 0xBEEF */
+            auxcount = p->buf[i+19];
+            vsize = p->buf[i+20]  | p->buf[i+21] << 8;
+            asize = p->buf[i+22]  | p->buf[i+23] << 8;
+            vsize = (vsize << 4) | (auxcount >> 4);
+            if ((asize + vsize + i + 23) <  p->buf_size - 2) {
+                if (p->buf[i+23+asize+vsize+1] == 0xEF &&
+                    p->buf[i+23+asize+vsize+2] == 0xBE)
+                    return AVPROBE_SCORE_MAX-20;
+            }
+        }
     }
     /* so we'll have more luck on extension... */
     if (av_match_ext(p->filename, "nsv"))
         return AVPROBE_SCORE_MAX/2;
     /* FIXME: add mime-type check */
-    return 0;
+    return score;
 }
 
 AVInputFormat ff_nsv_demuxer = {