Merge remote-tracking branch 'cehoyos/master'
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 6 Apr 2014 21:57:37 +0000 (23:57 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 6 Apr 2014 21:57:42 +0000 (23:57 +0200)
* cehoyos/master:
  Set Matroska private data when muxing Prores.

Merged-by: Michael Niedermayer <michaelni@gmx.at>
Changelog
libavformat/smush.c
libavformat/version.h
tests/fate/adpcm.mak
tests/fate/audio.mak
tests/ref/fate/adpcm-vima [new file with mode: 0644]
tests/ref/fate/sanm
tests/ref/fate/vima [deleted file]

index e62892d..6923200 100644 (file)
--- a/Changelog
+++ b/Changelog
@@ -279,6 +279,7 @@ version 1.0:
 - showwaves and showspectrum filter
 - LucasArts SMUSH SANM playback support
 - LucasArts SMUSH VIMA audio decoder (ADPCM)
+- LucasArts SMUSH demuxer
 - SAMI, RealText and SubViewer demuxers and decoders
 - Heart Of Darkness PAF playback support
 - iec61883 device
index e9c1937..a33d509 100644 (file)
  */
 
 #include "libavutil/intreadwrite.h"
+
 #include "avformat.h"
-#include "internal.h"
 #include "avio.h"
+#include "internal.h"
 
-typedef struct {
+typedef struct SMUSHContext {
     int version;
     int audio_stream_index;
     int video_stream_index;
@@ -32,9 +33,9 @@ typedef struct {
 
 static int smush_read_probe(AVProbeData *p)
 {
-    if (((AV_RL32(p->buf) == MKTAG('S', 'A', 'N', 'M') &&
+    if (((AV_RL32(p->buf)     == MKTAG('S', 'A', 'N', 'M') &&
           AV_RL32(p->buf + 8) == MKTAG('S', 'H', 'D', 'R')) ||
-         (AV_RL32(p->buf) == MKTAG('A', 'N', 'I', 'M') &&
+         (AV_RL32(p->buf)     == MKTAG('A', 'N', 'I', 'M') &&
           AV_RL32(p->buf + 8) == MKTAG('A', 'H', 'D', 'R')))) {
         return AVPROBE_SCORE_MAX;
     }
@@ -65,6 +66,8 @@ static int smush_read_header(AVFormatContext *ctx)
         smush->version = 0;
         subversion     = avio_rl16(pb);
         nframes        = avio_rl16(pb);
+        if (!nframes)
+            return AVERROR_INVALIDDATA;
 
         avio_skip(pb, 2); // skip pad
 
@@ -72,7 +75,7 @@ static int smush_read_header(AVFormatContext *ctx)
             palette[i] = avio_rb24(pb);
 
         avio_skip(pb, size - (3 * 256 + 6));
-    } else if (magic == MKBETAG('S', 'A', 'N', 'M') ) {
+    } else if (magic == MKBETAG('S', 'A', 'N', 'M')) {
         if (avio_rb32(pb) != MKBETAG('S', 'H', 'D', 'R'))
             return AVERROR_INVALIDDATA;
 
@@ -81,8 +84,11 @@ static int smush_read_header(AVFormatContext *ctx)
             return AVERROR_INVALIDDATA;
 
         smush->version = 1;
-        subversion     = avio_rl16(pb);
+        subversion = avio_rl16(pb);
         nframes = avio_rl32(pb);
+        if (!nframes)
+            return AVERROR_INVALIDDATA;
+
         avio_skip(pb, 2); // skip pad
         width  = avio_rl16(pb);
         height = avio_rl16(pb);
@@ -101,12 +107,18 @@ static int smush_read_header(AVFormatContext *ctx)
 
             sig        = avio_rb32(pb);
             chunk_size = avio_rb32(pb);
-            read += 8;
+            read      += 8;
             switch (sig) {
             case MKBETAG('W', 'a', 'v', 'e'):
                 got_audio = 1;
                 sample_rate = avio_rl32(pb);
-                channels    = avio_rl32(pb);
+                if (!sample_rate)
+                    return AVERROR_INVALIDDATA;
+
+                channels = avio_rl32(pb);
+                if (!channels)
+                    return AVERROR_INVALIDDATA;
+
                 avio_skip(pb, chunk_size - 8);
                 read += chunk_size;
                 break;
@@ -133,17 +145,18 @@ static int smush_read_header(AVFormatContext *ctx)
 
     smush->video_stream_index = vst->index;
 
+    avpriv_set_pts_info(vst, 64, 1, 15);
+
     vst->start_time        = 0;
     vst->duration          =
     vst->nb_frames         = nframes;
+    vst->avg_frame_rate    = av_inv_q(vst->time_base);
     vst->codec->codec_type = AVMEDIA_TYPE_VIDEO;
     vst->codec->codec_id   = AV_CODEC_ID_SANM;
     vst->codec->codec_tag  = 0;
     vst->codec->width      = width;
     vst->codec->height     = height;
 
-    avpriv_set_pts_info(vst, 64, 66667, 1000000);
-
     if (!smush->version) {
         if (ff_alloc_extradata(vst->codec, 1024 + 2))
             return AVERROR(ENOMEM);
@@ -162,7 +175,7 @@ static int smush_read_header(AVFormatContext *ctx)
 
         ast->start_time         = 0;
         ast->codec->codec_type  = AVMEDIA_TYPE_AUDIO;
-        ast->codec->codec_id    = AV_CODEC_ID_VIMA;
+        ast->codec->codec_id    = AV_CODEC_ID_ADPCM_VIMA;
         ast->codec->codec_tag   = 0;
         ast->codec->sample_rate = sample_rate;
         ast->codec->channels    = channels;
@@ -178,6 +191,7 @@ static int smush_read_packet(AVFormatContext *ctx, AVPacket *pkt)
     SMUSHContext *smush = ctx->priv_data;
     AVIOContext *pb = ctx->pb;
     int done = 0;
+    int ret;
 
     while (!done) {
         uint32_t sig, size;
@@ -185,22 +199,22 @@ static int smush_read_packet(AVFormatContext *ctx, AVPacket *pkt)
         if (url_feof(pb))
             return AVERROR_EOF;
 
-        sig    = avio_rb32(pb);
-        size   = avio_rb32(pb);
+        sig  = avio_rb32(pb);
+        size = avio_rb32(pb);
 
         switch (sig) {
         case MKBETAG('F', 'R', 'M', 'E'):
             if (smush->version)
                 break;
-            if (av_get_packet(pb, pkt, size) < 0)
-                return AVERROR(EIO);
+            if ((ret = av_get_packet(pb, pkt, size)) < 0)
+                return ret;
 
             pkt->stream_index = smush->video_stream_index;
             done = 1;
             break;
         case MKBETAG('B', 'l', '1', '6'):
-            if (av_get_packet(pb, pkt, size) < 0)
-                return AVERROR(EIO);
+            if ((ret = av_get_packet(pb, pkt, size)) < 0)
+                return ret;
 
             pkt->stream_index = smush->video_stream_index;
             pkt->duration = 1;
@@ -214,7 +228,7 @@ static int smush_read_packet(AVFormatContext *ctx, AVPacket *pkt)
 
             pkt->stream_index = smush->audio_stream_index;
             pkt->flags       |= AV_PKT_FLAG_KEY;
-            pkt->duration = AV_RB32(pkt->data);
+            pkt->duration     = AV_RB32(pkt->data);
             if (pkt->duration == 0xFFFFFFFFu)
                 pkt->duration = AV_RB32(pkt->data + 8);
             done = 1;
index fb4043e..fe54380 100644 (file)
@@ -31,7 +31,7 @@
 
 #define LIBAVFORMAT_VERSION_MAJOR 55
 #define LIBAVFORMAT_VERSION_MINOR 36
-#define LIBAVFORMAT_VERSION_MICRO 101
+#define LIBAVFORMAT_VERSION_MICRO 102
 
 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
                                                LIBAVFORMAT_VERSION_MINOR, \
index 6b1dd3c..b64920d 100644 (file)
@@ -82,6 +82,9 @@ fate-adpcm_ms-stereo: CMD = md5 -i $(TARGET_SAMPLES)/qt-surge-suite/surge-2-16-L
 FATE_ADPCM-$(call DEMDEC, THP, ADPCM_THP) += fate-adpcm-thp
 fate-adpcm-thp: CMD = framecrc -i $(TARGET_SAMPLES)/thp/pikmin2-opening1-partial.thp -vn
 
+FATE_ADPCM-$(call DEMDEC, SMUSH, ADPCM_VIMA) += fate-adpcm-vima
+fate-adpcm-vima: CMD = framecrc -i $(TARGET_SAMPLES)/smush/ronin_part.znm -vn
+
 FATE_ADPCM-$(call DEMDEC, STR, ADPCM_XA) += fate-adpcm-xa
 fate-adpcm-xa: CMD = framecrc -i $(TARGET_SAMPLES)/psx-str/abc000_cut.str -vn
 
index 6b5d1a9..20ef042 100644 (file)
@@ -52,9 +52,6 @@ fate-sierra-vmd-audio: CMD = framecrc -i $(TARGET_SAMPLES)/vmd/12.vmd -vn
 FATE_SAMPLES_AUDIO-$(call DEMDEC, SMACKER, SMACKAUD) += fate-smacker-audio
 fate-smacker-audio: CMD = framecrc -i $(TARGET_SAMPLES)/smacker/wetlogo.smk -vn
 
-FATE_SAMPLES_AUDIO-$(call DEMDEC, SMUSH, VIMA) += fate-vima
-fate-vima: CMD = framecrc -i $(TARGET_SAMPLES)/smush/ronin_part.znm -vn
-
 FATE_SAMPLES_AUDIO-$(call DEMDEC, WSVQA, WS_SND1) += fate-ws_snd
 fate-ws_snd: CMD = md5 -i $(TARGET_SAMPLES)/vqa/ws_snd.vqa -f s16le
 
diff --git a/tests/ref/fate/adpcm-vima b/tests/ref/fate/adpcm-vima
new file mode 100644 (file)
index 0000000..6984c5d
--- /dev/null
@@ -0,0 +1,17 @@
+#tb 0: 1/22050
+0,          0,          0,    73500,   294000, 0x37d439ee
+0,      73500,      73500,     1470,     5880, 0xe524b177
+0,      74970,      74970,     1470,     5880, 0x9e784af1
+0,      76440,      76440,     1470,     5880, 0x821989b0
+0,      77910,      77910,     1470,     5880, 0x8f4993da
+0,      79380,      79380,     1470,     5880, 0x889a9035
+0,      80850,      80850,     1470,     5880, 0x7f0f5299
+0,      82320,      82320,     1470,     5880, 0xf12f5d2a
+0,      83790,      83790,     1470,     5880, 0xd6292fda
+0,      85260,      85260,     1470,     5880, 0xe1b8405f
+0,      86730,      86730,     1470,     5880, 0xe23d2d44
+0,      88200,      88200,     1470,     5880, 0xe20631a4
+0,      89670,      89670,     1470,     5880, 0x3f72210f
+0,      91140,      91140,     1470,     5880, 0xec0b3fe8
+0,      92610,      92610,     1470,     5880, 0x9615f198
+0,      94080,      94080,     1470,     5880, 0x500226ce
index 8b6f903..a882118 100644 (file)
@@ -1,4 +1,4 @@
-#tb 0: 66667/1000000
+#tb 0: 1/15
 0,          0,          0,        1,   921600, 0x00000000
 0,          1,          1,        1,   921600, 0x00000000
 0,          2,          2,        1,   921600, 0x00000000
diff --git a/tests/ref/fate/vima b/tests/ref/fate/vima
deleted file mode 100644 (file)
index 6984c5d..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-#tb 0: 1/22050
-0,          0,          0,    73500,   294000, 0x37d439ee
-0,      73500,      73500,     1470,     5880, 0xe524b177
-0,      74970,      74970,     1470,     5880, 0x9e784af1
-0,      76440,      76440,     1470,     5880, 0x821989b0
-0,      77910,      77910,     1470,     5880, 0x8f4993da
-0,      79380,      79380,     1470,     5880, 0x889a9035
-0,      80850,      80850,     1470,     5880, 0x7f0f5299
-0,      82320,      82320,     1470,     5880, 0xf12f5d2a
-0,      83790,      83790,     1470,     5880, 0xd6292fda
-0,      85260,      85260,     1470,     5880, 0xe1b8405f
-0,      86730,      86730,     1470,     5880, 0xe23d2d44
-0,      88200,      88200,     1470,     5880, 0xe20631a4
-0,      89670,      89670,     1470,     5880, 0x3f72210f
-0,      91140,      91140,     1470,     5880, 0xec0b3fe8
-0,      92610,      92610,     1470,     5880, 0x9615f198
-0,      94080,      94080,     1470,     5880, 0x500226ce