Fix buffer handling for stereo mace files, fixes some random sig11
[libav.git] / libavcodec / mace.c
index bc71365..be50d3d 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
  *
  * 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 mace.c
+ * MACE decoder.
+ */
+
 #include "avcodec.h"
 
 /*
 #include "avcodec.h"
 
 /*
  * libavcodec api, context stuff, interlaced stereo out).
  */
 
  * libavcodec api, context stuff, interlaced stereo out).
  */
 
-static const UINT16 MACEtab1[] = { 0xfff3, 0x0008, 0x004c, 0x00de, 0x00de, 0x004c, 0x0008, 0xfff3 };
+static const uint16_t MACEtab1[] = { 0xfff3, 0x0008, 0x004c, 0x00de, 0x00de, 0x004c, 0x0008, 0xfff3 };
 
 
-static const UINT16 MACEtab3[] = { 0xffee, 0x008c, 0x008c, 0xffee };
+static const uint16_t MACEtab3[] = { 0xffee, 0x008c, 0x008c, 0xffee };
 
 
-static const UINT16 MACEtab2[][8] = {
+static const uint16_t MACEtab2[][8] = {
     { 0x0025, 0x0074, 0x00CE, 0x014A, 0xFEB5, 0xFF31, 0xFF8B, 0xFFDA },
     { 0x0027, 0x0079, 0x00D8, 0x015A, 0xFEA5, 0xFF27, 0xFF86, 0xFFD8 },
     { 0x0029, 0x007F, 0x00E1, 0x0169, 0xFE96, 0xFF1E, 0xFF80, 0xFFD6 },
     { 0x0025, 0x0074, 0x00CE, 0x014A, 0xFEB5, 0xFF31, 0xFF8B, 0xFFDA },
     { 0x0027, 0x0079, 0x00D8, 0x015A, 0xFEA5, 0xFF27, 0xFF86, 0xFFD8 },
     { 0x0029, 0x007F, 0x00E1, 0x0169, 0xFE96, 0xFF1E, 0xFF80, 0xFFD6 },
@@ -159,7 +165,7 @@ static const UINT16 MACEtab2[][8] = {
     { 0x25A7, 0x741F, 0x7FFF, 0x7FFF, 0x8000, 0x8000, 0x8BE0, 0xDA58 },
 };
 
     { 0x25A7, 0x741F, 0x7FFF, 0x7FFF, 0x8000, 0x8000, 0x8BE0, 0xDA58 },
 };
 
-static const UINT16 MACEtab4[][8] = {
+static const uint16_t MACEtab4[][8] = {
     { 0x0040, 0x00D8, 0xFF27, 0xFFBF, 0, 0, 0, 0 },  { 0x0043, 0x00E2, 0xFF1D, 0xFFBC, 0, 0, 0, 0 },
     { 0x0046, 0x00EC, 0xFF13, 0xFFB9, 0, 0, 0, 0 },  { 0x004A, 0x00F6, 0xFF09, 0xFFB5, 0, 0, 0, 0 },
     { 0x004D, 0x0101, 0xFEFE, 0xFFB2, 0, 0, 0, 0 },  { 0x0050, 0x010C, 0xFEF3, 0xFFAF, 0, 0, 0, 0 },
     { 0x0040, 0x00D8, 0xFF27, 0xFFBF, 0, 0, 0, 0 },  { 0x0043, 0x00E2, 0xFF1D, 0xFFBC, 0, 0, 0, 0 },
     { 0x0046, 0x00EC, 0xFF13, 0xFFB9, 0, 0, 0, 0 },  { 0x004A, 0x00F6, 0xFF09, 0xFFB5, 0, 0, 0, 0 },
     { 0x004D, 0x0101, 0xFEFE, 0xFFB2, 0, 0, 0, 0 },  { 0x0050, 0x010C, 0xFEF3, 0xFFAF, 0, 0, 0, 0 },
@@ -234,9 +240,10 @@ typedef struct MACEContext {
 
 /* /// "chomp3()" */
 static void chomp3(MACEContext *ctx,
 
 /* /// "chomp3()" */
 static void chomp3(MACEContext *ctx,
-            UINT8 val,
-            const UINT16 tab1[],
-            const UINT16 tab2[][8])
+            uint8_t val,
+            const uint16_t tab1[],
+            const uint16_t tab2[][8],
+            uint32_t numChannels)
 {
   short current;
 
 {
   short current;
 
@@ -246,20 +253,21 @@ static void chomp3(MACEContext *ctx,
   else current+=ctx->lev;
   ctx->lev=current-(current >> 3);
 //  *ctx->outPtr++=current >> 8;
   else current+=ctx->lev;
   ctx->lev=current-(current >> 3);
 //  *ctx->outPtr++=current >> 8;
-  *ctx->outPtr++=current;
+  *ctx->outPtr=current;
+  ctx->outPtr+=numChannels;
   if ( ( ctx->index += tab1[val]-(ctx->index>>5) ) < 0 ) ctx->index = 0;
 }
 /* \\\ */
 
 /* /// "Exp1to3()" */
 static void Exp1to3(MACEContext *ctx,
   if ( ( ctx->index += tab1[val]-(ctx->index>>5) ) < 0 ) ctx->index = 0;
 }
 /* \\\ */
 
 /* /// "Exp1to3()" */
 static void Exp1to3(MACEContext *ctx,
-             UINT8 *inBuffer,
+             uint8_t *inBuffer,
              void *outBuffer,
              void *outBuffer,
-             UINT32 cnt,
-             UINT32 numChannels,
-             UINT32 whichChannel)
+             uint32_t cnt,
+             uint32_t numChannels,
+             uint32_t whichChannel)
 {
 {
-   UINT8 pkt;
+   uint8_t pkt;
 
 /*
    if (inState) {
 
 /*
    if (inState) {
@@ -275,13 +283,13 @@ static void Exp1to3(MACEContext *ctx,
 
    while (cnt>0) {
      pkt=inBuffer[0];
 
    while (cnt>0) {
      pkt=inBuffer[0];
-     chomp3(ctx, pkt       & 7, MACEtab1, MACEtab2);
-     chomp3(ctx,(pkt >> 3) & 3, MACEtab3, MACEtab4);
-     chomp3(ctx, pkt >> 5     , MACEtab1, MACEtab2);
+     chomp3(ctx, pkt       & 7, MACEtab1, MACEtab2, numChannels);
+     chomp3(ctx,(pkt >> 3) & 3, MACEtab3, MACEtab4, numChannels);
+     chomp3(ctx, pkt >> 5     , MACEtab1, MACEtab2, numChannels);
      pkt=inBuffer[1];
      pkt=inBuffer[1];
-     chomp3(ctx, pkt       & 7, MACEtab1, MACEtab2);
-     chomp3(ctx,(pkt >> 3) & 3, MACEtab3, MACEtab4);
-     chomp3(ctx, pkt >> 5     , MACEtab1, MACEtab2);
+     chomp3(ctx, pkt       & 7, MACEtab1, MACEtab2, numChannels);
+     chomp3(ctx,(pkt >> 3) & 3, MACEtab3, MACEtab4, numChannels);
+     chomp3(ctx, pkt >> 5     , MACEtab1, MACEtab2, numChannels);
 
      inBuffer+=numChannels*2;
      --cnt;
 
      inBuffer+=numChannels*2;
      --cnt;
@@ -298,9 +306,10 @@ static void Exp1to3(MACEContext *ctx,
 
 /* /// "chomp6()" */
 static void chomp6(MACEContext *ctx,
 
 /* /// "chomp6()" */
 static void chomp6(MACEContext *ctx,
-            UINT8 val,
-            const UINT16 tab1[],
-            const UINT16 tab2[][8])
+            uint8_t val,
+            const uint16_t tab1[],
+            const uint16_t tab2[][8],
+            uint32_t numChannels)
 {
   short current;
 
 {
   short current;
 
@@ -323,9 +332,10 @@ static void chomp6(MACEContext *ctx,
 
 //  *ctx->outPtr++=(ctx->previous+ctx->prev2-((ctx->prev2-current) >> 2)) >> 8;
 //  *ctx->outPtr++=(ctx->previous+current+((ctx->prev2-current) >> 2)) >> 8;
 
 //  *ctx->outPtr++=(ctx->previous+ctx->prev2-((ctx->prev2-current) >> 2)) >> 8;
 //  *ctx->outPtr++=(ctx->previous+current+((ctx->prev2-current) >> 2)) >> 8;
-  *ctx->outPtr++=(ctx->previous+ctx->prev2-((ctx->prev2-current) >> 2));
-  *ctx->outPtr++=(ctx->previous+current+((ctx->prev2-current) >> 2));
-
+  *ctx->outPtr=(ctx->previous+ctx->prev2-((ctx->prev2-current) >> 2));
+  ctx->outPtr+=numChannels;
+  *ctx->outPtr=(ctx->previous+current+((ctx->prev2-current) >> 2));
+  ctx->outPtr+=numChannels;
   ctx->prev2=ctx->previous;
   ctx->previous=current;
 
   ctx->prev2=ctx->previous;
   ctx->previous=current;
 
@@ -335,13 +345,13 @@ static void chomp6(MACEContext *ctx,
 
 /* /// "Exp1to6()" */
 static void Exp1to6(MACEContext *ctx,
 
 /* /// "Exp1to6()" */
 static void Exp1to6(MACEContext *ctx,
-             UINT8 *inBuffer,
+             uint8_t *inBuffer,
              void *outBuffer,
              void *outBuffer,
-             UINT32 cnt,
-             UINT32 numChannels,
-             UINT32 whichChannel)
+             uint32_t cnt,
+             uint32_t numChannels,
+             uint32_t whichChannel)
 {
 {
-   UINT8 pkt;
+   uint8_t pkt;
 
 /*
    if (inState) {
 
 /*
    if (inState) {
@@ -360,9 +370,9 @@ static void Exp1to6(MACEContext *ctx,
    while (cnt>0) {
      pkt=*inBuffer;
 
    while (cnt>0) {
      pkt=*inBuffer;
 
-     chomp6(ctx, pkt >> 5     , MACEtab1, MACEtab2);
-     chomp6(ctx,(pkt >> 3) & 3, MACEtab3, MACEtab4);
-     chomp6(ctx, pkt       & 7, MACEtab1, MACEtab2);
+     chomp6(ctx, pkt >> 5     , MACEtab1, MACEtab2, numChannels);
+     chomp6(ctx,(pkt >> 3) & 3, MACEtab3, MACEtab4, numChannels);
+     chomp6(ctx, pkt       & 7, MACEtab1, MACEtab2, numChannels);
 
      inBuffer+=numChannels;
      --cnt;
 
      inBuffer+=numChannels;
      --cnt;
@@ -382,7 +392,6 @@ static void Exp1to6(MACEContext *ctx,
 
 static int mace_decode_init(AVCodecContext * avctx)
 {
 
 static int mace_decode_init(AVCodecContext * avctx)
 {
-    MACEContext *c = avctx->priv_data;
     if (avctx->channels > 2)
         return -1;
     return 0;
     if (avctx->channels > 2)
         return -1;
     return 0;
@@ -390,7 +399,7 @@ static int mace_decode_init(AVCodecContext * avctx)
 
 static int mace_decode_frame(AVCodecContext *avctx,
                             void *data, int *data_size,
 
 static int mace_decode_frame(AVCodecContext *avctx,
                             void *data, int *data_size,
-                            UINT8 *buf, int buf_size)
+                            uint8_t *buf, int buf_size)
 {
     short *samples;
     MACEContext *c = avctx->priv_data;
 {
     short *samples;
     MACEContext *c = avctx->priv_data;
@@ -398,21 +407,24 @@ static int mace_decode_frame(AVCodecContext *avctx,
     samples = (short *)data;
     switch (avctx->codec->id) {
     case CODEC_ID_MACE3:
     samples = (short *)data;
     switch (avctx->codec->id) {
     case CODEC_ID_MACE3:
+#ifdef DEBUG
 puts("mace_decode_frame[3]()");
 puts("mace_decode_frame[3]()");
-        Exp1to3(c, buf, samples, buf_size / 2, avctx->channels, 1);
+#endif
+        Exp1to3(c, buf, samples, buf_size / 2 / avctx->channels, avctx->channels, 1);
         if (avctx->channels == 2)
         if (avctx->channels == 2)
-            Exp1to3(c, buf, samples+1, buf_size / 2, 2, 2);
+            Exp1to3(c, buf, samples+1, buf_size / 2 / 2, 2, 2);
         *data_size = 2 * 3 * buf_size;
         break;
     case CODEC_ID_MACE6:
         *data_size = 2 * 3 * buf_size;
         break;
     case CODEC_ID_MACE6:
+#ifdef DEBUG
 puts("mace_decode_frame[6]()");
 puts("mace_decode_frame[6]()");
-        Exp1to6(c, buf, samples, buf_size, avctx->channels, 1);
+#endif
+        Exp1to6(c, buf, samples, buf_size / avctx->channels, avctx->channels, 1);
         if (avctx->channels == 2)
         if (avctx->channels == 2)
-            Exp1to6(c, buf, samples+1, buf_size, 2, 2);
+            Exp1to6(c, buf, samples+1, buf_size / 2, 2, 2);
         *data_size = 2 * 6 * buf_size;
         break;
     default:
         *data_size = 2 * 6 * buf_size;
         break;
     default:
-        *data_size = 0;
         return -1;
     }
     return buf_size;
         return -1;
     }
     return buf_size;