cook shouldn't try to enforce the bitstream reader type
[libav.git] / libavcodec / cook.c
index 7cf76fa..88ee071 100644 (file)
@@ -15,7 +15,7 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  *
  */
 
@@ -45,7 +45,6 @@
 #include <stddef.h>
 #include <stdio.h>
 
-#define ALT_BITSTREAM_READER
 #include "avcodec.h"
 #include "bitstream.h"
 #include "dsputil.h"
@@ -90,8 +89,8 @@ typedef struct {
     int                 samples_per_channel;
     int                 samples_per_frame;
     int                 subbands;
-    int                 numvector_bits;
-    int                 numvector_size;                //1 << numvector_bits;
+    int                 log2_numvector_size;
+    int                 numvector_size;                //1 << log2_numvector_size;
     int                 js_subband_start;
     int                 total_subbands;
     int                 num_vectors;
@@ -185,8 +184,8 @@ static void init_pow2table(COOKContext *q){
     int i;
     q->pow2tab[63] = 1.0;
     for (i=1 ; i<64 ; i++){
-        q->pow2tab[63+i]=(float)pow(2.0,(double)i);
-        q->pow2tab[63-i]=1.0/(float)pow(2.0,(double)i);
+        q->pow2tab[63+i]=(float)((uint64_t)1<<i);
+        q->pow2tab[63-i]=1.0/(float)((uint64_t)1<<i);
     }
 }
 
@@ -195,8 +194,8 @@ static void init_rootpow2table(COOKContext *q){
     int i;
     q->rootpow2tab[63] = 1.0;
     for (i=1 ; i<64 ; i++){
-        q->rootpow2tab[63+i]=sqrt((float)powf(2.0,(float)i));
-        q->rootpow2tab[63-i]=sqrt(1.0/(float)powf(2.0,(float)i));
+        q->rootpow2tab[63+i]=sqrt((float)((uint64_t)1<<i));
+        q->rootpow2tab[63-i]=sqrt(1.0/(float)((uint64_t)1<<i));
     }
 }
 
@@ -698,7 +697,7 @@ static void mono_decode(COOKContext *q, float* mlt_buffer) {
     memset(&category_index, 0, 128*sizeof(int));
 
     decode_envelope(q, quant_index_table);
-    q->num_vectors = get_bits(&q->gb,q->numvector_bits);
+    q->num_vectors = get_bits(&q->gb,q->log2_numvector_size);
     dequant_envelope(q, quant_index_table, quant_value_table);
     categorize(q, quant_index_table, category, category_index);
     expand_category(q, category, category_index);
@@ -954,7 +953,6 @@ static void joint_decode(COOKContext *q, float* mlt_buffer1,
  * @param inbuffer          pointer to the inbuffer
  * @param sub_packet_size   subpacket size
  * @param outbuffer         pointer to the outbuffer
- * @param pos               the subpacket number in the frame
  */
 
 
@@ -1119,6 +1117,7 @@ static int cook_decode_frame(AVCodecContext *avctx,
 
     return avctx->block_align;
 }
+
 #ifdef COOKDEBUG
 static void dump_cook_context(COOKContext *q, COOKextradata *e)
 {
@@ -1140,11 +1139,12 @@ static void dump_cook_context(COOKContext *q, COOKextradata *e)
     PRINT("random_state",q->random_state);
     PRINT("mlt_size",q->mlt_size);
     PRINT("js_subband_start",q->js_subband_start);
-    PRINT("numvector_bits",q->numvector_bits);
+    PRINT("log2_numvector_size",q->log2_numvector_size);
     PRINT("numvector_size",q->numvector_size);
     PRINT("total_subbands",q->total_subbands);
 }
 #endif
+
 /**
  * Cook initialization
  *
@@ -1191,7 +1191,7 @@ static int cook_decode_init(AVCodecContext *avctx)
 
     /* Initialize default data states. */
     q->js_subband_start = 0;
-    q->numvector_bits = 5;
+    q->log2_numvector_size = 5;
     q->total_subbands = q->subbands;
 
     /* Initialize version-dependent variables */
@@ -1224,10 +1224,10 @@ static int cook_decode_init(AVCodecContext *avctx)
                 q->js_vlc_bits = e->js_vlc_bits;
             }
             if (q->samples_per_channel > 256) {
-                q->numvector_bits++;   // q->numvector_bits  = 6
+                q->log2_numvector_size  = 6;
             }
             if (q->samples_per_channel > 512) {
-                q->numvector_bits++;   // q->numvector_bits  = 7
+                q->log2_numvector_size  = 7;
             }
             break;
         case MC_COOK:
@@ -1242,7 +1242,7 @@ static int cook_decode_init(AVCodecContext *avctx)
 
     /* Initialize variable relations */
     q->mlt_size = q->samples_per_channel;
-    q->numvector_size = (1 << q->numvector_bits);
+    q->numvector_size = (1 << q->log2_numvector_size);
 
     /* Generate tables */
     init_rootpow2table(q);
@@ -1252,6 +1252,10 @@ static int cook_decode_init(AVCodecContext *avctx)
     if (init_cook_vlc_tables(q) != 0)
         return -1;
 
+
+    if(avctx->block_align >= UINT_MAX/2)
+        return -1;
+
     /* Pad the databuffer with FF_INPUT_BUFFER_PADDING_SIZE,
        this is for the bitstreamreader. */
     if ((q->decoded_bytes_buffer = av_mallocz((avctx->block_align+(4-avctx->block_align%4) + FF_INPUT_BUFFER_PADDING_SIZE)*sizeof(uint8_t)))  == NULL)
@@ -1277,14 +1281,15 @@ static int cook_decode_init(AVCodecContext *avctx)
         av_log(NULL,AV_LOG_ERROR,"total_subbands > 53, report sample!\n");
         return -1;
     }
-    if (((q->subbands > 34) || (q->js_subband_start > 19)) && (q->joint_stereo)) {
-        av_log(NULL,AV_LOG_ERROR,"subbands > 34 or js_subband_start > 19, report sample!\n");
-        return -1;
-    }
     if (q->subbands > 50) {
         av_log(NULL,AV_LOG_ERROR,"subbands > 50, report sample!\n");
         return -1;
     }
+    if ((q->samples_per_channel == 256) || (q->samples_per_channel == 512) || (q->samples_per_channel == 1024)) {
+    } else {
+        av_log(NULL,AV_LOG_ERROR,"unknown amount of samples_per_channel = %d, report sample!\n",q->samples_per_channel);
+        return -1;
+    }
 
 #ifdef COOKDEBUG
     dump_cook_context(q,e);