void iteration_init( lame_global_flags *gfp) { lame_internal_flags *gfc=gfp->internal_flags; III_side_info_t * const l3_side = &gfc->l3_side; int i; if ( gfc->iteration_init_init==0 ) { gfc->iteration_init_init=1; l3_side->main_data_begin = 0; compute_ath(gfp,gfc->ATH->l,gfc->ATH->s); pow43[0] = 0.0; for(i=1;i<PRECALC_SIZE;i++) pow43[i] = pow((FLOAT8)i, 4.0/3.0); adj43asm[0] = 0.0; for (i = 1; i < PRECALC_SIZE; i++) adj43asm[i] = i - 0.5 - pow(0.5 * (pow43[i - 1] + pow43[i]),0.75); for (i = 0; i < PRECALC_SIZE-1; i++) adj43[i] = (i + 1) - pow(0.5 * (pow43[i] + pow43[i + 1]), 0.75); adj43[i] = 0.5; iipow20_ = &iipow20[210]; for (i = 0; i < Q_MAX; i++) { iipow20[i] = pow(2.0, (double)(i - 210) * 0.1875); ipow20[i] = pow(2.0, (double)(i - 210) * -0.1875); pow20[i] = pow(2.0, (double)(i - 210) * 0.25); } huffman_init(gfc); } }
int main(int argc, char **argv) { assert(argc >= 4); char *src_name = argv[2]; char *dest_name = argv[3]; struct huffman *phf = (struct huffman *)malloc(sizeof(*phf)); assert(phf != NULL); huffman_init(phf); if (strcmp(argv[1], "-c") == 0) { phf->compress(phf, src_name, dest_name); } else if (strcmp(argv[1], "-d") == 0) { phf->decompress(phf, src_name, dest_name); } else { fprintf(stderr, "Usage: %s -c|-d [src_name|dest_name]\n", argv[0]); } huffman_destroy(phf); free(phf); return 0; }
void test_huffman2(void) { struct hcnode *root, *n; unsigned int freqs[256]; int chars[256]; int count = 256, i; struct hcnode **nodes; for(i=0; i<count; i++) { freqs[i] = i; chars[i] = i; } nodes = huffman_init(freqs, chars, 256); root = huffman(nodes, 256); huffman_make_codes(root); for (i=0; i<count; i++) { n = nodes[i]; printf("code for character %d: 0x%x\n", n->character, bits_to_integer(n->code, n->code_len)); } }
void test_huffman(void) { struct hcnode *root, *n; /* This example is from CLRS */ u32 freqs[] = {5, 9, 12, 13, 16, 45}; int chars[] = {'f','e','c','b','d','a'}; u32 expect_codes[] = {0xc, 0xd, 0x4, 0x5, 0x7, 0x0}; int count = 6, i; struct hcnode **nodes; nodes = huffman_init(freqs, chars, 6); root = huffman(nodes, 6); huffman_make_codes(root); for (i=0; i<count; i++) { n = nodes[i]; /* printf("code for character %c (freq %d): %x (len %d) (expecting %x)\n", n->character, n->frequency, bits_to_integer(n->code, n->code_len), n->code_len, expect_codes[i]); */ assert(bits_to_integer(n->code, n->code_len) == expect_codes[i]); } }
int init(const char *options) { const char *p; int rc = 0; huffman_init(); /* parse command line options */ for (p = options; *p; p++) { switch (*p) { case 'c': prog_opts |= COMPRESS; break; case 'l': prog_opts |= LZ78; break; case 'x': prog_opts |= DECOMPRESS; break; default: fprintf(stderr, "error: invalid option: %c\n", *p); rc = 1; } } if (!rc && !(prog_opts & (COMPRESS | DECOMPRESS))) { fprintf(stderr, "error: at least c or x must be specified.\n"); rc = 1; } if (!rc && (prog_opts & COMPRESS) && (prog_opts & DECOMPRESS)) { fprintf(stderr, "error: conflicting options.\n"); rc = 1; } return rc; }
void iteration_init(lame_internal_flags * gfc) { SessionConfig_t const *const cfg = &gfc->cfg; III_side_info_t *const l3_side = &gfc->l3_side; FLOAT adjust, db; int i, sel; if (gfc->iteration_init_init == 0) { gfc->iteration_init_init = 1; l3_side->main_data_begin = 0; compute_ath(gfc); pow43[0] = 0.0; for (i = 1; i < PRECALC_SIZE; i++) pow43[i] = pow((FLOAT) i, 4.0 / 3.0); #ifdef TAKEHIRO_IEEE754_HACK adj43asm[0] = 0.0; for (i = 1; i < PRECALC_SIZE; i++) adj43asm[i] = i - 0.5 - pow(0.5 * (pow43[i - 1] + pow43[i]), 0.75); #else for (i = 0; i < PRECALC_SIZE - 1; i++) adj43[i] = (i + 1) - pow(0.5 * (pow43[i] + pow43[i + 1]), 0.75); adj43[i] = 0.5; #endif for (i = 0; i < Q_MAX; i++) ipow20[i] = pow(2.0, (double) (i - 210) * -0.1875); for (i = 0; i <= Q_MAX + Q_MAX2; i++) pow20[i] = pow(2.0, (double) (i - 210 - Q_MAX2) * 0.25); huffman_init(gfc); init_xrpow_core_init(gfc); sel = 1;/* RH: all modes like vbr-new (cfg->vbr == vbr_mt || cfg->vbr == vbr_mtrh) ? 1 : 0;*/ /* long */ db = cfg->adjust_bass_db + payload_long[sel][0]; adjust = powf(10.f, db * 0.1f); for (i = 0; i <= 6; ++i) { gfc->sv_qnt.longfact[i] = adjust; } db = cfg->adjust_alto_db + payload_long[sel][1]; adjust = powf(10.f, db * 0.1f); for (; i <= 13; ++i) { gfc->sv_qnt.longfact[i] = adjust; } db = cfg->adjust_treble_db + payload_long[sel][2]; adjust = powf(10.f, db * 0.1f); for (; i <= 20; ++i) { gfc->sv_qnt.longfact[i] = adjust; } db = cfg->adjust_sfb21_db + payload_long[sel][3]; adjust = powf(10.f, db * 0.1f); for (; i < SBMAX_l; ++i) { gfc->sv_qnt.longfact[i] = adjust; } /* short */ db = cfg->adjust_bass_db + payload_short[sel][0]; adjust = powf(10.f, db * 0.1f); for (i = 0; i <= 2; ++i) { gfc->sv_qnt.shortfact[i] = adjust; } db = cfg->adjust_alto_db + payload_short[sel][1]; adjust = powf(10.f, db * 0.1f); for (; i <= 6; ++i) { gfc->sv_qnt.shortfact[i] = adjust; } db = cfg->adjust_treble_db + payload_short[sel][2]; adjust = powf(10.f, db * 0.1f); for (; i <= 11; ++i) { gfc->sv_qnt.shortfact[i] = adjust; } db = cfg->adjust_sfb21_db + payload_short[sel][3]; adjust = powf(10.f, db * 0.1f); for (; i < SBMAX_s; ++i) { gfc->sv_qnt.shortfact[i] = adjust; } } }
/*jpeg decode * args: * pic: pointer to picture data ( decoded image - yuyv format) * buf: pointer to input data ( compressed jpeg ) * with: picture width * height: picture height */ int jpeg_decode(uint8_t *pic, int stride, uint8_t *buf, int width, int height) { struct ctx ctx; struct jpeg_decdata *decdata; int i=0, j=0, m=0, tac=0, tdc=0; int intwidth=0, intheight=0; int mcusx=0, mcusy=0, mx=0, my=0; int ypitch=0 ,xpitch=0,x=0,y=0; int mb=0; int max[6]; ftopict convert; int err = 0; int isInitHuffman = 0; decdata = (struct jpeg_decdata*) calloc(1, sizeof(struct jpeg_decdata)); for(i=0;i<6;i++) max[i]=0; if (!decdata) { err = -1; goto error; } if (buf == NULL) { err = -1; goto error; } ctx.datap = buf; /*check SOI (0xFFD8)*/ if (getbyte(&ctx) != 0xff) { err = ERR_NO_SOI; goto error; } if (getbyte(&ctx) != M_SOI) { err = ERR_NO_SOI; goto error; } /*read tables - if exist, up to start frame marker (0xFFC0)*/ if (readtables(&ctx,M_SOF0, &isInitHuffman)) { err = ERR_BAD_TABLES; goto error; } getword(&ctx); /*header lenght*/ i = getbyte(&ctx); /*precision (8 bit)*/ if (i != 8) { err = ERR_NOT_8BIT; goto error; } intheight = getword(&ctx); /*height*/ intwidth = getword(&ctx); /*width */ if ((intheight & 7) || (intwidth & 7)) /*must be even*/ { err = ERR_BAD_WIDTH_OR_HEIGHT; goto error; } ctx.info.nc = getbyte(&ctx); /*number of components*/ if (ctx.info.nc > MAXCOMP) { err = ERR_TOO_MANY_COMPPS; goto error; } /*for each component*/ for (i = 0; i < ctx.info.nc; i++) { int h, v; ctx.comps[i].cid = getbyte(&ctx); /*component id*/ ctx.comps[i].hv = getbyte(&ctx); v = ctx.comps[i].hv & 15; /*vertical sampling */ h = ctx.comps[i].hv >> 4; /*horizontal sampling */ ctx.comps[i].tq = getbyte(&ctx); /*quantization table used*/ if (h > 3 || v > 3) { err = ERR_ILLEGAL_HV; goto error; } if (ctx.comps[i].tq > 3) { err = ERR_QUANT_TABLE_SELECTOR; goto error; } } /*read tables - if exist, up to start of scan marker (0xFFDA)*/ if (readtables(&ctx,M_SOS,&isInitHuffman)) { err = ERR_BAD_TABLES; goto error; } getword(&ctx); /* header lenght */ ctx.info.ns = getbyte(&ctx); /* number of scans */ if (!ctx.info.ns) { ALOGE("info ns %d/n",ctx.info.ns); err = ERR_NOT_YCBCR_221111; goto error; } /*for each scan*/ for (i = 0; i < ctx.info.ns; i++) { ctx.dscans[i].cid = getbyte(&ctx); /*component id*/ tdc = getbyte(&ctx); tac = tdc & 15; /*ac table*/ tdc >>= 4; /*dc table*/ if (tdc > 1 || tac > 1) { err = ERR_QUANT_TABLE_SELECTOR; goto error; } for (j = 0; j < ctx.info.nc; j++) if (ctx.comps[j].cid == ctx.dscans[i].cid) break; if (j == ctx.info.nc) { err = ERR_UNKNOWN_CID_IN_SCAN; goto error; } ctx.dscans[i].hv = ctx.comps[j].hv; ctx.dscans[i].tq = ctx.comps[j].tq; ctx.dscans[i].hudc.dhuff = dec_huffdc + tdc; ctx.dscans[i].huac.dhuff = dec_huffac + tac; } i = getbyte(&ctx); /*0 */ j = getbyte(&ctx); /*63*/ m = getbyte(&ctx); /*0 */ if (i != 0 || j != 63 || m != 0) { ALOGE("hmm FW error,not seq DCT ??\n"); } /*build huffman tables*/ if(!isInitHuffman) { if(huffman_init(&ctx) < 0) return -ERR_BAD_TABLES; } /* if (ctx->dscans[0].cid != 1 || ctx->dscans[1].cid != 2 || ctx->dscans[2].cid != 3) { err = ERR_NOT_YCBCR_221111; goto error; } if (ctx->dscans[1].hv != 0x11 || ctx->dscans[2].hv != 0x11) { err = ERR_NOT_YCBCR_221111; goto error; } */ /* if internal width and external are not the same or heigth too and pic not allocated realloc the good size and mark the change need 1 macroblock line more ?? */ if (intwidth > width || intheight > height) { return -ERR_BAD_WIDTH_OR_HEIGHT; #if 0 width = intwidth; height = intheight; // BytesperPixel 2 yuyv , 3 rgb24 *pic = (uint8_t*) realloc( *pic, intwidth * (intheight + 8) * 2); #endif } switch (ctx.dscans[0].hv) { case 0x22: // 411 mb=6; mcusx = width >> 4; mcusy = height >> 4; xpitch = 16 * 2; ypitch = 16 * stride; convert = yuv420pto422; //choose the right conversion function break; case 0x21: //422 mb=4; mcusx = width >> 4; mcusy = height >> 3; xpitch = 16 * 2; ypitch = 8 * stride; convert = yuv422pto422; //choose the right conversion function break; case 0x11: //444 mcusx = width >> 3; mcusy = height >> 3; xpitch = 8 * 2; ypitch = 8 * stride; if (ctx.info.ns==1) { mb = 1; convert = yuv400pto422; //choose the right conversion function } else { mb=3; convert = yuv444pto422; //choose the right conversion function } break; default: err = ERR_NOT_YCBCR_221111; goto error; break; } idctqtab(ctx.quant[ctx.dscans[0].tq], decdata->dquant[0]); idctqtab(ctx.quant[ctx.dscans[1].tq], decdata->dquant[1]); idctqtab(ctx.quant[ctx.dscans[2].tq], decdata->dquant[2]); setinput(&ctx.in, ctx.datap); dec_initscans(&ctx); ctx.dscans[0].next = 2; ctx.dscans[1].next = 1; ctx.dscans[2].next = 0; /* 4xx encoding */ for (my = 0,y=0; my < mcusy; my++,y+=ypitch) { for (mx = 0,x=0; mx < mcusx; mx++,x+=xpitch) { if (ctx.info.dri && !--ctx.info.nm) if (dec_checkmarker(&ctx)) { err = ERR_WRONG_MARKER; goto error; } switch (mb) { case 6: decode_mcus(&ctx.in, decdata->dcts, mb, ctx.dscans, max); idct(decdata->dcts, decdata->out, decdata->dquant[0], IFIX(128.5), max[0]); idct(decdata->dcts + 64, decdata->out + 64, decdata->dquant[0], IFIX(128.5), max[1]); idct(decdata->dcts + 128, decdata->out + 128, decdata->dquant[0], IFIX(128.5), max[2]); idct(decdata->dcts + 192, decdata->out + 192, decdata->dquant[0], IFIX(128.5), max[3]); idct(decdata->dcts + 256, decdata->out + 256, decdata->dquant[1], IFIX(0.5), max[4]); idct(decdata->dcts + 320, decdata->out + 320, decdata->dquant[2], IFIX(0.5), max[5]); break; case 4: decode_mcus(&ctx.in, decdata->dcts, mb, ctx.dscans, max); idct(decdata->dcts, decdata->out, decdata->dquant[0], IFIX(128.5), max[0]); idct(decdata->dcts + 64, decdata->out + 64, decdata->dquant[0], IFIX(128.5), max[1]); idct(decdata->dcts + 128, decdata->out + 256, decdata->dquant[1], IFIX(0.5), max[4]); idct(decdata->dcts + 192, decdata->out + 320, decdata->dquant[2], IFIX(0.5), max[5]); break; case 3: decode_mcus(&ctx.in, decdata->dcts, mb, ctx.dscans, max); idct(decdata->dcts, decdata->out, decdata->dquant[0], IFIX(128.5), max[0]); idct(decdata->dcts + 64, decdata->out + 256, decdata->dquant[1], IFIX(0.5), max[4]); idct(decdata->dcts + 128, decdata->out + 320, decdata->dquant[2], IFIX(0.5), max[5]); break; case 1: decode_mcus(&ctx.in, decdata->dcts, mb, ctx.dscans, max); idct(decdata->dcts, decdata->out, decdata->dquant[0], IFIX(128.5), max[0]); break; } // switch enc411 convert(decdata->out,pic+y+x,stride); //convert to 422 } } m = dec_readmarker(&ctx.in); if (m != M_EOI) { err = ERR_NO_EOI; goto error; } free(decdata); return 0; error: free(decdata); return err; }
void iteration_init(lame_internal_flags * gfc) { SessionConfig_t const *const cfg = &gfc->cfg; III_side_info_t *const l3_side = &gfc->l3_side; int i; if (gfc->iteration_init_init == 0) { gfc->iteration_init_init = 1; l3_side->main_data_begin = 0; compute_ath(gfc); pow43[0] = 0.0; for (i = 1; i < PRECALC_SIZE; i++) pow43[i] = pow((FLOAT) i, 4.0 / 3.0); #ifdef TAKEHIRO_IEEE754_HACK adj43asm[0] = 0.0; for (i = 1; i < PRECALC_SIZE; i++) adj43asm[i] = i - 0.5 - pow(0.5 * (pow43[i - 1] + pow43[i]), 0.75); #else for (i = 0; i < PRECALC_SIZE - 1; i++) adj43[i] = (i + 1) - pow(0.5 * (pow43[i] + pow43[i + 1]), 0.75); adj43[i] = 0.5; #endif for (i = 0; i < Q_MAX; i++) ipow20[i] = pow(2.0, (double) (i - 210) * -0.1875); for (i = 0; i <= Q_MAX + Q_MAX2; i++) pow20[i] = pow(2.0, (double) (i - 210 - Q_MAX2) * 0.25); huffman_init(gfc); init_xrpow_core_init(gfc); for (i = 0; i < SBMAX_l; i++) { FLOAT f; if (i <= 6) f = cfg->adjust_bass; else if (i <= 13) f = cfg->adjust_alto; else if (i <= 20) f = cfg->adjust_treble; else f = cfg->adjust_sfb21; gfc->sv_qnt.longfact[i] = f; } for (i = 0; i < SBMAX_s; i++) { FLOAT f; if (i <= 5) f = cfg->adjust_bass; else if (i <= 10) f = cfg->adjust_alto; else if (i <= 11) f = cfg->adjust_treble; else f = cfg->adjust_sfb21; gfc->sv_qnt.shortfact[i] = f; } } }