diff --git a/libavcodec/motion_est.c b/libavcodec/motion_est.c index 94a0aa51dd..a5d5e57e69 100644 --- a/libavcodec/motion_est.c +++ b/libavcodec/motion_est.c @@ -1843,6 +1843,18 @@ void ff_estimate_b_frame_motion(MpegEncContext * s, get_limits(s, 16*mb_x, 16*mb_y); c->skip=0; + + if(s->codec_id == CODEC_ID_MPEG4 && s->next_picture.mbskip_table[xy]){ + int score= direct_search(s, mb_x, mb_y); //FIXME just check 0,0 + + score= ((unsigned)(score*score + 128*256))>>16; + c->mc_mb_var_sum_temp += score; + s->current_picture.mc_mb_var[mb_y*s->mb_stride + mb_x] = score; //FIXME use SSE + s->mb_type[mb_y*s->mb_stride + mb_x]= CANDIDATE_MB_TYPE_DIRECT0; + + return; + } + if(c->avctx->me_threshold){ int vard= check_input_motion(s, mb_x, mb_y, 0); diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index b2becd22bd..654e96f75e 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -5226,8 +5226,8 @@ static int encode_thread(AVCodecContext *c, void *arg){ } } - if(s->flags & CODEC_FLAG_QP_RD){ - if(best_s.mv_type==MV_TYPE_16X16 && !(best_s.mv_dir&MV_DIRECT)){ + if((s->flags & CODEC_FLAG_QP_RD) && dmin < INT_MAX){ + if(best_s.mv_type==MV_TYPE_16X16){ //FIXME move 4mv after QPRD const int last_qp= backup_s.qscale; int qpi, qp, dc[6]; DCTELEM ac[6][16]; @@ -5283,6 +5283,14 @@ static int encode_thread(AVCodecContext *c, void *arg){ encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb, &dmin, &next_block, mx, my); } + if(mb_type&CANDIDATE_MB_TYPE_DIRECT0){ + backup_s.dquant = 0; + s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT; + s->mb_intra= 0; + ff_mpeg4_set_direct_mv(s, 0, 0); + encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb, + &dmin, &next_block, 0, 0); + } s->current_picture.qscale_table[xy]= best_s.qscale; copy_context_after_encode(s, &best_s, -1); diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h index 011678a42d..4c57c54b32 100644 --- a/libavcodec/mpegvideo.h +++ b/libavcodec/mpegvideo.h @@ -402,6 +402,8 @@ typedef struct MpegEncContext { #define CANDIDATE_MB_TYPE_BACKWARD_I 0x400 #define CANDIDATE_MB_TYPE_BIDIR_I 0x800 +#define CANDIDATE_MB_TYPE_DIRECT0 0x1000 + int block_index[6]; ///< index to current MB in block based arrays with edges int block_wrap[6]; uint8_t *dest[3]; diff --git a/tests/rotozoom.regression.ref b/tests/rotozoom.regression.ref index d6b5d3b920..2322303ab9 100644 --- a/tests/rotozoom.regression.ref +++ b/tests/rotozoom.regression.ref @@ -67,18 +67,18 @@ a1323da0c8b437cd6961f8c90451880b *./data/a-huffyuv.avi 6455232 ./data/a-huffyuv.avi dde5895817ad9d219f79a52d0bdfb001 *./data/out.yuv stddev: 0.00 PSNR:99.99 bytes:7602176 -1fd3bddc95fa01ee4c4b383373803c67 *./data/a-mpeg4-rc.avi -227936 ./data/a-mpeg4-rc.avi -fa9079e35ff819c39656de95319846fb *./data/out.yuv +968ca132d8cf46f84e657abcf8473b7c *./data/a-mpeg4-rc.avi +227934 ./data/a-mpeg4-rc.avi +895773fe8250c806a0d1592a6dd12401 *./data/out.yuv stddev: 4.24 PSNR:35.56 bytes:7602176 9001cf571eb7f26fa5592bdec6538583 *./data/a-mpeg4-adv.avi 173590 ./data/a-mpeg4-adv.avi 699edf05648fdc42196b7bebef9be269 *./data/out.yuv stddev: 4.84 PSNR:34.41 bytes:7602176 -7006aa0ad8643348ec0d6d87bf03202c *./data/a-mpeg4-qprd.avi -235016 ./data/a-mpeg4-qprd.avi -224969c07440a23b376521c484936e75 *./data/out.yuv -stddev: 4.24 PSNR:35.56 bytes:7602176 +edd969be2816c13ae078b7a0416a5715 *./data/a-mpeg4-qprd.avi +234852 ./data/a-mpeg4-qprd.avi +51fa46add28e145c1a5ce6b27a4c57b8 *./data/out.yuv +stddev: 4.24 PSNR:35.57 bytes:7602176 7ecfbb848740d316e2fcf573b32cb848 *./data/a-mpeg4-adap.avi 205454 ./data/a-mpeg4-adap.avi c9225addf2e620e0094d26e805693af1 *./data/out.yuv