--- trunk/xvidcore/src/decoder.c 2002/07/24 23:09:28 339 +++ branches/dev-api-3/xvidcore/src/decoder.c 2002/09/26 01:54:54 543 @@ -55,7 +55,7 @@ * 22.12.2001 lock based interpolation * 01.12.2001 inital version; (c)2001 peter ross * - * $Id: decoder.c,v 1.35 2002-07-24 23:09:28 chl Exp $ + * $Id: decoder.c,v 1.37.2.1 2002-09-26 01:54:54 h Exp $ * *************************************************************************/ @@ -268,8 +268,10 @@ start_timer(); if (cbp & (1 << (5 - i))) // coded { - get_intra_block(bs, &block[i * 64], pMB->acpred_directions[i], - start_coeff); + int direction = dec->alternate_vertical_scan ? + 2 : pMB->acpred_directions[i]; + + get_intra_block(bs, &block[i * 64], direction, start_coeff); } stop_coding_timer(); @@ -407,12 +409,14 @@ stop_comp_timer(); for (i = 0; i < 6; i++) { + int direction = dec->alternate_vertical_scan ? 2 : 0; + if (cbp & (1 << (5 - i))) // coded { memset(&block[i * 64], 0, 64 * sizeof(int16_t)); // clear start_timer(); - get_inter_block(bs, &block[i * 64]); + get_inter_block(bs, &block[i * 64], direction); stop_coding_timer(); start_timer(); @@ -585,7 +589,7 @@ start_timer(); image_setedges(&dec->refn[0], dec->edged_width, dec->edged_height, - dec->width, dec->height, dec->interlacing); + dec->width, dec->height); stop_edges_timer(); bound = 0; @@ -653,8 +657,10 @@ mb->quant = quant; if (dec->interlacing) { - mb->field_dct = BitstreamGetBit(bs); - DEBUG1("decp: field_dct: ", mb->field_dct); + if (cbp || intra) { + mb->field_dct = BitstreamGetBit(bs); + DEBUG1("decp: field_dct: ", mb->field_dct); + } if (mb->mode == MODE_INTER || mb->mode == MODE_INTER_Q) { mb->field_pred = BitstreamGetBit(bs); @@ -874,12 +880,14 @@ stop_comp_timer(); for (i = 0; i < 6; i++) { + int direction = dec->alternate_vertical_scan ? 2 : 0; + if (cbp & (1 << (5 - i))) // coded { memset(&block[i * 64], 0, 64 * sizeof(int16_t)); // clear start_timer(); - get_inter_block(bs, &block[i * 64]); + get_inter_block(bs, &block[i * 64], direction); stop_coding_timer(); start_timer(); @@ -1040,12 +1048,14 @@ stop_comp_timer(); for (i = 0; i < 6; i++) { + int direction = dec->alternate_vertical_scan ? 2 : 0; + if (cbp & (1 << (5 - i))) // coded { memset(&block[i * 64], 0, 64 * sizeof(int16_t)); // clear start_timer(); - get_inter_block(bs, &block[i * 64]); + get_inter_block(bs, &block[i * 64], direction); stop_coding_timer(); start_timer(); @@ -1140,9 +1150,9 @@ start_timer(); image_setedges(&dec->refn[0], dec->edged_width, dec->edged_height, - dec->width, dec->height, dec->interlacing); + dec->width, dec->height); image_setedges(&dec->refn[1], dec->edged_width, dec->edged_height, - dec->width, dec->height, dec->interlacing); + dec->width, dec->height); stop_edges_timer(); #ifdef BFRAMES_DEC_DEBUG @@ -1377,14 +1387,14 @@ #ifdef BFRAMES_DEC // test if no B_VOP - if (dec->low_delay) { + if (dec->low_delay || dec->frames == 0) { #endif image_output(&dec->cur, dec->width, dec->height, dec->edged_width, frame->image, frame->stride, frame->colorspace); #ifdef BFRAMES_DEC } else { - if (dec->frames >= 0) { + if (dec->frames >= 1) { start_timer(); if ((vop_type == I_VOP || vop_type == P_VOP)) { image_output(&dec->refn[0], dec->width, dec->height,