Mercurial > libavcodec.hg
annotate h264_direct.c @ 11032:01bd040f8607 libavcodec
Unroll main loop so the edge==0 case is seperate.
This allows many things to be simplified away.
h264 decoder is overall 1% faster with a mbaff sample and
0.1% slower with the cathedral sample, probably because the slow loop
filter code must be loaded into the code cache for each first MB of each
row but isnt used for the following MBs.
| author | michael |
|---|---|
| date | Thu, 28 Jan 2010 01:24:25 +0000 |
| parents | b847f02d5b03 |
| children | e1eb8879e368 |
| rev | line source |
|---|---|
| 1168 | 1 /* |
|
10857
b20434143fd5
Split direct mode (macro)block decoding off h264.c.
michael
parents:
10854
diff
changeset
|
2 * H.26L/H.264/AVC/JVT/14496-10/... direct mb/block decoding |
| 1168 | 3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at> |
| 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 | 8 * modify it under the terms of the GNU Lesser General Public |
| 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 | 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 | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 15 * Lesser General Public License for more details. | |
| 16 * | |
| 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 | 20 */ |
| 2967 | 21 |
| 1168 | 22 /** |
|
10857
b20434143fd5
Split direct mode (macro)block decoding off h264.c.
michael
parents:
10854
diff
changeset
|
23 * @file libavcodec/h264_direct.c |
|
b20434143fd5
Split direct mode (macro)block decoding off h264.c.
michael
parents:
10854
diff
changeset
|
24 * H.264 / AVC / MPEG4 part10 direct mb/block decoding. |
| 1168 | 25 * @author Michael Niedermayer <michaelni@gmx.at> |
| 26 */ | |
| 27 | |
|
9012
15a3df8c01fd
More approved hunks for VAAPI & our new and cleaner hwaccel API.
michael
parents:
9004
diff
changeset
|
28 #include "internal.h" |
| 1168 | 29 #include "dsputil.h" |
| 30 #include "avcodec.h" | |
| 31 #include "mpegvideo.h" | |
| 4975 | 32 #include "h264.h" |
| 10864 | 33 #include "h264_mvpred.h" |
| 6020 | 34 #include "rectangle.h" |
| 1168 | 35 |
|
3284
a224d9752912
don't force asserts in release builds. 2% faster h264.
lorenm
parents:
3219
diff
changeset
|
36 //#undef NDEBUG |
| 1168 | 37 #include <assert.h> |
| 38 | |
| 39 | |
|
7898
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
40 static int get_scale_factor(H264Context * const h, int poc, int poc1, int i){ |
|
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
41 int poc0 = h->ref_list[0][i].poc; |
|
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
42 int td = av_clip(poc1 - poc0, -128, 127); |
|
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
43 if(td == 0 || h->ref_list[0][i].long_ref){ |
|
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
44 return 256; |
|
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
45 }else{ |
|
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
46 int tb = av_clip(poc - poc0, -128, 127); |
|
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
47 int tx = (16384 + (FFABS(td) >> 1)) / td; |
|
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
48 return av_clip((tb*tx + 32) >> 6, -1024, 1023); |
|
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
49 } |
|
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
50 } |
|
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
51 |
|
10857
b20434143fd5
Split direct mode (macro)block decoding off h264.c.
michael
parents:
10854
diff
changeset
|
52 void ff_h264_direct_dist_scale_factor(H264Context * const h){ |
|
7462
5cbf11f56c02
Picture.ref_count/ref_poc have to be stored per field (actually also per
michael
parents:
7450
diff
changeset
|
53 MpegEncContext * const s = &h->s; |
|
5cbf11f56c02
Picture.ref_count/ref_poc have to be stored per field (actually also per
michael
parents:
7450
diff
changeset
|
54 const int poc = h->s.current_picture_ptr->field_poc[ s->picture_structure == PICT_BOTTOM_FIELD ]; |
| 2396 | 55 const int poc1 = h->ref_list[1][0].poc; |
|
7898
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
56 int i, field; |
|
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
57 for(field=0; field<2; field++){ |
|
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
58 const int poc = h->s.current_picture_ptr->field_poc[field]; |
|
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
59 const int poc1 = h->ref_list[1][0].field_poc[field]; |
|
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
60 for(i=0; i < 2*h->ref_count[0]; i++) |
|
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
61 h->dist_scale_factor_field[field][i^field] = get_scale_factor(h, poc, poc1, i+16); |
|
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
62 } |
|
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
63 |
| 2396 | 64 for(i=0; i<h->ref_count[0]; i++){ |
|
7898
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
65 h->dist_scale_factor[i] = get_scale_factor(h, poc, poc1, i); |
| 3316 | 66 } |
| 2396 | 67 } |
|
7906
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
68 |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
69 static void fill_colmap(H264Context *h, int map[2][16+32], int list, int field, int colfield, int mbafi){ |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
70 MpegEncContext * const s = &h->s; |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
71 Picture * const ref1 = &h->ref_list[1][0]; |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
72 int j, old_ref, rfield; |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
73 int start= mbafi ? 16 : 0; |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
74 int end = mbafi ? 16+2*h->ref_count[list] : h->ref_count[list]; |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
75 int interl= mbafi || s->picture_structure != PICT_FRAME; |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
76 |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
77 /* bogus; fills in for missing frames */ |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
78 memset(map[list], 0, sizeof(map[list])); |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
79 |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
80 for(rfield=0; rfield<2; rfield++){ |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
81 for(old_ref=0; old_ref<ref1->ref_count[colfield][list]; old_ref++){ |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
82 int poc = ref1->ref_poc[colfield][list][old_ref]; |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
83 |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
84 if (!interl) |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
85 poc |= 3; |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
86 else if( interl && (poc&3) == 3) //FIXME store all MBAFF references so this isnt needed |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
87 poc= (poc&~3) + rfield + 1; |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
88 |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
89 for(j=start; j<end; j++){ |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
90 if(4*h->ref_list[list][j].frame_num + (h->ref_list[list][j].reference&3) == poc){ |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
91 int cur_ref= mbafi ? (j-16)^field : j; |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
92 map[list][2*old_ref + (rfield^field) + 16] = cur_ref; |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
93 if(rfield == field) |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
94 map[list][old_ref] = cur_ref; |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
95 break; |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
96 } |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
97 } |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
98 } |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
99 } |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
100 } |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
101 |
|
10857
b20434143fd5
Split direct mode (macro)block decoding off h264.c.
michael
parents:
10854
diff
changeset
|
102 void ff_h264_direct_ref_list_init(H264Context * const h){ |
|
2537
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
103 MpegEncContext * const s = &h->s; |
|
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
104 Picture * const ref1 = &h->ref_list[1][0]; |
|
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
105 Picture * const cur = s->current_picture_ptr; |
| 7928 | 106 int list, j, field; |
|
7906
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
107 int sidx= (s->picture_structure&1)^1; |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
108 int ref1sidx= (ref1->reference&1)^1; |
| 7907 | 109 |
|
2537
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
110 for(list=0; list<2; list++){ |
|
7462
5cbf11f56c02
Picture.ref_count/ref_poc have to be stored per field (actually also per
michael
parents:
7450
diff
changeset
|
111 cur->ref_count[sidx][list] = h->ref_count[list]; |
|
2537
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
112 for(j=0; j<h->ref_count[list]; j++) |
|
7487
13937730e79d
Use frame_num and reference instead of poc for matching frames for direct
michael
parents:
7486
diff
changeset
|
113 cur->ref_poc[sidx][list][j] = 4*h->ref_list[list][j].frame_num + (h->ref_list[list][j].reference&3); |
|
2537
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
114 } |
| 7907 | 115 |
| 7482 | 116 if(s->picture_structure == PICT_FRAME){ |
|
7906
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
117 memcpy(cur->ref_count[1], cur->ref_count[0], sizeof(cur->ref_count[0])); |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
118 memcpy(cur->ref_poc [1], cur->ref_poc [0], sizeof(cur->ref_poc [0])); |
| 7482 | 119 } |
| 7907 | 120 |
|
7902
8b8be8f2b647
Fix ref_shift so that it is correct for more/all? MBAFF/PAFF mixes.
michael
parents:
7901
diff
changeset
|
121 cur->mbaff= FRAME_MBAFF; |
| 7907 | 122 |
| 6481 | 123 if(cur->pict_type != FF_B_TYPE || h->direct_spatial_mv_pred) |
|
2537
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
124 return; |
| 7907 | 125 |
|
2537
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
126 for(list=0; list<2; list++){ |
|
7906
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
127 fill_colmap(h, h->map_col_to_list0, list, sidx, ref1sidx, 0); |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
128 for(field=0; field<2; field++) |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
129 fill_colmap(h, h->map_col_to_list0_field[field], list, field, field, 1); |
|
2537
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
130 } |
|
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
131 } |
| 2396 | 132 |
|
10857
b20434143fd5
Split direct mode (macro)block decoding off h264.c.
michael
parents:
10854
diff
changeset
|
133 void ff_h264_pred_direct_motion(H264Context * const h, int *mb_type){ |
| 2396 | 134 MpegEncContext * const s = &h->s; |
|
7493
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
135 int b8_stride = h->b8_stride; |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
136 int b4_stride = h->b_stride; |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
137 int mb_xy = h->mb_xy; |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
138 int mb_type_col[2]; |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
139 const int16_t (*l1mv0)[2], (*l1mv1)[2]; |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
140 const int8_t *l1ref0, *l1ref1; |
| 2396 | 141 const int is_b8x8 = IS_8X8(*mb_type); |
|
4365
9cebff821565
checking bitstream values and other related changes
michael
parents:
4364
diff
changeset
|
142 unsigned int sub_mb_type; |
| 2396 | 143 int i8, i4; |
| 144 | |
|
9416
d863de897b41
Assert that the first list1 entry is a reference frame.
michael
parents:
9415
diff
changeset
|
145 assert(h->ref_list[1][0].reference&3); |
|
d863de897b41
Assert that the first list1 entry is a reference frame.
michael
parents:
9415
diff
changeset
|
146 |
| 3316 | 147 #define MB_TYPE_16x16_OR_INTRA (MB_TYPE_16x16|MB_TYPE_INTRA4x4|MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM) |
|
7493
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
148 |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
149 if(IS_INTERLACED(h->ref_list[1][0].mb_type[mb_xy])){ // AFL/AFR/FR/FL -> AFL/FL |
| 7900 | 150 if(!IS_INTERLACED(*mb_type)){ // AFR/FR -> AFL/FL |
| 7901 | 151 int cur_poc = s->current_picture_ptr->poc; |
| 152 int *col_poc = h->ref_list[1]->field_poc; | |
| 153 int col_parity = FFABS(col_poc[0] - cur_poc) >= FFABS(col_poc[1] - cur_poc); | |
| 154 mb_xy= s->mb_x + ((s->mb_y&~1) + col_parity)*s->mb_stride; | |
| 155 b8_stride = 0; | |
|
7918
84b37de61d98
Field -> MBAFF direct mode can use data from fields that are not
michael
parents:
7907
diff
changeset
|
156 }else if(!(s->picture_structure & h->ref_list[1][0].reference) && !h->ref_list[1][0].mbaff){// FL -> FL & differ parity |
|
7493
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
157 int fieldoff= 2*(h->ref_list[1][0].reference)-3; |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
158 mb_xy += s->mb_stride*fieldoff; |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
159 } |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
160 goto single_col; |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
161 }else{ // AFL/AFR/FR/FL -> AFR/FR |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
162 if(IS_INTERLACED(*mb_type)){ // AFL /FL -> AFR/FR |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
163 mb_xy= s->mb_x + (s->mb_y&~1)*s->mb_stride; |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
164 mb_type_col[0] = h->ref_list[1][0].mb_type[mb_xy]; |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
165 mb_type_col[1] = h->ref_list[1][0].mb_type[mb_xy + s->mb_stride]; |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
166 b8_stride *= 3; |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
167 b4_stride *= 6; |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
168 //FIXME IS_8X8(mb_type_col[0]) && !h->sps.direct_8x8_inference_flag |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
169 if( (mb_type_col[0] & MB_TYPE_16x16_OR_INTRA) |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
170 && (mb_type_col[1] & MB_TYPE_16x16_OR_INTRA) |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
171 && !is_b8x8){ |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
172 sub_mb_type = MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_SUB_8x8 */ |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
173 *mb_type |= MB_TYPE_16x8 |MB_TYPE_L0L1|MB_TYPE_DIRECT2; /* B_16x8 */ |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
174 }else{ |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
175 sub_mb_type = MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_SUB_8x8 */ |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
176 *mb_type |= MB_TYPE_8x8|MB_TYPE_L0L1; |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
177 } |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
178 }else{ // AFR/FR -> AFR/FR |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
179 single_col: |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
180 mb_type_col[0] = |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
181 mb_type_col[1] = h->ref_list[1][0].mb_type[mb_xy]; |
| 7494 | 182 if(IS_8X8(mb_type_col[0]) && !h->sps.direct_8x8_inference_flag){ |
| 183 /* FIXME save sub mb types from previous frames (or derive from MVs) | |
| 184 * so we know exactly what block size to use */ | |
| 185 sub_mb_type = MB_TYPE_8x8|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_SUB_4x4 */ | |
| 186 *mb_type |= MB_TYPE_8x8|MB_TYPE_L0L1; | |
| 187 }else if(!is_b8x8 && (mb_type_col[0] & MB_TYPE_16x16_OR_INTRA)){ | |
| 188 sub_mb_type = MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_SUB_8x8 */ | |
| 189 *mb_type |= MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_16x16 */ | |
| 190 }else{ | |
| 191 sub_mb_type = MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_SUB_8x8 */ | |
| 192 *mb_type |= MB_TYPE_8x8|MB_TYPE_L0L1; | |
| 193 } | |
|
7493
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
194 } |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
195 } |
|
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
196 |
| 7497 | 197 l1mv0 = &h->ref_list[1][0].motion_val[0][h->mb2b_xy [mb_xy]]; |
| 198 l1mv1 = &h->ref_list[1][0].motion_val[1][h->mb2b_xy [mb_xy]]; | |
| 199 l1ref0 = &h->ref_list[1][0].ref_index [0][h->mb2b8_xy[mb_xy]]; | |
| 200 l1ref1 = &h->ref_list[1][0].ref_index [1][h->mb2b8_xy[mb_xy]]; | |
| 7496 | 201 if(!b8_stride){ |
| 202 if(s->mb_y&1){ | |
| 203 l1ref0 += h->b8_stride; | |
| 204 l1ref1 += h->b8_stride; | |
| 205 l1mv0 += 2*b4_stride; | |
| 206 l1mv1 += 2*b4_stride; | |
| 207 } | |
|
7493
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
208 } |
| 2967 | 209 |
| 2396 | 210 if(h->direct_spatial_mv_pred){ |
| 211 int ref[2]; | |
| 212 int mv[2][2]; | |
| 213 int list; | |
| 214 | |
| 3316 | 215 /* FIXME interlacing + spatial direct uses wrong colocated block positions */ |
| 216 | |
| 2396 | 217 /* ref = min(neighbors) */ |
| 218 for(list=0; list<2; list++){ | |
| 219 int refa = h->ref_cache[list][scan8[0] - 1]; | |
| 220 int refb = h->ref_cache[list][scan8[0] - 8]; | |
| 221 int refc = h->ref_cache[list][scan8[0] - 8 + 4]; | |
|
7445
a202753ce99d
Use #define instead of a constant. Patch by Paul Kendall.
darkshikari
parents:
7444
diff
changeset
|
222 if(refc == PART_NOT_AVAILABLE) |
| 2396 | 223 refc = h->ref_cache[list][scan8[0] - 8 - 1]; |
|
7336
aaf3e396f094
Simplify spatial direct ref selection with FFMIN3()
michael
parents:
7332
diff
changeset
|
224 ref[list] = FFMIN3((unsigned)refa, (unsigned)refb, (unsigned)refc); |
| 2396 | 225 if(ref[list] < 0) |
| 226 ref[list] = -1; | |
| 227 } | |
| 228 | |
| 229 if(ref[0] < 0 && ref[1] < 0){ | |
| 230 ref[0] = ref[1] = 0; | |
| 231 mv[0][0] = mv[0][1] = | |
| 232 mv[1][0] = mv[1][1] = 0; | |
| 233 }else{ | |
| 234 for(list=0; list<2; list++){ | |
| 235 if(ref[list] >= 0) | |
| 236 pred_motion(h, 0, 4, list, ref[list], &mv[list][0], &mv[list][1]); | |
| 237 else | |
| 238 mv[list][0] = mv[list][1] = 0; | |
| 239 } | |
| 240 } | |
| 241 | |
| 242 if(ref[1] < 0){ | |
| 6309 | 243 if(!is_b8x8) |
| 244 *mb_type &= ~MB_TYPE_L1; | |
| 245 sub_mb_type &= ~MB_TYPE_L1; | |
| 2396 | 246 }else if(ref[0] < 0){ |
| 6309 | 247 if(!is_b8x8) |
| 248 *mb_type &= ~MB_TYPE_L0; | |
| 249 sub_mb_type &= ~MB_TYPE_L0; | |
| 250 } | |
| 251 | |
|
7493
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
252 if(IS_INTERLACED(*mb_type) != IS_INTERLACED(mb_type_col[0])){ |
| 6309 | 253 for(i8=0; i8<4; i8++){ |
| 254 int x8 = i8&1; | |
| 255 int y8 = i8>>1; | |
| 256 int xy8 = x8+y8*b8_stride; | |
| 257 int xy4 = 3*x8+y8*b4_stride; | |
| 258 int a=0, b=0; | |
| 259 | |
| 260 if(is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8])) | |
| 261 continue; | |
| 262 h->sub_mb_type[i8] = sub_mb_type; | |
| 263 | |
| 264 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, (uint8_t)ref[0], 1); | |
| 265 fill_rectangle(&h->ref_cache[1][scan8[i8*4]], 2, 2, 8, (uint8_t)ref[1], 1); | |
|
7493
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
266 if(!IS_INTRA(mb_type_col[y8]) |
| 6309 | 267 && ( (l1ref0[xy8] == 0 && FFABS(l1mv0[xy4][0]) <= 1 && FFABS(l1mv0[xy4][1]) <= 1) |
| 268 || (l1ref0[xy8] < 0 && l1ref1[xy8] == 0 && FFABS(l1mv1[xy4][0]) <= 1 && FFABS(l1mv1[xy4][1]) <= 1))){ | |
| 269 if(ref[0] > 0) | |
| 270 a= pack16to32(mv[0][0],mv[0][1]); | |
| 271 if(ref[1] > 0) | |
| 272 b= pack16to32(mv[1][0],mv[1][1]); | |
| 273 }else{ | |
| 274 a= pack16to32(mv[0][0],mv[0][1]); | |
| 275 b= pack16to32(mv[1][0],mv[1][1]); | |
| 276 } | |
| 277 fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, a, 4); | |
| 278 fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, b, 4); | |
| 279 } | |
| 280 }else if(IS_16X16(*mb_type)){ | |
| 4540 | 281 int a=0, b=0; |
| 282 | |
|
3001
b52d8ee430f6
fix some potential arithmetic overflows in pred_direct_motion() and
lorenm
parents:
2979
diff
changeset
|
283 fill_rectangle(&h->ref_cache[0][scan8[0]], 4, 4, 8, (uint8_t)ref[0], 1); |
|
b52d8ee430f6
fix some potential arithmetic overflows in pred_direct_motion() and
lorenm
parents:
2979
diff
changeset
|
284 fill_rectangle(&h->ref_cache[1][scan8[0]], 4, 4, 8, (uint8_t)ref[1], 1); |
|
7493
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
285 if(!IS_INTRA(mb_type_col[0]) |
| 4001 | 286 && ( (l1ref0[0] == 0 && FFABS(l1mv0[0][0]) <= 1 && FFABS(l1mv0[0][1]) <= 1) |
| 287 || (l1ref0[0] < 0 && l1ref1[0] == 0 && FFABS(l1mv1[0][0]) <= 1 && FFABS(l1mv1[0][1]) <= 1 | |
| 2834 | 288 && (h->x264_build>33 || !h->x264_build)))){ |
| 2396 | 289 if(ref[0] > 0) |
| 4540 | 290 a= pack16to32(mv[0][0],mv[0][1]); |
| 2396 | 291 if(ref[1] > 0) |
| 4540 | 292 b= pack16to32(mv[1][0],mv[1][1]); |
| 2396 | 293 }else{ |
| 4540 | 294 a= pack16to32(mv[0][0],mv[0][1]); |
| 295 b= pack16to32(mv[1][0],mv[1][1]); | |
| 296 } | |
| 297 fill_rectangle(&h->mv_cache[0][scan8[0]], 4, 4, 8, a, 4); | |
| 298 fill_rectangle(&h->mv_cache[1][scan8[0]], 4, 4, 8, b, 4); | |
| 2396 | 299 }else{ |
| 300 for(i8=0; i8<4; i8++){ | |
| 301 const int x8 = i8&1; | |
| 302 const int y8 = i8>>1; | |
| 2967 | 303 |
| 2396 | 304 if(is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8])) |
| 305 continue; | |
| 306 h->sub_mb_type[i8] = sub_mb_type; | |
| 2967 | 307 |
| 2396 | 308 fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, pack16to32(mv[0][0],mv[0][1]), 4); |
| 309 fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, pack16to32(mv[1][0],mv[1][1]), 4); | |
|
3001
b52d8ee430f6
fix some potential arithmetic overflows in pred_direct_motion() and
lorenm
parents:
2979
diff
changeset
|
310 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, (uint8_t)ref[0], 1); |
|
b52d8ee430f6
fix some potential arithmetic overflows in pred_direct_motion() and
lorenm
parents:
2979
diff
changeset
|
311 fill_rectangle(&h->ref_cache[1][scan8[i8*4]], 2, 2, 8, (uint8_t)ref[1], 1); |
| 2967 | 312 |
| 2396 | 313 /* col_zero_flag */ |
|
7498
e7006afcb1c6
Use local variabes for *stride, where local variables exist.
michael
parents:
7497
diff
changeset
|
314 if(!IS_INTRA(mb_type_col[0]) && ( l1ref0[x8 + y8*b8_stride] == 0 |
|
e7006afcb1c6
Use local variabes for *stride, where local variables exist.
michael
parents:
7497
diff
changeset
|
315 || (l1ref0[x8 + y8*b8_stride] < 0 && l1ref1[x8 + y8*b8_stride] == 0 |
| 2834 | 316 && (h->x264_build>33 || !h->x264_build)))){ |
|
7498
e7006afcb1c6
Use local variabes for *stride, where local variables exist.
michael
parents:
7497
diff
changeset
|
317 const int16_t (*l1mv)[2]= l1ref0[x8 + y8*b8_stride] == 0 ? l1mv0 : l1mv1; |
| 3002 | 318 if(IS_SUB_8X8(sub_mb_type)){ |
|
7498
e7006afcb1c6
Use local variabes for *stride, where local variables exist.
michael
parents:
7497
diff
changeset
|
319 const int16_t *mv_col = l1mv[x8*3 + y8*3*b4_stride]; |
| 4001 | 320 if(FFABS(mv_col[0]) <= 1 && FFABS(mv_col[1]) <= 1){ |
| 3002 | 321 if(ref[0] == 0) |
| 322 fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, 0, 4); | |
| 323 if(ref[1] == 0) | |
| 324 fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, 0, 4); | |
| 325 } | |
| 326 }else | |
| 2396 | 327 for(i4=0; i4<4; i4++){ |
|
7498
e7006afcb1c6
Use local variabes for *stride, where local variables exist.
michael
parents:
7497
diff
changeset
|
328 const int16_t *mv_col = l1mv[x8*2 + (i4&1) + (y8*2 + (i4>>1))*b4_stride]; |
| 4001 | 329 if(FFABS(mv_col[0]) <= 1 && FFABS(mv_col[1]) <= 1){ |
| 2396 | 330 if(ref[0] == 0) |
| 331 *(uint32_t*)h->mv_cache[0][scan8[i8*4+i4]] = 0; | |
| 332 if(ref[1] == 0) | |
| 333 *(uint32_t*)h->mv_cache[1][scan8[i8*4+i4]] = 0; | |
| 334 } | |
| 335 } | |
| 336 } | |
| 337 } | |
| 338 } | |
| 339 }else{ /* direct temporal mv pred */ | |
| 3316 | 340 const int *map_col_to_list0[2] = {h->map_col_to_list0[0], h->map_col_to_list0[1]}; |
| 341 const int *dist_scale_factor = h->dist_scale_factor; | |
|
7906
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
342 int ref_offset= 0; |
| 3316 | 343 |
| 7494 | 344 if(FRAME_MBAFF && IS_INTERLACED(*mb_type)){ |
|
7898
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
345 map_col_to_list0[0] = h->map_col_to_list0_field[s->mb_y&1][0]; |
|
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
346 map_col_to_list0[1] = h->map_col_to_list0_field[s->mb_y&1][1]; |
|
a33287a39a55
Make MBAFF temporal direct mode closer to the spec.
michael
parents:
7897
diff
changeset
|
347 dist_scale_factor =h->dist_scale_factor_field[s->mb_y&1]; |
|
7902
8b8be8f2b647
Fix ref_shift so that it is correct for more/all? MBAFF/PAFF mixes.
michael
parents:
7901
diff
changeset
|
348 } |
|
8b8be8f2b647
Fix ref_shift so that it is correct for more/all? MBAFF/PAFF mixes.
michael
parents:
7901
diff
changeset
|
349 if(h->ref_list[1][0].mbaff && IS_INTERLACED(mb_type_col[0])) |
|
7906
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
350 ref_offset += 16; |
|
7902
8b8be8f2b647
Fix ref_shift so that it is correct for more/all? MBAFF/PAFF mixes.
michael
parents:
7901
diff
changeset
|
351 |
| 7494 | 352 if(IS_INTERLACED(*mb_type) != IS_INTERLACED(mb_type_col[0])){ |
| 353 /* FIXME assumes direct_8x8_inference == 1 */ | |
| 7495 | 354 int y_shift = 2*!IS_INTERLACED(*mb_type); |
| 7494 | 355 |
| 356 for(i8=0; i8<4; i8++){ | |
| 357 const int x8 = i8&1; | |
| 358 const int y8 = i8>>1; | |
| 359 int ref0, scale; | |
| 360 const int16_t (*l1mv)[2]= l1mv0; | |
| 361 | |
| 362 if(is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8])) | |
| 363 continue; | |
| 364 h->sub_mb_type[i8] = sub_mb_type; | |
| 365 | |
| 366 fill_rectangle(&h->ref_cache[1][scan8[i8*4]], 2, 2, 8, 0, 1); | |
| 367 if(IS_INTRA(mb_type_col[y8])){ | |
| 368 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, 0, 1); | |
| 369 fill_rectangle(&h-> mv_cache[0][scan8[i8*4]], 2, 2, 8, 0, 4); | |
| 370 fill_rectangle(&h-> mv_cache[1][scan8[i8*4]], 2, 2, 8, 0, 4); | |
| 371 continue; | |
| 3316 | 372 } |
| 373 | |
| 7494 | 374 ref0 = l1ref0[x8 + y8*b8_stride]; |
| 375 if(ref0 >= 0) | |
|
7906
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
376 ref0 = map_col_to_list0[0][ref0 + ref_offset]; |
| 7494 | 377 else{ |
|
7906
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
378 ref0 = map_col_to_list0[1][l1ref1[x8 + y8*b8_stride] + ref_offset]; |
| 7494 | 379 l1mv= l1mv1; |
| 3316 | 380 } |
| 7494 | 381 scale = dist_scale_factor[ref0]; |
| 382 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, ref0, 1); | |
| 383 | |
| 384 { | |
| 385 const int16_t *mv_col = l1mv[x8*3 + y8*b4_stride]; | |
| 386 int my_col = (mv_col[1]<<y_shift)/2; | |
| 387 int mx = (scale * mv_col[0] + 128) >> 8; | |
| 388 int my = (scale * my_col + 128) >> 8; | |
| 389 fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, pack16to32(mx,my), 4); | |
| 390 fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, pack16to32(mx-mv_col[0],my-my_col), 4); | |
| 391 } | |
| 392 } | |
| 393 return; | |
| 394 } | |
| 3316 | 395 |
| 396 /* one-to-one mv scaling */ | |
| 397 | |
| 2396 | 398 if(IS_16X16(*mb_type)){ |
| 4541 | 399 int ref, mv0, mv1; |
| 400 | |
| 2396 | 401 fill_rectangle(&h->ref_cache[1][scan8[0]], 4, 4, 8, 0, 1); |
|
7493
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
402 if(IS_INTRA(mb_type_col[0])){ |
| 4541 | 403 ref=mv0=mv1=0; |
| 2396 | 404 }else{ |
|
7906
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
405 const int ref0 = l1ref0[0] >= 0 ? map_col_to_list0[0][l1ref0[0] + ref_offset] |
|
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
406 : map_col_to_list0[1][l1ref1[0] + ref_offset]; |
| 3316 | 407 const int scale = dist_scale_factor[ref0]; |
|
2809
75400dfbe117
fixing colocated mv if colocated block is L1 predicted for the temporal direct case
michael
parents:
2808
diff
changeset
|
408 const int16_t *mv_col = l1ref0[0] >= 0 ? l1mv0[0] : l1mv1[0]; |
| 2396 | 409 int mv_l0[2]; |
| 3316 | 410 mv_l0[0] = (scale * mv_col[0] + 128) >> 8; |
| 411 mv_l0[1] = (scale * mv_col[1] + 128) >> 8; | |
| 4541 | 412 ref= ref0; |
| 413 mv0= pack16to32(mv_l0[0],mv_l0[1]); | |
| 414 mv1= pack16to32(mv_l0[0]-mv_col[0],mv_l0[1]-mv_col[1]); | |
| 415 } | |
| 416 fill_rectangle(&h->ref_cache[0][scan8[0]], 4, 4, 8, ref, 1); | |
| 417 fill_rectangle(&h-> mv_cache[0][scan8[0]], 4, 4, 8, mv0, 4); | |
| 418 fill_rectangle(&h-> mv_cache[1][scan8[0]], 4, 4, 8, mv1, 4); | |
| 2396 | 419 }else{ |
| 420 for(i8=0; i8<4; i8++){ | |
| 421 const int x8 = i8&1; | |
| 422 const int y8 = i8>>1; | |
| 3316 | 423 int ref0, scale; |
| 2834 | 424 const int16_t (*l1mv)[2]= l1mv0; |
|
2809
75400dfbe117
fixing colocated mv if colocated block is L1 predicted for the temporal direct case
michael
parents:
2808
diff
changeset
|
425 |
| 2396 | 426 if(is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8])) |
| 427 continue; | |
| 428 h->sub_mb_type[i8] = sub_mb_type; | |
| 3316 | 429 fill_rectangle(&h->ref_cache[1][scan8[i8*4]], 2, 2, 8, 0, 1); |
|
7493
e5b93d01b472
Factorize some code between temporal and spatial direct mode.
michael
parents:
7488
diff
changeset
|
430 if(IS_INTRA(mb_type_col[0])){ |
| 2396 | 431 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, 0, 1); |
| 432 fill_rectangle(&h-> mv_cache[0][scan8[i8*4]], 2, 2, 8, 0, 4); | |
| 433 fill_rectangle(&h-> mv_cache[1][scan8[i8*4]], 2, 2, 8, 0, 4); | |
| 434 continue; | |
| 435 } | |
| 2967 | 436 |
|
7906
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
437 ref0 = l1ref0[x8 + y8*b8_stride] + ref_offset; |
|
2537
14fef0f3f532
H.264: decode arbitrary frame orders and allow B-frames as references.
lorenm
parents:
2536
diff
changeset
|
438 if(ref0 >= 0) |
| 3316 | 439 ref0 = map_col_to_list0[0][ref0]; |
|
2809
75400dfbe117
fixing colocated mv if colocated block is L1 predicted for the temporal direct case
michael
parents:
2808
diff
changeset
|
440 else{ |
|
7906
5be944626072
Another try to fix temporal direct mode references.
michael
parents:
7902
diff
changeset
|
441 ref0 = map_col_to_list0[1][l1ref1[x8 + y8*b8_stride] + ref_offset]; |
|
2809
75400dfbe117
fixing colocated mv if colocated block is L1 predicted for the temporal direct case
michael
parents:
2808
diff
changeset
|
442 l1mv= l1mv1; |
|
75400dfbe117
fixing colocated mv if colocated block is L1 predicted for the temporal direct case
michael
parents:
2808
diff
changeset
|
443 } |
| 3316 | 444 scale = dist_scale_factor[ref0]; |
| 2967 | 445 |
| 2396 | 446 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, ref0, 1); |
| 3002 | 447 if(IS_SUB_8X8(sub_mb_type)){ |
|
7498
e7006afcb1c6
Use local variabes for *stride, where local variables exist.
michael
parents:
7497
diff
changeset
|
448 const int16_t *mv_col = l1mv[x8*3 + y8*3*b4_stride]; |
| 3316 | 449 int mx = (scale * mv_col[0] + 128) >> 8; |
| 450 int my = (scale * mv_col[1] + 128) >> 8; | |
| 3002 | 451 fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, pack16to32(mx,my), 4); |
| 452 fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, pack16to32(mx-mv_col[0],my-mv_col[1]), 4); | |
| 453 }else | |
| 2396 | 454 for(i4=0; i4<4; i4++){ |
|
7498
e7006afcb1c6
Use local variabes for *stride, where local variables exist.
michael
parents:
7497
diff
changeset
|
455 const int16_t *mv_col = l1mv[x8*2 + (i4&1) + (y8*2 + (i4>>1))*b4_stride]; |
| 2396 | 456 int16_t *mv_l0 = h->mv_cache[0][scan8[i8*4+i4]]; |
| 3316 | 457 mv_l0[0] = (scale * mv_col[0] + 128) >> 8; |
| 458 mv_l0[1] = (scale * mv_col[1] + 128) >> 8; | |
| 2396 | 459 *(uint32_t*)h->mv_cache[1][scan8[i8*4+i4]] = |
| 460 pack16to32(mv_l0[0]-mv_col[0],mv_l0[1]-mv_col[1]); | |
| 461 } | |
| 462 } | |
| 463 } | |
| 464 } | |
| 465 } |
