annotate h264_mvpred.h @ 11048:9db9a81cc220 libavcodec

Move variable declaration to block where it is used and simplify code. Avoids a (incorrect) "possibly used uninitialized" warning, no measurable speed difference.
author reimar
date Thu, 28 Jan 2010 21:01:50 +0000
parents 3a7fa91fa168
children 10c06a9bd3d9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
1 /*
10864
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
2 * H.26L/H.264/AVC/JVT/14496-10/... motion vector predicion
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
4 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3927
diff changeset
5 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3927
diff changeset
6 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3927
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
9 * 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: 3927
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
11 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3927
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
15 * Lesser General Public License for more details.
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
16 *
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
17 * 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: 3927
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 3029
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
20 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
21
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
22 /**
10864
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
23 * @file libavcodec/h264_mvpred.h
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
24 * H.264 / AVC / MPEG4 part10 motion vector predicion.
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
25 * @author Michael Niedermayer <michaelni@gmx.at>
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
26 */
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
27
10882
5d34ab807e91 Add forgotton multiple inclusion guards to h264_mvpred.h.
michael
parents: 10864
diff changeset
28 #ifndef AVCODEC_H264_MVPRED_H
5d34ab807e91 Add forgotton multiple inclusion guards to h264_mvpred.h.
michael
parents: 10864
diff changeset
29 #define AVCODEC_H264_MVPRED_H
5d34ab807e91 Add forgotton multiple inclusion guards to h264_mvpred.h.
michael
parents: 10864
diff changeset
30
9012
15a3df8c01fd More approved hunks for VAAPI & our new and cleaner hwaccel API.
michael
parents: 9004
diff changeset
31 #include "internal.h"
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
32 #include "avcodec.h"
4975
9a6a0818e93f split h264.c to move parser in its own file
aurel
parents: 4931
diff changeset
33 #include "h264.h"
1908
e20fd60b215c h264 - progressive I frame CABAC support patch by (Laurent Aimar <fenrir at via dot ecp dot fr>)
michael
parents: 1899
diff changeset
34
3284
a224d9752912 don't force asserts in release builds. 2% faster h264.
lorenm
parents: 3219
diff changeset
35 //#undef NDEBUG
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
36 #include <assert.h>
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
37
10864
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
38 static inline int fetch_diagonal_mv(H264Context *h, const int16_t **C, int i, int list, int part_width){
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
39 const int topright_ref= h->ref_cache[list][ i - 8 + part_width ];
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
40 MpegEncContext *s = &h->s;
7481
ca205cc57734 Fix static leaks in h264.c.
cehoyos
parents: 7480
diff changeset
41
10864
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
42 /* there is no consistent mapping of mvs to neighboring locations that will
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
43 * make mbaff happy, so we can't move all this logic to fill_caches */
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
44 if(FRAME_MBAFF){
8443
cf81cdbf8ca9 unified CAVLC level decoding LUT.
michael
parents: 8441
diff changeset
45
10864
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
46 #define SET_DIAG_MV(MV_OP, REF_OP, X4, Y4)\
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
47 const int x4 = X4, y4 = Y4;\
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
48 const int mb_type = mb_types[(x4>>2)+(y4>>2)*s->mb_stride];\
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
49 if(!USES_LIST(mb_type,list))\
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
50 return LIST_NOT_USED;\
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
51 mv = s->current_picture_ptr->motion_val[list][x4 + y4*h->b_stride];\
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
52 h->mv_cache[list][scan8[0]-2][0] = mv[0];\
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
53 h->mv_cache[list][scan8[0]-2][1] = mv[1] MV_OP;\
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
54 return s->current_picture_ptr->ref_index[list][(x4>>1) + (y4>>1)*h->b8_stride] REF_OP;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
55
10864
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
56 if(topright_ref == PART_NOT_AVAILABLE
10933
3a7fa91fa168 Remove 2 checks from fetch_diagonal_mv() that apparently serve no purpose.
michael
parents: 10932
diff changeset
57 && i >= scan8[0]+8 && (i&7)==4
10864
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
58 && h->ref_cache[list][scan8[0]-1] != PART_NOT_AVAILABLE){
10932
5f0ef177bbac Move a few things into a deeper if() in fetch_diagonal_mv().
michael
parents: 10931
diff changeset
59 const uint32_t *mb_types = s->current_picture_ptr->mb_type;
5f0ef177bbac Move a few things into a deeper if() in fetch_diagonal_mv().
michael
parents: 10931
diff changeset
60 const int16_t *mv;
5f0ef177bbac Move a few things into a deeper if() in fetch_diagonal_mv().
michael
parents: 10931
diff changeset
61 *(uint32_t*)h->mv_cache[list][scan8[0]-2] = 0;
5f0ef177bbac Move a few things into a deeper if() in fetch_diagonal_mv().
michael
parents: 10931
diff changeset
62 *C = h->mv_cache[list][scan8[0]-2];
5f0ef177bbac Move a few things into a deeper if() in fetch_diagonal_mv().
michael
parents: 10931
diff changeset
63
10864
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
64 if(!MB_FIELD
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
65 && IS_INTERLACED(mb_types[h->left_mb_xy[0]])){
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
66 SET_DIAG_MV(*2, >>1, s->mb_x*4-1, (s->mb_y|1)*4+(s->mb_y&1)*2+(i>>4)-1);
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
67 }
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
68 if(MB_FIELD
10933
3a7fa91fa168 Remove 2 checks from fetch_diagonal_mv() that apparently serve no purpose.
michael
parents: 10932
diff changeset
69 && !IS_INTERLACED(mb_types[h->left_mb_xy[0]])){
10864
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
70 // left shift will turn LIST_NOT_USED into PART_NOT_AVAILABLE, but that's OK.
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
71 SET_DIAG_MV(/2, <<1, s->mb_x*4-1, (s->mb_y&~1)*4 - 1 + ((i-scan8[0])>>3)*2);
2551
615995277bc5 MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents: 2548
diff changeset
72 }
615995277bc5 MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents: 2548
diff changeset
73 }
10864
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
74 #undef SET_DIAG_MV
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
75 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
76
10864
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
77 if(topright_ref != PART_NOT_AVAILABLE){
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
78 *C= h->mv_cache[list][ i - 8 + part_width ];
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
79 return topright_ref;
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
80 }else{
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
81 tprintf(s->avctx, "topright MV not available\n");
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
82
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
83 *C= h->mv_cache[list][ i - 8 - 1 ];
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
84 return h->ref_cache[list][ i - 8 - 1 ];
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
85 }
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
86 }
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
87
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
88 /**
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
89 * gets the predicted MV.
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
90 * @param n the block index
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
91 * @param part_width the width of the partition (4, 8,16) -> (1, 2, 4)
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
92 * @param mx the x component of the predicted motion vector
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
93 * @param my the y component of the predicted motion vector
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
94 */
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
95 static inline void pred_motion(H264Context * const h, int n, int part_width, int list, int ref, int * const mx, int * const my){
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
96 const int index8= scan8[n];
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
97 const int top_ref= h->ref_cache[list][ index8 - 8 ];
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
98 const int left_ref= h->ref_cache[list][ index8 - 1 ];
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
99 const int16_t * const A= h->mv_cache[list][ index8 - 1 ];
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
100 const int16_t * const B= h->mv_cache[list][ index8 - 8 ];
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
101 const int16_t * C;
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
102 int diagonal_ref, match_count;
3316
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
103
10864
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
104 assert(part_width==1 || part_width==2 || part_width==4);
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
105
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
106 /* mv_cache
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
107 B . . A T T T T
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
108 U . . L . . , .
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
109 U . . L . . . .
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
110 U . . L . . , .
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
111 . . . L . . . .
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
112 */
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
113
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
114 diagonal_ref= fetch_diagonal_mv(h, &C, index8, list, part_width);
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
115 match_count= (diagonal_ref==ref) + (top_ref==ref) + (left_ref==ref);
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
116 tprintf(h->s.avctx, "pred_motion match_count=%d\n", match_count);
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
117 if(match_count > 1){ //most common
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
118 *mx= mid_pred(A[0], B[0], C[0]);
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
119 *my= mid_pred(A[1], B[1], C[1]);
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
120 }else if(match_count==1){
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
121 if(left_ref==ref){
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
122 *mx= A[0];
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
123 *my= A[1];
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
124 }else if(top_ref==ref){
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
125 *mx= B[0];
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
126 *my= B[1];
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
127 }else{
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
128 *mx= C[0];
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
129 *my= C[1];
3316
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
130 }
2449
6f719184e2b9 simplify deblock
michael
parents: 2447
diff changeset
131 }else{
10864
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
132 if(top_ref == PART_NOT_AVAILABLE && diagonal_ref == PART_NOT_AVAILABLE && left_ref != PART_NOT_AVAILABLE){
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
133 *mx= A[0];
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
134 *my= A[1];
7532
c4de4b187b4f Support MBAFF + constrained intra prediction.
michael
parents: 7528
diff changeset
135 }else{
10864
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
136 *mx= mid_pred(A[0], B[0], C[0]);
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
137 *my= mid_pred(A[1], B[1], C[1]);
2551
615995277bc5 MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents: 2548
diff changeset
138 }
615995277bc5 MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents: 2548
diff changeset
139 }
615995277bc5 MBAFF I slice no deblocking patch by (Loic >>lll+ffmpeg m4x org<<)
michael
parents: 2548
diff changeset
140
10864
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10863
diff changeset
141 tprintf(h->s.avctx, "pred_motion (%2d %2d %2d) (%2d %2d %2d) (%2d %2d %2d) -> (%2d %2d %2d) at %2d %2d %d list %d\n", top_ref, B[0], B[1], diagonal_ref, C[0], C[1], left_ref, A[0], A[1], ref, *mx, *my, h->s.mb_x, h->s.mb_y, n, list);
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
142 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
143
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
144 /**
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
145 * gets the directionally predicted 16x8 MV.
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
146 * @param n the block index
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
147 * @param mx the x component of the predicted motion vector
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
148 * @param my the y component of the predicted motion vector
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
149 */
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
150 static inline void pred_16x8_motion(H264Context * const h, int n, int list, int ref, int * const mx, int * const my){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
151 if(n==0){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
152 const int top_ref= h->ref_cache[list][ scan8[0] - 8 ];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
153 const int16_t * const B= h->mv_cache[list][ scan8[0] - 8 ];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
154
4600
6ac364a4ce2b Supply context to tprintf
mbardiaux
parents: 4594
diff changeset
155 tprintf(h->s.avctx, "pred_16x8: (%2d %2d %2d) at %2d %2d %d list %d\n", top_ref, B[0], B[1], h->s.mb_x, h->s.mb_y, n, list);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
156
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
157 if(top_ref == ref){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
158 *mx= B[0];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
159 *my= B[1];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
160 return;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
161 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
162 }else{
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
163 const int left_ref= h->ref_cache[list][ scan8[8] - 1 ];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
164 const int16_t * const A= h->mv_cache[list][ scan8[8] - 1 ];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
165
4600
6ac364a4ce2b Supply context to tprintf
mbardiaux
parents: 4594
diff changeset
166 tprintf(h->s.avctx, "pred_16x8: (%2d %2d %2d) at %2d %2d %d list %d\n", left_ref, A[0], A[1], h->s.mb_x, h->s.mb_y, n, list);
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
167
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
168 if(left_ref == ref){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
169 *mx= A[0];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
170 *my= A[1];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
171 return;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
172 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
173 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
174
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
175 //RARE
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
176 pred_motion(h, n, 4, list, ref, mx, my);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
177 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
178
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
179 /**
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
180 * gets the directionally predicted 8x16 MV.
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
181 * @param n the block index
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
182 * @param mx the x component of the predicted motion vector
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
183 * @param my the y component of the predicted motion vector
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
184 */
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
185 static inline void pred_8x16_motion(H264Context * const h, int n, int list, int ref, int * const mx, int * const my){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
186 if(n==0){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
187 const int left_ref= h->ref_cache[list][ scan8[0] - 1 ];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
188 const int16_t * const A= h->mv_cache[list][ scan8[0] - 1 ];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
189
4600
6ac364a4ce2b Supply context to tprintf
mbardiaux
parents: 4594
diff changeset
190 tprintf(h->s.avctx, "pred_8x16: (%2d %2d %2d) at %2d %2d %d list %d\n", left_ref, A[0], A[1], h->s.mb_x, h->s.mb_y, n, list);
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
191
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
192 if(left_ref == ref){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
193 *mx= A[0];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
194 *my= A[1];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
195 return;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
196 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
197 }else{
1169
4e891257d3e2 multiple reference frames support
michaelni
parents: 1168
diff changeset
198 const int16_t * C;
4e891257d3e2 multiple reference frames support
michaelni
parents: 1168
diff changeset
199 int diagonal_ref;
4e891257d3e2 multiple reference frames support
michaelni
parents: 1168
diff changeset
200
4e891257d3e2 multiple reference frames support
michaelni
parents: 1168
diff changeset
201 diagonal_ref= fetch_diagonal_mv(h, &C, scan8[4], list, 2);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
202
4600
6ac364a4ce2b Supply context to tprintf
mbardiaux
parents: 4594
diff changeset
203 tprintf(h->s.avctx, "pred_8x16: (%2d %2d %2d) at %2d %2d %d list %d\n", diagonal_ref, C[0], C[1], h->s.mb_x, h->s.mb_y, n, list);
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
204
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
205 if(diagonal_ref == ref){
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
206 *mx= C[0];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
207 *my= C[1];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
208 return;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
209 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
210 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
211
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
212 //RARE
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
213 pred_motion(h, n, 2, list, ref, mx, my);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
214 }
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
215
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
216 static inline void pred_pskip_motion(H264Context * const h, int * const mx, int * const my){
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
217 const int top_ref = h->ref_cache[0][ scan8[0] - 8 ];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
218 const int left_ref= h->ref_cache[0][ scan8[0] - 1 ];
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
219
4600
6ac364a4ce2b Supply context to tprintf
mbardiaux
parents: 4594
diff changeset
220 tprintf(h->s.avctx, "pred_pskip: (%d) (%d) at %2d %2d\n", top_ref, left_ref, h->s.mb_x, h->s.mb_y);
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
221
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
222 if(top_ref == PART_NOT_AVAILABLE || left_ref == PART_NOT_AVAILABLE
8454
bc5f446ed4a8 Optimize pred_pskip_motion()
michael
parents: 8453
diff changeset
223 || !( top_ref | *(uint32_t*)h->mv_cache[0][ scan8[0] - 8 ])
bc5f446ed4a8 Optimize pred_pskip_motion()
michael
parents: 8453
diff changeset
224 || !(left_ref | *(uint32_t*)h->mv_cache[0][ scan8[0] - 1 ])){
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
225
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
226 *mx = *my = 0;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
227 return;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
228 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
229
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
230 pred_motion(h, 0, 4, 0, 0, mx, my);
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
231
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
232 return;
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
233 }
10882
5d34ab807e91 Add forgotton multiple inclusion guards to h264_mvpred.h.
michael
parents: 10864
diff changeset
234
5d34ab807e91 Add forgotton multiple inclusion guards to h264_mvpred.h.
michael
parents: 10864
diff changeset
235 #endif /* AVCODEC_H264_MVPRED_H */