]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/simple_idct.c
fix some crashes when missing frames
[ffmpeg] / libavcodec / simple_idct.c
index 4b488197a8274494a697f5a4a2368a17d9be4a62..8fa83bec7030ad723d816096de0de416d1ce06f1 100644 (file)
  *
  * 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
  */
+
 /**
  * @file simple_idct.c
  * simpleidct in C.
  */
+
 /*
   based upon some outcommented c code from mpeg2dec (idct_mmx.c
-  written by Aaron Holtzman <aholtzma@ess.engr.uvic.ca>) 
+  written by Aaron Holtzman <aholtzma@ess.engr.uvic.ca>)
  */
 #include "avcodec.h"
 #include "dsputil.h"
@@ -75,7 +75,7 @@
 
 static inline void idctRowCondDC (DCTELEM * row)
 {
-       int a0, a1, a2, a3, b0, b1, b2, b3;
+        int a0, a1, a2, a3, b0, b1, b2, b3;
 #ifdef FAST_64BIT
         uint64_t temp;
 #else
@@ -89,7 +89,7 @@ static inline void idctRowCondDC (DCTELEM * row)
 #define ROW0_MASK 0xffffLL
 #endif
         if(sizeof(DCTELEM)==2){
-            if ( ((((uint64_t *)row)[0] & ~ROW0_MASK) | 
+            if ( ((((uint64_t *)row)[0] & ~ROW0_MASK) |
                   ((uint64_t *)row)[1]) == 0) {
                 temp = (row[0] << 3) & 0xffff;
                 temp += temp << 16;
@@ -97,7 +97,7 @@ static inline void idctRowCondDC (DCTELEM * row)
                 ((uint64_t *)row)[0] = temp;
                 ((uint64_t *)row)[1] = temp;
                 return;
-           }
+            }
         }else{
             if (!(row[1]|row[2]|row[3]|row[4]|row[5]|row[6]|row[7])) {
                 row[0]=row[1]=row[2]=row[3]=row[4]=row[5]=row[6]=row[7]= row[0] << 3;
@@ -108,7 +108,7 @@ static inline void idctRowCondDC (DCTELEM * row)
         if(sizeof(DCTELEM)==2){
             if (!(((uint32_t*)row)[1] |
                   ((uint32_t*)row)[2] |
-                  ((uint32_t*)row)[3] | 
+                  ((uint32_t*)row)[3] |
                   row[1])) {
                 temp = (row[0] << 3) & 0xffff;
                 temp += temp << 16;
@@ -125,9 +125,9 @@ static inline void idctRowCondDC (DCTELEM * row)
 #endif
 
         a0 = (W4 * row[0]) + (1 << (ROW_SHIFT - 1));
-       a1 = a0;
-       a2 = a0;
-       a3 = a0;
+        a1 = a0;
+        a2 = a0;
+        a3 = a0;
 
         /* no need to optimize : gcc does it */
         a0 += W2 * row[2];
@@ -149,7 +149,7 @@ static inline void idctRowCondDC (DCTELEM * row)
 #else
         temp = ((uint32_t*)row)[2] | ((uint32_t*)row)[3];
 #endif
-       if (temp != 0) {
+        if (temp != 0) {
             a0 += W4*row[4] + W6*row[6];
             a1 += - W4*row[4] - W2*row[6];
             a2 += - W4*row[4] + W2*row[6];
@@ -157,38 +157,38 @@ static inline void idctRowCondDC (DCTELEM * row)
 
             MAC16(b0, W5, row[5]);
             MAC16(b0, W7, row[7]);
-            
+
             MAC16(b1, -W1, row[5]);
             MAC16(b1, -W5, row[7]);
-            
+
             MAC16(b2, W7, row[5]);
             MAC16(b2, W3, row[7]);
-            
+
             MAC16(b3, W3, row[5]);
             MAC16(b3, -W1, row[7]);
-       }
-
-       row[0] = (a0 + b0) >> ROW_SHIFT;
-       row[7] = (a0 - b0) >> ROW_SHIFT;
-       row[1] = (a1 + b1) >> ROW_SHIFT;
-       row[6] = (a1 - b1) >> ROW_SHIFT;
-       row[2] = (a2 + b2) >> ROW_SHIFT;
-       row[5] = (a2 - b2) >> ROW_SHIFT;
-       row[3] = (a3 + b3) >> ROW_SHIFT;
-       row[4] = (a3 - b3) >> ROW_SHIFT;
+        }
+
+        row[0] = (a0 + b0) >> ROW_SHIFT;
+        row[7] = (a0 - b0) >> ROW_SHIFT;
+        row[1] = (a1 + b1) >> ROW_SHIFT;
+        row[6] = (a1 - b1) >> ROW_SHIFT;
+        row[2] = (a2 + b2) >> ROW_SHIFT;
+        row[5] = (a2 - b2) >> ROW_SHIFT;
+        row[3] = (a3 + b3) >> ROW_SHIFT;
+        row[4] = (a3 - b3) >> ROW_SHIFT;
 }
 
-static inline void idctSparseColPut (uint8_t *dest, int line_size, 
+static inline void idctSparseColPut (uint8_t *dest, int line_size,
                                      DCTELEM * col)
 {
-       int a0, a1, a2, a3, b0, b1, b2, b3;
+        int a0, a1, a2, a3, b0, b1, b2, b3;
         uint8_t *cm = cropTbl + MAX_NEG_CROP;
 
         /* XXX: I did that only to give same values as previous code */
-       a0 = W4 * (col[8*0] + ((1<<(COL_SHIFT-1))/W4));
-       a1 = a0;
-       a2 = a0;
-       a3 = a0;
+        a0 = W4 * (col[8*0] + ((1<<(COL_SHIFT-1))/W4));
+        a1 = a0;
+        a2 = a0;
+        a3 = a0;
 
         a0 +=  + W2*col[8*2];
         a1 +=  + W6*col[8*2];
@@ -205,33 +205,33 @@ static inline void idctSparseColPut (uint8_t *dest, int line_size,
         MAC16(b2, - W1, col[8*3]);
         MAC16(b3, - W5, col[8*3]);
 
-       if(col[8*4]){
+        if(col[8*4]){
             a0 += + W4*col[8*4];
             a1 += - W4*col[8*4];
             a2 += - W4*col[8*4];
             a3 += + W4*col[8*4];
-       }
+        }
 
-       if (col[8*5]) {
+        if (col[8*5]) {
             MAC16(b0, + W5, col[8*5]);
             MAC16(b1, - W1, col[8*5]);
             MAC16(b2, + W7, col[8*5]);
             MAC16(b3, + W3, col[8*5]);
-       }
+        }
 
-       if(col[8*6]){
+        if(col[8*6]){
             a0 += + W6*col[8*6];
             a1 += - W2*col[8*6];
             a2 += + W2*col[8*6];
             a3 += - W6*col[8*6];
-       }
+        }
 
-       if (col[8*7]) {
+        if (col[8*7]) {
             MAC16(b0, + W7, col[8*7]);
             MAC16(b1, - W5, col[8*7]);
             MAC16(b2, + W3, col[8*7]);
             MAC16(b3, - W1, col[8*7]);
-       }
+        }
 
         dest[0] = cm[(a0 + b0) >> COL_SHIFT];
         dest += line_size;
@@ -250,17 +250,17 @@ static inline void idctSparseColPut (uint8_t *dest, int line_size,
         dest[0] = cm[(a0 - b0) >> COL_SHIFT];
 }
 
-static inline void idctSparseColAdd (uint8_t *dest, int line_size, 
+static inline void idctSparseColAdd (uint8_t *dest, int line_size,
                                      DCTELEM * col)
 {
-       int a0, a1, a2, a3, b0, b1, b2, b3;
+        int a0, a1, a2, a3, b0, b1, b2, b3;
         uint8_t *cm = cropTbl + MAX_NEG_CROP;
 
         /* XXX: I did that only to give same values as previous code */
-       a0 = W4 * (col[8*0] + ((1<<(COL_SHIFT-1))/W4));
-       a1 = a0;
-       a2 = a0;
-       a3 = a0;
+        a0 = W4 * (col[8*0] + ((1<<(COL_SHIFT-1))/W4));
+        a1 = a0;
+        a2 = a0;
+        a3 = a0;
 
         a0 +=  + W2*col[8*2];
         a1 +=  + W6*col[8*2];
@@ -277,33 +277,33 @@ static inline void idctSparseColAdd (uint8_t *dest, int line_size,
         MAC16(b2, - W1, col[8*3]);
         MAC16(b3, - W5, col[8*3]);
 
-       if(col[8*4]){
+        if(col[8*4]){
             a0 += + W4*col[8*4];
             a1 += - W4*col[8*4];
             a2 += - W4*col[8*4];
             a3 += + W4*col[8*4];
-       }
+        }
 
-       if (col[8*5]) {
+        if (col[8*5]) {
             MAC16(b0, + W5, col[8*5]);
             MAC16(b1, - W1, col[8*5]);
             MAC16(b2, + W7, col[8*5]);
             MAC16(b3, + W3, col[8*5]);
-       }
+        }
 
-       if(col[8*6]){
+        if(col[8*6]){
             a0 += + W6*col[8*6];
             a1 += - W2*col[8*6];
             a2 += + W2*col[8*6];
             a3 += - W6*col[8*6];
-       }
+        }
 
-       if (col[8*7]) {
+        if (col[8*7]) {
             MAC16(b0, + W7, col[8*7]);
             MAC16(b1, - W5, col[8*7]);
             MAC16(b2, + W3, col[8*7]);
             MAC16(b3, - W1, col[8*7]);
-       }
+        }
 
         dest[0] = cm[dest[0] + ((a0 + b0) >> COL_SHIFT)];
         dest += line_size;
@@ -324,13 +324,13 @@ static inline void idctSparseColAdd (uint8_t *dest, int line_size,
 
 static inline void idctSparseCol (DCTELEM * col)
 {
-       int a0, a1, a2, a3, b0, b1, b2, b3;
+        int a0, a1, a2, a3, b0, b1, b2, b3;
 
         /* XXX: I did that only to give same values as previous code */
-       a0 = W4 * (col[8*0] + ((1<<(COL_SHIFT-1))/W4));
-       a1 = a0;
-       a2 = a0;
-       a3 = a0;
+        a0 = W4 * (col[8*0] + ((1<<(COL_SHIFT-1))/W4));
+        a1 = a0;
+        a2 = a0;
+        a3 = a0;
 
         a0 +=  + W2*col[8*2];
         a1 +=  + W6*col[8*2];
@@ -347,33 +347,33 @@ static inline void idctSparseCol (DCTELEM * col)
         MAC16(b2, - W1, col[8*3]);
         MAC16(b3, - W5, col[8*3]);
 
-       if(col[8*4]){
+        if(col[8*4]){
             a0 += + W4*col[8*4];
             a1 += - W4*col[8*4];
             a2 += - W4*col[8*4];
             a3 += + W4*col[8*4];
-       }
+        }
 
-       if (col[8*5]) {
+        if (col[8*5]) {
             MAC16(b0, + W5, col[8*5]);
             MAC16(b1, - W1, col[8*5]);
             MAC16(b2, + W7, col[8*5]);
             MAC16(b3, + W3, col[8*5]);
-       }
+        }
 
-       if(col[8*6]){
+        if(col[8*6]){
             a0 += + W6*col[8*6];
             a1 += - W2*col[8*6];
             a2 += + W2*col[8*6];
             a3 += - W6*col[8*6];
-       }
+        }
 
-       if (col[8*7]) {
+        if (col[8*7]) {
             MAC16(b0, + W7, col[8*7]);
             MAC16(b1, - W5, col[8*7]);
             MAC16(b2, + W3, col[8*7]);
             MAC16(b3, - W1, col[8*7]);
-       }
+        }
 
         col[0 ] = ((a0 + b0) >> COL_SHIFT);
         col[8 ] = ((a1 + b1) >> COL_SHIFT);
@@ -390,7 +390,7 @@ void simple_idct_put(uint8_t *dest, int line_size, DCTELEM *block)
     int i;
     for(i=0; i<8; i++)
         idctRowCondDC(block + i*8);
-    
+
     for(i=0; i<8; i++)
         idctSparseColPut(dest + i, line_size, block + i);
 }
@@ -400,7 +400,7 @@ void simple_idct_add(uint8_t *dest, int line_size, DCTELEM *block)
     int i;
     for(i=0; i<8; i++)
         idctRowCondDC(block + i*8);
-    
+
     for(i=0; i<8; i++)
         idctSparseColAdd(dest + i, line_size, block + i);
 }
@@ -410,7 +410,7 @@ void simple_idct(DCTELEM *block)
     int i;
     for(i=0; i<8; i++)
         idctRowCondDC(block + i*8);
-    
+
     for(i=0; i<8; i++)
         idctSparseCol(block + i);
 }
@@ -467,7 +467,7 @@ void simple_idct248_put(uint8_t *dest, int line_size, DCTELEM *block)
 {
     int i;
     DCTELEM *ptr;
-    
+
     /* butterfly */
     ptr = block;
     for(i=0;i<4;i++) {