nuv: Fix playback of RTjpeg from current MythTV,
authorReimar Döffinger <Reimar.Doeffinger@gmx.de>
Tue, 31 Jul 2012 18:47:24 +0000 (20:47 +0200)
committerReimar Döffinger <Reimar.Doeffinger@gmx.de>
Wed, 1 Aug 2012 17:35:58 +0000 (19:35 +0200)
The previous validity check seems to work only for some
(presumably older) files, in current versions the first bytes
now contain the data size.

Signed-off-by: Reimar Döffinger <Reimar.Doeffinger@gmx.de>
libavcodec/nuv.c

index 17fcb70..00860fe 100644 (file)
@@ -191,8 +191,15 @@ retry:
     }
     if (c->codec_frameheader) {
         int w, h, q, res;
-        if (buf_size < 12 || buf[0] != 'V') {
-            av_log(avctx, AV_LOG_ERROR, "invalid nuv video frame (wrong codec_tag?)\n");
+        if (buf_size < 12) {
+            av_log(avctx, AV_LOG_ERROR, "Too small NUV video frame\n");
+            return AVERROR_INVALIDDATA;
+        }
+        // There seem to exist two variants of this header: one starts with 'V'
+        // and 5 bytes unknown, the other matches current MythTV and is 4 bytes size,
+        // 1 byte header size (== 12), 1 byte version (== 0)
+        if (buf[0] != 'V' && AV_RL16(&buf[4]) != 0x000c) {
+            av_log(avctx, AV_LOG_ERROR, "Unknown secondary frame header (wrong codec_tag?)\n");
             return AVERROR_INVALIDDATA;
         }
         w = AV_RL16(&buf[6]);