skip motion estimation and encoding of non direct-0,0 MBs if the next MB is skiped...
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 21 Dec 2006 15:20:02 +0000 (15:20 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 21 Dec 2006 15:20:02 +0000 (15:20 +0000)
Originally committed as revision 7343 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/motion_est.c
libavcodec/mpegvideo.c
libavcodec/mpegvideo.h
tests/rotozoom.regression.ref

index 94a0aa5..a5d5e57 100644 (file)
@@ -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);
 
index b2becd2..654e96f 100644 (file)
@@ -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);
index 011678a..4c57c54 100644 (file)
@@ -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];
index d6b5d3b..2322303 100644 (file)
@@ -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