Mercurial > libavcodec.hg
annotate motion_est.c @ 5205:922bb0564bd3 libavcodec
Remove more useless parentheses.
author | vitor |
---|---|
date | Thu, 05 Jul 2007 03:01:53 +0000 |
parents | 0244bba24b43 |
children | 470601203f44 |
rev | line source |
---|---|
0 | 1 /* |
2967 | 2 * Motion estimation |
429 | 3 * Copyright (c) 2000,2001 Fabrice Bellard. |
1739
07a484280a82
copyright year update of the files i touched and remembered, things look annoyingly unmaintained otherwise
michael
parents:
1729
diff
changeset
|
4 * Copyright (c) 2002-2004 Michael Niedermayer |
2967 | 5 * |
0 | 6 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3575
diff
changeset
|
7 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3575
diff
changeset
|
8 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3575
diff
changeset
|
9 * FFmpeg is free software; you can redistribute it and/or |
429 | 10 * modify it under the terms of the GNU Lesser General Public |
11 * License as published by the Free Software Foundation; either | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3575
diff
changeset
|
12 * version 2.1 of the License, or (at your option) any later version. |
0 | 13 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3575
diff
changeset
|
14 * FFmpeg is distributed in the hope that it will be useful, |
0 | 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
429 | 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
17 * Lesser General Public License for more details. | |
0 | 18 * |
429 | 19 * You should have received a copy of the GNU Lesser General Public |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3575
diff
changeset
|
20 * License along with FFmpeg; if not, write to the Free Software |
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
3026
diff
changeset
|
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
277
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
275
diff
changeset
|
22 * |
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
275
diff
changeset
|
23 * new Motion Estimation (X1/EPZS) by Michael Niedermayer <michaelni@gmx.at> |
0 | 24 */ |
2967 | 25 |
1106 | 26 /** |
27 * @file motion_est.c | |
28 * Motion estimation. | |
29 */ | |
2967 | 30 |
0 | 31 #include <stdlib.h> |
32 #include <stdio.h> | |
1426 | 33 #include <limits.h> |
0 | 34 #include "avcodec.h" |
35 #include "dsputil.h" | |
36 #include "mpegvideo.h" | |
37 | |
1950 | 38 #undef NDEBUG |
39 #include <assert.h> | |
936 | 40 |
455 | 41 #define SQ(a) ((a)*(a)) |
284 | 42 |
455 | 43 #define P_LEFT P[1] |
44 #define P_TOP P[2] | |
45 #define P_TOPRIGHT P[3] | |
46 #define P_MEDIAN P[4] | |
47 #define P_MV1 P[9] | |
48 | |
936 | 49 static inline int sad_hpel_motion_search(MpegEncContext * s, |
2979 | 50 int *mx_ptr, int *my_ptr, int dmin, |
1950 | 51 int src_index, int ref_index, |
52 int size, int h); | |
0 | 53 |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
54 static inline int update_map_generation(MotionEstContext *c) |
936 | 55 { |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
56 c->map_generation+= 1<<(ME_MAP_MV_BITS*2); |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
57 if(c->map_generation==0){ |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
58 c->map_generation= 1<<(ME_MAP_MV_BITS*2); |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
59 memset(c->map, 0, sizeof(uint32_t)*ME_MAP_SIZE); |
936 | 60 } |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
61 return c->map_generation; |
936 | 62 } |
63 | |
948 | 64 /* shape adaptive search stuff */ |
65 typedef struct Minima{ | |
66 int height; | |
67 int x, y; | |
68 int checked; | |
69 }Minima; | |
936 | 70 |
948 | 71 static int minima_cmp(const void *a, const void *b){ |
1057 | 72 const Minima *da = (const Minima *) a; |
73 const Minima *db = (const Minima *) b; | |
2967 | 74 |
948 | 75 return da->height - db->height; |
76 } | |
1950 | 77 |
78 #define FLAG_QPEL 1 //must be 1 | |
79 #define FLAG_CHROMA 2 | |
80 #define FLAG_DIRECT 4 | |
936 | 81 |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
82 static inline void init_ref(MotionEstContext *c, uint8_t *src[3], uint8_t *ref[3], uint8_t *ref2[3], int x, int y, int ref_index){ |
1950 | 83 const int offset[3]= { |
84 y*c-> stride + x, | |
85 ((y*c->uvstride + x)>>1), | |
86 ((y*c->uvstride + x)>>1), | |
87 }; | |
88 int i; | |
89 for(i=0; i<3; i++){ | |
90 c->src[0][i]= src [i] + offset[i]; | |
91 c->ref[0][i]= ref [i] + offset[i]; | |
92 } | |
93 if(ref_index){ | |
94 for(i=0; i<3; i++){ | |
95 c->ref[ref_index][i]= ref2[i] + offset[i]; | |
96 } | |
97 } | |
936 | 98 } |
99 | |
2015
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
100 static int get_flags(MotionEstContext *c, int direct, int chroma){ |
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
101 return ((c->avctx->flags&CODEC_FLAG_QPEL) ? FLAG_QPEL : 0) |
2967 | 102 + (direct ? FLAG_DIRECT : 0) |
1950 | 103 + (chroma ? FLAG_CHROMA : 0); |
104 } | |
1708 | 105 |
4758 | 106 /*! \brief compares a block (either a full macroblock or a partition thereof) |
107 against a proposed motion-compensated prediction of that block | |
4757
e511820c4a97
Add doxy comments, based on Loren's explanations posted here:
gpoirier
parents:
4594
diff
changeset
|
108 */ |
4283
d6f83e2f8804
rename always_inline to av_always_inline and move to common.h
mru
parents:
4259
diff
changeset
|
109 static av_always_inline int cmp(MpegEncContext *s, const int x, const int y, const int subx, const int suby, |
1950 | 110 const int size, const int h, int ref_index, int src_index, |
111 me_cmp_func cmp_func, me_cmp_func chroma_cmp_func, const int flags){ | |
112 MotionEstContext * const c= &s->me; | |
113 const int stride= c->stride; | |
114 const int uvstride= c->uvstride; | |
115 const int qpel= flags&FLAG_QPEL; | |
116 const int chroma= flags&FLAG_CHROMA; | |
117 const int dxy= subx + (suby<<(1+qpel)); //FIXME log2_subpel? | |
118 const int hx= subx + (x<<(1+qpel)); | |
119 const int hy= suby + (y<<(1+qpel)); | |
120 uint8_t * const * const ref= c->ref[ref_index]; | |
121 uint8_t * const * const src= c->src[src_index]; | |
122 int d; | |
123 //FIXME check chroma 4mv, (no crashes ...) | |
124 if(flags&FLAG_DIRECT){ | |
4318
ad27265d0c15
i think this if() is useless lets abuse our users to test this ;)
michael
parents:
4317
diff
changeset
|
125 assert(x >= c->xmin && hx <= c->xmax<<(qpel+1) && y >= c->ymin && hy <= c->ymax<<(qpel+1)); |
1950 | 126 if(x >= c->xmin && hx <= c->xmax<<(qpel+1) && y >= c->ymin && hy <= c->ymax<<(qpel+1)){ |
127 const int time_pp= s->pp_time; | |
128 const int time_pb= s->pb_time; | |
129 const int mask= 2*qpel+1; | |
130 if(s->mv_type==MV_TYPE_8X8){ | |
131 int i; | |
132 for(i=0; i<4; i++){ | |
133 int fx = c->direct_basis_mv[i][0] + hx; | |
134 int fy = c->direct_basis_mv[i][1] + hy; | |
135 int bx = hx ? fx - c->co_located_mv[i][0] : c->co_located_mv[i][0]*(time_pb - time_pp)/time_pp + ((i &1)<<(qpel+4)); | |
136 int by = hy ? fy - c->co_located_mv[i][1] : c->co_located_mv[i][1]*(time_pb - time_pp)/time_pp + ((i>>1)<<(qpel+4)); | |
137 int fxy= (fx&mask) + ((fy&mask)<<(qpel+1)); | |
138 int bxy= (bx&mask) + ((by&mask)<<(qpel+1)); | |
2967 | 139 |
1950 | 140 uint8_t *dst= c->temp + 8*(i&1) + 8*stride*(i>>1); |
141 if(qpel){ | |
142 c->qpel_put[1][fxy](dst, ref[0] + (fx>>2) + (fy>>2)*stride, stride); | |
143 c->qpel_avg[1][bxy](dst, ref[8] + (bx>>2) + (by>>2)*stride, stride); | |
144 }else{ | |
145 c->hpel_put[1][fxy](dst, ref[0] + (fx>>1) + (fy>>1)*stride, stride, 8); | |
146 c->hpel_avg[1][bxy](dst, ref[8] + (bx>>1) + (by>>1)*stride, stride, 8); | |
147 } | |
148 } | |
149 }else{ | |
150 int fx = c->direct_basis_mv[0][0] + hx; | |
151 int fy = c->direct_basis_mv[0][1] + hy; | |
152 int bx = hx ? fx - c->co_located_mv[0][0] : (c->co_located_mv[0][0]*(time_pb - time_pp)/time_pp); | |
153 int by = hy ? fy - c->co_located_mv[0][1] : (c->co_located_mv[0][1]*(time_pb - time_pp)/time_pp); | |
154 int fxy= (fx&mask) + ((fy&mask)<<(qpel+1)); | |
155 int bxy= (bx&mask) + ((by&mask)<<(qpel+1)); | |
2967 | 156 |
1950 | 157 if(qpel){ |
158 c->qpel_put[1][fxy](c->temp , ref[0] + (fx>>2) + (fy>>2)*stride , stride); | |
159 c->qpel_put[1][fxy](c->temp + 8 , ref[0] + (fx>>2) + (fy>>2)*stride + 8 , stride); | |
160 c->qpel_put[1][fxy](c->temp + 8*stride, ref[0] + (fx>>2) + (fy>>2)*stride + 8*stride, stride); | |
161 c->qpel_put[1][fxy](c->temp + 8 + 8*stride, ref[0] + (fx>>2) + (fy>>2)*stride + 8 + 8*stride, stride); | |
162 c->qpel_avg[1][bxy](c->temp , ref[8] + (bx>>2) + (by>>2)*stride , stride); | |
163 c->qpel_avg[1][bxy](c->temp + 8 , ref[8] + (bx>>2) + (by>>2)*stride + 8 , stride); | |
164 c->qpel_avg[1][bxy](c->temp + 8*stride, ref[8] + (bx>>2) + (by>>2)*stride + 8*stride, stride); | |
165 c->qpel_avg[1][bxy](c->temp + 8 + 8*stride, ref[8] + (bx>>2) + (by>>2)*stride + 8 + 8*stride, stride); | |
2967 | 166 }else{ |
1950 | 167 assert((fx>>1) + 16*s->mb_x >= -16); |
168 assert((fy>>1) + 16*s->mb_y >= -16); | |
169 assert((fx>>1) + 16*s->mb_x <= s->width); | |
170 assert((fy>>1) + 16*s->mb_y <= s->height); | |
171 assert((bx>>1) + 16*s->mb_x >= -16); | |
172 assert((by>>1) + 16*s->mb_y >= -16); | |
173 assert((bx>>1) + 16*s->mb_x <= s->width); | |
174 assert((by>>1) + 16*s->mb_y <= s->height); | |
936 | 175 |
1950 | 176 c->hpel_put[0][fxy](c->temp, ref[0] + (fx>>1) + (fy>>1)*stride, stride, 16); |
177 c->hpel_avg[0][bxy](c->temp, ref[8] + (bx>>1) + (by>>1)*stride, stride, 16); | |
178 } | |
179 } | |
180 d = cmp_func(s, c->temp, src[0], stride, 16); | |
181 }else | |
182 d= 256*256*256*32; | |
183 }else{ | |
2834 | 184 int uvdxy; /* no, it might not be used uninitialized */ |
1950 | 185 if(dxy){ |
186 if(qpel){ | |
187 c->qpel_put[size][dxy](c->temp, ref[0] + x + y*stride, stride); //FIXME prototype (add h) | |
188 if(chroma){ | |
189 int cx= hx/2; | |
190 int cy= hy/2; | |
191 cx= (cx>>1)|(cx&1); | |
192 cy= (cy>>1)|(cy&1); | |
193 uvdxy= (cx&1) + 2*(cy&1); | |
194 //FIXME x/y wrong, but mpeg4 qpel is sick anyway, we should drop as much of it as possible in favor for h264 | |
195 } | |
196 }else{ | |
197 c->hpel_put[size][dxy](c->temp, ref[0] + x + y*stride, stride, h); | |
198 if(chroma) | |
199 uvdxy= dxy | (x&1) | (2*(y&1)); | |
200 } | |
2967 | 201 d = cmp_func(s, c->temp, src[0], stride, h); |
1950 | 202 }else{ |
2967 | 203 d = cmp_func(s, src[0], ref[0] + x + y*stride, stride, h); |
1950 | 204 if(chroma) |
205 uvdxy= (x&1) + 2*(y&1); | |
206 } | |
207 if(chroma){ | |
208 uint8_t * const uvtemp= c->temp + 16*stride; | |
209 c->hpel_put[size+1][uvdxy](uvtemp , ref[1] + (x>>1) + (y>>1)*uvstride, uvstride, h>>1); | |
210 c->hpel_put[size+1][uvdxy](uvtemp+8, ref[2] + (x>>1) + (y>>1)*uvstride, uvstride, h>>1); | |
2967 | 211 d += chroma_cmp_func(s, uvtemp , src[1], uvstride, h>>1); |
212 d += chroma_cmp_func(s, uvtemp+8, src[2], uvstride, h>>1); | |
1950 | 213 } |
214 } | |
215 #if 0 | |
216 if(full_pel){ | |
217 const int index= (((y)<<ME_MAP_SHIFT) + (x))&(ME_MAP_SIZE-1); | |
218 score_map[index]= d; | |
219 } | |
936 | 220 |
1950 | 221 d += (c->mv_penalty[hx - c->pred_x] + c->mv_penalty[hy - c->pred_y])*c->penalty_factor; |
222 #endif | |
223 return d; | |
936 | 224 } |
225 | |
226 #include "motion_est_template.c" | |
227 | |
2075 | 228 static int zero_cmp(void *s, uint8_t *a, uint8_t *b, int stride, int h){ |
229 return 0; | |
230 } | |
231 | |
232 static void zero_hpel(uint8_t *a, const uint8_t *b, int stride, int h){ | |
233 } | |
234 | |
936 | 235 void ff_init_me(MpegEncContext *s){ |
1962 | 236 MotionEstContext * const c= &s->me; |
4305
4e75fbc983c9
warn user if the selected diamond size is larger then the motion estimation score cache size
michael
parents:
4304
diff
changeset
|
237 int cache_size= FFMIN(ME_MAP_SIZE>>ME_MAP_SHIFT, 1<<ME_MAP_SHIFT); |
4e75fbc983c9
warn user if the selected diamond size is larger then the motion estimation score cache size
michael
parents:
4304
diff
changeset
|
238 int dia_size= FFMAX(FFABS(s->avctx->dia_size)&255, FFABS(s->avctx->pre_dia_size)&255); |
4307 | 239 c->avctx= s->avctx; |
4305
4e75fbc983c9
warn user if the selected diamond size is larger then the motion estimation score cache size
michael
parents:
4304
diff
changeset
|
240 |
4e75fbc983c9
warn user if the selected diamond size is larger then the motion estimation score cache size
michael
parents:
4304
diff
changeset
|
241 if(cache_size < 2*dia_size && !c->stride){ |
4e75fbc983c9
warn user if the selected diamond size is larger then the motion estimation score cache size
michael
parents:
4304
diff
changeset
|
242 av_log(s->avctx, AV_LOG_INFO, "ME_MAP size may be a little small for the selected diamond size\n"); |
4e75fbc983c9
warn user if the selected diamond size is larger then the motion estimation score cache size
michael
parents:
4304
diff
changeset
|
243 } |
1962 | 244 |
2015
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
245 ff_set_cmp(&s->dsp, s->dsp.me_pre_cmp, c->avctx->me_pre_cmp); |
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
246 ff_set_cmp(&s->dsp, s->dsp.me_cmp, c->avctx->me_cmp); |
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
247 ff_set_cmp(&s->dsp, s->dsp.me_sub_cmp, c->avctx->me_sub_cmp); |
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
248 ff_set_cmp(&s->dsp, s->dsp.mb_cmp, c->avctx->mb_cmp); |
2967 | 249 |
2015
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
250 c->flags = get_flags(c, 0, c->avctx->me_cmp &FF_CMP_CHROMA); |
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
251 c->sub_flags= get_flags(c, 0, c->avctx->me_sub_cmp&FF_CMP_CHROMA); |
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
252 c->mb_flags = get_flags(c, 0, c->avctx->mb_cmp &FF_CMP_CHROMA); |
936 | 253 |
1962 | 254 /*FIXME s->no_rounding b_type*/ |
936 | 255 if(s->flags&CODEC_FLAG_QPEL){ |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
256 c->sub_motion_search= qpel_motion_search; |
1962 | 257 c->qpel_avg= s->dsp.avg_qpel_pixels_tab; |
258 if(s->no_rounding) c->qpel_put= s->dsp.put_no_rnd_qpel_pixels_tab; | |
259 else c->qpel_put= s->dsp.put_qpel_pixels_tab; | |
936 | 260 }else{ |
2015
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
261 if(c->avctx->me_sub_cmp&FF_CMP_CHROMA) |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
262 c->sub_motion_search= hpel_motion_search; |
2967 | 263 else if( c->avctx->me_sub_cmp == FF_CMP_SAD |
264 && c->avctx-> me_cmp == FF_CMP_SAD | |
2015
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
265 && c->avctx-> mb_cmp == FF_CMP_SAD) |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
266 c->sub_motion_search= sad_hpel_motion_search; // 2050 vs. 2450 cycles |
936 | 267 else |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
268 c->sub_motion_search= hpel_motion_search; |
936 | 269 } |
2075 | 270 c->hpel_avg= s->dsp.avg_pixels_tab; |
271 if(s->no_rounding) c->hpel_put= s->dsp.put_no_rnd_pixels_tab; | |
272 else c->hpel_put= s->dsp.put_pixels_tab; | |
273 | |
1950 | 274 if(s->linesize){ |
2967 | 275 c->stride = s->linesize; |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
276 c->uvstride= s->uvlinesize; |
954 | 277 }else{ |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
278 c->stride = 16*s->mb_width + 32; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
279 c->uvstride= 8*s->mb_width + 16; |
1013 | 280 } |
1962 | 281 |
5127 | 282 /* 8x8 fullpel search would need a 4x4 chroma compare, which we do |
283 * not have yet, and even if we had, the motion estimation code | |
284 * does not expect it. */ | |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2184
diff
changeset
|
285 if(s->codec_id != CODEC_ID_SNOW){ |
2643
8e42a0463f68
fix segfault with 'ffmpeg -i 1.avi -cmp 257 -4mv 2.avi'
michael
parents:
2628
diff
changeset
|
286 if((c->avctx->me_cmp&FF_CMP_CHROMA)/* && !s->dsp.me_cmp[2]*/){ |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2184
diff
changeset
|
287 s->dsp.me_cmp[2]= zero_cmp; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2184
diff
changeset
|
288 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2184
diff
changeset
|
289 if((c->avctx->me_sub_cmp&FF_CMP_CHROMA) && !s->dsp.me_sub_cmp[2]){ |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2184
diff
changeset
|
290 s->dsp.me_sub_cmp[2]= zero_cmp; |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2184
diff
changeset
|
291 } |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2184
diff
changeset
|
292 c->hpel_put[2][0]= c->hpel_put[2][1]= |
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2184
diff
changeset
|
293 c->hpel_put[2][2]= c->hpel_put[2][3]= zero_hpel; |
2075 | 294 } |
295 | |
2327
5e5cf598a48b
H.261 encoder by (Maarten Daniels <maarten dot daniels at luc dot ac dot be>)
michael
parents:
2302
diff
changeset
|
296 if(s->codec_id == CODEC_ID_H261){ |
5e5cf598a48b
H.261 encoder by (Maarten Daniels <maarten dot daniels at luc dot ac dot be>)
michael
parents:
2302
diff
changeset
|
297 c->sub_motion_search= no_sub_motion_search; |
5e5cf598a48b
H.261 encoder by (Maarten Daniels <maarten dot daniels at luc dot ac dot be>)
michael
parents:
2302
diff
changeset
|
298 } |
5e5cf598a48b
H.261 encoder by (Maarten Daniels <maarten dot daniels at luc dot ac dot be>)
michael
parents:
2302
diff
changeset
|
299 |
1962 | 300 c->temp= c->scratchpad; |
936 | 301 } |
2967 | 302 |
1419 | 303 #if 0 |
1064 | 304 static int pix_dev(uint8_t * pix, int line_size, int mean) |
284 | 305 { |
306 int s, i, j; | |
307 | |
308 s = 0; | |
309 for (i = 0; i < 16; i++) { | |
2979 | 310 for (j = 0; j < 16; j += 8) { |
4001 | 311 s += FFABS(pix[0]-mean); |
312 s += FFABS(pix[1]-mean); | |
313 s += FFABS(pix[2]-mean); | |
314 s += FFABS(pix[3]-mean); | |
315 s += FFABS(pix[4]-mean); | |
316 s += FFABS(pix[5]-mean); | |
317 s += FFABS(pix[6]-mean); | |
318 s += FFABS(pix[7]-mean); | |
2979 | 319 pix += 8; |
320 } | |
321 pix += line_size - 16; | |
284 | 322 } |
323 return s; | |
324 } | |
1419 | 325 #endif |
284 | 326 |
853
eacc2dd8fd9d
* using DSPContext - so each codec could use its local (sub)set of CPU extension
kabi
parents:
847
diff
changeset
|
327 static inline void no_motion_search(MpegEncContext * s, |
2979 | 328 int *mx_ptr, int *my_ptr) |
0 | 329 { |
330 *mx_ptr = 16 * s->mb_x; | |
331 *my_ptr = 16 * s->mb_y; | |
332 } | |
333 | |
2522
e25782262d7d
kill warnings patch by (M¸«©ns Rullg¸«©rd <mru inprovide com>)
michael
parents:
2354
diff
changeset
|
334 #if 0 /* the use of these functions is inside #if 0 */ |
0 | 335 static int full_motion_search(MpegEncContext * s, |
336 int *mx_ptr, int *my_ptr, int range, | |
324 | 337 int xmin, int ymin, int xmax, int ymax, uint8_t *ref_picture) |
0 | 338 { |
339 int x1, y1, x2, y2, xx, yy, x, y; | |
340 int mx, my, dmin, d; | |
1064 | 341 uint8_t *pix; |
0 | 342 |
343 xx = 16 * s->mb_x; | |
344 yy = 16 * s->mb_y; | |
2979 | 345 x1 = xx - range + 1; /* we loose one pixel to avoid boundary pb with half pixel pred */ |
0 | 346 if (x1 < xmin) |
2979 | 347 x1 = xmin; |
0 | 348 x2 = xx + range - 1; |
349 if (x2 > xmax) | |
2979 | 350 x2 = xmax; |
0 | 351 y1 = yy - range + 1; |
352 if (y1 < ymin) | |
2979 | 353 y1 = ymin; |
0 | 354 y2 = yy + range - 1; |
355 if (y2 > ymax) | |
2979 | 356 y2 = ymax; |
903 | 357 pix = s->new_picture.data[0] + (yy * s->linesize) + xx; |
0 | 358 dmin = 0x7fffffff; |
359 mx = 0; | |
360 my = 0; | |
361 for (y = y1; y <= y2; y++) { | |
2979 | 362 for (x = x1; x <= x2; x++) { |
363 d = s->dsp.pix_abs[0][0](NULL, pix, ref_picture + (y * s->linesize) + x, | |
364 s->linesize, 16); | |
365 if (d < dmin || | |
366 (d == dmin && | |
367 (abs(x - xx) + abs(y - yy)) < | |
368 (abs(mx - xx) + abs(my - yy)))) { | |
369 dmin = d; | |
370 mx = x; | |
371 my = y; | |
372 } | |
373 } | |
0 | 374 } |
375 | |
376 *mx_ptr = mx; | |
377 *my_ptr = my; | |
378 | |
379 #if 0 | |
380 if (*mx_ptr < -(2 * range) || *mx_ptr >= (2 * range) || | |
2979 | 381 *my_ptr < -(2 * range) || *my_ptr >= (2 * range)) { |
3177 | 382 av_log(NULL, AV_LOG_ERROR, "error %d %d\n", *mx_ptr, *my_ptr); |
0 | 383 } |
384 #endif | |
385 return dmin; | |
386 } | |
387 | |
388 | |
389 static int log_motion_search(MpegEncContext * s, | |
390 int *mx_ptr, int *my_ptr, int range, | |
324 | 391 int xmin, int ymin, int xmax, int ymax, uint8_t *ref_picture) |
0 | 392 { |
393 int x1, y1, x2, y2, xx, yy, x, y; | |
394 int mx, my, dmin, d; | |
1064 | 395 uint8_t *pix; |
0 | 396 |
397 xx = s->mb_x << 4; | |
398 yy = s->mb_y << 4; | |
399 | |
400 /* Left limit */ | |
401 x1 = xx - range; | |
402 if (x1 < xmin) | |
2979 | 403 x1 = xmin; |
0 | 404 |
405 /* Right limit */ | |
406 x2 = xx + range; | |
407 if (x2 > xmax) | |
2979 | 408 x2 = xmax; |
0 | 409 |
410 /* Upper limit */ | |
411 y1 = yy - range; | |
412 if (y1 < ymin) | |
2979 | 413 y1 = ymin; |
0 | 414 |
415 /* Lower limit */ | |
416 y2 = yy + range; | |
417 if (y2 > ymax) | |
2979 | 418 y2 = ymax; |
0 | 419 |
903 | 420 pix = s->new_picture.data[0] + (yy * s->linesize) + xx; |
0 | 421 dmin = 0x7fffffff; |
422 mx = 0; | |
423 my = 0; | |
424 | |
425 do { | |
2979 | 426 for (y = y1; y <= y2; y += range) { |
427 for (x = x1; x <= x2; x += range) { | |
428 d = s->dsp.pix_abs[0][0](NULL, pix, ref_picture + (y * s->linesize) + x, s->linesize, 16); | |
429 if (d < dmin || (d == dmin && (abs(x - xx) + abs(y - yy)) < (abs(mx - xx) + abs(my - yy)))) { | |
430 dmin = d; | |
431 mx = x; | |
432 my = y; | |
433 } | |
434 } | |
435 } | |
0 | 436 |
2979 | 437 range = range >> 1; |
0 | 438 |
2979 | 439 x1 = mx - range; |
440 if (x1 < xmin) | |
441 x1 = xmin; | |
0 | 442 |
2979 | 443 x2 = mx + range; |
444 if (x2 > xmax) | |
445 x2 = xmax; | |
0 | 446 |
2979 | 447 y1 = my - range; |
448 if (y1 < ymin) | |
449 y1 = ymin; | |
0 | 450 |
2979 | 451 y2 = my + range; |
452 if (y2 > ymax) | |
453 y2 = ymax; | |
0 | 454 |
455 } while (range >= 1); | |
456 | |
457 #ifdef DEBUG | |
2846
40765c51a7a9
Compilation fixes part 1 patch by (Arvind R. and Burkhard Plaum, plaum, ipf uni-stuttgart de)
michael
parents:
2834
diff
changeset
|
458 av_log(s->avctx, AV_LOG_DEBUG, "log - MX: %d\tMY: %d\n", mx, my); |
0 | 459 #endif |
460 *mx_ptr = mx; | |
461 *my_ptr = my; | |
462 return dmin; | |
463 } | |
464 | |
465 static int phods_motion_search(MpegEncContext * s, | |
466 int *mx_ptr, int *my_ptr, int range, | |
324 | 467 int xmin, int ymin, int xmax, int ymax, uint8_t *ref_picture) |
0 | 468 { |
469 int x1, y1, x2, y2, xx, yy, x, y, lastx, d; | |
470 int mx, my, dminx, dminy; | |
1064 | 471 uint8_t *pix; |
0 | 472 |
473 xx = s->mb_x << 4; | |
474 yy = s->mb_y << 4; | |
475 | |
476 /* Left limit */ | |
477 x1 = xx - range; | |
478 if (x1 < xmin) | |
2979 | 479 x1 = xmin; |
0 | 480 |
481 /* Right limit */ | |
482 x2 = xx + range; | |
483 if (x2 > xmax) | |
2979 | 484 x2 = xmax; |
0 | 485 |
486 /* Upper limit */ | |
487 y1 = yy - range; | |
488 if (y1 < ymin) | |
2979 | 489 y1 = ymin; |
0 | 490 |
491 /* Lower limit */ | |
492 y2 = yy + range; | |
493 if (y2 > ymax) | |
2979 | 494 y2 = ymax; |
0 | 495 |
903 | 496 pix = s->new_picture.data[0] + (yy * s->linesize) + xx; |
0 | 497 mx = 0; |
498 my = 0; | |
499 | |
500 x = xx; | |
501 y = yy; | |
502 do { | |
503 dminx = 0x7fffffff; | |
504 dminy = 0x7fffffff; | |
505 | |
2979 | 506 lastx = x; |
507 for (x = x1; x <= x2; x += range) { | |
508 d = s->dsp.pix_abs[0][0](NULL, pix, ref_picture + (y * s->linesize) + x, s->linesize, 16); | |
509 if (d < dminx || (d == dminx && (abs(x - xx) + abs(y - yy)) < (abs(mx - xx) + abs(my - yy)))) { | |
510 dminx = d; | |
511 mx = x; | |
512 } | |
513 } | |
0 | 514 |
2979 | 515 x = lastx; |
516 for (y = y1; y <= y2; y += range) { | |
517 d = s->dsp.pix_abs[0][0](NULL, pix, ref_picture + (y * s->linesize) + x, s->linesize, 16); | |
518 if (d < dminy || (d == dminy && (abs(x - xx) + abs(y - yy)) < (abs(mx - xx) + abs(my - yy)))) { | |
519 dminy = d; | |
520 my = y; | |
521 } | |
522 } | |
0 | 523 |
2979 | 524 range = range >> 1; |
0 | 525 |
2979 | 526 x = mx; |
527 y = my; | |
528 x1 = mx - range; | |
529 if (x1 < xmin) | |
530 x1 = xmin; | |
0 | 531 |
2979 | 532 x2 = mx + range; |
533 if (x2 > xmax) | |
534 x2 = xmax; | |
0 | 535 |
2979 | 536 y1 = my - range; |
537 if (y1 < ymin) | |
538 y1 = ymin; | |
0 | 539 |
2979 | 540 y2 = my + range; |
541 if (y2 > ymax) | |
542 y2 = ymax; | |
0 | 543 |
544 } while (range >= 1); | |
545 | |
546 #ifdef DEBUG | |
2846
40765c51a7a9
Compilation fixes part 1 patch by (Arvind R. and Burkhard Plaum, plaum, ipf uni-stuttgart de)
michael
parents:
2834
diff
changeset
|
547 av_log(s->avctx, AV_LOG_DEBUG, "phods - MX: %d\tMY: %d\n", mx, my); |
0 | 548 #endif |
549 | |
550 /* half pixel search */ | |
551 *mx_ptr = mx; | |
552 *my_ptr = my; | |
553 return dminy; | |
554 } | |
2522
e25782262d7d
kill warnings patch by (M¸«©ns Rullg¸«©rd <mru inprovide com>)
michael
parents:
2354
diff
changeset
|
555 #endif /* 0 */ |
277
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
275
diff
changeset
|
556 |
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
275
diff
changeset
|
557 #define Z_THRESHOLD 256 |
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
275
diff
changeset
|
558 |
936 | 559 #define CHECK_SAD_HALF_MV(suffix, x, y) \ |
455 | 560 {\ |
1708 | 561 d= s->dsp.pix_abs[size][(x?1:0)+(y?2:0)](NULL, pix, ptr+((x)>>1), stride, h);\ |
936 | 562 d += (mv_penalty[pen_x + x] + mv_penalty[pen_y + y])*penalty_factor;\ |
455 | 563 COPY3_IF_LT(dminh, d, dx, x, dy, y)\ |
564 } | |
277
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
275
diff
changeset
|
565 |
936 | 566 static inline int sad_hpel_motion_search(MpegEncContext * s, |
2979 | 567 int *mx_ptr, int *my_ptr, int dmin, |
1950 | 568 int src_index, int ref_index, |
569 int size, int h) | |
0 | 570 { |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
571 MotionEstContext * const c= &s->me; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
572 const int penalty_factor= c->sub_penalty_factor; |
1708 | 573 int mx, my, dminh; |
1064 | 574 uint8_t *pix, *ptr; |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
575 int stride= c->stride; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
576 const int flags= c->sub_flags; |
1950 | 577 LOAD_COMMON |
2967 | 578 |
1950 | 579 assert(flags == 0); |
455 | 580 |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
581 if(c->skip){ |
455 | 582 // printf("S"); |
583 *mx_ptr = 0; | |
584 *my_ptr = 0; | |
585 return dmin; | |
586 } | |
587 // printf("N"); | |
2967 | 588 |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
589 pix = c->src[src_index][0]; |
455 | 590 |
294 | 591 mx = *mx_ptr; |
592 my = *my_ptr; | |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
593 ptr = c->ref[ref_index][0] + (my * stride) + mx; |
2967 | 594 |
294 | 595 dminh = dmin; |
596 | |
2967 | 597 if (mx > xmin && mx < xmax && |
294 | 598 my > ymin && my < ymax) { |
455 | 599 int dx=0, dy=0; |
2967 | 600 int d, pen_x, pen_y; |
455 | 601 const int index= (my<<ME_MAP_SHIFT) + mx; |
602 const int t= score_map[(index-(1<<ME_MAP_SHIFT))&(ME_MAP_SIZE-1)]; | |
603 const int l= score_map[(index- 1 )&(ME_MAP_SIZE-1)]; | |
604 const int r= score_map[(index+ 1 )&(ME_MAP_SIZE-1)]; | |
605 const int b= score_map[(index+(1<<ME_MAP_SHIFT))&(ME_MAP_SIZE-1)]; | |
606 mx<<=1; | |
607 my<<=1; | |
294 | 608 |
2967 | 609 |
294 | 610 pen_x= pred_x + mx; |
611 pen_y= pred_y + my; | |
612 | |
1708 | 613 ptr-= stride; |
455 | 614 if(t<=b){ |
936 | 615 CHECK_SAD_HALF_MV(y2 , 0, -1) |
455 | 616 if(l<=r){ |
936 | 617 CHECK_SAD_HALF_MV(xy2, -1, -1) |
455 | 618 if(t+r<=b+l){ |
936 | 619 CHECK_SAD_HALF_MV(xy2, +1, -1) |
1708 | 620 ptr+= stride; |
455 | 621 }else{ |
1708 | 622 ptr+= stride; |
936 | 623 CHECK_SAD_HALF_MV(xy2, -1, +1) |
455 | 624 } |
936 | 625 CHECK_SAD_HALF_MV(x2 , -1, 0) |
455 | 626 }else{ |
936 | 627 CHECK_SAD_HALF_MV(xy2, +1, -1) |
455 | 628 if(t+l<=b+r){ |
936 | 629 CHECK_SAD_HALF_MV(xy2, -1, -1) |
1708 | 630 ptr+= stride; |
455 | 631 }else{ |
1708 | 632 ptr+= stride; |
936 | 633 CHECK_SAD_HALF_MV(xy2, +1, +1) |
455 | 634 } |
936 | 635 CHECK_SAD_HALF_MV(x2 , +1, 0) |
455 | 636 } |
637 }else{ | |
638 if(l<=r){ | |
639 if(t+l<=b+r){ | |
936 | 640 CHECK_SAD_HALF_MV(xy2, -1, -1) |
1708 | 641 ptr+= stride; |
455 | 642 }else{ |
1708 | 643 ptr+= stride; |
936 | 644 CHECK_SAD_HALF_MV(xy2, +1, +1) |
455 | 645 } |
936 | 646 CHECK_SAD_HALF_MV(x2 , -1, 0) |
647 CHECK_SAD_HALF_MV(xy2, -1, +1) | |
455 | 648 }else{ |
649 if(t+r<=b+l){ | |
936 | 650 CHECK_SAD_HALF_MV(xy2, +1, -1) |
1708 | 651 ptr+= stride; |
455 | 652 }else{ |
1708 | 653 ptr+= stride; |
936 | 654 CHECK_SAD_HALF_MV(xy2, -1, +1) |
455 | 655 } |
936 | 656 CHECK_SAD_HALF_MV(x2 , +1, 0) |
657 CHECK_SAD_HALF_MV(xy2, +1, +1) | |
455 | 658 } |
936 | 659 CHECK_SAD_HALF_MV(y2 , 0, +1) |
455 | 660 } |
661 mx+=dx; | |
662 my+=dy; | |
294 | 663 |
664 }else{ | |
455 | 665 mx<<=1; |
666 my<<=1; | |
294 | 667 } |
668 | |
669 *mx_ptr = mx; | |
670 *my_ptr = my; | |
455 | 671 return dminh; |
294 | 672 } |
673 | |
455 | 674 static inline void set_p_mv_tables(MpegEncContext * s, int mx, int my, int mv4) |
294 | 675 { |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1162
diff
changeset
|
676 const int xy= s->mb_x + s->mb_y*s->mb_stride; |
2967 | 677 |
324 | 678 s->p_mv_table[xy][0] = mx; |
679 s->p_mv_table[xy][1] = my; | |
294 | 680 |
2764 | 681 /* has already been set to the 4 MV if 4MV is done */ |
455 | 682 if(mv4){ |
294 | 683 int mot_xy= s->block_index[0]; |
684 | |
1668
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1634
diff
changeset
|
685 s->current_picture.motion_val[0][mot_xy ][0]= mx; |
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1634
diff
changeset
|
686 s->current_picture.motion_val[0][mot_xy ][1]= my; |
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1634
diff
changeset
|
687 s->current_picture.motion_val[0][mot_xy+1][0]= mx; |
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1634
diff
changeset
|
688 s->current_picture.motion_val[0][mot_xy+1][1]= my; |
294 | 689 |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1904
diff
changeset
|
690 mot_xy += s->b8_stride; |
1668
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1634
diff
changeset
|
691 s->current_picture.motion_val[0][mot_xy ][0]= mx; |
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1634
diff
changeset
|
692 s->current_picture.motion_val[0][mot_xy ][1]= my; |
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1634
diff
changeset
|
693 s->current_picture.motion_val[0][mot_xy+1][0]= mx; |
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1634
diff
changeset
|
694 s->current_picture.motion_val[0][mot_xy+1][1]= my; |
294 | 695 } |
696 } | |
697 | |
1086 | 698 /** |
699 * get fullpel ME search limits. | |
700 */ | |
1708 | 701 static inline void get_limits(MpegEncContext *s, int x, int y) |
324 | 702 { |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
703 MotionEstContext * const c= &s->me; |
4304 | 704 int range= c->avctx->me_range >> (1 + !!(c->flags&FLAG_QPEL)); |
1708 | 705 /* |
2015
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
706 if(c->avctx->me_range) c->range= c->avctx->me_range >> 1; |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
707 else c->range= 16; |
1708 | 708 */ |
324 | 709 if (s->unrestricted_mv) { |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
710 c->xmin = - x - 16; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
711 c->ymin = - y - 16; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
712 c->xmax = - x + s->mb_width *16; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
713 c->ymax = - y + s->mb_height*16; |
2327
5e5cf598a48b
H.261 encoder by (Maarten Daniels <maarten dot daniels at luc dot ac dot be>)
michael
parents:
2302
diff
changeset
|
714 } else if (s->out_format == FMT_H261){ |
5e5cf598a48b
H.261 encoder by (Maarten Daniels <maarten dot daniels at luc dot ac dot be>)
michael
parents:
2302
diff
changeset
|
715 // Search range of H261 is different from other codec standards |
5e5cf598a48b
H.261 encoder by (Maarten Daniels <maarten dot daniels at luc dot ac dot be>)
michael
parents:
2302
diff
changeset
|
716 c->xmin = (x > 15) ? - 15 : 0; |
5e5cf598a48b
H.261 encoder by (Maarten Daniels <maarten dot daniels at luc dot ac dot be>)
michael
parents:
2302
diff
changeset
|
717 c->ymin = (y > 15) ? - 15 : 0; |
2967 | 718 c->xmax = (x < s->mb_width * 16 - 16) ? 15 : 0; |
2327
5e5cf598a48b
H.261 encoder by (Maarten Daniels <maarten dot daniels at luc dot ac dot be>)
michael
parents:
2302
diff
changeset
|
719 c->ymax = (y < s->mb_height * 16 - 16) ? 15 : 0; |
324 | 720 } else { |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
721 c->xmin = - x; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
722 c->ymin = - y; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
723 c->xmax = - x + s->mb_width *16 - 16; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
724 c->ymax = - y + s->mb_height*16 - 16; |
324 | 725 } |
4304 | 726 if(range){ |
727 c->xmin = FFMAX(c->xmin,-range); | |
728 c->xmax = FFMIN(c->xmax, range); | |
729 c->ymin = FFMAX(c->ymin,-range); | |
730 c->ymax = FFMIN(c->ymax, range); | |
731 } | |
324 | 732 } |
733 | |
2015
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
734 static inline void init_mv4_ref(MotionEstContext *c){ |
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
735 const int stride= c->stride; |
1962 | 736 |
737 c->ref[1][0] = c->ref[0][0] + 8; | |
738 c->ref[2][0] = c->ref[0][0] + 8*stride; | |
739 c->ref[3][0] = c->ref[2][0] + 8; | |
740 c->src[1][0] = c->src[0][0] + 8; | |
741 c->src[2][0] = c->src[0][0] + 8*stride; | |
742 c->src[3][0] = c->src[2][0] + 8; | |
743 } | |
744 | |
1708 | 745 static inline int h263_mv4_search(MpegEncContext *s, int mx, int my, int shift) |
455 | 746 { |
1950 | 747 MotionEstContext * const c= &s->me; |
1708 | 748 const int size= 1; |
749 const int h=8; | |
455 | 750 int block; |
751 int P[10][2]; | |
1013 | 752 int dmin_sum=0, mx4_sum=0, my4_sum=0; |
1494
3ee63c12ea30
optionally try to encode each MB with MV=<0,0> and choose the one with better RD
michaelni
parents:
1426
diff
changeset
|
753 int same=1; |
2015
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
754 const int stride= c->stride; |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
755 uint8_t *mv_penalty= c->current_mv_penalty; |
455 | 756 |
2015
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
757 init_mv4_ref(c); |
2967 | 758 |
455 | 759 for(block=0; block<4; block++){ |
760 int mx4, my4; | |
761 int pred_x4, pred_y4; | |
762 int dmin4; | |
763 static const int off[4]= {2, 1, 1, -1}; | |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1904
diff
changeset
|
764 const int mot_stride = s->b8_stride; |
455 | 765 const int mot_xy = s->block_index[block]; |
1708 | 766 |
1668
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1634
diff
changeset
|
767 P_LEFT[0] = s->current_picture.motion_val[0][mot_xy - 1][0]; |
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1634
diff
changeset
|
768 P_LEFT[1] = s->current_picture.motion_val[0][mot_xy - 1][1]; |
455 | 769 |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
770 if(P_LEFT[0] > (c->xmax<<shift)) P_LEFT[0] = (c->xmax<<shift); |
455 | 771 |
772 /* special case for first line */ | |
1799 | 773 if (s->first_slice_line && block<2) { |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
774 c->pred_x= pred_x4= P_LEFT[0]; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
775 c->pred_y= pred_y4= P_LEFT[1]; |
455 | 776 } else { |
1668
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1634
diff
changeset
|
777 P_TOP[0] = s->current_picture.motion_val[0][mot_xy - mot_stride ][0]; |
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1634
diff
changeset
|
778 P_TOP[1] = s->current_picture.motion_val[0][mot_xy - mot_stride ][1]; |
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1634
diff
changeset
|
779 P_TOPRIGHT[0] = s->current_picture.motion_val[0][mot_xy - mot_stride + off[block]][0]; |
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1634
diff
changeset
|
780 P_TOPRIGHT[1] = s->current_picture.motion_val[0][mot_xy - mot_stride + off[block]][1]; |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
781 if(P_TOP[1] > (c->ymax<<shift)) P_TOP[1] = (c->ymax<<shift); |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
782 if(P_TOPRIGHT[0] < (c->xmin<<shift)) P_TOPRIGHT[0]= (c->xmin<<shift); |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
783 if(P_TOPRIGHT[0] > (c->xmax<<shift)) P_TOPRIGHT[0]= (c->xmax<<shift); |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
784 if(P_TOPRIGHT[1] > (c->ymax<<shift)) P_TOPRIGHT[1]= (c->ymax<<shift); |
2967 | 785 |
455 | 786 P_MEDIAN[0]= mid_pred(P_LEFT[0], P_TOP[0], P_TOPRIGHT[0]); |
787 P_MEDIAN[1]= mid_pred(P_LEFT[1], P_TOP[1], P_TOPRIGHT[1]); | |
788 | |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
789 c->pred_x= pred_x4 = P_MEDIAN[0]; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
790 c->pred_y= pred_y4 = P_MEDIAN[1]; |
455 | 791 } |
792 P_MV1[0]= mx; | |
793 P_MV1[1]= my; | |
794 | |
1950 | 795 dmin4 = epzs_motion_search4(s, &mx4, &my4, P, block, block, s->p_mv_table, (1<<16)>>shift); |
455 | 796 |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
797 dmin4= c->sub_motion_search(s, &mx4, &my4, dmin4, block, block, size, h); |
2967 | 798 |
1950 | 799 if(s->dsp.me_sub_cmp[0] != s->dsp.mb_cmp[0]){ |
1013 | 800 int dxy; |
1708 | 801 const int offset= ((block&1) + (block>>1)*stride)*8; |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
802 uint8_t *dest_y = c->scratchpad + offset; |
1013 | 803 if(s->quarter_sample){ |
1950 | 804 uint8_t *ref= c->ref[block][0] + (mx4>>2) + (my4>>2)*stride; |
1013 | 805 dxy = ((my4 & 3) << 2) | (mx4 & 3); |
806 | |
807 if(s->no_rounding) | |
1799 | 808 s->dsp.put_no_rnd_qpel_pixels_tab[1][dxy](dest_y , ref , stride); |
1013 | 809 else |
1708 | 810 s->dsp.put_qpel_pixels_tab [1][dxy](dest_y , ref , stride); |
1013 | 811 }else{ |
1950 | 812 uint8_t *ref= c->ref[block][0] + (mx4>>1) + (my4>>1)*stride; |
1013 | 813 dxy = ((my4 & 1) << 1) | (mx4 & 1); |
814 | |
815 if(s->no_rounding) | |
1708 | 816 s->dsp.put_no_rnd_pixels_tab[1][dxy](dest_y , ref , stride, h); |
1013 | 817 else |
1708 | 818 s->dsp.put_pixels_tab [1][dxy](dest_y , ref , stride, h); |
1013 | 819 } |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
820 dmin_sum+= (mv_penalty[mx4-pred_x4] + mv_penalty[my4-pred_y4])*c->mb_penalty_factor; |
1013 | 821 }else |
822 dmin_sum+= dmin4; | |
823 | |
824 if(s->quarter_sample){ | |
825 mx4_sum+= mx4/2; | |
826 my4_sum+= my4/2; | |
827 }else{ | |
828 mx4_sum+= mx4; | |
829 my4_sum+= my4; | |
830 } | |
2967 | 831 |
1668
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1634
diff
changeset
|
832 s->current_picture.motion_val[0][ s->block_index[block] ][0]= mx4; |
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1634
diff
changeset
|
833 s->current_picture.motion_val[0][ s->block_index[block] ][1]= my4; |
1494
3ee63c12ea30
optionally try to encode each MB with MV=<0,0> and choose the one with better RD
michaelni
parents:
1426
diff
changeset
|
834 |
3ee63c12ea30
optionally try to encode each MB with MV=<0,0> and choose the one with better RD
michaelni
parents:
1426
diff
changeset
|
835 if(mx4 != mx || my4 != my) same=0; |
1013 | 836 } |
2967 | 837 |
1494
3ee63c12ea30
optionally try to encode each MB with MV=<0,0> and choose the one with better RD
michaelni
parents:
1426
diff
changeset
|
838 if(same) |
3ee63c12ea30
optionally try to encode each MB with MV=<0,0> and choose the one with better RD
michaelni
parents:
1426
diff
changeset
|
839 return INT_MAX; |
2967 | 840 |
1038 | 841 if(s->dsp.me_sub_cmp[0] != s->dsp.mb_cmp[0]){ |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
842 dmin_sum += s->dsp.mb_cmp[0](s, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*16*stride, c->scratchpad, stride, 16); |
455 | 843 } |
2967 | 844 |
2015
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
845 if(c->avctx->mb_cmp&FF_CMP_CHROMA){ |
1013 | 846 int dxy; |
847 int mx, my; | |
848 int offset; | |
849 | |
850 mx= ff_h263_round_chroma(mx4_sum); | |
851 my= ff_h263_round_chroma(my4_sum); | |
852 dxy = ((my & 1) << 1) | (mx & 1); | |
2967 | 853 |
1013 | 854 offset= (s->mb_x*8 + (mx>>1)) + (s->mb_y*8 + (my>>1))*s->uvlinesize; |
2967 | 855 |
1013 | 856 if(s->no_rounding){ |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
857 s->dsp.put_no_rnd_pixels_tab[1][dxy](c->scratchpad , s->last_picture.data[1] + offset, s->uvlinesize, 8); |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
858 s->dsp.put_no_rnd_pixels_tab[1][dxy](c->scratchpad+8 , s->last_picture.data[2] + offset, s->uvlinesize, 8); |
1013 | 859 }else{ |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
860 s->dsp.put_pixels_tab [1][dxy](c->scratchpad , s->last_picture.data[1] + offset, s->uvlinesize, 8); |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
861 s->dsp.put_pixels_tab [1][dxy](c->scratchpad+8 , s->last_picture.data[2] + offset, s->uvlinesize, 8); |
1013 | 862 } |
863 | |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
864 dmin_sum += s->dsp.mb_cmp[1](s, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*8*s->uvlinesize, c->scratchpad , s->uvlinesize, 8); |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
865 dmin_sum += s->dsp.mb_cmp[1](s, s->new_picture.data[2] + s->mb_x*8 + s->mb_y*8*s->uvlinesize, c->scratchpad+8, s->uvlinesize, 8); |
1013 | 866 } |
2967 | 867 |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
868 c->pred_x= mx; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
869 c->pred_y= my; |
1013 | 870 |
2015
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
871 switch(c->avctx->mb_cmp&0xFF){ |
1013 | 872 /*case FF_CMP_SSE: |
873 return dmin_sum+ 32*s->qscale*s->qscale;*/ | |
874 case FF_CMP_RD: | |
875 return dmin_sum; | |
876 default: | |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
877 return dmin_sum+ 11*c->mb_penalty_factor; |
1013 | 878 } |
455 | 879 } |
880 | |
1962 | 881 static inline void init_interlaced_ref(MpegEncContext *s, int ref_index){ |
882 MotionEstContext * const c= &s->me; | |
883 | |
884 c->ref[1+ref_index][0] = c->ref[0+ref_index][0] + s->linesize; | |
885 c->src[1][0] = c->src[0][0] + s->linesize; | |
886 if(c->flags & FLAG_CHROMA){ | |
887 c->ref[1+ref_index][1] = c->ref[0+ref_index][1] + s->uvlinesize; | |
888 c->ref[1+ref_index][2] = c->ref[0+ref_index][2] + s->uvlinesize; | |
889 c->src[1][1] = c->src[0][1] + s->uvlinesize; | |
890 c->src[1][2] = c->src[0][2] + s->uvlinesize; | |
891 } | |
892 } | |
893 | |
2967 | 894 static int interlaced_search(MpegEncContext *s, int ref_index, |
1968
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
895 int16_t (*mv_tables[2][2])[2], uint8_t *field_select_tables[2], int mx, int my, int user_field_select) |
1708 | 896 { |
1950 | 897 MotionEstContext * const c= &s->me; |
1708 | 898 const int size=0; |
899 const int h=8; | |
900 int block; | |
901 int P[10][2]; | |
1950 | 902 uint8_t * const mv_penalty= c->current_mv_penalty; |
1708 | 903 int same=1; |
904 const int stride= 2*s->linesize; | |
905 int dmin_sum= 0; | |
906 const int mot_stride= s->mb_stride; | |
907 const int xy= s->mb_x + s->mb_y*mot_stride; | |
2967 | 908 |
1950 | 909 c->ymin>>=1; |
910 c->ymax>>=1; | |
911 c->stride<<=1; | |
912 c->uvstride<<=1; | |
1962 | 913 init_interlaced_ref(s, ref_index); |
2967 | 914 |
1708 | 915 for(block=0; block<2; block++){ |
916 int field_select; | |
917 int best_dmin= INT_MAX; | |
918 int best_field= -1; | |
919 | |
920 for(field_select=0; field_select<2; field_select++){ | |
1950 | 921 int dmin, mx_i, my_i; |
1708 | 922 int16_t (*mv_table)[2]= mv_tables[block][field_select]; |
2967 | 923 |
1968
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
924 if(user_field_select){ |
3188
04636faaa720
asserts to check if assumed conditions really are true
michael
parents:
3177
diff
changeset
|
925 assert(field_select==0 || field_select==1); |
04636faaa720
asserts to check if assumed conditions really are true
michael
parents:
3177
diff
changeset
|
926 assert(field_select_tables[block][xy]==0 || field_select_tables[block][xy]==1); |
1968
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
927 if(field_select_tables[block][xy] != field_select) |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
928 continue; |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
929 } |
2967 | 930 |
1708 | 931 P_LEFT[0] = mv_table[xy - 1][0]; |
932 P_LEFT[1] = mv_table[xy - 1][1]; | |
1950 | 933 if(P_LEFT[0] > (c->xmax<<1)) P_LEFT[0] = (c->xmax<<1); |
2967 | 934 |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
935 c->pred_x= P_LEFT[0]; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
936 c->pred_y= P_LEFT[1]; |
2967 | 937 |
1799 | 938 if(!s->first_slice_line){ |
1708 | 939 P_TOP[0] = mv_table[xy - mot_stride][0]; |
940 P_TOP[1] = mv_table[xy - mot_stride][1]; | |
941 P_TOPRIGHT[0] = mv_table[xy - mot_stride + 1][0]; | |
942 P_TOPRIGHT[1] = mv_table[xy - mot_stride + 1][1]; | |
1950 | 943 if(P_TOP[1] > (c->ymax<<1)) P_TOP[1] = (c->ymax<<1); |
944 if(P_TOPRIGHT[0] < (c->xmin<<1)) P_TOPRIGHT[0]= (c->xmin<<1); | |
945 if(P_TOPRIGHT[0] > (c->xmax<<1)) P_TOPRIGHT[0]= (c->xmax<<1); | |
946 if(P_TOPRIGHT[1] > (c->ymax<<1)) P_TOPRIGHT[1]= (c->ymax<<1); | |
2967 | 947 |
1708 | 948 P_MEDIAN[0]= mid_pred(P_LEFT[0], P_TOP[0], P_TOPRIGHT[0]); |
949 P_MEDIAN[1]= mid_pred(P_LEFT[1], P_TOP[1], P_TOPRIGHT[1]); | |
950 } | |
951 P_MV1[0]= mx; //FIXME not correct if block != field_select | |
952 P_MV1[1]= my / 2; | |
2967 | 953 |
1950 | 954 dmin = epzs_motion_search2(s, &mx_i, &my_i, P, block, field_select+ref_index, mv_table, (1<<16)>>1); |
1708 | 955 |
1950 | 956 dmin= c->sub_motion_search(s, &mx_i, &my_i, dmin, block, field_select+ref_index, size, h); |
2967 | 957 |
1708 | 958 mv_table[xy][0]= mx_i; |
959 mv_table[xy][1]= my_i; | |
2967 | 960 |
1950 | 961 if(s->dsp.me_sub_cmp[0] != s->dsp.mb_cmp[0]){ |
1708 | 962 int dxy; |
963 | |
964 //FIXME chroma ME | |
1950 | 965 uint8_t *ref= c->ref[field_select+ref_index][0] + (mx_i>>1) + (my_i>>1)*stride; |
1708 | 966 dxy = ((my_i & 1) << 1) | (mx_i & 1); |
967 | |
968 if(s->no_rounding){ | |
1950 | 969 s->dsp.put_no_rnd_pixels_tab[size][dxy](c->scratchpad, ref , stride, h); |
1708 | 970 }else{ |
1950 | 971 s->dsp.put_pixels_tab [size][dxy](c->scratchpad, ref , stride, h); |
1708 | 972 } |
1950 | 973 dmin= s->dsp.mb_cmp[size](s, c->src[block][0], c->scratchpad, stride, h); |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
974 dmin+= (mv_penalty[mx_i-c->pred_x] + mv_penalty[my_i-c->pred_y] + 1)*c->mb_penalty_factor; |
1708 | 975 }else |
1950 | 976 dmin+= c->mb_penalty_factor; //field_select bits |
2967 | 977 |
1708 | 978 dmin += field_select != block; //slightly prefer same field |
2967 | 979 |
1708 | 980 if(dmin < best_dmin){ |
981 best_dmin= dmin; | |
982 best_field= field_select; | |
983 } | |
984 } | |
985 { | |
986 int16_t (*mv_table)[2]= mv_tables[block][best_field]; | |
987 | |
988 if(mv_table[xy][0] != mx) same=0; //FIXME check if these checks work and are any good at all | |
989 if(mv_table[xy][1]&1) same=0; | |
2967 | 990 if(mv_table[xy][1]*2 != my) same=0; |
1708 | 991 if(best_field != block) same=0; |
992 } | |
993 | |
994 field_select_tables[block][xy]= best_field; | |
995 dmin_sum += best_dmin; | |
996 } | |
2967 | 997 |
1950 | 998 c->ymin<<=1; |
999 c->ymax<<=1; | |
1000 c->stride>>=1; | |
1001 c->uvstride>>=1; | |
1708 | 1002 |
1003 if(same) | |
1004 return INT_MAX; | |
2967 | 1005 |
2015
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
1006 switch(c->avctx->mb_cmp&0xFF){ |
1708 | 1007 /*case FF_CMP_SSE: |
1008 return dmin_sum+ 32*s->qscale*s->qscale;*/ | |
1009 case FF_CMP_RD: | |
1010 return dmin_sum; | |
1011 default: | |
1950 | 1012 return dmin_sum+ 11*c->mb_penalty_factor; |
1708 | 1013 } |
1014 } | |
1015 | |
2072 | 1016 static void clip_input_mv(MpegEncContext * s, int16_t *mv, int interlaced){ |
1017 int ymax= s->me.ymax>>interlaced; | |
1018 int ymin= s->me.ymin>>interlaced; | |
2967 | 1019 |
2072 | 1020 if(mv[0] < s->me.xmin) mv[0] = s->me.xmin; |
1021 if(mv[0] > s->me.xmax) mv[0] = s->me.xmax; | |
1022 if(mv[1] < ymin) mv[1] = ymin; | |
1023 if(mv[1] > ymax) mv[1] = ymax; | |
1024 } | |
1025 | |
1955
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1026 static inline int check_input_motion(MpegEncContext * s, int mb_x, int mb_y, int p_type){ |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1027 MotionEstContext * const c= &s->me; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1028 Picture *p= s->current_picture_ptr; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1029 int mb_xy= mb_x + mb_y*s->mb_stride; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1030 int xy= 2*mb_x + 2*mb_y*s->b8_stride; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1031 int mb_type= s->current_picture.mb_type[mb_xy]; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1032 int flags= c->flags; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1033 int shift= (flags&FLAG_QPEL) + 1; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1034 int mask= (1<<shift)-1; |
1962 | 1035 int x, y, i; |
1955
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1036 int d=0; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1037 me_cmp_func cmpf= s->dsp.sse[0]; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1038 me_cmp_func chroma_cmpf= s->dsp.sse[1]; |
2967 | 1039 |
2072 | 1040 if(p_type && USES_LIST(mb_type, 1)){ |
1041 av_log(c->avctx, AV_LOG_ERROR, "backward motion vector in P frame\n"); | |
2576
e237d9bd0f8c
check mb/me_threshold range, fixes assertion failure
michael
parents:
2522
diff
changeset
|
1042 return INT_MAX/2; |
2072 | 1043 } |
1955
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1044 assert(IS_INTRA(mb_type) || USES_LIST(mb_type,0) || USES_LIST(mb_type,1)); |
2967 | 1045 |
2072 | 1046 for(i=0; i<4; i++){ |
1047 int xy= s->block_index[i]; | |
1048 clip_input_mv(s, p->motion_val[0][xy], !!IS_INTERLACED(mb_type)); | |
1049 clip_input_mv(s, p->motion_val[1][xy], !!IS_INTERLACED(mb_type)); | |
1050 } | |
1051 | |
1955
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1052 if(IS_INTERLACED(mb_type)){ |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1053 int xy2= xy + s->b8_stride; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1054 s->mb_type[mb_xy]=CANDIDATE_MB_TYPE_INTRA; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1055 c->stride<<=1; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1056 c->uvstride<<=1; |
2967 | 1057 |
1995 | 1058 if(!(s->flags & CODEC_FLAG_INTERLACED_ME)){ |
2015
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
1059 av_log(c->avctx, AV_LOG_ERROR, "Interlaced macroblock selected but interlaced motion estimation disabled\n"); |
2576
e237d9bd0f8c
check mb/me_threshold range, fixes assertion failure
michael
parents:
2522
diff
changeset
|
1060 return INT_MAX/2; |
1995 | 1061 } |
1962 | 1062 |
1955
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1063 if(USES_LIST(mb_type, 0)){ |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1064 int field_select0= p->ref_index[0][xy ]; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1065 int field_select1= p->ref_index[0][xy2]; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1066 assert(field_select0==0 ||field_select0==1); |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1067 assert(field_select1==0 ||field_select1==1); |
1968
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1068 init_interlaced_ref(s, 0); |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1069 |
1955
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1070 if(p_type){ |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1071 s->p_field_select_table[0][mb_xy]= field_select0; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1072 s->p_field_select_table[1][mb_xy]= field_select1; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1073 *(uint32_t*)s->p_field_mv_table[0][field_select0][mb_xy]= *(uint32_t*)p->motion_val[0][xy ]; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1074 *(uint32_t*)s->p_field_mv_table[1][field_select1][mb_xy]= *(uint32_t*)p->motion_val[0][xy2]; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1075 s->mb_type[mb_xy]=CANDIDATE_MB_TYPE_INTER_I; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1076 }else{ |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1077 s->b_field_select_table[0][0][mb_xy]= field_select0; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1078 s->b_field_select_table[0][1][mb_xy]= field_select1; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1079 *(uint32_t*)s->b_field_mv_table[0][0][field_select0][mb_xy]= *(uint32_t*)p->motion_val[0][xy ]; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1080 *(uint32_t*)s->b_field_mv_table[0][1][field_select1][mb_xy]= *(uint32_t*)p->motion_val[0][xy2]; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1081 s->mb_type[mb_xy]= CANDIDATE_MB_TYPE_FORWARD_I; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1082 } |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1083 |
2967 | 1084 x= p->motion_val[0][xy ][0]; |
1955
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1085 y= p->motion_val[0][xy ][1]; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1086 d = cmp(s, x>>shift, y>>shift, x&mask, y&mask, 0, 8, field_select0, 0, cmpf, chroma_cmpf, flags); |
2967 | 1087 x= p->motion_val[0][xy2][0]; |
1955
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1088 y= p->motion_val[0][xy2][1]; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1089 d+= cmp(s, x>>shift, y>>shift, x&mask, y&mask, 0, 8, field_select1, 1, cmpf, chroma_cmpf, flags); |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1090 } |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1091 if(USES_LIST(mb_type, 1)){ |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1092 int field_select0= p->ref_index[1][xy ]; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1093 int field_select1= p->ref_index[1][xy2]; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1094 assert(field_select0==0 ||field_select0==1); |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1095 assert(field_select1==0 ||field_select1==1); |
1968
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1096 init_interlaced_ref(s, 2); |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1097 |
1955
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1098 s->b_field_select_table[1][0][mb_xy]= field_select0; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1099 s->b_field_select_table[1][1][mb_xy]= field_select1; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1100 *(uint32_t*)s->b_field_mv_table[1][0][field_select0][mb_xy]= *(uint32_t*)p->motion_val[1][xy ]; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1101 *(uint32_t*)s->b_field_mv_table[1][1][field_select1][mb_xy]= *(uint32_t*)p->motion_val[1][xy2]; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1102 if(USES_LIST(mb_type, 0)){ |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1103 s->mb_type[mb_xy]= CANDIDATE_MB_TYPE_BIDIR_I; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1104 }else{ |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1105 s->mb_type[mb_xy]= CANDIDATE_MB_TYPE_BACKWARD_I; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1106 } |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1107 |
2967 | 1108 x= p->motion_val[1][xy ][0]; |
1955
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1109 y= p->motion_val[1][xy ][1]; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1110 d = cmp(s, x>>shift, y>>shift, x&mask, y&mask, 0, 8, field_select0+2, 0, cmpf, chroma_cmpf, flags); |
2967 | 1111 x= p->motion_val[1][xy2][0]; |
1955
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1112 y= p->motion_val[1][xy2][1]; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1113 d+= cmp(s, x>>shift, y>>shift, x&mask, y&mask, 0, 8, field_select1+2, 1, cmpf, chroma_cmpf, flags); |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1114 //FIXME bidir scores |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1115 } |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1116 c->stride>>=1; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1117 c->uvstride>>=1; |
1962 | 1118 }else if(IS_8X8(mb_type)){ |
1995 | 1119 if(!(s->flags & CODEC_FLAG_4MV)){ |
2015
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
1120 av_log(c->avctx, AV_LOG_ERROR, "4MV macroblock selected but 4MV encoding disabled\n"); |
2576
e237d9bd0f8c
check mb/me_threshold range, fixes assertion failure
michael
parents:
2522
diff
changeset
|
1121 return INT_MAX/2; |
1995 | 1122 } |
1962 | 1123 cmpf= s->dsp.sse[1]; |
1124 chroma_cmpf= s->dsp.sse[1]; | |
2015
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
1125 init_mv4_ref(c); |
1962 | 1126 for(i=0; i<4; i++){ |
1127 xy= s->block_index[i]; | |
2967 | 1128 x= p->motion_val[0][xy][0]; |
1962 | 1129 y= p->motion_val[0][xy][1]; |
1130 d+= cmp(s, x>>shift, y>>shift, x&mask, y&mask, 1, 8, i, i, cmpf, chroma_cmpf, flags); | |
1131 } | |
1132 s->mb_type[mb_xy]=CANDIDATE_MB_TYPE_INTER4V; | |
1955
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1133 }else{ |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1134 if(USES_LIST(mb_type, 0)){ |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1135 if(p_type){ |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1136 *(uint32_t*)s->p_mv_table[mb_xy]= *(uint32_t*)p->motion_val[0][xy]; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1137 s->mb_type[mb_xy]=CANDIDATE_MB_TYPE_INTER; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1138 }else if(USES_LIST(mb_type, 1)){ |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1139 *(uint32_t*)s->b_bidir_forw_mv_table[mb_xy]= *(uint32_t*)p->motion_val[0][xy]; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1140 *(uint32_t*)s->b_bidir_back_mv_table[mb_xy]= *(uint32_t*)p->motion_val[1][xy]; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1141 s->mb_type[mb_xy]=CANDIDATE_MB_TYPE_BIDIR; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1142 }else{ |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1143 *(uint32_t*)s->b_forw_mv_table[mb_xy]= *(uint32_t*)p->motion_val[0][xy]; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1144 s->mb_type[mb_xy]=CANDIDATE_MB_TYPE_FORWARD; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1145 } |
2967 | 1146 x= p->motion_val[0][xy][0]; |
1955
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1147 y= p->motion_val[0][xy][1]; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1148 d = cmp(s, x>>shift, y>>shift, x&mask, y&mask, 0, 16, 0, 0, cmpf, chroma_cmpf, flags); |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1149 }else if(USES_LIST(mb_type, 1)){ |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1150 *(uint32_t*)s->b_back_mv_table[mb_xy]= *(uint32_t*)p->motion_val[1][xy]; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1151 s->mb_type[mb_xy]=CANDIDATE_MB_TYPE_BACKWARD; |
2967 | 1152 |
1153 x= p->motion_val[1][xy][0]; | |
1955
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1154 y= p->motion_val[1][xy][1]; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1155 d = cmp(s, x>>shift, y>>shift, x&mask, y&mask, 0, 16, 2, 0, cmpf, chroma_cmpf, flags); |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1156 }else |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1157 s->mb_type[mb_xy]=CANDIDATE_MB_TYPE_INTRA; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1158 } |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1159 return d; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1160 } |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1161 |
324 | 1162 void ff_estimate_p_frame_motion(MpegEncContext * s, |
1163 int mb_x, int mb_y) | |
0 | 1164 { |
1950 | 1165 MotionEstContext * const c= &s->me; |
1064 | 1166 uint8_t *pix, *ppix; |
4299
ffa6f24a0c0f
Doxygen comments about variables described by Michael here:
gpoirier
parents:
4283
diff
changeset
|
1167 int sum, mx, my, dmin; |
ffa6f24a0c0f
Doxygen comments about variables described by Michael here:
gpoirier
parents:
4283
diff
changeset
|
1168 int varc; ///< the variance of the block (sum of squared (p[y][x]-average)) |
ffa6f24a0c0f
Doxygen comments about variables described by Michael here:
gpoirier
parents:
4283
diff
changeset
|
1169 int vard; ///< sum of squared differences with the estimated motion vector |
455 | 1170 int P[10][2]; |
280 | 1171 const int shift= 1+s->quarter_sample; |
294 | 1172 int mb_type=0; |
903 | 1173 Picture * const pic= &s->current_picture; |
2967 | 1174 |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1175 init_ref(c, s->new_picture.data, s->last_picture.data, NULL, 16*mb_x, 16*mb_y, 0); |
1708 | 1176 |
936 | 1177 assert(s->quarter_sample==0 || s->quarter_sample==1); |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1178 assert(s->linesize == c->stride); |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1179 assert(s->uvlinesize == c->uvstride); |
936 | 1180 |
2184 | 1181 c->penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_cmp); |
1182 c->sub_penalty_factor= get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_sub_cmp); | |
1183 c->mb_penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->mb_cmp); | |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1184 c->current_mv_penalty= c->mv_penalty[s->f_code] + MAX_MV; |
0 | 1185 |
1708 | 1186 get_limits(s, 16*mb_x, 16*mb_y); |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1187 c->skip=0; |
324 | 1188 |
1968
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1189 /* intra / predictive decision */ |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1190 pix = c->src[0][0]; |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1191 sum = s->dsp.pix_sum(pix, s->linesize); |
2987 | 1192 varc = s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500; |
1968
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1193 |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1194 pic->mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8; |
2987 | 1195 pic->mb_var [s->mb_stride * mb_y + mb_x] = (varc+128)>>8; |
1196 c->mb_var_sum_temp += (varc+128)>>8; | |
1968
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1197 |
2015
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
1198 if(c->avctx->me_threshold){ |
2987 | 1199 vard= check_input_motion(s, mb_x, mb_y, 1); |
2967 | 1200 |
2987 | 1201 if((vard+128)>>8 < c->avctx->me_threshold){ |
4126 | 1202 int p_score= FFMIN(vard, varc-500+(s->lambda2>>FF_LAMBDA_SHIFT)*100); |
1203 int i_score= varc-500+(s->lambda2>>FF_LAMBDA_SHIFT)*20; | |
2987 | 1204 pic->mc_mb_var[s->mb_stride * mb_y + mb_x] = (vard+128)>>8; |
1205 c->mc_mb_var_sum_temp += (vard+128)>>8; | |
4126 | 1206 c->scene_change_score+= ff_sqrt(p_score) - ff_sqrt(i_score); |
1955
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1207 return; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1208 } |
2987 | 1209 if((vard+128)>>8 < c->avctx->mb_threshold) |
1968
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1210 mb_type= s->mb_type[mb_x + mb_y*s->mb_stride]; |
1955
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1211 } |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1212 |
320
cda7d0857baf
- ME setting moved to AVCodecContext/MpegEncContext, no longer a global.
pulento
parents:
304
diff
changeset
|
1213 switch(s->me_method) { |
0 | 1214 case ME_ZERO: |
1215 default: | |
2979 | 1216 no_motion_search(s, &mx, &my); |
455 | 1217 mx-= mb_x*16; |
1218 my-= mb_y*16; | |
0 | 1219 dmin = 0; |
1220 break; | |
1708 | 1221 #if 0 |
0 | 1222 case ME_FULL: |
2979 | 1223 dmin = full_motion_search(s, &mx, &my, range, ref_picture); |
455 | 1224 mx-= mb_x*16; |
1225 my-= mb_y*16; | |
0 | 1226 break; |
1227 case ME_LOG: | |
2979 | 1228 dmin = log_motion_search(s, &mx, &my, range / 2, ref_picture); |
455 | 1229 mx-= mb_x*16; |
1230 my-= mb_y*16; | |
0 | 1231 break; |
1232 case ME_PHODS: | |
2979 | 1233 dmin = phods_motion_search(s, &mx, &my, range / 2, ref_picture); |
455 | 1234 mx-= mb_x*16; |
1235 my-= mb_y*16; | |
0 | 1236 break; |
1708 | 1237 #endif |
288 | 1238 case ME_X1: |
277
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
275
diff
changeset
|
1239 case ME_EPZS: |
288 | 1240 { |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1904
diff
changeset
|
1241 const int mot_stride = s->b8_stride; |
294 | 1242 const int mot_xy = s->block_index[0]; |
288 | 1243 |
1668
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1634
diff
changeset
|
1244 P_LEFT[0] = s->current_picture.motion_val[0][mot_xy - 1][0]; |
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1634
diff
changeset
|
1245 P_LEFT[1] = s->current_picture.motion_val[0][mot_xy - 1][1]; |
288 | 1246 |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1247 if(P_LEFT[0] > (c->xmax<<shift)) P_LEFT[0] = (c->xmax<<shift); |
280 | 1248 |
1799 | 1249 if(!s->first_slice_line) { |
1668
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1634
diff
changeset
|
1250 P_TOP[0] = s->current_picture.motion_val[0][mot_xy - mot_stride ][0]; |
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1634
diff
changeset
|
1251 P_TOP[1] = s->current_picture.motion_val[0][mot_xy - mot_stride ][1]; |
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1634
diff
changeset
|
1252 P_TOPRIGHT[0] = s->current_picture.motion_val[0][mot_xy - mot_stride + 2][0]; |
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1634
diff
changeset
|
1253 P_TOPRIGHT[1] = s->current_picture.motion_val[0][mot_xy - mot_stride + 2][1]; |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1254 if(P_TOP[1] > (c->ymax<<shift)) P_TOP[1] = (c->ymax<<shift); |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1255 if(P_TOPRIGHT[0] < (c->xmin<<shift)) P_TOPRIGHT[0]= (c->xmin<<shift); |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1256 if(P_TOPRIGHT[1] > (c->ymax<<shift)) P_TOPRIGHT[1]= (c->ymax<<shift); |
2967 | 1257 |
455 | 1258 P_MEDIAN[0]= mid_pred(P_LEFT[0], P_TOP[0], P_TOPRIGHT[0]); |
1259 P_MEDIAN[1]= mid_pred(P_LEFT[1], P_TOP[1], P_TOPRIGHT[1]); | |
1260 | |
1261 if(s->out_format == FMT_H263){ | |
1950 | 1262 c->pred_x = P_MEDIAN[0]; |
1263 c->pred_y = P_MEDIAN[1]; | |
455 | 1264 }else { /* mpeg1 at least */ |
1950 | 1265 c->pred_x= P_LEFT[0]; |
1266 c->pred_y= P_LEFT[1]; | |
455 | 1267 } |
952 | 1268 }else{ |
1950 | 1269 c->pred_x= P_LEFT[0]; |
1270 c->pred_y= P_LEFT[1]; | |
288 | 1271 } |
952 | 1272 |
280 | 1273 } |
2967 | 1274 dmin = ff_epzs_motion_search(s, &mx, &my, P, 0, 0, s->p_mv_table, (1<<16)>>shift, 0, 16); |
1950 | 1275 |
277
5cb2978e701f
new motion estimation (epzs) not complete yet but allready pretty good :)
michaelni
parents:
275
diff
changeset
|
1276 break; |
0 | 1277 } |
1278 | |
455 | 1279 /* At this point (mx,my) are full-pell and the relative displacement */ |
1950 | 1280 ppix = c->ref[0][0] + (my * s->linesize) + mx; |
2967 | 1281 |
2987 | 1282 vard = s->dsp.sse[0](NULL, pix, ppix, s->linesize, 16); |
608 | 1283 |
2987 | 1284 pic->mc_mb_var[s->mb_stride * mb_y + mb_x] = (vard+128)>>8; |
2967 | 1285 // pic->mb_cmp_score[s->mb_stride * mb_y + mb_x] = dmin; |
2987 | 1286 c->mc_mb_var_sum_temp += (vard+128)>>8; |
2967 | 1287 |
0 | 1288 #if 0 |
233
3f5b72726118
- More work on preliminary bit rate control, just to be able to get an
pulento
parents:
232
diff
changeset
|
1289 printf("varc=%4d avg_var=%4d (sum=%4d) vard=%4d mx=%2d my=%2d\n", |
2979 | 1290 varc, s->avg_mb_var, sum, vard, mx - xx, my - yy); |
0 | 1291 #endif |
1968
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1292 if(mb_type){ |
4126 | 1293 int p_score= FFMIN(vard, varc-500+(s->lambda2>>FF_LAMBDA_SHIFT)*100); |
1294 int i_score= varc-500+(s->lambda2>>FF_LAMBDA_SHIFT)*20; | |
1295 c->scene_change_score+= ff_sqrt(p_score) - ff_sqrt(i_score); | |
1968
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1296 |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1297 if(mb_type == CANDIDATE_MB_TYPE_INTER){ |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1298 c->sub_motion_search(s, &mx, &my, dmin, 0, 0, 0, 16); |
1968
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1299 set_p_mv_tables(s, mx, my, 1); |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1300 }else{ |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1301 mx <<=shift; |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1302 my <<=shift; |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1303 } |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1304 if(mb_type == CANDIDATE_MB_TYPE_INTER4V){ |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1305 h263_mv4_search(s, mx, my, shift); |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1306 |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1307 set_p_mv_tables(s, mx, my, 0); |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1308 } |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1309 if(mb_type == CANDIDATE_MB_TYPE_INTER_I){ |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1310 interlaced_search(s, 0, s->p_field_mv_table, s->p_field_select_table, mx, my, 1); |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1311 } |
2015
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
1312 }else if(c->avctx->mb_decision > FF_MB_DECISION_SIMPLE){ |
4126 | 1313 int p_score= FFMIN(vard, varc-500+(s->lambda2>>FF_LAMBDA_SHIFT)*100); |
1314 int i_score= varc-500+(s->lambda2>>FF_LAMBDA_SHIFT)*20; | |
1315 c->scene_change_score+= ff_sqrt(p_score) - ff_sqrt(i_score); | |
608 | 1316 |
2987 | 1317 if (vard*2 + 200*256 > varc) |
1708 | 1318 mb_type|= CANDIDATE_MB_TYPE_INTRA; |
4100
bfab45292f1b
CANDIDATE_MB_TYPE_INTER heuristic doesnt work at really low quality where the distortion becomes less relevant then the overhead of intra blocks
michael
parents:
4001
diff
changeset
|
1319 if (varc*2 + 200*256 > vard || s->qscale > 24){ |
bfab45292f1b
CANDIDATE_MB_TYPE_INTER heuristic doesnt work at really low quality where the distortion becomes less relevant then the overhead of intra blocks
michael
parents:
4001
diff
changeset
|
1320 // if (varc*2 + 200*256 + 50*(s->lambda2>>FF_LAMBDA_SHIFT) > vard){ |
1708 | 1321 mb_type|= CANDIDATE_MB_TYPE_INTER; |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1322 c->sub_motion_search(s, &mx, &my, dmin, 0, 0, 0, 16); |
1494
3ee63c12ea30
optionally try to encode each MB with MV=<0,0> and choose the one with better RD
michaelni
parents:
1426
diff
changeset
|
1323 if(s->flags&CODEC_FLAG_MV0) |
3ee63c12ea30
optionally try to encode each MB with MV=<0,0> and choose the one with better RD
michaelni
parents:
1426
diff
changeset
|
1324 if(mx || my) |
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2576
diff
changeset
|
1325 mb_type |= CANDIDATE_MB_TYPE_SKIPPED; //FIXME check difference |
304 | 1326 }else{ |
936 | 1327 mx <<=shift; |
1328 my <<=shift; | |
0 | 1329 } |
455 | 1330 if((s->flags&CODEC_FLAG_4MV) |
2987 | 1331 && !c->skip && varc>50<<8 && vard>10<<8){ |
1708 | 1332 if(h263_mv4_search(s, mx, my, shift) < INT_MAX) |
1333 mb_type|=CANDIDATE_MB_TYPE_INTER4V; | |
455 | 1334 |
1335 set_p_mv_tables(s, mx, my, 0); | |
1336 }else | |
1337 set_p_mv_tables(s, mx, my, 1); | |
1708 | 1338 if((s->flags&CODEC_FLAG_INTERLACED_ME) |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1339 && !c->skip){ //FIXME varc/d checks |
1968
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1340 if(interlaced_search(s, 0, s->p_field_mv_table, s->p_field_select_table, mx, my, 0) < INT_MAX) |
1708 | 1341 mb_type |= CANDIDATE_MB_TYPE_INTER_I; |
1342 } | |
294 | 1343 }else{ |
1633 | 1344 int intra_score, i; |
1708 | 1345 mb_type= CANDIDATE_MB_TYPE_INTER; |
1013 | 1346 |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1347 dmin= c->sub_motion_search(s, &mx, &my, dmin, 0, 0, 0, 16); |
2015
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
1348 if(c->avctx->me_sub_cmp != c->avctx->mb_cmp && !c->skip) |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2184
diff
changeset
|
1349 dmin= ff_get_mb_score(s, mx, my, 0, 0, 0, 16, 1); |
1013 | 1350 |
1351 if((s->flags&CODEC_FLAG_4MV) | |
2987 | 1352 && !c->skip && varc>50<<8 && vard>10<<8){ |
1708 | 1353 int dmin4= h263_mv4_search(s, mx, my, shift); |
1013 | 1354 if(dmin4 < dmin){ |
1708 | 1355 mb_type= CANDIDATE_MB_TYPE_INTER4V; |
1013 | 1356 dmin=dmin4; |
1357 } | |
1358 } | |
1708 | 1359 if((s->flags&CODEC_FLAG_INTERLACED_ME) |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1360 && !c->skip){ //FIXME varc/d checks |
1968
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1361 int dmin_i= interlaced_search(s, 0, s->p_field_mv_table, s->p_field_select_table, mx, my, 0); |
1708 | 1362 if(dmin_i < dmin){ |
1363 mb_type = CANDIDATE_MB_TYPE_INTER_I; | |
1364 dmin= dmin_i; | |
1365 } | |
1366 } | |
2967 | 1367 |
1368 // pic->mb_cmp_score[s->mb_stride * mb_y + mb_x] = dmin; | |
1708 | 1369 set_p_mv_tables(s, mx, my, mb_type!=CANDIDATE_MB_TYPE_INTER4V); |
1633 | 1370 |
1371 /* get intra luma score */ | |
2015
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
1372 if((c->avctx->mb_cmp&0xFF)==FF_CMP_SSE){ |
2987 | 1373 intra_score= varc - 500; |
1633 | 1374 }else{ |
1375 int mean= (sum+128)>>8; | |
1376 mean*= 0x01010101; | |
2967 | 1377 |
1633 | 1378 for(i=0; i<16; i++){ |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1379 *(uint32_t*)(&c->scratchpad[i*s->linesize+ 0]) = mean; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1380 *(uint32_t*)(&c->scratchpad[i*s->linesize+ 4]) = mean; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1381 *(uint32_t*)(&c->scratchpad[i*s->linesize+ 8]) = mean; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1382 *(uint32_t*)(&c->scratchpad[i*s->linesize+12]) = mean; |
1633 | 1383 } |
1384 | |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1385 intra_score= s->dsp.mb_cmp[0](s, c->scratchpad, pix, s->linesize, 16); |
1633 | 1386 } |
1387 #if 0 //FIXME | |
1388 /* get chroma score */ | |
2015
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
1389 if(c->avctx->mb_cmp&FF_CMP_CHROMA){ |
1633 | 1390 for(i=1; i<3; i++){ |
1391 uint8_t *dest_c; | |
1392 int mean; | |
2967 | 1393 |
1633 | 1394 if(s->out_format == FMT_H263){ |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1904
diff
changeset
|
1395 mean= (s->dc_val[i][mb_x + mb_y*s->b8_stride] + 4)>>3; //FIXME not exact but simple ;) |
1633 | 1396 }else{ |
1397 mean= (s->last_dc[i] + 4)>>3; | |
1398 } | |
1399 dest_c = s->new_picture.data[i] + (mb_y * 8 * (s->uvlinesize)) + mb_x * 8; | |
2967 | 1400 |
1633 | 1401 mean*= 0x01010101; |
1402 for(i=0; i<8; i++){ | |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1403 *(uint32_t*)(&c->scratchpad[i*s->uvlinesize+ 0]) = mean; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1404 *(uint32_t*)(&c->scratchpad[i*s->uvlinesize+ 4]) = mean; |
1633 | 1405 } |
2967 | 1406 |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1407 intra_score+= s->dsp.mb_cmp[1](s, c->scratchpad, dest_c, s->uvlinesize); |
2967 | 1408 } |
1633 | 1409 } |
1410 #endif | |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1411 intra_score += c->mb_penalty_factor*16; |
2967 | 1412 |
1633 | 1413 if(intra_score < dmin){ |
1708 | 1414 mb_type= CANDIDATE_MB_TYPE_INTRA; |
1415 s->current_picture.mb_type[mb_y*s->mb_stride + mb_x]= CANDIDATE_MB_TYPE_INTRA; //FIXME cleanup | |
1633 | 1416 }else |
1417 s->current_picture.mb_type[mb_y*s->mb_stride + mb_x]= 0; | |
2967 | 1418 |
4126 | 1419 { |
1420 int p_score= FFMIN(vard, varc-500+(s->lambda2>>FF_LAMBDA_SHIFT)*100); | |
1421 int i_score= varc-500+(s->lambda2>>FF_LAMBDA_SHIFT)*20; | |
1422 c->scene_change_score+= ff_sqrt(p_score) - ff_sqrt(i_score); | |
294 | 1423 } |
1424 } | |
284 | 1425 |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1162
diff
changeset
|
1426 s->mb_type[mb_y*s->mb_stride + mb_x]= mb_type; |
0 | 1427 } |
1428 | |
951 | 1429 int ff_pre_estimate_p_frame_motion(MpegEncContext * s, |
1430 int mb_x, int mb_y) | |
1431 { | |
1950 | 1432 MotionEstContext * const c= &s->me; |
1708 | 1433 int mx, my, dmin; |
951 | 1434 int P[10][2]; |
1435 const int shift= 1+s->quarter_sample; | |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1162
diff
changeset
|
1436 const int xy= mb_x + mb_y*s->mb_stride; |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1437 init_ref(c, s->new_picture.data, s->last_picture.data, NULL, 16*mb_x, 16*mb_y, 0); |
2967 | 1438 |
951 | 1439 assert(s->quarter_sample==0 || s->quarter_sample==1); |
1440 | |
2184 | 1441 c->pre_penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_pre_cmp); |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1442 c->current_mv_penalty= c->mv_penalty[s->f_code] + MAX_MV; |
951 | 1443 |
1708 | 1444 get_limits(s, 16*mb_x, 16*mb_y); |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1445 c->skip=0; |
951 | 1446 |
1447 P_LEFT[0] = s->p_mv_table[xy + 1][0]; | |
1448 P_LEFT[1] = s->p_mv_table[xy + 1][1]; | |
1449 | |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1450 if(P_LEFT[0] < (c->xmin<<shift)) P_LEFT[0] = (c->xmin<<shift); |
951 | 1451 |
1452 /* special case for first line */ | |
1799 | 1453 if (s->first_slice_line) { |
1950 | 1454 c->pred_x= P_LEFT[0]; |
1455 c->pred_y= P_LEFT[1]; | |
952 | 1456 P_TOP[0]= P_TOPRIGHT[0]= P_MEDIAN[0]= |
2967 | 1457 P_TOP[1]= P_TOPRIGHT[1]= P_MEDIAN[1]= 0; //FIXME |
951 | 1458 } else { |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1162
diff
changeset
|
1459 P_TOP[0] = s->p_mv_table[xy + s->mb_stride ][0]; |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1162
diff
changeset
|
1460 P_TOP[1] = s->p_mv_table[xy + s->mb_stride ][1]; |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1162
diff
changeset
|
1461 P_TOPRIGHT[0] = s->p_mv_table[xy + s->mb_stride - 1][0]; |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1162
diff
changeset
|
1462 P_TOPRIGHT[1] = s->p_mv_table[xy + s->mb_stride - 1][1]; |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1463 if(P_TOP[1] < (c->ymin<<shift)) P_TOP[1] = (c->ymin<<shift); |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1464 if(P_TOPRIGHT[0] > (c->xmax<<shift)) P_TOPRIGHT[0]= (c->xmax<<shift); |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1465 if(P_TOPRIGHT[1] < (c->ymin<<shift)) P_TOPRIGHT[1]= (c->ymin<<shift); |
2967 | 1466 |
951 | 1467 P_MEDIAN[0]= mid_pred(P_LEFT[0], P_TOP[0], P_TOPRIGHT[0]); |
1468 P_MEDIAN[1]= mid_pred(P_LEFT[1], P_TOP[1], P_TOPRIGHT[1]); | |
1469 | |
1950 | 1470 c->pred_x = P_MEDIAN[0]; |
1471 c->pred_y = P_MEDIAN[1]; | |
951 | 1472 } |
1950 | 1473 |
2967 | 1474 dmin = ff_epzs_motion_search(s, &mx, &my, P, 0, 0, s->p_mv_table, (1<<16)>>shift, 0, 16); |
952 | 1475 |
951 | 1476 s->p_mv_table[xy][0] = mx<<shift; |
1477 s->p_mv_table[xy][1] = my<<shift; | |
2967 | 1478 |
951 | 1479 return dmin; |
1480 } | |
1481 | |
1057 | 1482 static int ff_estimate_motion_b(MpegEncContext * s, |
1950 | 1483 int mb_x, int mb_y, int16_t (*mv_table)[2], int ref_index, int f_code) |
0 | 1484 { |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1485 MotionEstContext * const c= &s->me; |
1708 | 1486 int mx, my, dmin; |
455 | 1487 int P[10][2]; |
324 | 1488 const int shift= 1+s->quarter_sample; |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1162
diff
changeset
|
1489 const int mot_stride = s->mb_stride; |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1162
diff
changeset
|
1490 const int mot_xy = mb_y*mot_stride + mb_x; |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1491 uint8_t * const mv_penalty= c->mv_penalty[f_code] + MAX_MV; |
948 | 1492 int mv_scale; |
2967 | 1493 |
2184 | 1494 c->penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_cmp); |
1495 c->sub_penalty_factor= get_penalty_factor(s->lambda, s->lambda2, c->avctx->me_sub_cmp); | |
1496 c->mb_penalty_factor = get_penalty_factor(s->lambda, s->lambda2, c->avctx->mb_cmp); | |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1497 c->current_mv_penalty= mv_penalty; |
936 | 1498 |
1708 | 1499 get_limits(s, 16*mb_x, 16*mb_y); |
324 | 1500 |
1501 switch(s->me_method) { | |
1502 case ME_ZERO: | |
1503 default: | |
2979 | 1504 no_motion_search(s, &mx, &my); |
324 | 1505 dmin = 0; |
455 | 1506 mx-= mb_x*16; |
1507 my-= mb_y*16; | |
324 | 1508 break; |
1708 | 1509 #if 0 |
324 | 1510 case ME_FULL: |
2979 | 1511 dmin = full_motion_search(s, &mx, &my, range, ref_picture); |
455 | 1512 mx-= mb_x*16; |
1513 my-= mb_y*16; | |
324 | 1514 break; |
1515 case ME_LOG: | |
2979 | 1516 dmin = log_motion_search(s, &mx, &my, range / 2, ref_picture); |
455 | 1517 mx-= mb_x*16; |
1518 my-= mb_y*16; | |
324 | 1519 break; |
1520 case ME_PHODS: | |
2979 | 1521 dmin = phods_motion_search(s, &mx, &my, range / 2, ref_picture); |
455 | 1522 mx-= mb_x*16; |
1523 my-= mb_y*16; | |
324 | 1524 break; |
1708 | 1525 #endif |
324 | 1526 case ME_X1: |
1527 case ME_EPZS: | |
1528 { | |
455 | 1529 P_LEFT[0] = mv_table[mot_xy - 1][0]; |
1530 P_LEFT[1] = mv_table[mot_xy - 1][1]; | |
324 | 1531 |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1532 if(P_LEFT[0] > (c->xmax<<shift)) P_LEFT[0] = (c->xmax<<shift); |
324 | 1533 |
1534 /* special case for first line */ | |
1799 | 1535 if (!s->first_slice_line) { |
455 | 1536 P_TOP[0] = mv_table[mot_xy - mot_stride ][0]; |
1537 P_TOP[1] = mv_table[mot_xy - mot_stride ][1]; | |
1538 P_TOPRIGHT[0] = mv_table[mot_xy - mot_stride + 1 ][0]; | |
1539 P_TOPRIGHT[1] = mv_table[mot_xy - mot_stride + 1 ][1]; | |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1540 if(P_TOP[1] > (c->ymax<<shift)) P_TOP[1]= (c->ymax<<shift); |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1541 if(P_TOPRIGHT[0] < (c->xmin<<shift)) P_TOPRIGHT[0]= (c->xmin<<shift); |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1542 if(P_TOPRIGHT[1] > (c->ymax<<shift)) P_TOPRIGHT[1]= (c->ymax<<shift); |
2967 | 1543 |
455 | 1544 P_MEDIAN[0]= mid_pred(P_LEFT[0], P_TOP[0], P_TOPRIGHT[0]); |
1545 P_MEDIAN[1]= mid_pred(P_LEFT[1], P_TOP[1], P_TOPRIGHT[1]); | |
324 | 1546 } |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1547 c->pred_x= P_LEFT[0]; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1548 c->pred_y= P_LEFT[1]; |
324 | 1549 } |
2967 | 1550 |
948 | 1551 if(mv_table == s->b_forw_mv_table){ |
1552 mv_scale= (s->pb_time<<16) / (s->pp_time<<shift); | |
1553 }else{ | |
1554 mv_scale= ((s->pb_time - s->pp_time)<<16) / (s->pp_time<<shift); | |
1555 } | |
2967 | 1556 |
2184 | 1557 dmin = ff_epzs_motion_search(s, &mx, &my, P, 0, ref_index, s->p_mv_table, mv_scale, 0, 16); |
2967 | 1558 |
324 | 1559 break; |
1560 } | |
2967 | 1561 |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1562 dmin= c->sub_motion_search(s, &mx, &my, dmin, 0, ref_index, 0, 16); |
2967 | 1563 |
2015
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
1564 if(c->avctx->me_sub_cmp != c->avctx->mb_cmp && !c->skip) |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2184
diff
changeset
|
1565 dmin= ff_get_mb_score(s, mx, my, 0, ref_index, 0, 16, 1); |
1013 | 1566 |
455 | 1567 //printf("%d %d %d %d//", s->mb_x, s->mb_y, mx, my); |
324 | 1568 // s->mb_type[mb_y*s->mb_width + mb_x]= mb_type; |
1569 mv_table[mot_xy][0]= mx; | |
1570 mv_table[mot_xy][1]= my; | |
936 | 1571 |
327 | 1572 return dmin; |
324 | 1573 } |
1574 | |
1950 | 1575 static inline int check_bidir_mv(MpegEncContext * s, |
327 | 1576 int motion_fx, int motion_fy, |
1577 int motion_bx, int motion_by, | |
1578 int pred_fx, int pred_fy, | |
1708 | 1579 int pred_bx, int pred_by, |
1580 int size, int h) | |
327 | 1581 { |
1582 //FIXME optimize? | |
936 | 1583 //FIXME better f_code prediction (max mv & distance) |
1708 | 1584 //FIXME pointers |
1950 | 1585 MotionEstContext * const c= &s->me; |
2982 | 1586 uint8_t * const mv_penalty_f= c->mv_penalty[s->f_code] + MAX_MV; // f_code of the prev frame |
1587 uint8_t * const mv_penalty_b= c->mv_penalty[s->b_code] + MAX_MV; // f_code of the prev frame | |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1588 int stride= c->stride; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1589 uint8_t *dest_y = c->scratchpad; |
327 | 1590 uint8_t *ptr; |
1591 int dxy; | |
1592 int src_x, src_y; | |
1593 int fbmin; | |
1950 | 1594 uint8_t **src_data= c->src[0]; |
1595 uint8_t **ref_data= c->ref[0]; | |
1596 uint8_t **ref2_data= c->ref[2]; | |
327 | 1597 |
936 | 1598 if(s->quarter_sample){ |
1599 dxy = ((motion_fy & 3) << 2) | (motion_fx & 3); | |
1708 | 1600 src_x = motion_fx >> 2; |
1601 src_y = motion_fy >> 2; | |
327 | 1602 |
1708 | 1603 ptr = ref_data[0] + (src_y * stride) + src_x; |
1604 s->dsp.put_qpel_pixels_tab[0][dxy](dest_y , ptr , stride); | |
853
eacc2dd8fd9d
* using DSPContext - so each codec could use its local (sub)set of CPU extension
kabi
parents:
847
diff
changeset
|
1605 |
936 | 1606 dxy = ((motion_by & 3) << 2) | (motion_bx & 3); |
1708 | 1607 src_x = motion_bx >> 2; |
1608 src_y = motion_by >> 2; | |
2967 | 1609 |
1950 | 1610 ptr = ref2_data[0] + (src_y * stride) + src_x; |
1708 | 1611 s->dsp.avg_qpel_pixels_tab[size][dxy](dest_y , ptr , stride); |
936 | 1612 }else{ |
1613 dxy = ((motion_fy & 1) << 1) | (motion_fx & 1); | |
1708 | 1614 src_x = motion_fx >> 1; |
1615 src_y = motion_fy >> 1; | |
327 | 1616 |
1708 | 1617 ptr = ref_data[0] + (src_y * stride) + src_x; |
1618 s->dsp.put_pixels_tab[size][dxy](dest_y , ptr , stride, h); | |
853
eacc2dd8fd9d
* using DSPContext - so each codec could use its local (sub)set of CPU extension
kabi
parents:
847
diff
changeset
|
1619 |
936 | 1620 dxy = ((motion_by & 1) << 1) | (motion_bx & 1); |
1708 | 1621 src_x = motion_bx >> 1; |
1622 src_y = motion_by >> 1; | |
2967 | 1623 |
1950 | 1624 ptr = ref2_data[0] + (src_y * stride) + src_x; |
1708 | 1625 s->dsp.avg_pixels_tab[size][dxy](dest_y , ptr , stride, h); |
936 | 1626 } |
853
eacc2dd8fd9d
* using DSPContext - so each codec could use its local (sub)set of CPU extension
kabi
parents:
847
diff
changeset
|
1627 |
2982 | 1628 fbmin = (mv_penalty_f[motion_fx-pred_fx] + mv_penalty_f[motion_fy-pred_fy])*c->mb_penalty_factor |
1629 +(mv_penalty_b[motion_bx-pred_bx] + mv_penalty_b[motion_by-pred_by])*c->mb_penalty_factor | |
1708 | 1630 + s->dsp.mb_cmp[size](s, src_data[0], dest_y, stride, h); //FIXME new_pic |
2967 | 1631 |
2015
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
1632 if(c->avctx->mb_cmp&FF_CMP_CHROMA){ |
1013 | 1633 } |
1634 //FIXME CHROMA !!! | |
2967 | 1635 |
327 | 1636 return fbmin; |
1637 } | |
1638 | |
1639 /* refine the bidir vectors in hq mode and return the score in both lq & hq mode*/ | |
1950 | 1640 static inline int bidir_refine(MpegEncContext * s, int mb_x, int mb_y) |
327 | 1641 { |
2983 | 1642 MotionEstContext * const c= &s->me; |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1162
diff
changeset
|
1643 const int mot_stride = s->mb_stride; |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1162
diff
changeset
|
1644 const int xy = mb_y *mot_stride + mb_x; |
327 | 1645 int fbmin; |
1646 int pred_fx= s->b_bidir_forw_mv_table[xy-1][0]; | |
1647 int pred_fy= s->b_bidir_forw_mv_table[xy-1][1]; | |
1648 int pred_bx= s->b_bidir_back_mv_table[xy-1][0]; | |
1649 int pred_by= s->b_bidir_back_mv_table[xy-1][1]; | |
1650 int motion_fx= s->b_bidir_forw_mv_table[xy][0]= s->b_forw_mv_table[xy][0]; | |
1651 int motion_fy= s->b_bidir_forw_mv_table[xy][1]= s->b_forw_mv_table[xy][1]; | |
1652 int motion_bx= s->b_bidir_back_mv_table[xy][0]= s->b_back_mv_table[xy][0]; | |
1653 int motion_by= s->b_bidir_back_mv_table[xy][1]= s->b_back_mv_table[xy][1]; | |
2983 | 1654 const int flags= c->sub_flags; |
1655 const int qpel= flags&FLAG_QPEL; | |
1656 const int shift= 1+qpel; | |
1657 const int xmin= c->xmin<<shift; | |
1658 const int ymin= c->ymin<<shift; | |
1659 const int xmax= c->xmax<<shift; | |
1660 const int ymax= c->ymax<<shift; | |
3026
10934895be5a
10l: bidir_refine didn't save the new mvs. also improve speed.
lorenm
parents:
2987
diff
changeset
|
1661 uint8_t map[8][8][8][8]; |
10934895be5a
10l: bidir_refine didn't save the new mvs. also improve speed.
lorenm
parents:
2987
diff
changeset
|
1662 |
10934895be5a
10l: bidir_refine didn't save the new mvs. also improve speed.
lorenm
parents:
2987
diff
changeset
|
1663 memset(map,0,sizeof(map)); |
10934895be5a
10l: bidir_refine didn't save the new mvs. also improve speed.
lorenm
parents:
2987
diff
changeset
|
1664 #define BIDIR_MAP(fx,fy,bx,by) \ |
10934895be5a
10l: bidir_refine didn't save the new mvs. also improve speed.
lorenm
parents:
2987
diff
changeset
|
1665 map[(motion_fx+fx)&7][(motion_fy+fy)&7][(motion_bx+bx)&7][(motion_by+by)&7] |
10934895be5a
10l: bidir_refine didn't save the new mvs. also improve speed.
lorenm
parents:
2987
diff
changeset
|
1666 BIDIR_MAP(0,0,0,0) = 1; |
2967 | 1667 |
1950 | 1668 fbmin= check_bidir_mv(s, motion_fx, motion_fy, |
327 | 1669 motion_bx, motion_by, |
1670 pred_fx, pred_fy, | |
1708 | 1671 pred_bx, pred_by, |
1672 0, 16); | |
327 | 1673 |
2983 | 1674 if(s->avctx->bidir_refine){ |
1675 int score, end; | |
1676 #define CHECK_BIDIR(fx,fy,bx,by)\ | |
3026
10934895be5a
10l: bidir_refine didn't save the new mvs. also improve speed.
lorenm
parents:
2987
diff
changeset
|
1677 if( !BIDIR_MAP(fx,fy,bx,by)\ |
10934895be5a
10l: bidir_refine didn't save the new mvs. also improve speed.
lorenm
parents:
2987
diff
changeset
|
1678 &&(fx<=0 || motion_fx+fx<=xmax) && (fy<=0 || motion_fy+fy<=ymax) && (bx<=0 || motion_bx+bx<=xmax) && (by<=0 || motion_by+by<=ymax)\ |
2984 | 1679 &&(fx>=0 || motion_fx+fx>=xmin) && (fy>=0 || motion_fy+fy>=ymin) && (bx>=0 || motion_bx+bx>=xmin) && (by>=0 || motion_by+by>=ymin)){\ |
3026
10934895be5a
10l: bidir_refine didn't save the new mvs. also improve speed.
lorenm
parents:
2987
diff
changeset
|
1680 BIDIR_MAP(fx,fy,bx,by) = 1;\ |
2984 | 1681 score= check_bidir_mv(s, motion_fx+fx, motion_fy+fy, motion_bx+bx, motion_by+by, pred_fx, pred_fy, pred_bx, pred_by, 0, 16);\ |
1682 if(score < fbmin){\ | |
1683 fbmin= score;\ | |
1684 motion_fx+=fx;\ | |
1685 motion_fy+=fy;\ | |
1686 motion_bx+=bx;\ | |
1687 motion_by+=by;\ | |
1688 end=0;\ | |
1689 }\ | |
2983 | 1690 } |
1691 #define CHECK_BIDIR2(a,b,c,d)\ | |
1692 CHECK_BIDIR(a,b,c,d)\ | |
3575
4baed6f6577b
Fix CHECK_BIDIR macro so it works with Intel's Compiler
gpoirier
parents:
3188
diff
changeset
|
1693 CHECK_BIDIR(-(a),-(b),-(c),-(d)) |
2983 | 1694 |
1695 #define CHECK_BIDIRR(a,b,c,d)\ | |
1696 CHECK_BIDIR2(a,b,c,d)\ | |
1697 CHECK_BIDIR2(b,c,d,a)\ | |
1698 CHECK_BIDIR2(c,d,a,b)\ | |
1699 CHECK_BIDIR2(d,a,b,c) | |
1700 | |
1701 do{ | |
1702 end=1; | |
1703 | |
1704 CHECK_BIDIRR( 0, 0, 0, 1) | |
1705 if(s->avctx->bidir_refine > 1){ | |
1706 CHECK_BIDIRR( 0, 0, 1, 1) | |
1707 CHECK_BIDIR2( 0, 1, 0, 1) | |
1708 CHECK_BIDIR2( 1, 0, 1, 0) | |
1709 CHECK_BIDIRR( 0, 0,-1, 1) | |
1710 CHECK_BIDIR2( 0,-1, 0, 1) | |
1711 CHECK_BIDIR2(-1, 0, 1, 0) | |
1712 if(s->avctx->bidir_refine > 2){ | |
1713 CHECK_BIDIRR( 0, 1, 1, 1) | |
1714 CHECK_BIDIRR( 0,-1, 1, 1) | |
1715 CHECK_BIDIRR( 0, 1,-1, 1) | |
1716 CHECK_BIDIRR( 0, 1, 1,-1) | |
1717 if(s->avctx->bidir_refine > 3){ | |
1718 CHECK_BIDIR2( 1, 1, 1, 1) | |
1719 CHECK_BIDIRR( 1, 1, 1,-1) | |
1720 CHECK_BIDIR2( 1, 1,-1,-1) | |
1721 CHECK_BIDIR2( 1,-1,-1, 1) | |
1722 CHECK_BIDIR2( 1,-1, 1,-1) | |
1723 } | |
1724 } | |
1725 } | |
1726 }while(!end); | |
1727 } | |
1728 | |
3026
10934895be5a
10l: bidir_refine didn't save the new mvs. also improve speed.
lorenm
parents:
2987
diff
changeset
|
1729 s->b_bidir_forw_mv_table[xy][0]= motion_fx; |
10934895be5a
10l: bidir_refine didn't save the new mvs. also improve speed.
lorenm
parents:
2987
diff
changeset
|
1730 s->b_bidir_forw_mv_table[xy][1]= motion_fy; |
10934895be5a
10l: bidir_refine didn't save the new mvs. also improve speed.
lorenm
parents:
2987
diff
changeset
|
1731 s->b_bidir_back_mv_table[xy][0]= motion_bx; |
10934895be5a
10l: bidir_refine didn't save the new mvs. also improve speed.
lorenm
parents:
2987
diff
changeset
|
1732 s->b_bidir_back_mv_table[xy][1]= motion_by; |
10934895be5a
10l: bidir_refine didn't save the new mvs. also improve speed.
lorenm
parents:
2987
diff
changeset
|
1733 |
2983 | 1734 return fbmin; |
327 | 1735 } |
1736 | |
1950 | 1737 static inline int direct_search(MpegEncContext * s, int mb_x, int mb_y) |
324 | 1738 { |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1739 MotionEstContext * const c= &s->me; |
455 | 1740 int P[10][2]; |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1162
diff
changeset
|
1741 const int mot_stride = s->mb_stride; |
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1162
diff
changeset
|
1742 const int mot_xy = mb_y*mot_stride + mb_x; |
936 | 1743 const int shift= 1+s->quarter_sample; |
1744 int dmin, i; | |
327 | 1745 const int time_pp= s->pp_time; |
664 | 1746 const int time_pb= s->pb_time; |
936 | 1747 int mx, my, xmin, xmax, ymin, ymax; |
327 | 1748 int16_t (*mv_table)[2]= s->b_direct_mv_table; |
2967 | 1749 |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1750 c->current_mv_penalty= c->mv_penalty[1] + MAX_MV; |
936 | 1751 ymin= xmin=(-32)>>shift; |
1752 ymax= xmax= 31>>shift; | |
1753 | |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1162
diff
changeset
|
1754 if(IS_8X8(s->next_picture.mb_type[mot_xy])){ |
936 | 1755 s->mv_type= MV_TYPE_8X8; |
1756 }else{ | |
1757 s->mv_type= MV_TYPE_16X16; | |
327 | 1758 } |
936 | 1759 |
1760 for(i=0; i<4; i++){ | |
1761 int index= s->block_index[i]; | |
1762 int min, max; | |
2967 | 1763 |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1764 c->co_located_mv[i][0]= s->next_picture.motion_val[0][index][0]; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1765 c->co_located_mv[i][1]= s->next_picture.motion_val[0][index][1]; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1766 c->direct_basis_mv[i][0]= c->co_located_mv[i][0]*time_pb/time_pp + ((i& 1)<<(shift+3)); |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1767 c->direct_basis_mv[i][1]= c->co_located_mv[i][1]*time_pb/time_pp + ((i>>1)<<(shift+3)); |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1768 // c->direct_basis_mv[1][i][0]= c->co_located_mv[i][0]*(time_pb - time_pp)/time_pp + ((i &1)<<(shift+3); |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1769 // c->direct_basis_mv[1][i][1]= c->co_located_mv[i][1]*(time_pb - time_pp)/time_pp + ((i>>1)<<(shift+3); |
936 | 1770 |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1771 max= FFMAX(c->direct_basis_mv[i][0], c->direct_basis_mv[i][0] - c->co_located_mv[i][0])>>shift; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1772 min= FFMIN(c->direct_basis_mv[i][0], c->direct_basis_mv[i][0] - c->co_located_mv[i][0])>>shift; |
1764 | 1773 max+= 16*mb_x + 1; // +-1 is for the simpler rounding |
1774 min+= 16*mb_x - 1; | |
960 | 1775 xmax= FFMIN(xmax, s->width - max); |
1776 xmin= FFMAX(xmin, - 16 - min); | |
936 | 1777 |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1778 max= FFMAX(c->direct_basis_mv[i][1], c->direct_basis_mv[i][1] - c->co_located_mv[i][1])>>shift; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1779 min= FFMIN(c->direct_basis_mv[i][1], c->direct_basis_mv[i][1] - c->co_located_mv[i][1])>>shift; |
1764 | 1780 max+= 16*mb_y + 1; // +-1 is for the simpler rounding |
1781 min+= 16*mb_y - 1; | |
960 | 1782 ymax= FFMIN(ymax, s->height - max); |
1783 ymin= FFMAX(ymin, - 16 - min); | |
2967 | 1784 |
936 | 1785 if(s->mv_type == MV_TYPE_16X16) break; |
327 | 1786 } |
2967 | 1787 |
936 | 1788 assert(xmax <= 15 && ymax <= 15 && xmin >= -16 && ymin >= -16); |
2967 | 1789 |
936 | 1790 if(xmax < 0 || xmin >0 || ymax < 0 || ymin > 0){ |
1791 s->b_direct_mv_table[mot_xy][0]= 0; | |
1792 s->b_direct_mv_table[mot_xy][1]= 0; | |
1793 | |
1794 return 256*256*256*64; | |
1795 } | |
2967 | 1796 |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1797 c->xmin= xmin; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1798 c->ymin= ymin; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1799 c->xmax= xmax; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1800 c->ymax= ymax; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1801 c->flags |= FLAG_DIRECT; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1802 c->sub_flags |= FLAG_DIRECT; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1803 c->pred_x=0; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1804 c->pred_y=0; |
936 | 1805 |
4594 | 1806 P_LEFT[0] = av_clip(mv_table[mot_xy - 1][0], xmin<<shift, xmax<<shift); |
1807 P_LEFT[1] = av_clip(mv_table[mot_xy - 1][1], ymin<<shift, ymax<<shift); | |
950 | 1808 |
1809 /* special case for first line */ | |
5129 | 1810 if (!s->first_slice_line) { //FIXME maybe allow this over thread boundary as it is clipped |
4594 | 1811 P_TOP[0] = av_clip(mv_table[mot_xy - mot_stride ][0], xmin<<shift, xmax<<shift); |
1812 P_TOP[1] = av_clip(mv_table[mot_xy - mot_stride ][1], ymin<<shift, ymax<<shift); | |
1813 P_TOPRIGHT[0] = av_clip(mv_table[mot_xy - mot_stride + 1 ][0], xmin<<shift, xmax<<shift); | |
1814 P_TOPRIGHT[1] = av_clip(mv_table[mot_xy - mot_stride + 1 ][1], ymin<<shift, ymax<<shift); | |
2967 | 1815 |
950 | 1816 P_MEDIAN[0]= mid_pred(P_LEFT[0], P_TOP[0], P_TOPRIGHT[0]); |
1817 P_MEDIAN[1]= mid_pred(P_LEFT[1], P_TOP[1], P_TOPRIGHT[1]); | |
1818 } | |
2967 | 1819 |
2184 | 1820 dmin = ff_epzs_motion_search(s, &mx, &my, P, 0, 0, mv_table, 1<<(16-shift), 0, 16); |
2967 | 1821 if(c->sub_flags&FLAG_QPEL) |
1950 | 1822 dmin = qpel_motion_search(s, &mx, &my, dmin, 0, 0, 0, 16); |
1823 else | |
1824 dmin = hpel_motion_search(s, &mx, &my, dmin, 0, 0, 0, 16); | |
2967 | 1825 |
2015
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
1826 if(c->avctx->me_sub_cmp != c->avctx->mb_cmp && !c->skip) |
2189
70b27300a496
quad tree based motion compensation (currently only 16x16 & 8x8 OBMC blocks, but can be extended to other block sizes easily)
michael
parents:
2184
diff
changeset
|
1827 dmin= ff_get_mb_score(s, mx, my, 0, 0, 0, 16, 1); |
2967 | 1828 |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1829 get_limits(s, 16*mb_x, 16*mb_y); //restore c->?min/max, maybe not needed |
327 | 1830 |
4319 | 1831 mv_table[mot_xy][0]= mx; |
1832 mv_table[mot_xy][1]= my; | |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1833 c->flags &= ~FLAG_DIRECT; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1834 c->sub_flags &= ~FLAG_DIRECT; |
1950 | 1835 |
327 | 1836 return dmin; |
324 | 1837 } |
1838 | |
1839 void ff_estimate_b_frame_motion(MpegEncContext * s, | |
1840 int mb_x, int mb_y) | |
1841 { | |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1842 MotionEstContext * const c= &s->me; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1843 const int penalty_factor= c->mb_penalty_factor; |
1708 | 1844 int fmin, bmin, dmin, fbmin, bimin, fimin; |
327 | 1845 int type=0; |
1968
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1846 const int xy = mb_y*s->mb_stride + mb_x; |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1847 init_ref(c, s->new_picture.data, s->last_picture.data, s->next_picture.data, 16*mb_x, 16*mb_y, 2); |
1968
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1848 |
2072 | 1849 get_limits(s, 16*mb_x, 16*mb_y); |
2967 | 1850 |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1851 c->skip=0; |
4317
5a2ee0bc2739
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)
michael
parents:
4307
diff
changeset
|
1852 |
5a2ee0bc2739
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)
michael
parents:
4307
diff
changeset
|
1853 if(s->codec_id == CODEC_ID_MPEG4 && s->next_picture.mbskip_table[xy]){ |
5a2ee0bc2739
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)
michael
parents:
4307
diff
changeset
|
1854 int score= direct_search(s, mb_x, mb_y); //FIXME just check 0,0 |
5a2ee0bc2739
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)
michael
parents:
4307
diff
changeset
|
1855 |
5a2ee0bc2739
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)
michael
parents:
4307
diff
changeset
|
1856 score= ((unsigned)(score*score + 128*256))>>16; |
5a2ee0bc2739
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)
michael
parents:
4307
diff
changeset
|
1857 c->mc_mb_var_sum_temp += score; |
5a2ee0bc2739
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)
michael
parents:
4307
diff
changeset
|
1858 s->current_picture.mc_mb_var[mb_y*s->mb_stride + mb_x] = score; //FIXME use SSE |
5a2ee0bc2739
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)
michael
parents:
4307
diff
changeset
|
1859 s->mb_type[mb_y*s->mb_stride + mb_x]= CANDIDATE_MB_TYPE_DIRECT0; |
5a2ee0bc2739
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)
michael
parents:
4307
diff
changeset
|
1860 |
5a2ee0bc2739
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)
michael
parents:
4307
diff
changeset
|
1861 return; |
5a2ee0bc2739
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)
michael
parents:
4307
diff
changeset
|
1862 } |
5a2ee0bc2739
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)
michael
parents:
4307
diff
changeset
|
1863 |
2015
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
1864 if(c->avctx->me_threshold){ |
2987 | 1865 int vard= check_input_motion(s, mb_x, mb_y, 0); |
2967 | 1866 |
2987 | 1867 if((vard+128)>>8 < c->avctx->me_threshold){ |
1955
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1868 // pix = c->src[0][0]; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1869 // sum = s->dsp.pix_sum(pix, s->linesize); |
2987 | 1870 // varc = s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500; |
2967 | 1871 |
2987 | 1872 // pic->mb_var [s->mb_stride * mb_y + mb_x] = (varc+128)>>8; |
1873 s->current_picture.mc_mb_var[s->mb_stride * mb_y + mb_x] = (vard+128)>>8; | |
1955
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1874 /* pic->mb_mean [s->mb_stride * mb_y + mb_x] = (sum+128)>>8; |
2987 | 1875 c->mb_var_sum_temp += (varc+128)>>8;*/ |
1876 c->mc_mb_var_sum_temp += (vard+128)>>8; | |
1877 /* if (vard <= 64<<8 || vard < varc) { | |
1878 c->scene_change_score+= ff_sqrt(vard) - ff_sqrt(varc); | |
1955
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1879 }else{ |
3061 | 1880 c->scene_change_score+= s->qscale * s->avctx->scenechange_factor; |
1955
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1881 }*/ |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1882 return; |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1883 } |
2987 | 1884 if((vard+128)>>8 < c->avctx->mb_threshold){ |
1968
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1885 type= s->mb_type[mb_y*s->mb_stride + mb_x]; |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1886 if(type == CANDIDATE_MB_TYPE_DIRECT){ |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1887 direct_search(s, mb_x, mb_y); |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1888 } |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1889 if(type == CANDIDATE_MB_TYPE_FORWARD || type == CANDIDATE_MB_TYPE_BIDIR){ |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1890 c->skip=0; |
1968
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1891 ff_estimate_motion_b(s, mb_x, mb_y, s->b_forw_mv_table, 0, s->f_code); |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1892 } |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1893 if(type == CANDIDATE_MB_TYPE_BACKWARD || type == CANDIDATE_MB_TYPE_BIDIR){ |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1894 c->skip=0; |
1968
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1895 ff_estimate_motion_b(s, mb_x, mb_y, s->b_back_mv_table, 2, s->b_code); |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1896 } |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1897 if(type == CANDIDATE_MB_TYPE_FORWARD_I || type == CANDIDATE_MB_TYPE_BIDIR_I){ |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1898 c->skip=0; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1899 c->current_mv_penalty= c->mv_penalty[s->f_code] + MAX_MV; |
1968
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1900 interlaced_search(s, 0, |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1901 s->b_field_mv_table[0], s->b_field_select_table[0], |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1902 s->b_forw_mv_table[xy][0], s->b_forw_mv_table[xy][1], 1); |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1903 } |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1904 if(type == CANDIDATE_MB_TYPE_BACKWARD_I || type == CANDIDATE_MB_TYPE_BIDIR_I){ |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1905 c->skip=0; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1906 c->current_mv_penalty= c->mv_penalty[s->b_code] + MAX_MV; |
1968
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1907 interlaced_search(s, 2, |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1908 s->b_field_mv_table[1], s->b_field_select_table[1], |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1909 s->b_back_mv_table[xy][0], s->b_back_mv_table[xy][1], 1); |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1910 } |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1911 return; |
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1912 } |
1955
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1913 } |
5dafb10e0252
reuse motion vectors/mb types/field select values of the source video, if the SSE for a macroblock which is predicted with these values is below me_threshold
michael
parents:
1950
diff
changeset
|
1914 |
1426 | 1915 if (s->codec_id == CODEC_ID_MPEG4) |
1950 | 1916 dmin= direct_search(s, mb_x, mb_y); |
1426 | 1917 else |
1918 dmin= INT_MAX; | |
1708 | 1919 //FIXME penalty stuff for non mpeg4 |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1920 c->skip=0; |
1950 | 1921 fmin= ff_estimate_motion_b(s, mb_x, mb_y, s->b_forw_mv_table, 0, s->f_code) + 3*penalty_factor; |
2967 | 1922 |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1923 c->skip=0; |
1950 | 1924 bmin= ff_estimate_motion_b(s, mb_x, mb_y, s->b_back_mv_table, 2, s->b_code) + 2*penalty_factor; |
324 | 1925 //printf(" %d %d ", s->b_forw_mv_table[xy][0], s->b_forw_mv_table[xy][1]); |
327 | 1926 |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1927 c->skip=0; |
1950 | 1928 fbmin= bidir_refine(s, mb_x, mb_y) + penalty_factor; |
1013 | 1929 //printf("%d %d %d %d\n", dmin, fmin, bmin, fbmin); |
2967 | 1930 |
1708 | 1931 if(s->flags & CODEC_FLAG_INTERLACED_ME){ |
1932 //FIXME mb type penalty | |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1933 c->skip=0; |
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1934 c->current_mv_penalty= c->mv_penalty[s->f_code] + MAX_MV; |
1950 | 1935 fimin= interlaced_search(s, 0, |
1936 s->b_field_mv_table[0], s->b_field_select_table[0], | |
1968
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1937 s->b_forw_mv_table[xy][0], s->b_forw_mv_table[xy][1], 0); |
2014
15c885db82a8
reduce dependancy between motion estimation and MpegEncContext
michael
parents:
1995
diff
changeset
|
1938 c->current_mv_penalty= c->mv_penalty[s->b_code] + MAX_MV; |
1950 | 1939 bimin= interlaced_search(s, 2, |
1940 s->b_field_mv_table[1], s->b_field_select_table[1], | |
1968
19c2344e800a
support reusing mb types and field select values of the source file, but use motion vectors just as additional predictors
michael
parents:
1963
diff
changeset
|
1941 s->b_back_mv_table[xy][0], s->b_back_mv_table[xy][1], 0); |
1708 | 1942 }else |
1943 fimin= bimin= INT_MAX; | |
1944 | |
612 | 1945 { |
1051
e5a9dbf597d4
mpeg1 bframe encoding patch by (Rapha¸«³l LEGRAND) with some modifications by me
michaelni
parents:
1050
diff
changeset
|
1946 int score= fmin; |
1708 | 1947 type = CANDIDATE_MB_TYPE_FORWARD; |
2967 | 1948 |
1426 | 1949 if (dmin <= score){ |
1051
e5a9dbf597d4
mpeg1 bframe encoding patch by (Rapha¸«³l LEGRAND) with some modifications by me
michaelni
parents:
1050
diff
changeset
|
1950 score = dmin; |
1708 | 1951 type = CANDIDATE_MB_TYPE_DIRECT; |
327 | 1952 } |
1953 if(bmin<score){ | |
1954 score=bmin; | |
2967 | 1955 type= CANDIDATE_MB_TYPE_BACKWARD; |
327 | 1956 } |
1957 if(fbmin<score){ | |
1958 score=fbmin; | |
1708 | 1959 type= CANDIDATE_MB_TYPE_BIDIR; |
1960 } | |
1961 if(fimin<score){ | |
1962 score=fimin; | |
1963 type= CANDIDATE_MB_TYPE_FORWARD_I; | |
1964 } | |
1965 if(bimin<score){ | |
1966 score=bimin; | |
1967 type= CANDIDATE_MB_TYPE_BACKWARD_I; | |
327 | 1968 } |
2967 | 1969 |
807
0e1d375c537f
fixing q>0.0 assert failure caused by overflow of variance for b frames
michaelni
parents:
765
diff
changeset
|
1970 score= ((unsigned)(score*score + 128*256))>>16; |
2015
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
1971 c->mc_mb_var_sum_temp += score; |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1162
diff
changeset
|
1972 s->current_picture.mc_mb_var[mb_y*s->mb_stride + mb_x] = score; //FIXME use SSE |
327 | 1973 } |
612 | 1974 |
2015
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
1975 if(c->avctx->mb_decision > FF_MB_DECISION_SIMPLE){ |
1708 | 1976 type= CANDIDATE_MB_TYPE_FORWARD | CANDIDATE_MB_TYPE_BACKWARD | CANDIDATE_MB_TYPE_BIDIR | CANDIDATE_MB_TYPE_DIRECT; |
1977 if(fimin < INT_MAX) | |
1978 type |= CANDIDATE_MB_TYPE_FORWARD_I; | |
1979 if(bimin < INT_MAX) | |
1980 type |= CANDIDATE_MB_TYPE_BACKWARD_I; | |
1981 if(fimin < INT_MAX && bimin < INT_MAX){ | |
1982 type |= CANDIDATE_MB_TYPE_BIDIR_I; | |
1983 } | |
1984 //FIXME something smarter | |
5127 | 1985 if(dmin>256*256*16) type&= ~CANDIDATE_MB_TYPE_DIRECT; //do not try direct mode if it is invalid for this MB |
4326 | 1986 if(s->codec_id == CODEC_ID_MPEG4 && type&CANDIDATE_MB_TYPE_DIRECT && s->flags&CODEC_FLAG_MV0 && *(uint32_t*)s->b_direct_mv_table[xy]) |
1987 type |= CANDIDATE_MB_TYPE_DIRECT0; | |
2967 | 1988 #if 0 |
1729 | 1989 if(s->out_format == FMT_MPEG1) |
1990 type |= CANDIDATE_MB_TYPE_INTRA; | |
1991 #endif | |
612 | 1992 } |
1993 | |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1162
diff
changeset
|
1994 s->mb_type[mb_y*s->mb_stride + mb_x]= type; |
324 | 1995 } |
0 | 1996 |
324 | 1997 /* find best f_code for ME which do unlimited searches */ |
1998 int ff_get_best_fcode(MpegEncContext * s, int16_t (*mv_table)[2], int type) | |
1999 { | |
2000 if(s->me_method>=ME_EPZS){ | |
455 | 2001 int score[8]; |
2816 | 2002 int i, y, range= s->avctx->me_range ? s->avctx->me_range : (INT_MAX/2); |
1064 | 2003 uint8_t * fcode_tab= s->fcode_tab; |
455 | 2004 int best_fcode=-1; |
2005 int best_score=-10000000; | |
324 | 2006 |
2967 | 2007 if(s->msmpeg4_version) |
2811 | 2008 range= FFMIN(range, 16); |
2009 else if(s->codec_id == CODEC_ID_MPEG2VIDEO && s->avctx->strict_std_compliance >= FF_COMPLIANCE_NORMAL) | |
2010 range= FFMIN(range, 256); | |
2011 | |
936 | 2012 for(i=0; i<8; i++) score[i]= s->mb_num*(8-i); |
324 | 2013 |
2014 for(y=0; y<s->mb_height; y++){ | |
2015 int x; | |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1162
diff
changeset
|
2016 int xy= y*s->mb_stride; |
324 | 2017 for(x=0; x<s->mb_width; x++){ |
1634 | 2018 if(s->mb_type[xy] & type){ |
2302 | 2019 int mx= mv_table[xy][0]; |
2020 int my= mv_table[xy][1]; | |
2021 int fcode= FFMAX(fcode_tab[mx + MAX_MV], | |
2022 fcode_tab[my + MAX_MV]); | |
455 | 2023 int j; |
2967 | 2024 |
2025 if(mx >= range || mx < -range || | |
2302 | 2026 my >= range || my < -range) |
2027 continue; | |
2967 | 2028 |
455 | 2029 for(j=0; j<fcode && j<8; j++){ |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1162
diff
changeset
|
2030 if(s->pict_type==B_TYPE || s->current_picture.mc_mb_var[xy] < s->current_picture.mb_var[xy]) |
455 | 2031 score[j]-= 170; |
2032 } | |
324 | 2033 } |
2034 xy++; | |
2035 } | |
2036 } | |
2967 | 2037 |
455 | 2038 for(i=1; i<8; i++){ |
2039 if(score[i] > best_score){ | |
2040 best_score= score[i]; | |
2041 best_fcode= i; | |
2042 } | |
2043 // printf("%d %d\n", i, score[i]); | |
2044 } | |
327 | 2045 |
324 | 2046 // printf("fcode: %d type: %d\n", i, s->pict_type); |
455 | 2047 return best_fcode; |
324 | 2048 /* for(i=0; i<=MAX_FCODE; i++){ |
2049 printf("%d ", mv_num[i]); | |
2050 } | |
2051 printf("\n");*/ | |
2052 }else{ | |
2053 return 1; | |
0 | 2054 } |
2055 } | |
2056 | |
324 | 2057 void ff_fix_long_p_mvs(MpegEncContext * s) |
2058 { | |
2015
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
2059 MotionEstContext * const c= &s->me; |
324 | 2060 const int f_code= s->f_code; |
1086 | 2061 int y, range; |
1421 | 2062 assert(s->pict_type==P_TYPE); |
1086 | 2063 |
2811 | 2064 range = (((s->out_format == FMT_MPEG1 || s->msmpeg4_version) ? 8 : 16) << f_code); |
2065 | |
2066 assert(range <= 16 || !s->msmpeg4_version); | |
2067 assert(range <=256 || !(s->codec_id == CODEC_ID_MPEG2VIDEO && s->avctx->strict_std_compliance >= FF_COMPLIANCE_NORMAL)); | |
2967 | 2068 |
2015
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
2069 if(c->avctx->me_range && range > c->avctx->me_range) range= c->avctx->me_range; |
2967 | 2070 |
455 | 2071 //printf("%d no:%d %d//\n", clip, noclip, f_code); |
324 | 2072 if(s->flags&CODEC_FLAG_4MV){ |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1904
diff
changeset
|
2073 const int wrap= s->b8_stride; |
324 | 2074 |
2075 /* clip / convert to intra 8x8 type MVs */ | |
2076 for(y=0; y<s->mb_height; y++){ | |
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1904
diff
changeset
|
2077 int xy= y*2*wrap; |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1162
diff
changeset
|
2078 int i= y*s->mb_stride; |
324 | 2079 int x; |
2080 | |
2081 for(x=0; x<s->mb_width; x++){ | |
1708 | 2082 if(s->mb_type[i]&CANDIDATE_MB_TYPE_INTER4V){ |
324 | 2083 int block; |
2084 for(block=0; block<4; block++){ | |
2085 int off= (block& 1) + (block>>1)*wrap; | |
1668
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1634
diff
changeset
|
2086 int mx= s->current_picture.motion_val[0][ xy + off ][0]; |
30746f429df6
move motion_val & mb_type to AVFrame patch by (Wolfgang Hesseler <qv at multimediaware dot com>)
michael
parents:
1634
diff
changeset
|
2087 int my= s->current_picture.motion_val[0][ xy + off ][1]; |
324 | 2088 |
1086 | 2089 if( mx >=range || mx <-range |
2090 || my >=range || my <-range){ | |
1708 | 2091 s->mb_type[i] &= ~CANDIDATE_MB_TYPE_INTER4V; |
2092 s->mb_type[i] |= CANDIDATE_MB_TYPE_INTRA; | |
2093 s->current_picture.mb_type[i]= CANDIDATE_MB_TYPE_INTRA; | |
324 | 2094 } |
2095 } | |
2096 } | |
502 | 2097 xy+=2; |
2098 i++; | |
324 | 2099 } |
2100 } | |
2101 } | |
2102 } | |
2103 | |
1708 | 2104 /** |
2105 * | |
2106 * @param truncate 1 for truncation, 0 for using intra | |
2107 */ | |
2967 | 2108 void ff_fix_long_mvs(MpegEncContext * s, uint8_t *field_select_table, int field_select, |
1708 | 2109 int16_t (*mv_table)[2], int f_code, int type, int truncate) |
324 | 2110 { |
2015
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
2111 MotionEstContext * const c= &s->me; |
1708 | 2112 int y, h_range, v_range; |
324 | 2113 |
1051
e5a9dbf597d4
mpeg1 bframe encoding patch by (Rapha¸«³l LEGRAND) with some modifications by me
michaelni
parents:
1050
diff
changeset
|
2114 // RAL: 8 in MPEG-1, 16 in MPEG-4 |
2811 | 2115 int range = (((s->out_format == FMT_MPEG1 || s->msmpeg4_version) ? 8 : 16) << f_code); |
1708 | 2116 |
2015
3ab8f3e2ae6a
moving motion estimation specific variables from MpegEncContext -> MotionEstContext
michael
parents:
2014
diff
changeset
|
2117 if(c->avctx->me_range && range > c->avctx->me_range) range= c->avctx->me_range; |
1051
e5a9dbf597d4
mpeg1 bframe encoding patch by (Rapha¸«³l LEGRAND) with some modifications by me
michaelni
parents:
1050
diff
changeset
|
2118 |
1708 | 2119 h_range= range; |
2120 v_range= field_select_table ? range>>1 : range; | |
2121 | |
324 | 2122 /* clip / convert to intra 16x16 type MVs */ |
2123 for(y=0; y<s->mb_height; y++){ | |
2124 int x; | |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1162
diff
changeset
|
2125 int xy= y*s->mb_stride; |
1086 | 2126 for(x=0; x<s->mb_width; x++){ |
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1162
diff
changeset
|
2127 if (s->mb_type[xy] & type){ // RAL: "type" test added... |
1708 | 2128 if(field_select_table==NULL || field_select_table[xy] == field_select){ |
2129 if( mv_table[xy][0] >=h_range || mv_table[xy][0] <-h_range | |
2130 || mv_table[xy][1] >=v_range || mv_table[xy][1] <-v_range){ | |
1086 | 2131 |
1708 | 2132 if(truncate){ |
2133 if (mv_table[xy][0] > h_range-1) mv_table[xy][0]= h_range-1; | |
2134 else if(mv_table[xy][0] < -h_range ) mv_table[xy][0]= -h_range; | |
2135 if (mv_table[xy][1] > v_range-1) mv_table[xy][1]= v_range-1; | |
2136 else if(mv_table[xy][1] < -v_range ) mv_table[xy][1]= -v_range; | |
2137 }else{ | |
2138 s->mb_type[xy] &= ~type; | |
2139 s->mb_type[xy] |= CANDIDATE_MB_TYPE_INTRA; | |
2140 mv_table[xy][0]= | |
2141 mv_table[xy][1]= 0; | |
2142 } | |
1051
e5a9dbf597d4
mpeg1 bframe encoding patch by (Rapha¸«³l LEGRAND) with some modifications by me
michaelni
parents:
1050
diff
changeset
|
2143 } |
1086 | 2144 } |
324 | 2145 } |
2146 xy++; | |
2147 } | |
2148 } | |
2149 } |