[Ffmpeg-cvslog] r7343 - in trunk: libavcodec/motion_est.c libavcodec/mpegvideo.c libavcodec/mpegvideo.h tests/rotozoom.regression.ref

michael subversion
Thu Dec 21 16:20:03 CET 2006


Author: michael
Date: Thu Dec 21 16:20:02 2006
New Revision: 7343

Modified:
   trunk/libavcodec/motion_est.c
   trunk/libavcodec/mpegvideo.c
   trunk/libavcodec/mpegvideo.h
   trunk/tests/rotozoom.regression.ref

Log:
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) 


Modified: trunk/libavcodec/motion_est.c
==============================================================================
--- trunk/libavcodec/motion_est.c	(original)
+++ trunk/libavcodec/motion_est.c	Thu Dec 21 16:20:02 2006
@@ -1843,6 +1843,18 @@
     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);
 

Modified: trunk/libavcodec/mpegvideo.c
==============================================================================
--- trunk/libavcodec/mpegvideo.c	(original)
+++ trunk/libavcodec/mpegvideo.c	Thu Dec 21 16:20:02 2006
@@ -5226,8 +5226,8 @@
                     }
                 }
 
-                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 @@
                     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);

Modified: trunk/libavcodec/mpegvideo.h
==============================================================================
--- trunk/libavcodec/mpegvideo.h	(original)
+++ trunk/libavcodec/mpegvideo.h	Thu Dec 21 16:20:02 2006
@@ -402,6 +402,8 @@
 #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];

Modified: trunk/tests/rotozoom.regression.ref
==============================================================================
--- trunk/tests/rotozoom.regression.ref	(original)
+++ trunk/tests/rotozoom.regression.ref	Thu Dec 21 16:20:02 2006
@@ -67,18 +67,18 @@
 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




More information about the ffmpeg-cvslog mailing list