[FFmpeg-cvslog] avcodec/mpegvideo: Move MotionEstContext to MPVEncContext
Andreas Rheinhardt
git at videolan.org
Wed Mar 26 06:10:54 EET 2025
ffmpeg | branch: master | Andreas Rheinhardt <andreas.rheinhardt at outlook.com> | Wed Mar 19 14:24:56 2025 +0100| [6e45f7f5359f7871960cc147579d6cabf61f3085] | committer: Andreas Rheinhardt
avcodec/mpegvideo: Move MotionEstContext to MPVEncContext
All that is necessary to do so is perform ff_me_init_pic()
on every slice.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=6e45f7f5359f7871960cc147579d6cabf61f3085
---
libavcodec/h261enc.c | 2 +-
libavcodec/ituh263enc.c | 2 +-
libavcodec/motion_est.c | 36 +++++++++++++++++------------------
libavcodec/motion_est_template.c | 32 +++++++++++++++----------------
libavcodec/mpeg12enc.c | 2 +-
libavcodec/mpegvideo.c | 6 ------
libavcodec/mpegvideo.h | 3 ---
libavcodec/mpegvideo_enc.c | 41 ++++++++++++++++++++--------------------
libavcodec/mpegvideoenc.h | 4 +++-
libavcodec/snowenc.c | 36 +++++++++++++++++------------------
libavcodec/svq1enc.c | 24 +++++++++++------------
11 files changed, 90 insertions(+), 98 deletions(-)
diff --git a/libavcodec/h261enc.c b/libavcodec/h261enc.c
index fe171bd113..70f5f2b09c 100644
--- a/libavcodec/h261enc.c
+++ b/libavcodec/h261enc.c
@@ -377,7 +377,7 @@ static av_cold int h261_encode_init(AVCodecContext *avctx)
s->max_qcoeff = 127;
s->ac_esc_length = H261_ESC_LEN;
- s->c.me.mv_penalty = mv_penalty;
+ s->me.mv_penalty = mv_penalty;
s->intra_ac_vlc_length = s->inter_ac_vlc_length = uni_h261_rl_len;
s->intra_ac_vlc_last_length = s->inter_ac_vlc_last_length = uni_h261_rl_len_last;
diff --git a/libavcodec/ituh263enc.c b/libavcodec/ituh263enc.c
index 6bd7b6a6cd..2e087c518d 100644
--- a/libavcodec/ituh263enc.c
+++ b/libavcodec/ituh263enc.c
@@ -820,7 +820,7 @@ av_cold void ff_h263_encode_init(MPVMainEncContext *const m)
{
MPVEncContext *const s = &m->s;
- s->c.me.mv_penalty = ff_h263_get_mv_penalty(); // FIXME exact table for MSMPEG4 & H.263+
+ s->me.mv_penalty = ff_h263_get_mv_penalty(); // FIXME exact table for MSMPEG4 & H.263+
ff_h263dsp_init(&s->c.h263dsp);
diff --git a/libavcodec/motion_est.c b/libavcodec/motion_est.c
index e8c0e880bf..fc2ca993bc 100644
--- a/libavcodec/motion_est.c
+++ b/libavcodec/motion_est.c
@@ -110,7 +110,7 @@ static int get_flags(MotionEstContext *c, int direct, int chroma){
static av_always_inline int cmp_direct_inline(MPVEncContext *const s, const int x, const int y, const int subx, const int suby,
const int size, const int h, int ref_index, int src_index,
me_cmp_func cmp_func, me_cmp_func chroma_cmp_func, int qpel){
- MotionEstContext *const c = &s->c.me;
+ MotionEstContext *const c = &s->me;
const int stride= c->stride;
const int hx = subx + x * (1 << (1 + qpel));
const int hy = suby + y * (1 << (1 + qpel));
@@ -182,7 +182,7 @@ static av_always_inline int cmp_direct_inline(MPVEncContext *const s, const int
static av_always_inline int cmp_inline(MPVEncContext *const s, const int x, const int y, const int subx, const int suby,
const int size, const int h, int ref_index, int src_index,
me_cmp_func cmp_func, me_cmp_func chroma_cmp_func, int qpel, int chroma){
- MotionEstContext *const c = &s->c.me;
+ MotionEstContext *const c = &s->me;
const int stride= c->stride;
const int uvstride= c->uvstride;
const int dxy= subx + (suby<<(1+qpel)); //FIXME log2_subpel?
@@ -370,7 +370,7 @@ av_cold int ff_me_init(MotionEstContext *c, AVCodecContext *avctx,
void ff_me_init_pic(MPVEncContext *const s)
{
- MotionEstContext * const c= &s->c.me;
+ MotionEstContext *const c = &s->me;
/*FIXME s->c.no_rounding b_type*/
if (c->avctx->flags & AV_CODEC_FLAG_QPEL) {
@@ -411,7 +411,7 @@ static int sad_hpel_motion_search(MPVEncContext *const s,
int src_index, int ref_index,
int size, int h)
{
- MotionEstContext *const c = &s->c.me;
+ MotionEstContext *const c = &s->me;
const int penalty_factor= c->sub_penalty_factor;
int mx, my, dminh;
const uint8_t *pix, *ptr;
@@ -540,7 +540,7 @@ static inline void set_p_mv_tables(MPVEncContext *const s, int mx, int my, int m
*/
static inline void get_limits(MPVEncContext *const s, int x, int y, int bframe)
{
- MotionEstContext *const c = &s->c.me;
+ MotionEstContext *const c = &s->me;
int range= c->avctx->me_range >> (1 + !!(c->flags&FLAG_QPEL));
int max_range = MAX_MV >> (1 + !!(c->flags&FLAG_QPEL));
/*
@@ -587,7 +587,7 @@ static inline void init_mv4_ref(MotionEstContext *c){
static inline int h263_mv4_search(MPVEncContext *const s, int mx, int my, int shift)
{
- MotionEstContext *const c = &s->c.me;
+ MotionEstContext *const c = &s->me;
const int size= 1;
const int h=8;
int block;
@@ -730,7 +730,7 @@ static inline int h263_mv4_search(MPVEncContext *const s, int mx, int my, int sh
static inline void init_interlaced_ref(MPVEncContext *const s, int ref_index)
{
- MotionEstContext *const c = &s->c.me;
+ MotionEstContext *const c = &s->me;
c->ref[1+ref_index][0] = c->ref[0+ref_index][0] + s->c.linesize;
c->src[1][0] = c->src[0][0] + s->c.linesize;
@@ -745,7 +745,7 @@ static inline void init_interlaced_ref(MPVEncContext *const s, int ref_index)
static int interlaced_search(MPVEncContext *const s, int ref_index,
int16_t (*mv_tables[2][2])[2], uint8_t *field_select_tables[2], int mx, int my, int user_field_select)
{
- MotionEstContext *const c = &s->c.me;
+ MotionEstContext *const c = &s->me;
const int size=0;
const int h=8;
int block;
@@ -888,7 +888,7 @@ static inline int get_penalty_factor(int lambda, int lambda2, int type){
void ff_estimate_p_frame_motion(MPVEncContext *const s,
int mb_x, int mb_y)
{
- MotionEstContext *const c = &s->c.me;
+ MotionEstContext *const c = &s->me;
const uint8_t *pix, *ppix;
int sum, mx = 0, my = 0, dmin = 0;
int varc; ///< the variance of the block (sum of squared (p[y][x]-average))
@@ -1063,7 +1063,7 @@ void ff_estimate_p_frame_motion(MPVEncContext *const s,
int ff_pre_estimate_p_frame_motion(MPVEncContext *const s,
int mb_x, int mb_y)
{
- MotionEstContext *const c = &s->c.me;
+ MotionEstContext *const c = &s->me;
int mx, my, dmin;
int P[10][2];
const int shift = 1 + s->c.quarter_sample;
@@ -1116,7 +1116,7 @@ int ff_pre_estimate_p_frame_motion(MPVEncContext *const s,
static int estimate_motion_b(MPVEncContext *const s, int mb_x, int mb_y,
int16_t (*mv_table)[2], int ref_index, int f_code)
{
- MotionEstContext * const c= &s->c.me;
+ MotionEstContext *const c = &s->me;
int mx = 0, my = 0, dmin = 0;
int P[10][2];
const int shift= 1+s->c.quarter_sample;
@@ -1182,7 +1182,7 @@ static inline int check_bidir_mv(MPVEncContext *const s,
//FIXME optimize?
//FIXME better f_code prediction (max mv & distance)
//FIXME pointers
- MotionEstContext * const c= &s->c.me;
+ MotionEstContext *const c = &s->me;
const uint8_t * const mv_penalty_f = c->mv_penalty[s->c.f_code] + MAX_DMV; // f_code of the prev frame
const uint8_t * const mv_penalty_b = c->mv_penalty[s->c.b_code] + MAX_DMV; // f_code of the prev frame
int stride= c->stride;
@@ -1239,7 +1239,7 @@ static inline int check_bidir_mv(MPVEncContext *const s,
/* refine the bidir vectors in hq mode and return the score in both lq & hq mode*/
static inline int bidir_refine(MPVEncContext *const s, int mb_x, int mb_y)
{
- MotionEstContext * const c= &s->c.me;
+ MotionEstContext *const c = &s->me;
const int mot_stride = s->c.mb_stride;
const int xy = mb_y *mot_stride + mb_x;
int fbmin;
@@ -1386,7 +1386,7 @@ CHECK_BIDIR(-(a),-(b),-(c),-(d))
static inline int direct_search(MPVEncContext *const s, int mb_x, int mb_y)
{
- MotionEstContext * const c= &s->c.me;
+ MotionEstContext *const c = &s->me;
int P[10][2];
const int mot_stride = s->c.mb_stride;
const int mot_xy = mb_y*mot_stride + mb_x;
@@ -1489,7 +1489,7 @@ static inline int direct_search(MPVEncContext *const s, int mb_x, int mb_y)
void ff_estimate_b_frame_motion(MPVEncContext *const s,
int mb_x, int mb_y)
{
- MotionEstContext * const c= &s->c.me;
+ MotionEstContext *const c = &s->me;
int fmin, bmin, dmin, fbmin, bimin, fimin;
int type=0;
const int xy = mb_y*s->c.mb_stride + mb_x;
@@ -1601,7 +1601,7 @@ void ff_estimate_b_frame_motion(MPVEncContext *const s,
int ff_get_best_fcode(MPVMainEncContext *const m, const int16_t (*mv_table)[2], int type)
{
MPVEncContext *const s = &m->s;
- MotionEstContext *const c = &s->c.me;
+ MotionEstContext *const c = &s->me;
if (c->motion_est != FF_ME_ZERO) {
int score[8];
@@ -1656,7 +1656,7 @@ int ff_get_best_fcode(MPVMainEncContext *const m, const int16_t (*mv_table)[2],
void ff_fix_long_p_mvs(MPVEncContext *const s, int type)
{
- MotionEstContext * const c= &s->c.me;
+ MotionEstContext *const c = &s->me;
const int f_code= s->c.f_code;
int y, range;
av_assert0(s->c.pict_type == AV_PICTURE_TYPE_P);
@@ -1706,7 +1706,7 @@ void ff_fix_long_p_mvs(MPVEncContext *const s, int type)
void ff_fix_long_mvs(MPVEncContext *const s, uint8_t *field_select_table, int field_select,
int16_t (*mv_table)[2], int f_code, int type, int truncate)
{
- MotionEstContext * const c= &s->c.me;
+ MotionEstContext *const c = &s->me;
int y, h_range, v_range;
// RAL: 8 in MPEG-1, 16 in MPEG-4
diff --git a/libavcodec/motion_est_template.c b/libavcodec/motion_est_template.c
index 7c7e645625..aa669e0ee7 100644
--- a/libavcodec/motion_est_template.c
+++ b/libavcodec/motion_est_template.c
@@ -52,7 +52,7 @@ static int hpel_motion_search(MPVEncContext *const s,
int src_index, int ref_index,
int size, int h)
{
- MotionEstContext * const c= &s->c.me;
+ MotionEstContext *const c = &s->me;
const int mx = *mx_ptr;
const int my = *my_ptr;
const int penalty_factor= c->sub_penalty_factor;
@@ -166,7 +166,7 @@ static inline int get_mb_score(MPVEncContext *const s, int mx, int my,
int src_index, int ref_index, int size,
int h, int add_rate)
{
- MotionEstContext * const c= &s->c.me;
+ MotionEstContext *const c = &s->me;
const int penalty_factor= c->mb_penalty_factor;
const int flags= c->mb_flags;
const int qpel= flags & FLAG_QPEL;
@@ -209,7 +209,7 @@ static int qpel_motion_search(MPVEncContext *const s,
int src_index, int ref_index,
int size, int h)
{
- MotionEstContext * const c= &s->c.me;
+ MotionEstContext *const c = &s->me;
const int mx = *mx_ptr;
const int my = *my_ptr;
const int penalty_factor= c->sub_penalty_factor;
@@ -256,7 +256,7 @@ static int qpel_motion_search(MPVEncContext *const s,
int best_pos[8][2];
memset(best, 64, sizeof(int)*8);
- if(s->c.me.dia_size>=2){
+ if(s->me.dia_size>=2){
const int tl= score_map[(index-(1<<ME_MAP_SHIFT)-1)&(ME_MAP_SIZE-1)];
const int bl= score_map[(index+(1<<ME_MAP_SHIFT)-1)&(ME_MAP_SIZE-1)];
const int tr= score_map[(index-(1<<ME_MAP_SHIFT)+1)&(ME_MAP_SIZE-1)];
@@ -417,7 +417,7 @@ static av_always_inline int small_diamond_search(MPVEncContext *const s, int *be
int src_index, int ref_index, const int penalty_factor,
int size, int h, int flags)
{
- MotionEstContext * const c= &s->c.me;
+ MotionEstContext *const c = &s->me;
me_cmp_func cmpf, chroma_cmpf;
int next_dir=-1;
LOAD_COMMON
@@ -458,7 +458,7 @@ static int funny_diamond_search(MPVEncContext *const s, int *best, int dmin,
int src_index, int ref_index, const int penalty_factor,
int size, int h, int flags)
{
- MotionEstContext * const c= &s->c.me;
+ MotionEstContext *const c = &s->me;
me_cmp_func cmpf, chroma_cmpf;
int dia_size;
LOAD_COMMON
@@ -500,7 +500,7 @@ static int hex_search(MPVEncContext *const s, int *best, int dmin,
int src_index, int ref_index, const int penalty_factor,
int size, int h, int flags, int dia_size)
{
- MotionEstContext * const c= &s->c.me;
+ MotionEstContext *const c = &s->me;
me_cmp_func cmpf, chroma_cmpf;
LOAD_COMMON
LOAD_COMMON2
@@ -534,7 +534,7 @@ static int l2s_dia_search(MPVEncContext *const s, int *best, int dmin,
int src_index, int ref_index, const int penalty_factor,
int size, int h, int flags)
{
- MotionEstContext * const c= &s->c.me;
+ MotionEstContext *const c = &s->me;
me_cmp_func cmpf, chroma_cmpf;
LOAD_COMMON
LOAD_COMMON2
@@ -572,7 +572,7 @@ static int umh_search(MPVEncContext *const s, int *best, int dmin,
int src_index, int ref_index, const int penalty_factor,
int size, int h, int flags)
{
- MotionEstContext * const c= &s->c.me;
+ MotionEstContext *const c = &s->me;
me_cmp_func cmpf, chroma_cmpf;
LOAD_COMMON
LOAD_COMMON2
@@ -619,7 +619,7 @@ static int full_search(MPVEncContext *const s, int *best, int dmin,
int src_index, int ref_index, const int penalty_factor,
int size, int h, int flags)
{
- MotionEstContext * const c= &s->c.me;
+ MotionEstContext *const c = &s->me;
me_cmp_func cmpf, chroma_cmpf;
LOAD_COMMON
LOAD_COMMON2
@@ -682,7 +682,7 @@ static int sab_diamond_search(MPVEncContext *const s, int *best, int dmin,
int src_index, int ref_index, const int penalty_factor,
int size, int h, int flags)
{
- MotionEstContext * const c= &s->c.me;
+ MotionEstContext *const c = &s->me;
me_cmp_func cmpf, chroma_cmpf;
Minima minima[MAX_SAB_SIZE];
const int minima_count= FFABS(c->dia_size);
@@ -772,7 +772,7 @@ static int var_diamond_search(MPVEncContext *const s, int *best, int dmin,
int src_index, int ref_index, const int penalty_factor,
int size, int h, int flags)
{
- MotionEstContext * const c= &s->c.me;
+ MotionEstContext *const c = &s->me;
me_cmp_func cmpf, chroma_cmpf;
int dia_size;
LOAD_COMMON
@@ -832,7 +832,7 @@ static int var_diamond_search(MPVEncContext *const s, int *best, int dmin,
static av_always_inline int diamond_search(MPVEncContext *const s, int *best, int dmin,
int src_index, int ref_index, const int penalty_factor,
int size, int h, int flags){
- MotionEstContext * const c= &s->c.me;
+ MotionEstContext *const c = &s->me;
if(c->dia_size==-1)
return funny_diamond_search(s, best, dmin, src_index, ref_index, penalty_factor, size, h, flags);
else if(c->dia_size<-1)
@@ -861,7 +861,7 @@ static av_always_inline int epzs_motion_search_internal(MPVEncContext *const s,
int P[10][2], int src_index, int ref_index, const int16_t (*last_mv)[2],
int ref_mv_scale, int flags, int size, int h)
{
- MotionEstContext * const c= &s->c.me;
+ MotionEstContext *const c = &s->me;
int best[2]={0, 0}; /**< x and y coordinates of the best motion vector.
i.e. the difference between the position of the
block currently being encoded and the position of
@@ -979,7 +979,7 @@ int ff_epzs_motion_search(MPVEncContext *const s, int *mx_ptr, int *my_ptr,
const int16_t (*last_mv)[2], int ref_mv_scale,
int size, int h)
{
- MotionEstContext * const c= &s->c.me;
+ MotionEstContext *const c = &s->me;
//FIXME convert other functions in the same way if faster
if(c->flags==0 && h==16 && size==0){
return epzs_motion_search_internal(s, mx_ptr, my_ptr, P, src_index, ref_index, last_mv, ref_mv_scale, 0, 0, 16);
@@ -995,7 +995,7 @@ static int epzs_motion_search2(MPVEncContext *const s,
int src_index, int ref_index, const int16_t (*last_mv)[2],
int ref_mv_scale, const int size)
{
- MotionEstContext * const c= &s->c.me;
+ MotionEstContext *const c = &s->me;
int best[2]={0, 0};
int d, dmin;
unsigned map_generation;
diff --git a/libavcodec/mpeg12enc.c b/libavcodec/mpeg12enc.c
index 9d33f6a14a..8364368fde 100644
--- a/libavcodec/mpeg12enc.c
+++ b/libavcodec/mpeg12enc.c
@@ -1112,7 +1112,7 @@ static av_cold int encode_init(AVCodecContext *avctx)
m->encode_picture_header = mpeg1_encode_picture_header;
s->encode_mb = mpeg12_encode_mb;
- s->c.me.mv_penalty = mv_penalty;
+ s->me.mv_penalty = mv_penalty;
m->fcode_tab = fcode_tab + MAX_MV;
if (avctx->codec_id == AV_CODEC_ID_MPEG1VIDEO) {
s->min_qcoeff = -255;
diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c
index a65125cc13..efc9ee24d6 100644
--- a/libavcodec/mpegvideo.c
+++ b/libavcodec/mpegvideo.c
@@ -406,7 +406,6 @@ static av_cold void free_duplicate_context(MpegEncContext *s)
av_freep(&s->sc.edge_emu_buffer);
av_freep(&s->sc.scratchpad_buf);
- s->me.temp = s->me.scratchpad =
s->sc.obmc_scratchpad = NULL;
s->sc.linesize = 0;
@@ -428,13 +427,10 @@ static void backup_duplicate_context(MpegEncContext *bak, MpegEncContext *src)
{
#define COPY(a) bak->a = src->a
COPY(sc);
- COPY(me.map);
- COPY(me.score_map);
COPY(blocks);
COPY(block);
COPY(start_mb_y);
COPY(end_mb_y);
- COPY(me.map_generation);
COPY(ac_val_base);
COPY(ac_val[0]);
COPY(ac_val[1]);
@@ -636,8 +632,6 @@ static void clear_context(MpegEncContext *s)
s->ac_val[0] =
s->ac_val[1] =
s->ac_val[2] =NULL;
- s->me.scratchpad = NULL;
- s->me.temp = NULL;
memset(&s->sc, 0, sizeof(s->sc));
diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h
index 5301338188..1dcfca6b03 100644
--- a/libavcodec/mpegvideo.h
+++ b/libavcodec/mpegvideo.h
@@ -35,7 +35,6 @@
#include "h263dsp.h"
#include "hpeldsp.h"
#include "idctdsp.h"
-#include "motion_est.h"
#include "mpegpicture.h"
#include "qpeldsp.h"
#include "videodsp.h"
@@ -205,8 +204,6 @@ typedef struct MpegEncContext {
int last_mv[2][2][2]; ///< last MV, used for MV prediction in MPEG-1 & B-frame MPEG-4
int16_t direct_scale_mv[2][64]; ///< precomputed to avoid divisions in ff_mpeg4_set_direct_mv
- MotionEstContext me;
-
int no_rounding; /**< apply no rounding to motion compensation (MPEG-4, msmpeg4, ...)
for B-frames rounding mode is always 0 */
diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c
index 39b303b22a..c8206015dc 100644
--- a/libavcodec/mpegvideo_enc.c
+++ b/libavcodec/mpegvideo_enc.c
@@ -317,7 +317,7 @@ static av_cold int me_cmp_init(MPVMainEncContext *const m, AVCodecContext *avctx
int ret;
ff_me_cmp_init(&mecc, avctx);
- ret = ff_me_init(&s->c.me, avctx, &mecc, 1);
+ ret = ff_me_init(&s->me, avctx, &mecc, 1);
if (ret < 0)
return ret;
ret = ff_set_cmp(&mecc, me_cmp, m->frame_skip_cmp, 1);
@@ -431,7 +431,7 @@ static av_cold int init_buffers(MPVMainEncContext *const m, AVCodecContext *avct
#else
ALIGN = 128,
#endif
- ME_MAP_ALLOC_SIZE = FFALIGN(2 * ME_MAP_SIZE * sizeof(*s->c.me.map), ALIGN),
+ ME_MAP_ALLOC_SIZE = FFALIGN(2 * ME_MAP_SIZE * sizeof(*s->me.map), ALIGN),
DCT_ERROR_SIZE = FFALIGN(2 * sizeof(*s->dct_error_sum), ALIGN),
};
static_assert(FFMAX(ME_MAP_ALLOC_SIZE, DCT_ERROR_SIZE) * MAX_THREADS + ALIGN - 1 <= SIZE_MAX,
@@ -494,8 +494,8 @@ static av_cold int init_buffers(MPVMainEncContext *const m, AVCodecContext *avct
s2->mb_mean = (uint8_t*)(s2->mb_var + mb_array_size);
s2->lambda_table = s->lambda_table;
- s2->c.me.map = (uint32_t*)me_map;
- s2->c.me.score_map = s2->c.me.map + ME_MAP_SIZE;
+ s2->me.map = (uint32_t*)me_map;
+ s2->me.score_map = s2->me.map + ME_MAP_SIZE;
me_map += ME_MAP_ALLOC_SIZE;
s2->p_mv_table = tmp_mv_table;
@@ -2789,8 +2789,8 @@ static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
MPVEncContext *const s = *(void**)arg;
- s->c.me.pre_pass = 1;
- s->c.me.dia_size = s->c.avctx->pre_dia_size;
+ s->me.pre_pass = 1;
+ s->me.dia_size = s->c.avctx->pre_dia_size;
s->c.first_slice_line = 1;
for (s->c.mb_y = s->c.end_mb_y - 1; s->c.mb_y >= s->c.start_mb_y; s->c.mb_y--) {
for (s->c.mb_x = s->c.mb_width - 1; s->c.mb_x >=0 ; s->c.mb_x--)
@@ -2798,7 +2798,7 @@ static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
s->c.first_slice_line = 0;
}
- s->c.me.pre_pass = 0;
+ s->me.pre_pass = 0;
return 0;
}
@@ -2806,7 +2806,7 @@ static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
static int estimate_motion_thread(AVCodecContext *c, void *arg){
MPVEncContext *const s = *(void**)arg;
- s->c.me.dia_size = s->c.avctx->dia_size;
+ s->me.dia_size = s->c.avctx->dia_size;
s->c.first_slice_line = 1;
for (s->c.mb_y = s->c.start_mb_y; s->c.mb_y < s->c.end_mb_y; s->c.mb_y++) {
s->c.mb_x = 0; //for block init below
@@ -2844,7 +2844,7 @@ static int mb_var_thread(AVCodecContext *c, void *arg){
s->mb_var [s->c.mb_stride * mb_y + mb_x] = varc;
s->mb_mean[s->c.mb_stride * mb_y + mb_x] = (sum+128)>>8;
- s->c.me.mb_var_sum_temp += varc;
+ s->me.mb_var_sum_temp += varc;
}
}
return 0;
@@ -3586,9 +3586,9 @@ static int encode_thread(AVCodecContext *c, void *arg){
#define MERGE(field) dst->field += src->field; src->field=0
static void merge_context_after_me(MPVEncContext *const dst, MPVEncContext *const src)
{
- MERGE(c.me.scene_change_score);
- MERGE(c.me.mc_mb_var_sum_temp);
- MERGE(c.me.mb_var_sum_temp);
+ MERGE(me.scene_change_score);
+ MERGE(me.mc_mb_var_sum_temp);
+ MERGE(me.mb_var_sum_temp);
}
static void merge_context_after_encode(MPVEncContext *const dst, MPVEncContext *const src)
@@ -3681,8 +3681,8 @@ static int encode_picture(MPVMainEncContext *const m, const AVPacket *pkt)
int context_count = s->c.slice_context_count;
/* Reset the average MB variance */
- s->c.me.mb_var_sum_temp =
- s->c.me.mc_mb_var_sum_temp = 0;
+ s->me.mb_var_sum_temp =
+ s->me.mc_mb_var_sum_temp = 0;
/* we need to initialize some time vars before we can encode B-frames */
// RAL: Condition added for MPEG1VIDEO
@@ -3691,7 +3691,7 @@ static int encode_picture(MPVMainEncContext *const m, const AVPacket *pkt)
if (CONFIG_MPEG4_ENCODER && s->c.codec_id == AV_CODEC_ID_MPEG4)
ff_set_mpeg4_time(s);
- s->c.me.scene_change_score=0;
+ s->me.scene_change_score=0;
// s->lambda = s->c.cur_pic.ptr->quality; //FIXME qscale / ... stuff for ME rate distortion
@@ -3714,8 +3714,6 @@ static int encode_picture(MPVMainEncContext *const m, const AVPacket *pkt)
update_qscale(m);
}
- ff_me_init_pic(s);
-
s->c.mb_intra = 0; //for the rate distortion & bit compare functions
for (int i = 0; i < context_count; i++) {
MPVEncContext *const slice = s->c.enc_contexts[i];
@@ -3729,7 +3727,8 @@ static int encode_picture(MPVMainEncContext *const m, const AVPacket *pkt)
slice->lambda = s->lambda;
slice->lambda2 = s->lambda2;
}
- slice->c.me.temp = slice->c.me.scratchpad = slice->c.sc.scratchpad_buf;
+ slice->me.temp = slice->me.scratchpad = slice->c.sc.scratchpad_buf;
+ ff_me_init_pic(slice);
h = s->c.mb_height;
start = pkt->data + (size_t)(((int64_t) pkt->size) * slice->c.start_mb_y / h);
@@ -3767,11 +3766,11 @@ static int encode_picture(MPVMainEncContext *const m, const AVPacket *pkt)
for(i=1; i<context_count; i++){
merge_context_after_me(s, s->c.enc_contexts[i]);
}
- m->mc_mb_var_sum = s->c.me.mc_mb_var_sum_temp;
- m->mb_var_sum = s->c.me. mb_var_sum_temp;
+ m->mc_mb_var_sum = s->me.mc_mb_var_sum_temp;
+ m->mb_var_sum = s->me. mb_var_sum_temp;
emms_c();
- if (s->c.me.scene_change_score > m->scenechange_threshold &&
+ if (s->me.scene_change_score > m->scenechange_threshold &&
s->c.pict_type == AV_PICTURE_TYPE_P) {
s->c.pict_type = AV_PICTURE_TYPE_I;
for (int i = 0; i < s->c.mb_stride * s->c.mb_height; i++)
diff --git a/libavcodec/mpegvideoenc.h b/libavcodec/mpegvideoenc.h
index 6e76185c0c..787cfef11b 100644
--- a/libavcodec/mpegvideoenc.h
+++ b/libavcodec/mpegvideoenc.h
@@ -33,6 +33,7 @@
#include "libavutil/avassert.h"
#include "libavutil/opt.h"
#include "fdctdsp.h"
+#include "motion_est.h"
#include "mpegvideo.h"
#include "mpegvideoencdsp.h"
#include "pixblockdsp.h"
@@ -71,6 +72,7 @@ typedef struct MPVEncContext {
FDCTDSPContext fdsp;
MpegvideoEncDSPContext mpvencdsp;
PixblockDSPContext pdsp;
+ MotionEstContext me;
int16_t (*p_mv_table)[2]; ///< MV table (1MV per MB) P-frame
int16_t (*b_forw_mv_table)[2]; ///< MV table (1MV per MB) forward mode B-frame
@@ -347,7 +349,7 @@ FF_MPV_OPT_CMP_FUNC, \
#define FF_MPV_COMMON_MOTION_EST_OPTS \
{ "mv0", "always try a mb with mv=<0,0>", 0, AV_OPT_TYPE_CONST, { .i64 = FF_MPV_FLAG_MV0 }, 0, 0, FF_MPV_OPT_FLAGS, .unit = "mpv_flags" },\
-{"motion_est", "motion estimation algorithm", FF_MPV_OFFSET(c.me.motion_est), AV_OPT_TYPE_INT, {.i64 = FF_ME_EPZS }, FF_ME_ZERO, FF_ME_XONE, FF_MPV_OPT_FLAGS, .unit = "motion_est" }, \
+{"motion_est", "motion estimation algorithm", FF_MPV_OFFSET(me.motion_est), AV_OPT_TYPE_INT, {.i64 = FF_ME_EPZS }, FF_ME_ZERO, FF_ME_XONE, FF_MPV_OPT_FLAGS, .unit = "motion_est" }, \
{ "zero", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_ZERO }, 0, 0, FF_MPV_OPT_FLAGS, .unit = "motion_est" }, \
{ "epzs", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_EPZS }, 0, 0, FF_MPV_OPT_FLAGS, .unit = "motion_est" }, \
{ "xone", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_XONE }, 0, 0, FF_MPV_OPT_FLAGS, .unit = "motion_est" }, \
diff --git a/libavcodec/snowenc.c b/libavcodec/snowenc.c
index bce962e93f..5b78b0edbf 100644
--- a/libavcodec/snowenc.c
+++ b/libavcodec/snowenc.c
@@ -217,7 +217,7 @@ static av_cold int encode_init(AVCodecContext *avctx)
mcf(12,12)
ff_me_cmp_init(&enc->mecc, avctx);
- ret = ff_me_init(&mpv->c.me, avctx, &enc->mecc, 0);
+ ret = ff_me_init(&mpv->me, avctx, &enc->mecc, 0);
if (ret < 0)
return ret;
ff_mpegvideoencdsp_init(&enc->mpvencdsp, avctx);
@@ -232,15 +232,15 @@ static av_cold int encode_init(AVCodecContext *avctx)
enc->m.lmax = avctx->mb_lmax;
mpv->c.mb_num = (avctx->width * avctx->height + 255) / 256; // For ratecontrol
- mpv->c.me.temp =
- mpv->c.me.scratchpad = av_calloc(avctx->width + 64, 2*16*2*sizeof(uint8_t));
+ mpv->me.temp =
+ mpv->me.scratchpad = av_calloc(avctx->width + 64, 2*16*2*sizeof(uint8_t));
mpv->c.sc.obmc_scratchpad = av_mallocz(MB_SIZE*MB_SIZE*12*sizeof(uint32_t));
- mpv->c.me.map = av_mallocz(2 * ME_MAP_SIZE * sizeof(*mpv->c.me.map));
- if (!mpv->c.me.scratchpad || !mpv->c.me.map || !mpv->c.sc.obmc_scratchpad)
+ mpv->me.map = av_mallocz(2 * ME_MAP_SIZE * sizeof(*mpv->me.map));
+ if (!mpv->me.scratchpad || !mpv->me.map || !mpv->c.sc.obmc_scratchpad)
return AVERROR(ENOMEM);
- mpv->c.me.score_map = mpv->c.me.map + ME_MAP_SIZE;
+ mpv->me.score_map = mpv->me.map + ME_MAP_SIZE;
- mpv->c.me.mv_penalty = ff_h263_get_mv_penalty();
+ mpv->me.mv_penalty = ff_h263_get_mv_penalty();
s->max_ref_frames = av_clip(avctx->refs, 1, MAX_REF_FRAMES);
@@ -369,7 +369,7 @@ static inline int get_penalty_factor(int lambda, int lambda2, int type){
static int encode_q_branch(SnowEncContext *enc, int level, int x, int y)
{
SnowContext *const s = &enc->com;
- MotionEstContext *const c = &enc->m.s.c.me;
+ MotionEstContext *const c = &enc->m.s.me;
uint8_t p_buffer[1024];
uint8_t i_buffer[1024];
uint8_t p_state[sizeof(s->block_state)];
@@ -840,12 +840,12 @@ static int get_block_rd(SnowEncContext *enc, int mb_x, int mb_y,
distortion = 0;
for(i=0; i<4; i++){
int off = sx+16*(i&1) + (sy+16*(i>>1))*ref_stride;
- distortion += enc->m.s.c.me.me_cmp[0](&enc->m.s, src + off, dst + off, ref_stride, 16);
+ distortion += enc->m.s.me.me_cmp[0](&enc->m.s, src + off, dst + off, ref_stride, 16);
}
}
}else{
av_assert2(block_w==8);
- distortion = enc->m.s.c.me.me_cmp[0](&enc->m.s, src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, block_w*2);
+ distortion = enc->m.s.me.me_cmp[0](&enc->m.s, src + sx + sy*ref_stride, dst + sx + sy*ref_stride, ref_stride, block_w*2);
}
if(plane_index==0){
@@ -911,7 +911,7 @@ static int get_4block_rd(SnowEncContext *enc, int mb_x, int mb_y, int plane_inde
}
av_assert1(block_w== 8 || block_w==16);
- distortion += enc->m.s.c.me.me_cmp[block_w==8](&enc->m.s, src + x + y*ref_stride, dst + x + y*ref_stride, ref_stride, block_h);
+ distortion += enc->m.s.me.me_cmp[block_w==8](&enc->m.s, src + x + y*ref_stride, dst + x + y*ref_stride, ref_stride, block_h);
}
if(plane_index==0){
@@ -1866,9 +1866,9 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
mpv->c.b8_stride = 2 * mpv->c.mb_width + 1;
mpv->c.f_code = 1;
mpv->c.pict_type = pic->pict_type;
- mpv->c.me.motion_est = enc->motion_est;
- mpv->c.me.scene_change_score = 0;
- mpv->c.me.dia_size = avctx->dia_size;
+ mpv->me.motion_est = enc->motion_est;
+ mpv->me.scene_change_score = 0;
+ mpv->me.dia_size = avctx->dia_size;
mpv->c.quarter_sample = (s->avctx->flags & AV_CODEC_FLAG_QPEL)!=0;
mpv->c.out_format = FMT_H263;
mpv->c.unrestricted_mv = 1;
@@ -1937,7 +1937,7 @@ redo_frame:
if( plane_index==0
&& pic->pict_type == AV_PICTURE_TYPE_P
&& !(avctx->flags&AV_CODEC_FLAG_PASS2)
- && mpv->c.me.scene_change_score > enc->scenechange_threshold) {
+ && mpv->me.scene_change_score > enc->scenechange_threshold) {
ff_init_range_encoder(c, pkt->data, pkt->size);
ff_build_rac_states(c, (1LL<<32)/20, 256-8);
pic->pict_type= AV_PICTURE_TYPE_I;
@@ -2092,9 +2092,9 @@ static av_cold int encode_end(AVCodecContext *avctx)
av_freep(&s->ref_scores[i]);
}
- enc->m.s.c.me.temp = NULL;
- av_freep(&enc->m.s.c.me.scratchpad);
- av_freep(&enc->m.s.c.me.map);
+ enc->m.s.me.temp = NULL;
+ av_freep(&enc->m.s.me.scratchpad);
+ av_freep(&enc->m.s.me.map);
av_freep(&enc->m.s.c.sc.obmc_scratchpad);
av_freep(&avctx->stats_out);
diff --git a/libavcodec/svq1enc.c b/libavcodec/svq1enc.c
index ae75dbdd89..9d8b0d496f 100644
--- a/libavcodec/svq1enc.c
+++ b/libavcodec/svq1enc.c
@@ -339,7 +339,7 @@ static int svq1_encode_plane(SVQ1EncContext *s, int plane,
s2->b8_stride = 2 * s2->mb_width + 1;
s2->f_code = 1;
s2->pict_type = s->pict_type;
- s2->me.scene_change_score = 0;
+ s->m.me.scene_change_score = 0;
// s2->out_format = FMT_H263;
// s2->unrestricted_mv = 1;
s->m.lambda = s->quality;
@@ -374,7 +374,7 @@ static int svq1_encode_plane(SVQ1EncContext *s, int plane,
s2->mb_stride + 1;
ff_me_init_pic(&s->m);
- s2->me.dia_size = s->avctx->dia_size;
+ s->m.me.dia_size = s->avctx->dia_size;
s2->first_slice_line = 1;
for (y = 0; y < block_height; y++) {
s->m.new_pic->data[0] = src - y * 16 * stride; // ugly
@@ -539,8 +539,8 @@ static av_cold int svq1_encode_end(AVCodecContext *avctx)
s->rd_total / (double)(avctx->width * avctx->height *
avctx->frame_num));
- av_freep(&s->m.c.me.scratchpad);
- av_freep(&s->m.c.me.map);
+ av_freep(&s->m.me.scratchpad);
+ av_freep(&s->m.me.map);
av_freep(&s->mb_type);
av_freep(&s->dummy);
av_freep(&s->scratchbuf);
@@ -585,7 +585,7 @@ static av_cold int svq1_encode_init(AVCodecContext *avctx)
ff_hpeldsp_init(&s->hdsp, avctx->flags);
ff_me_cmp_init(&s->mecc, avctx);
- ret = ff_me_init(&s->m.c.me, avctx, &s->mecc, 0);
+ ret = ff_me_init(&s->m.me, avctx, &s->mecc, 0);
if (ret < 0)
return ret;
ff_mpegvideoencdsp_init(&s->m.mpvencdsp, avctx);
@@ -613,24 +613,24 @@ static av_cold int svq1_encode_init(AVCodecContext *avctx)
return ret;
s->m.c.picture_structure = PICT_FRAME;
- s->m.c.me.temp =
- s->m.c.me.scratchpad = av_mallocz((avctx->width + 64) *
+ s->m.me.temp =
+ s->m.me.scratchpad = av_mallocz((avctx->width + 64) *
2 * 16 * 2 * sizeof(uint8_t));
s->mb_type = av_mallocz((s->y_block_width + 1) *
s->y_block_height * sizeof(int16_t));
s->dummy = av_mallocz((s->y_block_width + 1) *
s->y_block_height * sizeof(int32_t));
- s->m.c.me.map = av_mallocz(2 * ME_MAP_SIZE * sizeof(*s->m.c.me.map));
+ s->m.me.map = av_mallocz(2 * ME_MAP_SIZE * sizeof(*s->m.me.map));
s->m.new_pic = av_frame_alloc();
- if (!s->m.c.me.scratchpad || !s->m.c.me.map ||
+ if (!s->m.me.scratchpad || !s->m.me.map ||
!s->mb_type || !s->dummy || !s->m.new_pic)
return AVERROR(ENOMEM);
- s->m.c.me.score_map = s->m.c.me.map + ME_MAP_SIZE;
+ s->m.me.score_map = s->m.me.map + ME_MAP_SIZE;
ff_svq1enc_init(&s->svq1encdsp);
- s->m.c.me.mv_penalty = ff_h263_get_mv_penalty();
+ s->m.me.mv_penalty = ff_h263_get_mv_penalty();
return write_ident(avctx, s->avctx->flags & AV_CODEC_FLAG_BITEXACT ? "Lavc" : LIBAVCODEC_IDENT);
}
@@ -718,7 +718,7 @@ static int svq1_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
#define OFFSET(x) offsetof(struct SVQ1EncContext, x)
#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
static const AVOption options[] = {
- { "motion-est", "Motion estimation algorithm", OFFSET(m.c.me.motion_est), AV_OPT_TYPE_INT, { .i64 = FF_ME_EPZS }, FF_ME_ZERO, FF_ME_XONE, VE, .unit = "motion-est"},
+ { "motion-est", "Motion estimation algorithm", OFFSET(m.me.motion_est), AV_OPT_TYPE_INT, { .i64 = FF_ME_EPZS }, FF_ME_ZERO, FF_ME_XONE, VE, .unit = "motion-est"},
{ "zero", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_ZERO }, 0, 0, FF_MPV_OPT_FLAGS, .unit = "motion-est" },
{ "epzs", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_EPZS }, 0, 0, FF_MPV_OPT_FLAGS, .unit = "motion-est" },
{ "xone", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_XONE }, 0, 0, FF_MPV_OPT_FLAGS, .unit = "motion-est" },
More information about the ffmpeg-cvslog
mailing list