20 |
* along with this program ; if not, write to the Free Software |
* along with this program ; if not, write to the Free Software |
21 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
22 |
* |
* |
23 |
* $Id: decoder.c,v 1.49.2.20 2003-11-30 16:13:15 edgomez Exp $ |
* $Id: decoder.c,v 1.49.2.25 2003-12-13 13:52:25 syskin Exp $ |
24 |
* |
* |
25 |
****************************************************************************/ |
****************************************************************************/ |
26 |
|
|
58 |
|
|
59 |
#include "image/image.h" |
#include "image/image.h" |
60 |
#include "image/colorspace.h" |
#include "image/colorspace.h" |
61 |
|
#include "image/postprocessing.h" |
62 |
#include "utils/mem_align.h" |
#include "utils/mem_align.h" |
63 |
|
|
64 |
static int |
static int |
1317 |
void decoder_output(DECODER * dec, IMAGE * img, MACROBLOCK * mbs, |
void decoder_output(DECODER * dec, IMAGE * img, MACROBLOCK * mbs, |
1318 |
xvid_dec_frame_t * frame, xvid_dec_stats_t * stats, int coding_type) |
xvid_dec_frame_t * frame, xvid_dec_stats_t * stats, int coding_type) |
1319 |
{ |
{ |
1320 |
|
if (frame->general & (XVID_DEBLOCKY|XVID_DEBLOCKUV) && mbs != NULL) /* post process */ |
1321 |
|
{ |
1322 |
|
/* note: image is stored to tmp */ |
1323 |
|
image_copy(&dec->tmp, img, dec->edged_width, dec->height); |
1324 |
|
image_deblock(&dec->tmp, dec->edged_width, |
1325 |
|
mbs, dec->mb_width, dec->mb_height, dec->mb_width, |
1326 |
|
frame->general); |
1327 |
|
img = &dec->tmp; |
1328 |
|
} |
1329 |
|
|
1330 |
image_output(img, dec->width, dec->height, |
image_output(img, dec->width, dec->height, |
1331 |
dec->edged_width, (uint8_t**)frame->output.plane, frame->output.stride, |
dec->edged_width, (uint8_t**)frame->output.plane, frame->output.stride, |
1332 |
frame->output.csp, dec->interlacing); |
frame->output.csp, dec->interlacing); |
1461 |
/* XXX: not_coded vops are not used for forward prediction */ |
/* XXX: not_coded vops are not used for forward prediction */ |
1462 |
/* we should not swap(last_mbs,mbs) */ |
/* we should not swap(last_mbs,mbs) */ |
1463 |
image_copy(&dec->cur, &dec->refn[0], dec->edged_width, dec->height); |
image_copy(&dec->cur, &dec->refn[0], dec->edged_width, dec->height); |
1464 |
|
SWAP(MACROBLOCK *, dec->mbs, dec->last_mbs); /* it will be swapped back */ |
1465 |
break; |
break; |
1466 |
} |
} |
1467 |
|
|
1503 |
/* attemping to decode a bvop without atleast 2 reference frames */ |
/* attemping to decode a bvop without atleast 2 reference frames */ |
1504 |
image_printf(&dec->cur, dec->edged_width, dec->height, 16, 16, |
image_printf(&dec->cur, dec->edged_width, dec->height, 16, 16, |
1505 |
"broken b-frame, mising ref frames"); |
"broken b-frame, mising ref frames"); |
1506 |
|
stats->type = XVID_TYPE_NOTHING; |
1507 |
} else if (dec->time_pp <= dec->time_bp) { |
} else if (dec->time_pp <= dec->time_bp) { |
1508 |
/* this occurs when dx50_bvop_compatibility==0 sequences are |
/* this occurs when dx50_bvop_compatibility==0 sequences are |
1509 |
decoded in vfw. */ |
decoded in vfw. */ |
1510 |
image_printf(&dec->cur, dec->edged_width, dec->height, 16, 16, |
image_printf(&dec->cur, dec->edged_width, dec->height, 16, 16, |
1511 |
"broken b-frame, tpp=%i tbp=%i", dec->time_pp, dec->time_bp); |
"broken b-frame, tpp=%i tbp=%i", dec->time_pp, dec->time_bp); |
1512 |
|
stats->type = XVID_TYPE_NOTHING; |
1513 |
} else { |
} else { |
1514 |
decoder_bframe(dec, &bs, quant, fcode_forward, fcode_backward); |
decoder_bframe(dec, &bs, quant, fcode_forward, fcode_backward); |
1515 |
|
decoder_output(dec, &dec->cur, dec->mbs, frame, stats, coding_type); |
1516 |
} |
} |
1517 |
|
|
|
decoder_output(dec, &dec->cur, dec->mbs, frame, stats, coding_type); |
|
1518 |
output = 1; |
output = 1; |
1519 |
dec->frames++; |
dec->frames++; |
1520 |
} |
} |