summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2006-12-21 15:20:02 +0000
committerMichael Niedermayer <michaelni@gmx.at>2006-12-21 15:20:02 +0000
commit2f16af0667c7a7b2a706f416b65052c15f22d255 (patch)
treef9a1842024187267a738a7193b9424c46e4ddc3f
parent59743d16c785276a93a031c9a330a9b932e60729 (diff)
skip motion estimation and encoding of non direct-0,0 MBs if the next MB is skiped (mpeg4 doesnt allow such MBs and in the past we did ME and encoding until at the end we droped them, so this should be faster though i didnt benchmark it, benchmark welcome)
Originally committed as revision 7343 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavcodec/motion_est.c12
-rw-r--r--libavcodec/mpegvideo.c12
-rw-r--r--libavcodec/mpegvideo.h2
-rw-r--r--tests/rotozoom.regression.ref14
4 files changed, 31 insertions, 9 deletions
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