(comp->coord[1][1] - comp->coord[1][0]);
if (codsty->transform == FF_DWT97) {
+ csize += FF_INPUT_BUFFER_PADDING_SIZE / sizeof(*comp->f_data);
comp->i_data = NULL;
comp->f_data = av_mallocz_array(csize, sizeof(*comp->f_data));
if (!comp->f_data)
return AVERROR(ENOMEM);
} else {
+ csize += FF_INPUT_BUFFER_PADDING_SIZE / sizeof(*comp->i_data);
comp->f_data = NULL;
comp->i_data = av_mallocz_array(csize, sizeof(*comp->i_data));
if (!comp->i_data)
* delta_b = 2 ^ (R_b - expn_b) * (1 + (mant_b / 2 ^ 11))
* R_b = R_I + log2 (gain_b )
* see ISO/IEC 15444-1:2002 E.1.1 eqn. E-3 and E-4 */
- /* TODO/WARN: value of log2 (gain_b ) not taken into account
- * but it works (compared to OpenJPEG). Why?
- * Further investigation needed. */
gain = cbps;
band->f_stepsize = pow(2.0, gain - qntsty->expn[gbandno]);
band->f_stepsize *= qntsty->mant[gbandno] / 2048.0 + 1.0;
av_log(avctx, AV_LOG_ERROR, "Unknown quantization format\n");
break;
}
+ if (codsty->transform != FF_DWT53) {
+ int lband = 0;
+ switch (bandno + (reslevelno > 0)) {
+ case 1:
+ case 2:
+ band->f_stepsize *= F_LFTG_X * 2;
+ lband = 1;
+ break;
+ case 3:
+ band->f_stepsize *= F_LFTG_X * F_LFTG_X * 4;
+ break;
+ }
+ if (codsty->transform == FF_DWT97) {
+ band->f_stepsize *= pow(F_LFTG_K, 2*(codsty->nreslevels2decode - reslevelno) + lband - 2);
+ }
+ }
/* FIXME: In openjepg code stespize = stepsize * 0.5. Why?
* If not set output of entropic decoder is not correct. */
if (!av_codec_is_encoder(avctx->codec))
for (i = 0; i < 2; i++)
for (j = 0; j < 2; j++)
band->coord[i][j] =
- ff_jpeg2000_ceildivpow2(comp->coord_o[i][j] - comp->coord_o[i][0],
+ ff_jpeg2000_ceildivpow2(comp->coord_o[i][j],
declvl - 1);
log2_band_prec_width = reslevel->log2_prec_width;
log2_band_prec_height = reslevel->log2_prec_height;
for (j = 0; j < 2; j++)
/* Formula example for tbx_0 = ceildiv((tcx_0 - 2 ^ (declvl - 1) * x0_b) / declvl) */
band->coord[i][j] =
- ff_jpeg2000_ceildivpow2(comp->coord_o[i][j] - comp->coord_o[i][0] -
+ ff_jpeg2000_ceildivpow2(comp->coord_o[i][j] -
(((bandno + 1 >> i) & 1) << declvl - 1),
declvl);
/* TODO: Manage case of 3 band offsets here or
/* TODO: Verify with previous count of codeblocks per band */
/* Compute P_x0 */
- prec->coord[0][0] = (precno % reslevel->num_precincts_x) *
+ prec->coord[0][0] = ((band->coord[0][0] >> reslevel->log2_prec_width) + precno % reslevel->num_precincts_x) *
(1 << log2_band_prec_width);
prec->coord[0][0] = FFMAX(prec->coord[0][0], band->coord[0][0]);
/* Compute P_y0 */
- prec->coord[1][0] = (precno / reslevel->num_precincts_x) *
+ prec->coord[1][0] = ((band->coord[1][0] >> reslevel->log2_prec_height) + precno / reslevel->num_precincts_x) *
(1 << log2_band_prec_height);
prec->coord[1][0] = FFMAX(prec->coord[1][0], band->coord[1][0]);
prec->coord[1][1] = FFMIN(prec->coord[1][1], band->coord[1][1]);
prec->nb_codeblocks_width =
- ff_jpeg2000_ceildivpow2(prec->coord[0][1] -
- prec->coord[0][0],
- band->log2_cblk_width);
+ ff_jpeg2000_ceildivpow2(prec->coord[0][1],
+ band->log2_cblk_width)
+ - (prec->coord[0][0] >> band->log2_cblk_width);
prec->nb_codeblocks_height =
- ff_jpeg2000_ceildivpow2(prec->coord[1][1] -
- prec->coord[1][0],
- band->log2_cblk_height);
+ ff_jpeg2000_ceildivpow2(prec->coord[1][1],
+ band->log2_cblk_height)
+ - (prec->coord[1][0] >> band->log2_cblk_height);
+
/* Tag trees initialization */
prec->cblkincl =
/* Compute coordinates of codeblocks */
/* Compute Cx0*/
- Cx0 = (prec->coord[0][0] >> band->log2_cblk_width) << band->log2_cblk_width;
+ Cx0 = ((prec->coord[0][0]) >> band->log2_cblk_width) << band->log2_cblk_width;
Cx0 = Cx0 + ((cblkno % prec->nb_codeblocks_width) << band->log2_cblk_width);
cblk->coord[0][0] = FFMAX(Cx0, prec->coord[0][0]);
/* Compute Cy0*/
- Cy0 = (prec->coord[1][0] >> band->log2_cblk_height) << band->log2_cblk_height;
+ Cy0 = ((prec->coord[1][0]) >> band->log2_cblk_height) << band->log2_cblk_height;
Cy0 = Cy0 + ((cblkno / prec->nb_codeblocks_width) << band->log2_cblk_height);
cblk->coord[1][0] = FFMAX(Cy0, prec->coord[1][0]);