📄 mace.c
字号:
{ 0x2826, 0x7FFF, 0x8000, 0xD7D9, 0, 0, 0, 0 }, { 0x29F1, 0x7FFF, 0x8000, 0xD60E, 0, 0, 0, 0 }, { 0x2BD0, 0x7FFF, 0x8000, 0xD42F, 0, 0, 0, 0 }, { 0x2DC5, 0x7FFF, 0x8000, 0xD23A, 0, 0, 0, 0 }, { 0x2FD0, 0x7FFF, 0x8000, 0xD02F, 0, 0, 0, 0 }, { 0x31F2, 0x7FFF, 0x8000, 0xCE0D, 0, 0, 0, 0 }, { 0x342C, 0x7FFF, 0x8000, 0xCBD3, 0, 0, 0, 0 }, { 0x3681, 0x7FFF, 0x8000, 0xC97E, 0, 0, 0, 0 }, { 0x38F0, 0x7FFF, 0x8000, 0xC70F, 0, 0, 0, 0 }, { 0x3B7A, 0x7FFF, 0x8000, 0xC485, 0, 0, 0, 0 }, { 0x3E22, 0x7FFF, 0x8000, 0xC1DD, 0, 0, 0, 0 }, { 0x40E7, 0x7FFF, 0x8000, 0xBF18, 0, 0, 0, 0 },};/* end of constants */typedef struct MACEContext { short index, lev, factor, prev2, previous, level; short *outPtr;} MACEContext;/* /// "chomp3()" */static void chomp3(MACEContext *ctx, uint8_t val, const uint16_t tab1[], const uint16_t tab2[][8]){ short current; current=(short)tab2[(ctx->index & 0x7f0) >> 4][val]; if (current+ctx->lev > 32767) current=32767; else if (current+ctx->lev < -32768) current=-32767; else current+=ctx->lev; ctx->lev=current-(current >> 3);// *ctx->outPtr++=current >> 8; *ctx->outPtr++=current; if ( ( ctx->index += tab1[val]-(ctx->index>>5) ) < 0 ) ctx->index = 0;}/* \\\ *//* /// "Exp1to3()" */static void Exp1to3(MACEContext *ctx, uint8_t *inBuffer, void *outBuffer, uint32_t cnt, uint32_t numChannels, uint32_t whichChannel){ uint8_t pkt;/* if (inState) { ctx->index=inState[0]; ctx->lev=inState[1]; } else*/ ctx->index=ctx->lev=0; inBuffer+=(whichChannel-1)*2; ctx->outPtr=outBuffer; 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); pkt=inBuffer[1]; chomp3(ctx, pkt & 7, MACEtab1, MACEtab2); chomp3(ctx,(pkt >> 3) & 3, MACEtab3, MACEtab4); chomp3(ctx, pkt >> 5 , MACEtab1, MACEtab2); inBuffer+=numChannels*2; --cnt; }/* if (outState) { outState[0]=ctx->index; outState[1]=ctx->lev; }*/}/* \\\ *//* /// "chomp6()" */static void chomp6(MACEContext *ctx, uint8_t val, const uint16_t tab1[], const uint16_t tab2[][8]){ short current; current=(short)tab2[(ctx->index & 0x7f0) >> 4][val]; if ((ctx->previous^current)>=0) { if (ctx->factor+506>32767) ctx->factor=32767; else ctx->factor+=506; } else { if (ctx->factor-314<-32768) ctx->factor=-32767; else ctx->factor-=314; } if (current+ctx->level>32767) current=32767; else if (current+ctx->level<-32768) current=-32767; else current+=ctx->level; ctx->level=((current*ctx->factor) >> 15); current>>=1;// *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->prev2=ctx->previous; ctx->previous=current; if( ( ctx->index += tab1[val]-(ctx->index>>5) ) < 0 ) ctx->index = 0;}/* \\\ *//* /// "Exp1to6()" */static void Exp1to6(MACEContext *ctx, uint8_t *inBuffer, void *outBuffer, uint32_t cnt, uint32_t numChannels, uint32_t whichChannel){ uint8_t pkt;/* if (inState) { ctx->previous=inState[0]; ctx->prev2=inState[1]; ctx->index=inState[2]; ctx->level=inState[3]; ctx->factor=inState[4]; } else*/ ctx->previous=ctx->prev2=ctx->index=ctx->level=ctx->factor=0; inBuffer+=(whichChannel-1); ctx->outPtr=outBuffer; while (cnt>0) { pkt=*inBuffer; chomp6(ctx, pkt >> 5 , MACEtab1, MACEtab2); chomp6(ctx,(pkt >> 3) & 3, MACEtab3, MACEtab4); chomp6(ctx, pkt & 7, MACEtab1, MACEtab2); inBuffer+=numChannels; --cnt; }/* if (outState) { outState[0]=ctx->previous; outState[1]=ctx->prev2; outState[2]=ctx->index; outState[3]=ctx->level; outState[4]=ctx->factor; }*/}/* \\\ */static int mace_decode_init(AVCodecContext * avctx){ if (avctx->channels > 2) return -1; return 0;}static int mace_decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size){ short *samples; MACEContext *c = avctx->priv_data; samples = (short *)data; switch (avctx->codec->id) { case CODEC_ID_MACE3:#ifdef DEBUGputs("mace_decode_frame[3]()");#endif Exp1to3(c, buf, samples, buf_size / 2, avctx->channels, 1); if (avctx->channels == 2) Exp1to3(c, buf, samples+1, buf_size / 2, 2, 2); *data_size = 2 * 3 * buf_size; break; case CODEC_ID_MACE6:#ifdef DEBUGputs("mace_decode_frame[6]()");#endif Exp1to6(c, buf, samples, buf_size, avctx->channels, 1); if (avctx->channels == 2) Exp1to6(c, buf, samples+1, buf_size, 2, 2); *data_size = 2 * 6 * buf_size; break; default: *data_size = 0; return -1; } return buf_size;}AVCodec mace3_decoder = { "mace3", CODEC_TYPE_AUDIO, CODEC_ID_MACE3, sizeof(MACEContext), mace_decode_init, NULL, NULL, mace_decode_frame,};AVCodec mace6_decoder = { "mace6", CODEC_TYPE_AUDIO, CODEC_ID_MACE6, sizeof(MACEContext), mace_decode_init, NULL, NULL, mace_decode_frame,};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -