[SCM] libav/experimental: Validate AVCodecTag vs CodecID.

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sun Jun 30 17:07:15 UTC 2013


The following commit has been merged in the experimental branch:
commit 698f4cc7f0af0ba9ef54b01cfffd1f02d7aa5d05
Author: Francesco Lavra <francescolavra at interfree.it>
Date:   Tue May 18 19:23:29 2010 +0000

    Validate AVCodecTag vs CodecID.
    
    Patch by Francesco Lavra, francescolavra interfree it
    
    Originally committed as revision 23159 to svn://svn.ffmpeg.org/ffmpeg/trunk

diff --git a/libavformat/utils.c b/libavformat/utils.c
index 73cecc9..9b5ae5d 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -2573,6 +2573,39 @@ int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
     return 0;
 }
 
+static int validate_codec_tag(AVFormatContext *s, AVStream *st)
+{
+    const AVCodecTag *avctag;
+    int n;
+    enum CodecID id = CODEC_ID_NONE;
+    unsigned int tag = 0;
+
+    /**
+     * Check that tag + id is in the table
+     * If neither is in the table -> OK
+     * If tag is in the table with another id -> FAIL
+     * If id is in the table with another tag -> FAIL unless strict < normal
+     */
+    for (n = 0; s->oformat->codec_tag[n]; n++) {
+        avctag = s->oformat->codec_tag[n];
+        while (avctag->id != CODEC_ID_NONE) {
+            if (ff_toupper4(avctag->tag) == ff_toupper4(st->codec->codec_tag)) {
+                id = avctag->id;
+                if (id == st->codec->codec_id)
+                    return 1;
+            }
+            if (avctag->id == st->codec->codec_id)
+                tag = avctag->tag;
+            avctag++;
+        }
+    }
+    if (id != CODEC_ID_NONE)
+        return 0;
+    if (tag && (st->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL))
+        return 0;
+    return 1;
+}
+
 int av_write_header(AVFormatContext *s)
 {
     int ret, i;
@@ -2615,11 +2648,12 @@ int av_write_header(AVFormatContext *s)
 
         if(s->oformat->codec_tag){
             if(st->codec->codec_tag){
-                //FIXME
-                //check that tag + id is in the table
-                //if neither is in the table -> OK
-                //if tag is in the table with another id -> FAIL
-                //if id is in the table with another tag -> FAIL unless strict < ?
+                if (!validate_codec_tag(s, st)) {
+                    av_log(s, AV_LOG_ERROR,
+                           "Tag 0x%08x incompatible with output codec\n",
+                           st->codec->codec_tag);
+                    return AVERROR_INVALIDDATA;
+                }
             }else
                 st->codec->codec_tag= av_codec_get_tag(s->oformat->codec_tag, st->codec->codec_id);
         }

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list