changeset 3338:937f14bb0f23 libavcodec

support doing motion estimation and compensation without any residual transform or coding this is usefull for filters which need ME/MC
author michael
date Sun, 04 Jun 2006 21:54:58 +0000
parents bec1eb6d3746
children 13829fcefa81
files avcodec.h snow.c
diffstat 2 files changed, 16 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/avcodec.h	Sat Jun 03 22:18:03 2006 +0000
+++ b/avcodec.h	Sun Jun 04 21:54:58 2006 +0000
@@ -343,6 +343,7 @@
 #define CODEC_FLAG2_AUD           0x00000200 ///< H.264 access unit delimiters
 #define CODEC_FLAG2_BRDO          0x00000400 ///< b-frame rate-distortion optimization
 #define CODEC_FLAG2_INTRA_VLC     0x00000800 ///< use MPEG-2 intra VLC table
+#define CODEC_FLAG2_MEMC_ONLY     0x00001000 ///< only do ME/MC (I frames -> ref, P frame -> ME+MC)
 
 /* Unsupported options :
  *              Syntax Arithmetic coding (SAC)
--- a/snow.c	Sat Jun 03 22:18:03 2006 +0000
+++ b/snow.c	Sun Jun 04 21:54:58 2006 +0000
@@ -4261,6 +4261,7 @@
         int x, y;
 //        int bits= put_bits_count(&s->c.pb);
 
+    if(!(avctx->flags2 & CODEC_FLAG2_MEMC_ONLY)){
         //FIXME optimize
      if(pict->data[plane_index]) //FIXME gray hack
         for(y=0; y<h; y++){
@@ -4330,6 +4331,20 @@
 {START_TIMER
         predict_plane(s, s->spatial_dwt_buffer, plane_index, 1);
 STOP_TIMER("pred-conv")}
+      }else{
+            //ME/MC only
+            if(pict->pict_type == I_TYPE){
+                for(y=0; y<h; y++){
+                    for(x=0; x<w; x++){
+                        s->current_picture.data[plane_index][y*s->current_picture.linesize[plane_index] + x]=
+                            pict->data[plane_index][y*pict->linesize[plane_index] + x];
+                    }
+                }
+            }else{
+                memset(s->spatial_dwt_buffer, 0, sizeof(DWTELEM)*w*h);
+                predict_plane(s, s->spatial_dwt_buffer, plane_index, 1);
+            }
+      }
         if(s->avctx->flags&CODEC_FLAG_PSNR){
             int64_t error= 0;