summaryrefslogtreecommitdiff
path: root/libavcodec/h264_direct.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2010-02-07 21:53:55 +0000
committerMichael Niedermayer <michaelni@gmx.at>2010-02-07 21:53:55 +0000
commitf28a2656c365a38995c451d9ff5e98e9e614bd95 (patch)
tree6e15e7d0aff049e1502131d227e1a5ebe9966d4e /libavcodec/h264_direct.c
parent0a8dca8765e19a2a034ff9914c63b514336729a9 (diff)
Merge mv&ref related code for spatial direct MV code.
a bit more than 10 cpu cycles faster. Originally committed as revision 21678 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/h264_direct.c')
-rw-r--r--libavcodec/h264_direct.c31
1 files changed, 11 insertions, 20 deletions
diff --git a/libavcodec/h264_direct.c b/libavcodec/h264_direct.c
index 86880b22d4..159f3ea5c1 100644
--- a/libavcodec/h264_direct.c
+++ b/libavcodec/h264_direct.c
@@ -231,31 +231,22 @@ single_col:
if(refc == PART_NOT_AVAILABLE)
refc = h->ref_cache[list][scan8[0] - 8 - 1];
ref[list] = FFMIN3((unsigned)refa, (unsigned)refb, (unsigned)refc);
- if(ref[list] < 0)
+ if(ref[list] >= 0){
+ pred_motion(h, 0, 4, list, ref[list], &mv[list][0], &mv[list][1]);
+ }else{
+ int mask= ~(MB_TYPE_L0 << (2*list));
+ mv[list][0] = mv[list][1] = 0;
ref[list] = -1;
+ if(!is_b8x8)
+ *mb_type &= mask;
+ sub_mb_type &= mask;
+ }
}
-
if(ref[0] < 0 && ref[1] < 0){
ref[0] = ref[1] = 0;
- mv[0][0] = mv[0][1] =
- mv[1][0] = mv[1][1] = 0;
- }else{
- for(list=0; list<2; list++){
- if(ref[list] >= 0)
- pred_motion(h, 0, 4, list, ref[list], &mv[list][0], &mv[list][1]);
- else
- mv[list][0] = mv[list][1] = 0;
- }
- }
-
- if(ref[1] < 0){
- if(!is_b8x8)
- *mb_type &= ~MB_TYPE_L1;
- sub_mb_type &= ~MB_TYPE_L1;
- }else if(ref[0] < 0){
if(!is_b8x8)
- *mb_type &= ~MB_TYPE_L0;
- sub_mb_type &= ~MB_TYPE_L0;
+ *mb_type |= MB_TYPE_L0L1;
+ sub_mb_type |= MB_TYPE_L0L1;
}
if(IS_INTERLACED(*mb_type) != IS_INTERLACED(mb_type_col[0])){