# HG changeset patch # User michael # Date 1082230909 0 # Node ID 32f68745c431d3de91630287f1734b84ca200b87 # Parent a3f44c9168aa22e77d9aab49d76a6979a10cc8bf passing AVFrame instead of AVPicture around in ffmpeg, that way stuff like motion vectors can be passed from the decoder to the encoder moving ref_index from Picture to AVFrame diff -r a3f44c9168aa -r 32f68745c431 avcodec.h --- a/avcodec.h Sat Apr 17 13:36:21 2004 +0000 +++ b/avcodec.h Sat Apr 17 19:41:49 2004 +0000 @@ -17,7 +17,7 @@ #define FFMPEG_VERSION_INT 0x000408 #define FFMPEG_VERSION "0.4.8" -#define LIBAVCODEC_BUILD 4708 +#define LIBAVCODEC_BUILD 4709 #define LIBAVCODEC_VERSION_INT FFMPEG_VERSION_INT #define LIBAVCODEC_VERSION FFMPEG_VERSION @@ -442,7 +442,7 @@ \ /**\ * Motion vector table\ - * - encoding: unused\ + * - encoding: set by user\ * - decoding: set by lavc\ */\ int16_t (*motion_val[2])[2];\ @@ -450,7 +450,7 @@ /**\ * Macroblock type table\ * mb_type_base + mb_width + 2\ - * - encoding: unused\ + * - encoding: set by user\ * - decoding: set by lavc\ */\ uint32_t *mb_type;\ @@ -538,13 +538,20 @@ * - decoding: set by lavc\ */\ short *dct_coeff;\ +\ + /**\ + * Motion referece frame index\ + * - encoding: set by user\ + * - decoding: set by lavc\ + */\ + int8_t *ref_index[2]; #define FF_QSCALE_TYPE_MPEG1 0 #define FF_QSCALE_TYPE_MPEG2 1 #define FF_BUFFER_TYPE_INTERNAL 1 #define FF_BUFFER_TYPE_USER 2 ///< Direct rendering buffers (image is (de)allocated by user) -#define FF_BUFFER_TYPE_SHARED 4 ///< buffer from somewher else, dont dealloc image (data/base) +#define FF_BUFFER_TYPE_SHARED 4 ///< buffer from somewher else, dont dealloc image (data/base), all other tables are not shared #define FF_BUFFER_TYPE_COPY 8 ///< just a (modified) copy of some other buffer, dont dealloc anything @@ -1561,6 +1568,14 @@ * - decoding: set by execute() */ void *thread_opaque; + + /** + * Motion estimation threshold. + * + * - encoding: set by user + * - decoding: set by user + */ + void *me_threshold; } AVCodecContext; diff -r a3f44c9168aa -r 32f68745c431 mpegvideo.c --- a/mpegvideo.c Sat Apr 17 13:36:21 2004 +0000 +++ b/mpegvideo.c Sat Apr 17 19:41:49 2004 +0000 @@ -287,15 +287,28 @@ dst->interlaced_frame = src->interlaced_frame; dst->top_field_first = src->top_field_first; - if(src->motion_val[0] && src->motion_val[0] != dst->motion_val[0]){ + if(s->avctx->me_threshold){ + if(!src->motion_val[0]) + av_log(s->avctx, AV_LOG_ERROR, "AVFrame.motion_val not set!\n"); + if(!src->mb_type) + av_log(s->avctx, AV_LOG_ERROR, "AVFrame.mb_type not set!\n"); + if(!src->ref_index[0]) + av_log(s->avctx, AV_LOG_ERROR, "AVFrame.ref_index not set!\n"); if(src->motion_subsample_log2 != dst->motion_subsample_log2) av_log(s->avctx, AV_LOG_ERROR, "AVFrame.motion_subsample_log2 doesnt match!\n"); - else{ + + memcpy(dst->mb_type, src->mb_type, s->mb_stride * s->mb_height * sizeof(dst->mb_type[0])); + + for(i=0; i<2; i++){ int stride= ((16*s->mb_width )>>src->motion_subsample_log2) + 1; int height= ((16*s->mb_height)>>src->motion_subsample_log2); - for(i=0; i<2; i++) - memcpy(dst->motion_val[i], src->motion_val[i], stride*height*sizeof(int16_t)); + if(src->motion_val[i] && src->motion_val[i] != dst->motion_val[i]){ + memcpy(dst->motion_val[i], src->motion_val[i], 2*stride*height*sizeof(int16_t)); + } + if(src->ref_index[i] && src->ref_index[i] != dst->ref_index[i]){ + memcpy(dst->ref_index[i], src->ref_index[i], s->mb_stride*s->mb_height*sizeof(int8_t)); //FIXME init this too + } } } } @@ -363,6 +376,7 @@ for(i=0; i<2; i++){ CHECKED_ALLOCZ(pic->motion_val_base[i], 2 * (b8_array_size+2) * sizeof(int16_t)) pic->motion_val[i]= pic->motion_val_base[i]+2; + CHECKED_ALLOCZ(pic->ref_index[i], mb_array_size * sizeof(int8_t)) } pic->motion_subsample_log2= 3; } diff -r a3f44c9168aa -r 32f68745c431 mpegvideo.h --- a/mpegvideo.h Sat Apr 17 13:36:21 2004 +0000 +++ b/mpegvideo.h Sat Apr 17 19:41:49 2004 +0000 @@ -138,7 +138,6 @@ */ uint8_t *interpolated[3]; int16_t (*motion_val_base[2])[2]; - int8_t *ref_index[2]; uint32_t *mb_type_base; #define MB_TYPE_INTRA MB_TYPE_INTRA4x4 //default mb_type if theres just one type #define IS_INTRA4x4(a) ((a)&MB_TYPE_INTRA4x4)