1.) LGPL license mentioned
[ffmpeg.git] / libavcodec / vorbis.c
index 3505409..bda54f2 100644 (file)
@@ -2,6 +2,21 @@
  * @file vorbis.c
  * Vorbis I decoder
  * @author Denes Balatoni  ( dbalatoni programozo hu )
+
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
  */
 
 #undef V_DEBUG
@@ -175,6 +190,8 @@ static void vorbis_free(vorbis_context *vc) {
 
 static int vorbis_parse_setup_hdr_codebooks(vorbis_context *vc) {
     uint_fast16_t cb;
+    uint_fast8_t *tmp_vlc_bits;
+    uint_fast32_t *tmp_vlc_codes;
     GetBitContext *gb=&vc->gb;
 
     vc->codebook_count=get_bits(gb,8)+1;
@@ -182,33 +199,31 @@ static int vorbis_parse_setup_hdr_codebooks(vorbis_context *vc) {
     AV_DEBUG(" Codebooks: %d \n", vc->codebook_count);
 
     vc->codebooks=(vorbis_codebook *)av_mallocz(vc->codebook_count * sizeof(vorbis_codebook));
+    tmp_vlc_bits=(uint_fast8_t *)av_mallocz(V_MAX_VLCS * sizeof(uint_fast8_t));
+    tmp_vlc_codes=(uint_fast32_t *)av_mallocz(V_MAX_VLCS * sizeof(uint_fast32_t));
 
     for(cb=0;cb<vc->codebook_count;++cb) {
         vorbis_codebook *codebook_setup=&vc->codebooks[cb];
         uint_fast8_t ordered;
         uint_fast32_t t, used_entries=0;
         uint_fast32_t entries;
-        uint_fast8_t tmp_vlc_bits[V_MAX_VLCS];
-        uint_fast32_t tmp_vlc_codes[V_MAX_VLCS];
-
-//        memset(tmp_vlc_bits, 0, sizeof(tmp_vlc_bits));
 
         AV_DEBUG(" %d. Codebook \n", cb);
 
         if (get_bits(gb, 24)!=0x564342) {
             av_log(vc->avccontext, AV_LOG_ERROR, " %d. Codebook setup data corrupt. \n", cb);
-            return 1;
+            goto error;
         }
 
         codebook_setup->dimensions=get_bits(gb, 16);
         if (codebook_setup->dimensions>16) {
             av_log(vc->avccontext, AV_LOG_ERROR, " %d. Codebook's dimension is too large (%d). \n", cb, codebook_setup->dimensions);
-            return 1;
+            goto error;
         }
         entries=get_bits(gb, 24);
         if (entries>V_MAX_VLCS) {
             av_log(vc->avccontext, AV_LOG_ERROR, " %d. Codebook has too many entries (%d). \n", cb, entries);
-            return 1;
+            goto error;
         }
 
         ordered=get_bits1(gb);
@@ -266,7 +281,7 @@ static int vorbis_parse_setup_hdr_codebooks(vorbis_context *vc) {
             }
             if (current_entry>used_entries) {
                 av_log(vc->avccontext, AV_LOG_ERROR, " More codelengths than codes in codebook. \n");
-                return 1;
+                goto error;
             }
         }
 
@@ -332,19 +347,19 @@ static int vorbis_parse_setup_hdr_codebooks(vorbis_context *vc) {
             }
             if (j!=used_entries) {
                 av_log(vc->avccontext, AV_LOG_ERROR, "Bug in codevector vector building code. \n");
-                return 1;
+                goto error;
             }
             entries=used_entries;
         }
         else if (codebook_setup->lookup_type>=2) {
             av_log(vc->avccontext, AV_LOG_ERROR, "Codebook lookup type not supported. \n");
-            return 1;
+            goto error;
         }
 
 // Initialize VLC table
         if (vorbis_len2vlc(vc, tmp_vlc_bits, tmp_vlc_codes, entries)) {
             av_log(vc->avccontext, AV_LOG_ERROR, " Invalid code lengths while generating vlcs. \n");
-            return 1;
+            goto error;
         }
         codebook_setup->maxdepth=0;
         for(t=0;t<entries;++t)
@@ -354,10 +369,19 @@ static int vorbis_parse_setup_hdr_codebooks(vorbis_context *vc) {
 
         if (init_vlc(&codebook_setup->vlc, V_NB_BITS, entries, tmp_vlc_bits, sizeof(*tmp_vlc_bits), sizeof(*tmp_vlc_bits), tmp_vlc_codes, sizeof(*tmp_vlc_codes), sizeof(*tmp_vlc_codes), INIT_VLC_LE)) {
             av_log(vc->avccontext, AV_LOG_ERROR, " Error generating vlc tables. \n");
-            return 1;
+            goto error;
         }
     }
+
+    av_free(tmp_vlc_bits);
+    av_free(tmp_vlc_codes);
     return 0;
+
+// Error:
+error:
+    av_free(tmp_vlc_bits);
+    av_free(tmp_vlc_codes);
+    return 1;
 }
 
 // Process time domain transforms part (unused in Vorbis I)
@@ -1190,7 +1214,11 @@ static int vorbis_parse_audio_packet(vorbis_context *vc) {
         return -1; // packet type not audio
     }
 
-    mode_number=get_bits(gb, ilog(vc->mode_count-1));
+    if (vc->mode_count==1) {
+        mode_number=0;
+    } else {
+        mode_number=get_bits(gb, ilog(vc->mode_count-1));
+    }
     mapping=&vc->mappings[vc->modes[mode_number].mapping];
 
     AV_DEBUG(" Mode number: %d , mapping: %d , blocktype %d \n", mode_number, vc->modes[mode_number].mapping, vc->modes[mode_number].blockflag);