⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jcarith.c

📁 It is possible that certain products which can be built using this software modules might form inve
💻 C
📖 第 1 页 / 共 2 页
字号:
      emit_restart(cinfo, entropy->next_restart_num);      entropy->restarts_to_go = cinfo->restart_interval;      entropy->next_restart_num++;      entropy->next_restart_num &= 7;    }    entropy->restarts_to_go--;  }  /* Encode the MCU data block */  block = MCU_data[0];  tbl = cinfo->cur_comp_info[0]->ac_tbl_no;  /* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */  /* Establish EOB (end-of-block) index */  for (ke = cinfo->Se + 1; ke > 1; ke--)    /* We must apply the point transform by Al.  For AC coefficients this     * is an integer division with rounding towards 0.  To do this portably     * in C, we shift after obtaining the absolute value.     */    if ((v = (*block)[jpeg_natural_order[ke - 1]]) >= 0) {      if (v >>= cinfo->Al) break;    } else {      v = -v;      if (v >>= cinfo->Al) break;    }  /* Figure F.5: Encode_AC_Coefficients */  for (k = cinfo->Ss; k < ke; k++) {    st = entropy->ac_stats[tbl] + 3 * (k - 1);    arith_encode(cinfo, st, 0);		/* EOB decision */    entropy->ac_stats[tbl][245] = 0;    for (;;) {      if ((v = (*block)[jpeg_natural_order[k]]) >= 0) {	if (v >>= cinfo->Al) {	  arith_encode(cinfo, st + 1, 1);	  arith_encode(cinfo, entropy->ac_stats[tbl] + 245, 0);	  break;	}      } else {	v = -v;	if (v >>= cinfo->Al) {	  arith_encode(cinfo, st + 1, 1);	  arith_encode(cinfo, entropy->ac_stats[tbl] + 245, 1);	  break;	}      }      arith_encode(cinfo, st + 1, 0); st += 3; k++;    }    st += 2;    /* Figure F.8: Encoding the magnitude category of v */    m = 0;    if (v -= 1) {      arith_encode(cinfo, st, 1);      m = 1;      v2 = v;      if (v2 >>= 1) {	arith_encode(cinfo, st, 1);	m <<= 1;	st = entropy->ac_stats[tbl] +	     (k <= cinfo->arith_ac_K[tbl] ? 189 : 217);	while (v2 >>= 1) {	  arith_encode(cinfo, st, 1);	  m <<= 1;	  st += 1;	}      }    }    arith_encode(cinfo, st, 0);    /* Figure F.9: Encoding the magnitude bit pattern of v */    st += 14;    while (m >>= 1)      arith_encode(cinfo, st, (m & v) ? 1 : 0);  }  /* Encode EOB decision only if k <= cinfo->Se */  if (k <= cinfo->Se) {    st = entropy->ac_stats[tbl] + 3 * (k - 1);    arith_encode(cinfo, st, 1);  }  return TRUE;}/* * MCU encoding for DC successive approximation refinement scan. */METHODDEF(boolean)encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data){  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;  unsigned char st[4];  int Al, blkn;  /* Emit restart marker if needed */  if (cinfo->restart_interval) {    if (entropy->restarts_to_go == 0) {      emit_restart(cinfo, entropy->next_restart_num);      entropy->restarts_to_go = cinfo->restart_interval;      entropy->next_restart_num++;      entropy->next_restart_num &= 7;    }    entropy->restarts_to_go--;  }  Al = cinfo->Al;  /* Encode the MCU data blocks */  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {    st[0] = 0;	/* use fixed probability estimation */    /* We simply emit the Al'th bit of the DC coefficient value. */    arith_encode(cinfo, st, (MCU_data[blkn][0][0] >> Al) & 1);  }  return TRUE;}/* * MCU encoding for AC successive approximation refinement scan. */METHODDEF(boolean)encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data){  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;  JBLOCKROW block;  unsigned char *st;  int tbl, k, ke, kex;  int v;  /* Emit restart marker if needed */  if (cinfo->restart_interval) {    if (entropy->restarts_to_go == 0) {      emit_restart(cinfo, entropy->next_restart_num);      entropy->restarts_to_go = cinfo->restart_interval;      entropy->next_restart_num++;      entropy->next_restart_num &= 7;    }    entropy->restarts_to_go--;  }  /* Encode the MCU data block */  block = MCU_data[0];  tbl = cinfo->cur_comp_info[0]->ac_tbl_no;  /* Section G.1.3.3: Encoding of AC coefficients */  /* Establish EOB (end-of-block) index */  for (ke = cinfo->Se + 1; ke > 1; ke--)    /* We must apply the point transform by Al.  For AC coefficients this     * is an integer division with rounding towards 0.  To do this portably     * in C, we shift after obtaining the absolute value.     */    if ((v = (*block)[jpeg_natural_order[ke - 1]]) >= 0) {      if (v >>= cinfo->Al) break;    } else {      v = -v;      if (v >>= cinfo->Al) break;    }  /* Establish EOBx (previous stage end-of-block) index */  for (kex = ke; kex > 1; kex--)    if ((v = (*block)[jpeg_natural_order[kex - 1]]) >= 0) {      if (v >>= cinfo->Ah) break;    } else {      v = -v;      if (v >>= cinfo->Ah) break;    }  /* Figure G.10: Encode_AC_Coefficients_SA */  for (k = cinfo->Ss; k < ke; k++) {    st = entropy->ac_stats[tbl] + 3 * (k - 1);    if (k >= kex)      arith_encode(cinfo, st, 0);	/* EOB decision */    entropy->ac_stats[tbl][245] = 0;    for (;;) {      if ((v = (*block)[jpeg_natural_order[k]]) >= 0) {	if (v >>= cinfo->Al) {	  if (v >> 1)		/* previously nonzero coef */	    arith_encode(cinfo, st + 2, (v & 1));	  else {		/* newly nonzero coef */	    arith_encode(cinfo, st + 1, 1);	    arith_encode(cinfo, entropy->ac_stats[tbl] + 245, 0);	  }	  break;	}      } else {	v = -v;	if (v >>= cinfo->Al) {	  if (v >> 1)		/* previously nonzero coef */	    arith_encode(cinfo, st + 2, (v & 1));	  else {		/* newly nonzero coef */	    arith_encode(cinfo, st + 1, 1);	    arith_encode(cinfo, entropy->ac_stats[tbl] + 245, 1);	  }	  break;	}      }      arith_encode(cinfo, st + 1, 0); st += 3; k++;    }  }  /* Encode EOB decision only if k <= cinfo->Se */  if (k <= cinfo->Se) {    st = entropy->ac_stats[tbl] + 3 * (k - 1);    arith_encode(cinfo, st, 1);  }  return TRUE;}/* * Encode and output one MCU's worth of arithmetic-compressed coefficients. */METHODDEF(boolean)encode_mcu (j_compress_ptr cinfo, JBLOCKROW *MCU_data){  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;  jpeg_component_info * compptr;  JBLOCKROW block;  unsigned char *st;  int blkn, ci, tbl, k, ke;  int v, v2, m;  /* Emit restart marker if needed */  if (cinfo->restart_interval) {    if (entropy->restarts_to_go == 0) {      emit_restart(cinfo, entropy->next_restart_num);      entropy->restarts_to_go = cinfo->restart_interval;      entropy->next_restart_num++;      entropy->next_restart_num &= 7;    }    entropy->restarts_to_go--;  }  /* Encode the MCU data blocks */  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {    block = MCU_data[blkn];    ci = cinfo->MCU_membership[blkn];    compptr = cinfo->cur_comp_info[ci];    /* Sections F.1.4.1 & F.1.4.4.1: Encoding of DC coefficients */    tbl = compptr->dc_tbl_no;    /* Table F.4: Point to statistics bin S0 for DC coefficient coding */    st = entropy->dc_stats[tbl] + entropy->dc_context[ci];    /* Figure F.4: Encode_DC_DIFF */    if ((v = (*block)[0] - entropy->last_dc_val[ci]) == 0) {      arith_encode(cinfo, st, 0);      entropy->dc_context[ci] = 0;	/* zero diff category */    } else {      entropy->last_dc_val[ci] = (*block)[0];      arith_encode(cinfo, st, 1);      /* Figure F.6: Encoding nonzero value v */      /* Figure F.7: Encoding the sign of v */      if (v > 0) {	arith_encode(cinfo, st + 1, 0);	/* Table F.4: SS = S0 + 1 */	st += 2;			/* Table F.4: SP = S0 + 2 */	entropy->dc_context[ci] = 4;	/* small positive diff category */      } else {	v = -v;	arith_encode(cinfo, st + 1, 1);	/* Table F.4: SS = S0 + 1 */	st += 3;			/* Table F.4: SN = S0 + 3 */	entropy->dc_context[ci] = 8;	/* small negative diff category */      }      /* Figure F.8: Encoding the magnitude category of v */      m = 0;      if (v -= 1) {	arith_encode(cinfo, st, 1);	m = 1;	v2 = v;	st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */	while (v2 >>= 1) {	  arith_encode(cinfo, st, 1);	  m <<= 1;	  st += 1;	}      }      arith_encode(cinfo, st, 0);      /* Section F.1.4.4.1.2: Establish dc_context conditioning category */      if (m < (int) (((INT32) 1 << cinfo->arith_dc_L[tbl]) >> 1))	entropy->dc_context[ci] = 0;	/* zero diff category */      else if (m > (int) (((INT32) 1 << cinfo->arith_dc_U[tbl]) >> 1))	entropy->dc_context[ci] += 8;	/* large diff category */      /* Figure F.9: Encoding the magnitude bit pattern of v */      st += 14;      while (m >>= 1)	arith_encode(cinfo, st, (m & v) ? 1 : 0);    }    /* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */    tbl = compptr->ac_tbl_no;    /* Establish EOB (end-of-block) index */    for (ke = DCTSIZE2; ke > 1; ke--)      if ((*block)[jpeg_natural_order[ke - 1]]) break;    /* Figure F.5: Encode_AC_Coefficients */    for (k = 1; k < ke; k++) {      st = entropy->ac_stats[tbl] + 3 * (k - 1);      arith_encode(cinfo, st, 0);	/* EOB decision */      while ((v = (*block)[jpeg_natural_order[k]]) == 0) {	arith_encode(cinfo, st + 1, 0); st += 3; k++;      }      arith_encode(cinfo, st + 1, 1);      /* Figure F.6: Encoding nonzero value v */      /* Figure F.7: Encoding the sign of v */      entropy->ac_stats[tbl][245] = 0;      if (v > 0) {	arith_encode(cinfo, entropy->ac_stats[tbl] + 245, 0);      } else {	v = -v;	arith_encode(cinfo, entropy->ac_stats[tbl] + 245, 1);      }      st += 2;      /* Figure F.8: Encoding the magnitude category of v */      m = 0;      if (v -= 1) {	arith_encode(cinfo, st, 1);	m = 1;	v2 = v;	if (v2 >>= 1) {	  arith_encode(cinfo, st, 1);	  m <<= 1;	  st = entropy->ac_stats[tbl] +	       (k <= cinfo->arith_ac_K[tbl] ? 189 : 217);	  while (v2 >>= 1) {	    arith_encode(cinfo, st, 1);	    m <<= 1;	    st += 1;	  }	}      }      arith_encode(cinfo, st, 0);      /* Figure F.9: Encoding the magnitude bit pattern of v */      st += 14;      while (m >>= 1)	arith_encode(cinfo, st, (m & v) ? 1 : 0);    }    /* Encode EOB decision only if k < DCTSIZE2 */    if (k < DCTSIZE2) {      st = entropy->ac_stats[tbl] + 3 * (k - 1);      arith_encode(cinfo, st, 1);    }  }  return TRUE;}/* * Initialize for an arithmetic-compressed scan. */METHODDEF(void)start_pass (j_compress_ptr cinfo, boolean gather_statistics){  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;  int ci, tbl;  jpeg_component_info * compptr;  if (gather_statistics)    /* Make sure to avoid that in the master control logic!     * We are fully adaptive here and need no extra     * statistics gathering pass!     */    ERREXIT(cinfo, JERR_NOT_COMPILED);  /* We assume jcmaster.c already validated the progressive scan parameters. */  /* Select execution routines */  if (cinfo->progressive_mode) {    if (cinfo->Ah == 0) {      if (cinfo->Ss == 0)	entropy->pub.encode_mcu = encode_mcu_DC_first;      else	entropy->pub.encode_mcu = encode_mcu_AC_first;    } else {      if (cinfo->Ss == 0)	entropy->pub.encode_mcu = encode_mcu_DC_refine;      else	entropy->pub.encode_mcu = encode_mcu_AC_refine;    }  } else    entropy->pub.encode_mcu = encode_mcu;  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {    compptr = cinfo->cur_comp_info[ci];    /* Allocate & initialize requested statistics areas */    if (cinfo->progressive_mode == 0 || (cinfo->Ss == 0 && cinfo->Ah == 0)) {      tbl = compptr->dc_tbl_no;      if (tbl < 0 || tbl >= NUM_ARITH_TBLS)	ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);      if (entropy->dc_stats[tbl] == NULL)	entropy->dc_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small)	  ((j_common_ptr) cinfo, JPOOL_IMAGE, DC_STAT_BINS);      MEMZERO(entropy->dc_stats[tbl], DC_STAT_BINS);      /* Initialize DC predictions to 0 */      entropy->last_dc_val[ci] = 0;      entropy->dc_context[ci] = 0;    }    if (cinfo->progressive_mode == 0 || cinfo->Ss) {      tbl = compptr->ac_tbl_no;      if (tbl < 0 || tbl >= NUM_ARITH_TBLS)	ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);      if (entropy->ac_stats[tbl] == NULL)	entropy->ac_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small)	  ((j_common_ptr) cinfo, JPOOL_IMAGE, AC_STAT_BINS);      MEMZERO(entropy->ac_stats[tbl], AC_STAT_BINS);#ifdef CALCULATE_SPECTRAL_CONDITIONING      if (cinfo->progressive_mode)	/* Section G.1.3.2: Set appropriate arithmetic conditioning value Kx */	cinfo->arith_ac_K[tbl] = cinfo->Ss + ((8 + cinfo->Se - cinfo->Ss) >> 4);#endif    }  }  /* Initialize arithmetic encoding variables */  entropy->c = 0;  entropy->a = 0x10000L;  entropy->sc = 0;  entropy->zc = 0;  entropy->ct = 11;  entropy->buffer = -1;  /* empty */  /* Initialize restart stuff */  entropy->restarts_to_go = cinfo->restart_interval;  entropy->next_restart_num = 0;}/* * Module initialization routine for arithmetic entropy encoding. */GLOBAL(void)jinit_arith_encoder (j_compress_ptr cinfo){  arith_entropy_ptr entropy;  int i;  entropy = (arith_entropy_ptr)    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,				SIZEOF(arith_entropy_encoder));  cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;  entropy->pub.start_pass = start_pass;  entropy->pub.finish_pass = finish_pass;  /* Mark tables unallocated */  for (i = 0; i < NUM_ARITH_TBLS; i++) {    entropy->dc_stats[i] = NULL;    entropy->ac_stats[i] = NULL;  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -