Mercurial > libavcodec.hg
comparison mpegvideo.c @ 327:d359db02fc90 libavcodec
much better ME for b frames (a bit slow though)
fixed MC rounding for b frames
fixed hq mode with b-frames
author | michaelni |
---|---|
date | Fri, 19 Apr 2002 03:25:20 +0000 |
parents | 6ebb8680885d |
children | 5cc47d0ba53e |
comparison
equal
deleted
inserted
replaced
326:6ebb8680885d | 327:d359db02fc90 |
---|---|
223 if (s->b_direct_mv_table == NULL) { | 223 if (s->b_direct_mv_table == NULL) { |
224 perror("malloc"); | 224 perror("malloc"); |
225 goto fail; | 225 goto fail; |
226 } | 226 } |
227 | 227 |
228 s->me_scratchpad = av_mallocz( s->linesize*16*3*sizeof(uint8_t)); | |
229 if (s->me_scratchpad == NULL) { | |
230 perror("malloc"); | |
231 goto fail; | |
232 } | |
233 | |
228 if(s->max_b_frames){ | 234 if(s->max_b_frames){ |
229 for(j=0; j<REORDER_BUFFER_SIZE; j++){ | 235 for(j=0; j<REORDER_BUFFER_SIZE; j++){ |
230 int i; | 236 int i; |
231 for(i=0;i<3;i++) { | 237 for(i=0;i<3;i++) { |
232 int w, h, shift; | 238 int w, h, shift; |
295 /* init macroblock skip table */ | 301 /* init macroblock skip table */ |
296 s->mbskip_table = av_mallocz(s->mb_num); | 302 s->mbskip_table = av_mallocz(s->mb_num); |
297 if (!s->mbskip_table) | 303 if (!s->mbskip_table) |
298 goto fail; | 304 goto fail; |
299 | 305 |
300 s->block= s->intra_block; | 306 s->block= s->blocks[0]; |
301 | 307 |
302 s->context_initialized = 1; | 308 s->context_initialized = 1; |
303 return 0; | 309 return 0; |
304 fail: | 310 fail: |
305 MPV_common_end(s); | 311 MPV_common_end(s); |
331 CHECK_FREE(s->motion_val); | 337 CHECK_FREE(s->motion_val); |
332 CHECK_FREE(s->dc_val[0]); | 338 CHECK_FREE(s->dc_val[0]); |
333 CHECK_FREE(s->ac_val[0]); | 339 CHECK_FREE(s->ac_val[0]); |
334 CHECK_FREE(s->coded_block); | 340 CHECK_FREE(s->coded_block); |
335 CHECK_FREE(s->mbintra_table); | 341 CHECK_FREE(s->mbintra_table); |
342 CHECK_FREE(s->me_scratchpad); | |
336 | 343 |
337 CHECK_FREE(s->mbskip_table); | 344 CHECK_FREE(s->mbskip_table); |
338 for(i=0;i<3;i++) { | 345 for(i=0;i<3;i++) { |
339 int j; | 346 int j; |
340 CHECK_FREE(s->last_picture_base[i]); | 347 CHECK_FREE(s->last_picture_base[i]); |
759 // printf("%f\n", avctx->psnr_y); | 766 // printf("%f\n", avctx->psnr_y); |
760 } | 767 } |
761 return pbBufPtr(&s->pb) - s->pb.buf; | 768 return pbBufPtr(&s->pb) - s->pb.buf; |
762 } | 769 } |
763 | 770 |
764 static inline int clip(int a, int amin, int amax) | |
765 { | |
766 if (a < amin) | |
767 return amin; | |
768 else if (a > amax) | |
769 return amax; | |
770 else | |
771 return a; | |
772 } | |
773 | |
774 static inline void gmc1_motion(MpegEncContext *s, | 771 static inline void gmc1_motion(MpegEncContext *s, |
775 UINT8 *dest_y, UINT8 *dest_cb, UINT8 *dest_cr, | 772 UINT8 *dest_y, UINT8 *dest_cb, UINT8 *dest_cr, |
776 int dest_offset, | 773 int dest_offset, |
777 UINT8 **ref_picture, int src_offset, | 774 UINT8 **ref_picture, int src_offset, |
778 int h) | 775 int h) |
1223 } | 1220 } |
1224 | 1221 |
1225 if (!s->mb_intra) { | 1222 if (!s->mb_intra) { |
1226 /* motion handling */ | 1223 /* motion handling */ |
1227 if((s->flags&CODEC_FLAG_HQ) || (!s->encoding)){ | 1224 if((s->flags&CODEC_FLAG_HQ) || (!s->encoding)){ |
1228 if (!s->no_rounding){ | 1225 if ((!s->no_rounding) || s->pict_type==B_TYPE){ |
1229 op_pix = put_pixels_tab; | 1226 op_pix = put_pixels_tab; |
1230 op_qpix= qpel_mc_rnd_tab; | 1227 op_qpix= qpel_mc_rnd_tab; |
1231 }else{ | 1228 }else{ |
1232 op_pix = put_no_rnd_pixels_tab; | 1229 op_pix = put_no_rnd_pixels_tab; |
1233 op_qpix= qpel_mc_no_rnd_tab; | 1230 op_qpix= qpel_mc_no_rnd_tab; |
1234 } | 1231 } |
1235 | 1232 |
1236 if (s->mv_dir & MV_DIR_FORWARD) { | 1233 if (s->mv_dir & MV_DIR_FORWARD) { |
1237 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture, op_pix, op_qpix); | 1234 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture, op_pix, op_qpix); |
1238 if (!s->no_rounding) | 1235 if ((!s->no_rounding) || s->pict_type==B_TYPE) |
1239 op_pix = avg_pixels_tab; | 1236 op_pix = avg_pixels_tab; |
1240 else | 1237 else |
1241 op_pix = avg_no_rnd_pixels_tab; | 1238 op_pix = avg_no_rnd_pixels_tab; |
1242 } | 1239 } |
1243 if (s->mv_dir & MV_DIR_BACKWARD) { | 1240 if (s->mv_dir & MV_DIR_BACKWARD) { |
1310 | 1307 |
1311 dest_y = s->current_picture[0] + (mb_y * 16 * s->linesize ) + mb_x * 16; | 1308 dest_y = s->current_picture[0] + (mb_y * 16 * s->linesize ) + mb_x * 16; |
1312 dest_cb = s->current_picture[1] + (mb_y * 8 * (s->linesize >> 1)) + mb_x * 8; | 1309 dest_cb = s->current_picture[1] + (mb_y * 8 * (s->linesize >> 1)) + mb_x * 8; |
1313 dest_cr = s->current_picture[2] + (mb_y * 8 * (s->linesize >> 1)) + mb_x * 8; | 1310 dest_cr = s->current_picture[2] + (mb_y * 8 * (s->linesize >> 1)) + mb_x * 8; |
1314 | 1311 |
1315 if (!s->no_rounding){ | 1312 if ((!s->no_rounding) || s->pict_type==B_TYPE){ |
1316 op_pix = put_pixels_tab; | 1313 op_pix = put_pixels_tab; |
1317 op_qpix= qpel_mc_rnd_tab; | 1314 op_qpix= qpel_mc_rnd_tab; |
1318 }else{ | 1315 }else{ |
1319 op_pix = put_no_rnd_pixels_tab; | 1316 op_pix = put_no_rnd_pixels_tab; |
1320 op_qpix= qpel_mc_no_rnd_tab; | 1317 op_qpix= qpel_mc_no_rnd_tab; |
1321 } | 1318 } |
1322 | 1319 |
1323 if (s->mv_dir & MV_DIR_FORWARD) { | 1320 if (s->mv_dir & MV_DIR_FORWARD) { |
1324 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture, op_pix, op_qpix); | 1321 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture, op_pix, op_qpix); |
1325 if (!s->no_rounding) | 1322 if ((!s->no_rounding) || s->pict_type==B_TYPE) |
1326 op_pix = avg_pixels_tab; | 1323 op_pix = avg_pixels_tab; |
1327 else | 1324 else |
1328 op_pix = avg_no_rnd_pixels_tab; | 1325 op_pix = avg_no_rnd_pixels_tab; |
1329 } | 1326 } |
1330 if (s->mv_dir & MV_DIR_BACKWARD) { | 1327 if (s->mv_dir & MV_DIR_BACKWARD) { |
1427 d->i_count= s->i_count; | 1424 d->i_count= s->i_count; |
1428 d->p_count= s->p_count; | 1425 d->p_count= s->p_count; |
1429 d->skip_count= s->skip_count; | 1426 d->skip_count= s->skip_count; |
1430 d->misc_bits= s->misc_bits; | 1427 d->misc_bits= s->misc_bits; |
1431 d->last_bits= s->last_bits; | 1428 d->last_bits= s->last_bits; |
1429 | |
1430 d->mb_skiped= s->mb_skiped; | |
1432 } | 1431 } |
1433 | 1432 |
1434 static void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){ | 1433 static void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){ |
1435 int i; | 1434 int i; |
1436 | 1435 |
1451 d->skip_count= s->skip_count; | 1450 d->skip_count= s->skip_count; |
1452 d->misc_bits= s->misc_bits; | 1451 d->misc_bits= s->misc_bits; |
1453 d->last_bits= s->last_bits; | 1452 d->last_bits= s->last_bits; |
1454 | 1453 |
1455 d->mb_intra= s->mb_intra; | 1454 d->mb_intra= s->mb_intra; |
1455 d->mb_skiped= s->mb_skiped; | |
1456 d->mv_type= s->mv_type; | 1456 d->mv_type= s->mv_type; |
1457 d->mv_dir= s->mv_dir; | 1457 d->mv_dir= s->mv_dir; |
1458 d->pb= s->pb; | 1458 d->pb= s->pb; |
1459 d->block= s->block; | 1459 d->block= s->block; |
1460 for(i=0; i<6; i++) | 1460 for(i=0; i<6; i++) |
1466 { | 1466 { |
1467 int mb_x, mb_y, last_gob, pdif = 0; | 1467 int mb_x, mb_y, last_gob, pdif = 0; |
1468 int i; | 1468 int i; |
1469 int bits; | 1469 int bits; |
1470 MpegEncContext best_s, backup_s; | 1470 MpegEncContext best_s, backup_s; |
1471 UINT8 bit_buf[4][3000]; //FIXME check that this is ALLWAYS large enogh for a MB | 1471 UINT8 bit_buf[7][3000]; //FIXME check that this is ALLWAYS large enogh for a MB |
1472 | 1472 |
1473 s->picture_number = picture_number; | 1473 s->picture_number = picture_number; |
1474 | 1474 |
1475 s->block_wrap[0]= | 1475 s->block_wrap[0]= |
1476 s->block_wrap[1]= | 1476 s->block_wrap[1]= |
1481 | 1481 |
1482 s->last_mc_mb_var = s->mc_mb_var; | 1482 s->last_mc_mb_var = s->mc_mb_var; |
1483 /* Reset the average MB variance */ | 1483 /* Reset the average MB variance */ |
1484 s->avg_mb_var = 0; | 1484 s->avg_mb_var = 0; |
1485 s->mc_mb_var = 0; | 1485 s->mc_mb_var = 0; |
1486 | 1486 |
1487 /* we need to initialize some time vars before we can encode b-frames */ | |
1488 if (s->h263_pred && !s->h263_msmpeg4) | |
1489 ff_set_mpeg4_time(s, s->picture_number); | |
1490 | |
1487 /* Estimate motion for every MB */ | 1491 /* Estimate motion for every MB */ |
1488 if(s->pict_type != I_TYPE){ | 1492 if(s->pict_type != I_TYPE){ |
1489 // int16_t (*tmp)[2]= s->p_mv_table; | 1493 // int16_t (*tmp)[2]= s->p_mv_table; |
1490 // s->p_mv_table= s->last_mv_table; | 1494 // s->p_mv_table= s->last_mv_table; |
1491 // s->last_mv_table= s->mv_table; | 1495 // s->last_mv_table= s->mv_table; |
1533 s->f_code= ff_get_best_fcode(s, s->p_mv_table, MB_TYPE_INTER); | 1537 s->f_code= ff_get_best_fcode(s, s->p_mv_table, MB_TYPE_INTER); |
1534 ff_fix_long_p_mvs(s); | 1538 ff_fix_long_p_mvs(s); |
1535 if(s->pict_type==B_TYPE){ | 1539 if(s->pict_type==B_TYPE){ |
1536 s->f_code= ff_get_best_fcode(s, s->b_forw_mv_table, MB_TYPE_FORWARD); | 1540 s->f_code= ff_get_best_fcode(s, s->b_forw_mv_table, MB_TYPE_FORWARD); |
1537 s->b_code= ff_get_best_fcode(s, s->b_back_mv_table, MB_TYPE_BACKWARD); | 1541 s->b_code= ff_get_best_fcode(s, s->b_back_mv_table, MB_TYPE_BACKWARD); |
1538 //FIXME if BIDIR != for&back | 1542 |
1539 ff_fix_long_b_mvs(s, s->b_forw_mv_table, s->f_code, MB_TYPE_FORWARD |MB_TYPE_BIDIR); | 1543 ff_fix_long_b_mvs(s, s->b_forw_mv_table, s->f_code, MB_TYPE_FORWARD); |
1540 ff_fix_long_b_mvs(s, s->b_back_mv_table, s->b_code, MB_TYPE_BACKWARD|MB_TYPE_BIDIR); | 1544 ff_fix_long_b_mvs(s, s->b_back_mv_table, s->b_code, MB_TYPE_BACKWARD); |
1545 ff_fix_long_b_mvs(s, s->b_bidir_forw_mv_table, s->f_code, MB_TYPE_BIDIR); | |
1546 ff_fix_long_b_mvs(s, s->b_bidir_back_mv_table, s->b_code, MB_TYPE_BIDIR); | |
1541 } | 1547 } |
1542 | 1548 |
1543 //printf("f_code %d ///\n", s->f_code); | 1549 //printf("f_code %d ///\n", s->f_code); |
1544 | 1550 |
1545 // printf("%d %d\n", s->avg_mb_var, s->mc_mb_var); | 1551 // printf("%d %d\n", s->avg_mb_var, s->mc_mb_var); |
1630 s->block_index[2]= s->block_wrap[0]*(mb_y*2 + 2) - 1; | 1636 s->block_index[2]= s->block_wrap[0]*(mb_y*2 + 2) - 1; |
1631 s->block_index[3]= s->block_wrap[0]*(mb_y*2 + 2); | 1637 s->block_index[3]= s->block_wrap[0]*(mb_y*2 + 2); |
1632 s->block_index[4]= s->block_wrap[4]*(mb_y + 1) + s->block_wrap[0]*(s->mb_height*2 + 2); | 1638 s->block_index[4]= s->block_wrap[4]*(mb_y + 1) + s->block_wrap[0]*(s->mb_height*2 + 2); |
1633 s->block_index[5]= s->block_wrap[4]*(mb_y + 1 + s->mb_height + 2) + s->block_wrap[0]*(s->mb_height*2 + 2); | 1639 s->block_index[5]= s->block_wrap[4]*(mb_y + 1 + s->mb_height + 2) + s->block_wrap[0]*(s->mb_height*2 + 2); |
1634 for(mb_x=0; mb_x < s->mb_width; mb_x++) { | 1640 for(mb_x=0; mb_x < s->mb_width; mb_x++) { |
1635 /*const */int mb_type= s->mb_type[mb_y * s->mb_width + mb_x]; | 1641 const int mb_type= s->mb_type[mb_y * s->mb_width + mb_x]; |
1642 const int xy= (mb_y+1) * (s->mb_width+2) + mb_x + 1; | |
1636 PutBitContext pb; | 1643 PutBitContext pb; |
1637 int d; | 1644 int d; |
1638 int dmin=10000000; | 1645 int dmin=10000000; |
1639 int best=0; | 1646 int best=0; |
1640 | 1647 |
1645 s->block_index[2]+=2; | 1652 s->block_index[2]+=2; |
1646 s->block_index[3]+=2; | 1653 s->block_index[3]+=2; |
1647 s->block_index[4]++; | 1654 s->block_index[4]++; |
1648 s->block_index[5]++; | 1655 s->block_index[5]++; |
1649 if(mb_type & (mb_type-1)){ // more than 1 MB type possible | 1656 if(mb_type & (mb_type-1)){ // more than 1 MB type possible |
1657 int next_block=0; | |
1650 pb= s->pb; | 1658 pb= s->pb; |
1651 s->mv_dir = MV_DIR_FORWARD; | |
1652 | 1659 |
1653 copy_context_before_encode(&backup_s, s, -1); | 1660 copy_context_before_encode(&backup_s, s, -1); |
1654 | 1661 |
1655 if(mb_type&MB_TYPE_INTER){ | 1662 if(mb_type&MB_TYPE_INTER){ |
1656 int xy= (mb_y+1) * (s->mb_width+2) + mb_x + 1; | 1663 s->mv_dir = MV_DIR_FORWARD; |
1657 s->mv_type = MV_TYPE_16X16; | 1664 s->mv_type = MV_TYPE_16X16; |
1658 s->mb_intra= 0; | 1665 s->mb_intra= 0; |
1659 s->mv[0][0][0] = s->p_mv_table[xy][0]; | 1666 s->mv[0][0][0] = s->p_mv_table[xy][0]; |
1660 s->mv[0][0][1] = s->p_mv_table[xy][1]; | 1667 s->mv[0][0][1] = s->p_mv_table[xy][1]; |
1661 init_put_bits(&s->pb, bit_buf[1], 3000, NULL, NULL); | 1668 init_put_bits(&s->pb, bit_buf[1], 3000, NULL, NULL); |
1662 s->block= s->inter_block; | 1669 s->block= s->blocks[next_block]; |
1663 | 1670 |
1664 encode_mb(s, s->mv[0][0][0], s->mv[0][0][1]); | 1671 encode_mb(s, s->mv[0][0][0], s->mv[0][0][1]); |
1665 d= get_bit_count(&s->pb); | 1672 d= get_bit_count(&s->pb); |
1666 if(d<dmin){ | 1673 if(d<dmin){ |
1667 flush_put_bits(&s->pb); | 1674 flush_put_bits(&s->pb); |
1668 dmin=d; | 1675 dmin=d; |
1669 copy_context_after_encode(&best_s, s, MB_TYPE_INTER); | 1676 copy_context_after_encode(&best_s, s, MB_TYPE_INTER); |
1670 best=1; | 1677 best=1; |
1678 next_block^=1; | |
1671 } | 1679 } |
1672 } | 1680 } |
1673 if(mb_type&MB_TYPE_INTER4V){ | 1681 if(mb_type&MB_TYPE_INTER4V){ |
1674 copy_context_before_encode(s, &backup_s, MB_TYPE_INTER4V); | 1682 copy_context_before_encode(s, &backup_s, MB_TYPE_INTER4V); |
1683 s->mv_dir = MV_DIR_FORWARD; | |
1675 s->mv_type = MV_TYPE_8X8; | 1684 s->mv_type = MV_TYPE_8X8; |
1676 s->mb_intra= 0; | 1685 s->mb_intra= 0; |
1677 for(i=0; i<4; i++){ | 1686 for(i=0; i<4; i++){ |
1678 s->mv[0][i][0] = s->motion_val[s->block_index[i]][0]; | 1687 s->mv[0][i][0] = s->motion_val[s->block_index[i]][0]; |
1679 s->mv[0][i][1] = s->motion_val[s->block_index[i]][1]; | 1688 s->mv[0][i][1] = s->motion_val[s->block_index[i]][1]; |
1680 } | 1689 } |
1681 init_put_bits(&s->pb, bit_buf[2], 3000, NULL, NULL); | 1690 init_put_bits(&s->pb, bit_buf[2], 3000, NULL, NULL); |
1682 s->block= s->inter4v_block; | 1691 s->block= s->blocks[next_block]; |
1683 | 1692 |
1684 encode_mb(s, 0, 0); | 1693 encode_mb(s, 0, 0); |
1685 d= get_bit_count(&s->pb); | 1694 d= get_bit_count(&s->pb); |
1686 if(d<dmin && 0){ | 1695 if(d<dmin){ |
1687 flush_put_bits(&s->pb); | 1696 flush_put_bits(&s->pb); |
1688 dmin=d; | 1697 dmin=d; |
1689 copy_context_after_encode(&best_s, s, MB_TYPE_INTER4V); | 1698 copy_context_after_encode(&best_s, s, MB_TYPE_INTER4V); |
1690 best=2; | 1699 best=2; |
1700 next_block^=1; | |
1701 } | |
1702 } | |
1703 if(mb_type&MB_TYPE_FORWARD){ | |
1704 copy_context_before_encode(s, &backup_s, MB_TYPE_FORWARD); | |
1705 s->mv_dir = MV_DIR_FORWARD; | |
1706 s->mv_type = MV_TYPE_16X16; | |
1707 s->mb_intra= 0; | |
1708 s->mv[0][0][0] = s->b_forw_mv_table[xy][0]; | |
1709 s->mv[0][0][1] = s->b_forw_mv_table[xy][1]; | |
1710 init_put_bits(&s->pb, bit_buf[3], 3000, NULL, NULL); | |
1711 s->block= s->blocks[next_block]; | |
1712 | |
1713 encode_mb(s, s->mv[0][0][0], s->mv[0][0][1]); | |
1714 d= get_bit_count(&s->pb); | |
1715 if(d<dmin){ | |
1716 flush_put_bits(&s->pb); | |
1717 dmin=d; | |
1718 copy_context_after_encode(&best_s, s, MB_TYPE_FORWARD); | |
1719 best=3; | |
1720 next_block^=1; | |
1721 } | |
1722 } | |
1723 if(mb_type&MB_TYPE_BACKWARD){ | |
1724 copy_context_before_encode(s, &backup_s, MB_TYPE_BACKWARD); | |
1725 s->mv_dir = MV_DIR_BACKWARD; | |
1726 s->mv_type = MV_TYPE_16X16; | |
1727 s->mb_intra= 0; | |
1728 s->mv[1][0][0] = s->b_back_mv_table[xy][0]; | |
1729 s->mv[1][0][1] = s->b_back_mv_table[xy][1]; | |
1730 init_put_bits(&s->pb, bit_buf[4], 3000, NULL, NULL); | |
1731 s->block= s->blocks[next_block]; | |
1732 | |
1733 encode_mb(s, s->mv[1][0][0], s->mv[1][0][1]); | |
1734 d= get_bit_count(&s->pb); | |
1735 if(d<dmin){ | |
1736 flush_put_bits(&s->pb); | |
1737 dmin=d; | |
1738 copy_context_after_encode(&best_s, s, MB_TYPE_BACKWARD); | |
1739 best=4; | |
1740 next_block^=1; | |
1741 } | |
1742 } | |
1743 if(mb_type&MB_TYPE_BIDIR){ | |
1744 copy_context_before_encode(s, &backup_s, MB_TYPE_BIDIR); | |
1745 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD; | |
1746 s->mv_type = MV_TYPE_16X16; | |
1747 s->mb_intra= 0; | |
1748 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0]; | |
1749 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1]; | |
1750 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0]; | |
1751 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1]; | |
1752 init_put_bits(&s->pb, bit_buf[5], 3000, NULL, NULL); | |
1753 s->block= s->blocks[next_block]; | |
1754 | |
1755 encode_mb(s, 0, 0); | |
1756 d= get_bit_count(&s->pb); | |
1757 if(d<dmin){ | |
1758 flush_put_bits(&s->pb); | |
1759 dmin=d; | |
1760 copy_context_after_encode(&best_s, s, MB_TYPE_BIDIR); | |
1761 best=5; | |
1762 next_block^=1; | |
1763 } | |
1764 } | |
1765 if(mb_type&MB_TYPE_DIRECT){ | |
1766 copy_context_before_encode(s, &backup_s, MB_TYPE_DIRECT); | |
1767 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT; | |
1768 s->mv_type = MV_TYPE_16X16; //FIXME | |
1769 s->mb_intra= 0; | |
1770 s->mv[0][0][0] = s->b_direct_forw_mv_table[xy][0]; | |
1771 s->mv[0][0][1] = s->b_direct_forw_mv_table[xy][1]; | |
1772 s->mv[1][0][0] = s->b_direct_back_mv_table[xy][0]; | |
1773 s->mv[1][0][1] = s->b_direct_back_mv_table[xy][1]; | |
1774 init_put_bits(&s->pb, bit_buf[6], 3000, NULL, NULL); | |
1775 s->block= s->blocks[next_block]; | |
1776 | |
1777 encode_mb(s, s->b_direct_mv_table[xy][0], s->b_direct_mv_table[xy][1]); | |
1778 d= get_bit_count(&s->pb); | |
1779 if(d<dmin){ | |
1780 flush_put_bits(&s->pb); | |
1781 dmin=d; | |
1782 copy_context_after_encode(&best_s, s, MB_TYPE_DIRECT); | |
1783 best=6; | |
1784 next_block^=1; | |
1691 } | 1785 } |
1692 } | 1786 } |
1693 if(mb_type&MB_TYPE_INTRA){ | 1787 if(mb_type&MB_TYPE_INTRA){ |
1694 copy_context_before_encode(s, &backup_s, MB_TYPE_INTRA); | 1788 copy_context_before_encode(s, &backup_s, MB_TYPE_INTRA); |
1789 s->mv_dir = MV_DIR_FORWARD; | |
1695 s->mv_type = MV_TYPE_16X16; | 1790 s->mv_type = MV_TYPE_16X16; |
1696 s->mb_intra= 1; | 1791 s->mb_intra= 1; |
1697 s->mv[0][0][0] = 0; | 1792 s->mv[0][0][0] = 0; |
1698 s->mv[0][0][1] = 0; | 1793 s->mv[0][0][1] = 0; |
1699 init_put_bits(&s->pb, bit_buf[0], 3000, NULL, NULL); | 1794 init_put_bits(&s->pb, bit_buf[0], 3000, NULL, NULL); |
1700 s->block= s->intra_block; | 1795 s->block= s->blocks[next_block]; |
1701 | 1796 |
1702 encode_mb(s, 0, 0); | 1797 encode_mb(s, 0, 0); |
1703 d= get_bit_count(&s->pb); | 1798 d= get_bit_count(&s->pb); |
1704 if(d<dmin){ | 1799 if(d<dmin){ |
1705 flush_put_bits(&s->pb); | 1800 flush_put_bits(&s->pb); |
1706 dmin=d; | 1801 dmin=d; |
1707 copy_context_after_encode(&best_s, s, MB_TYPE_INTRA); | 1802 copy_context_after_encode(&best_s, s, MB_TYPE_INTRA); |
1708 best=0; | 1803 best=0; |
1804 next_block^=1; | |
1709 } | 1805 } |
1710 /* force cleaning of ac/dc pred stuff if needed ... */ | 1806 /* force cleaning of ac/dc pred stuff if needed ... */ |
1711 if(s->h263_pred || s->h263_aic) | 1807 if(s->h263_pred || s->h263_aic) |
1712 s->mbintra_table[mb_x + mb_y*s->mb_width]=1; | 1808 s->mbintra_table[mb_x + mb_y*s->mb_width]=1; |
1713 } | 1809 } |
1716 s->pb= pb; | 1812 s->pb= pb; |
1717 } else { | 1813 } else { |
1718 int motion_x, motion_y; | 1814 int motion_x, motion_y; |
1719 s->mv_type=MV_TYPE_16X16; | 1815 s->mv_type=MV_TYPE_16X16; |
1720 // only one MB-Type possible | 1816 // only one MB-Type possible |
1721 //FIXME convert to swicth() | 1817 switch(mb_type){ |
1722 if(mb_type&MB_TYPE_INTRA){ | 1818 case MB_TYPE_INTRA: |
1723 s->mv_dir = MV_DIR_FORWARD; | 1819 s->mv_dir = MV_DIR_FORWARD; |
1724 s->mb_intra= 1; | 1820 s->mb_intra= 1; |
1725 motion_x= s->mv[0][0][0] = 0; | 1821 motion_x= s->mv[0][0][0] = 0; |
1726 motion_y= s->mv[0][0][1] = 0; | 1822 motion_y= s->mv[0][0][1] = 0; |
1727 }else if(mb_type&MB_TYPE_INTER){ | 1823 break; |
1728 int xy= (mb_y+1) * (s->mb_width+2) + mb_x + 1; | 1824 case MB_TYPE_INTER: |
1729 s->mv_dir = MV_DIR_FORWARD; | 1825 s->mv_dir = MV_DIR_FORWARD; |
1730 s->mb_intra= 0; | 1826 s->mb_intra= 0; |
1731 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0]; | 1827 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0]; |
1732 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1]; | 1828 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1]; |
1733 }else if(mb_type&MB_TYPE_DIRECT){ | 1829 break; |
1734 int xy= (mb_y+1) * (s->mb_width+2) + mb_x + 1; | 1830 case MB_TYPE_DIRECT: |
1735 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT; | 1831 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT; |
1736 s->mb_intra= 0; | 1832 s->mb_intra= 0; |
1737 motion_x=0; | 1833 motion_x=s->b_direct_mv_table[xy][0]; |
1738 motion_y=0; | 1834 motion_y=s->b_direct_mv_table[xy][1]; |
1739 s->mv[0][0][0] = 0; | 1835 s->mv[0][0][0] = s->b_direct_forw_mv_table[xy][0]; |
1740 s->mv[0][0][1] = 0; | 1836 s->mv[0][0][1] = s->b_direct_forw_mv_table[xy][1]; |
1741 s->mv[1][0][0] = 0; | 1837 s->mv[1][0][0] = s->b_direct_back_mv_table[xy][0]; |
1742 s->mv[1][0][1] = 0; | 1838 s->mv[1][0][1] = s->b_direct_back_mv_table[xy][1]; |
1743 }else if(mb_type&MB_TYPE_BIDIR){ | 1839 break; |
1744 int xy= (mb_y+1) * (s->mb_width+2) + mb_x + 1; | 1840 case MB_TYPE_BIDIR: |
1745 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD; | 1841 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD; |
1746 s->mb_intra= 0; | 1842 s->mb_intra= 0; |
1747 motion_x=0; | 1843 motion_x=0; |
1748 motion_y=0; | 1844 motion_y=0; |
1749 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0]; | 1845 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0]; |
1750 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1]; | 1846 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1]; |
1751 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0]; | 1847 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0]; |
1752 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1]; | 1848 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1]; |
1753 }else if(mb_type&MB_TYPE_BACKWARD){ | 1849 break; |
1754 int xy= (mb_y+1) * (s->mb_width+2) + mb_x + 1; | 1850 case MB_TYPE_BACKWARD: |
1755 s->mv_dir = MV_DIR_BACKWARD; | 1851 s->mv_dir = MV_DIR_BACKWARD; |
1756 s->mb_intra= 0; | 1852 s->mb_intra= 0; |
1757 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0]; | 1853 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0]; |
1758 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1]; | 1854 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1]; |
1759 }else if(mb_type&MB_TYPE_FORWARD){ | 1855 break; |
1760 int xy= (mb_y+1) * (s->mb_width+2) + mb_x + 1; | 1856 case MB_TYPE_FORWARD: |
1761 s->mv_dir = MV_DIR_FORWARD; | 1857 s->mv_dir = MV_DIR_FORWARD; |
1762 s->mb_intra= 0; | 1858 s->mb_intra= 0; |
1763 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0]; | 1859 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0]; |
1764 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1]; | 1860 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1]; |
1765 // printf(" %d %d ", motion_x, motion_y); | 1861 // printf(" %d %d ", motion_x, motion_y); |
1766 }else{ | 1862 break; |
1863 default: | |
1767 motion_x=motion_y=0; //gcc warning fix | 1864 motion_x=motion_y=0; //gcc warning fix |
1768 printf("illegal MB type\n"); | 1865 printf("illegal MB type\n"); |
1769 } | 1866 } |
1770 encode_mb(s, motion_x, motion_y); | 1867 encode_mb(s, motion_x, motion_y); |
1868 } | |
1869 /* clean the MV table in IPS frames for direct mode in B frames */ | |
1870 if(s->mb_intra /* && I,P,S_TYPE */){ | |
1871 s->p_mv_table[xy][0]=0; | |
1872 s->p_mv_table[xy][1]=0; | |
1771 } | 1873 } |
1772 | 1874 |
1773 MPV_decode_mb(s, s->block); | 1875 MPV_decode_mb(s, s->block); |
1774 } | 1876 } |
1775 | 1877 |