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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
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
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 /**
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
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
9012
15a3df8c01fd More approved hunks for VAAPI & our new and cleaner hwaccel API.
michael
parents: 9004
diff changeset
28 #include "internal.h"
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
29 #include "dsputil.h"
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
30 #include "avcodec.h"
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
31 #include "mpegvideo.h"
4975
9a6a0818e93f split h264.c to move parser in its own file
aurel
parents: 4931
diff changeset
32 #include "h264.h"
10864
e3f5eb016712 Split motion vector prediction off h264.c/h.
michael
parents: 10857
diff changeset
33 #include "h264_mvpred.h"
6020
c531defb03ee Make fill_rectangle() available for other decoders
kostya
parents: 6019
diff changeset
34 #include "rectangle.h"
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
35
3284
a224d9752912 don't force asserts in release builds. 2% faster h264.
lorenm
parents: 3219
diff changeset
36 //#undef NDEBUG
1168
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
37 #include <assert.h>
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
38
5af9aeadbdc3 H264 decoder & demuxer
michaelni
parents:
diff changeset
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
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
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
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
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
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
66 }
2396
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
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
7d897cb94a31 Remove unused variable.
diego
parents: 7926
diff changeset
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
8eb69709a934 A few empty lines for readability.
michael
parents: 7906
diff changeset
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
8eb69709a934 A few empty lines for readability.
michael
parents: 7906
diff changeset
115
7482
ecf3c774f5e1 Fill ref_count/ref_poc for both fields of frames.
michael
parents: 7481
diff changeset
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
ecf3c774f5e1 Fill ref_count/ref_poc for both fields of frames.
michael
parents: 7481
diff changeset
119 }
7907
8eb69709a934 A few empty lines for readability.
michael
parents: 7906
diff changeset
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
8eb69709a934 A few empty lines for readability.
michael
parents: 7906
diff changeset
122
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6429
diff changeset
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
8eb69709a934 A few empty lines for readability.
michael
parents: 7906
diff changeset
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
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
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
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
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
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
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
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
143 int i8, i4;
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
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
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
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
37f62a3dc645 Correct comment in the direct mode code.
michael
parents: 7899
diff changeset
150 if(!IS_INTERLACED(*mb_type)){ // AFR/FR -> AFL/FL
7901
michael
parents: 7900
diff changeset
151 int cur_poc = s->current_picture_ptr->poc;
michael
parents: 7900
diff changeset
152 int *col_poc = h->ref_list[1]->field_poc;
michael
parents: 7900
diff changeset
153 int col_parity = FFABS(col_poc[0] - cur_poc) >= FFABS(col_poc[1] - cur_poc);
michael
parents: 7900
diff changeset
154 mb_xy= s->mb_x + ((s->mb_y&~1) + col_parity)*s->mb_stride;
michael
parents: 7900
diff changeset
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
michael
parents: 7493
diff changeset
182 if(IS_8X8(mb_type_col[0]) && !h->sps.direct_8x8_inference_flag){
michael
parents: 7493
diff changeset
183 /* FIXME save sub mb types from previous frames (or derive from MVs)
michael
parents: 7493
diff changeset
184 * so we know exactly what block size to use */
michael
parents: 7493
diff changeset
185 sub_mb_type = MB_TYPE_8x8|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_SUB_4x4 */
michael
parents: 7493
diff changeset
186 *mb_type |= MB_TYPE_8x8|MB_TYPE_L0L1;
michael
parents: 7493
diff changeset
187 }else if(!is_b8x8 && (mb_type_col[0] & MB_TYPE_16x16_OR_INTRA)){
michael
parents: 7493
diff changeset
188 sub_mb_type = MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_SUB_8x8 */
michael
parents: 7493
diff changeset
189 *mb_type |= MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_16x16 */
michael
parents: 7493
diff changeset
190 }else{
michael
parents: 7493
diff changeset
191 sub_mb_type = MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_SUB_8x8 */
michael
parents: 7493
diff changeset
192 *mb_type |= MB_TYPE_8x8|MB_TYPE_L0L1;
michael
parents: 7493
diff changeset
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
michael
parents: 7496
diff changeset
197 l1mv0 = &h->ref_list[1][0].motion_val[0][h->mb2b_xy [mb_xy]];
michael
parents: 7496
diff changeset
198 l1mv1 = &h->ref_list[1][0].motion_val[1][h->mb2b_xy [mb_xy]];
michael
parents: 7496
diff changeset
199 l1ref0 = &h->ref_list[1][0].ref_index [0][h->mb2b8_xy[mb_xy]];
michael
parents: 7496
diff changeset
200 l1ref1 = &h->ref_list[1][0].ref_index [1][h->mb2b8_xy[mb_xy]];
7496
f96c14041e48 Simplify l1mv/l1ref calculation.
michael
parents: 7495
diff changeset
201 if(!b8_stride){
f96c14041e48 Simplify l1mv/l1ref calculation.
michael
parents: 7495
diff changeset
202 if(s->mb_y&1){
f96c14041e48 Simplify l1mv/l1ref calculation.
michael
parents: 7495
diff changeset
203 l1ref0 += h->b8_stride;
f96c14041e48 Simplify l1mv/l1ref calculation.
michael
parents: 7495
diff changeset
204 l1ref1 += h->b8_stride;
f96c14041e48 Simplify l1mv/l1ref calculation.
michael
parents: 7495
diff changeset
205 l1mv0 += 2*b4_stride;
f96c14041e48 Simplify l1mv/l1ref calculation.
michael
parents: 7495
diff changeset
206 l1mv1 += 2*b4_stride;
f96c14041e48 Simplify l1mv/l1ref calculation.
michael
parents: 7495
diff changeset
207 }
7493
e5b93d01b472 Factorize some code between temporal and spatial direct mode.
michael
parents: 7488
diff changeset
208 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
209
2396
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
210 if(h->direct_spatial_mv_pred){
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
211 int ref[2];
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
212 int mv[2][2];
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
213 int list;
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
214
3316
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
215 /* FIXME interlacing + spatial direct uses wrong colocated block positions */
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
216
2396
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
217 /* ref = min(neighbors) */
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
218 for(list=0; list<2; list++){
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
219 int refa = h->ref_cache[list][scan8[0] - 1];
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
220 int refb = h->ref_cache[list][scan8[0] - 8];
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
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
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
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
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
225 if(ref[list] < 0)
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
226 ref[list] = -1;
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
227 }
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
228
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
229 if(ref[0] < 0 && ref[1] < 0){
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
230 ref[0] = ref[1] = 0;
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
231 mv[0][0] = mv[0][1] =
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
232 mv[1][0] = mv[1][1] = 0;
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
233 }else{
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
234 for(list=0; list<2; list++){
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
235 if(ref[list] >= 0)
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
236 pred_motion(h, 0, 4, list, ref[list], &mv[list][0], &mv[list][1]);
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
237 else
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
238 mv[list][0] = mv[list][1] = 0;
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
239 }
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
240 }
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
241
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
242 if(ref[1] < 0){
6309
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
243 if(!is_b8x8)
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
244 *mb_type &= ~MB_TYPE_L1;
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
245 sub_mb_type &= ~MB_TYPE_L1;
2396
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
246 }else if(ref[0] < 0){
6309
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
247 if(!is_b8x8)
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
248 *mb_type &= ~MB_TYPE_L0;
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
249 sub_mb_type &= ~MB_TYPE_L0;
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
250 }
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
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
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
253 for(i8=0; i8<4; i8++){
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
254 int x8 = i8&1;
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
255 int y8 = i8>>1;
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
256 int xy8 = x8+y8*b8_stride;
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
257 int xy4 = 3*x8+y8*b4_stride;
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
258 int a=0, b=0;
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
259
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
260 if(is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8]))
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
261 continue;
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
262 h->sub_mb_type[i8] = sub_mb_type;
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
263
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
264 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, (uint8_t)ref[0], 1);
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
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
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
267 && ( (l1ref0[xy8] == 0 && FFABS(l1mv0[xy4][0]) <= 1 && FFABS(l1mv0[xy4][1]) <= 1)
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
268 || (l1ref0[xy8] < 0 && l1ref1[xy8] == 0 && FFABS(l1mv1[xy4][0]) <= 1 && FFABS(l1mv1[xy4][1]) <= 1))){
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
269 if(ref[0] > 0)
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
270 a= pack16to32(mv[0][0],mv[0][1]);
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
271 if(ref[1] > 0)
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
272 b= pack16to32(mv[1][0],mv[1][1]);
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
273 }else{
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
274 a= pack16to32(mv[0][0],mv[0][1]);
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
275 b= pack16to32(mv[1][0],mv[1][1]);
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
276 }
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
277 fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, a, 4);
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
278 fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, b, 4);
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
279 }
af4b8e1f9b6c mbaff spatial direct
lorenm
parents: 6216
diff changeset
280 }else if(IS_16X16(*mb_type)){
4540
d81e41071424 factorize fill_rectangle() calls
michael
parents: 4534
diff changeset
281 int a=0, b=0;
d81e41071424 factorize fill_rectangle() calls
michael
parents: 4534
diff changeset
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
34fdffe98bd0 Rename ABS macro to FFABS.
diego
parents: 4000
diff changeset
286 && ( (l1ref0[0] == 0 && FFABS(l1mv0[0][0]) <= 1 && FFABS(l1mv0[0][1]) <= 1)
34fdffe98bd0 Rename ABS macro to FFABS.
diego
parents: 4000
diff changeset
287 || (l1ref0[0] < 0 && l1ref1[0] == 0 && FFABS(l1mv1[0][0]) <= 1 && FFABS(l1mv1[0][1]) <= 1
2834
fd5d7c732c6b kill a bunch of compiler warnings
mru
parents: 2815
diff changeset
288 && (h->x264_build>33 || !h->x264_build)))){
2396
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
289 if(ref[0] > 0)
4540
d81e41071424 factorize fill_rectangle() calls
michael
parents: 4534
diff changeset
290 a= pack16to32(mv[0][0],mv[0][1]);
2396
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
291 if(ref[1] > 0)
4540
d81e41071424 factorize fill_rectangle() calls
michael
parents: 4534
diff changeset
292 b= pack16to32(mv[1][0],mv[1][1]);
2396
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
293 }else{
4540
d81e41071424 factorize fill_rectangle() calls
michael
parents: 4534
diff changeset
294 a= pack16to32(mv[0][0],mv[0][1]);
d81e41071424 factorize fill_rectangle() calls
michael
parents: 4534
diff changeset
295 b= pack16to32(mv[1][0],mv[1][1]);
d81e41071424 factorize fill_rectangle() calls
michael
parents: 4534
diff changeset
296 }
d81e41071424 factorize fill_rectangle() calls
michael
parents: 4534
diff changeset
297 fill_rectangle(&h->mv_cache[0][scan8[0]], 4, 4, 8, a, 4);
d81e41071424 factorize fill_rectangle() calls
michael
parents: 4534
diff changeset
298 fill_rectangle(&h->mv_cache[1][scan8[0]], 4, 4, 8, b, 4);
2396
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
299 }else{
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
300 for(i8=0; i8<4; i8++){
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
301 const int x8 = i8&1;
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
302 const int y8 = i8>>1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
303
2396
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
304 if(is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8]))
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
305 continue;
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
306 h->sub_mb_type[i8] = sub_mb_type;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
307
2396
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
308 fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, pack16to32(mv[0][0],mv[0][1]), 4);
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
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
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
312
2396
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
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
fd5d7c732c6b kill a bunch of compiler warnings
mru
parents: 2815
diff changeset
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
68d252a8ecd2 fix direct_8x8_inference_flag with 4x4 mvs.
lorenm
parents: 3001
diff changeset
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
34fdffe98bd0 Rename ABS macro to FFABS.
diego
parents: 4000
diff changeset
320 if(FFABS(mv_col[0]) <= 1 && FFABS(mv_col[1]) <= 1){
3002
68d252a8ecd2 fix direct_8x8_inference_flag with 4x4 mvs.
lorenm
parents: 3001
diff changeset
321 if(ref[0] == 0)
68d252a8ecd2 fix direct_8x8_inference_flag with 4x4 mvs.
lorenm
parents: 3001
diff changeset
322 fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, 0, 4);
68d252a8ecd2 fix direct_8x8_inference_flag with 4x4 mvs.
lorenm
parents: 3001
diff changeset
323 if(ref[1] == 0)
68d252a8ecd2 fix direct_8x8_inference_flag with 4x4 mvs.
lorenm
parents: 3001
diff changeset
324 fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, 0, 4);
68d252a8ecd2 fix direct_8x8_inference_flag with 4x4 mvs.
lorenm
parents: 3001
diff changeset
325 }
68d252a8ecd2 fix direct_8x8_inference_flag with 4x4 mvs.
lorenm
parents: 3001
diff changeset
326 }else
2396
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
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
34fdffe98bd0 Rename ABS macro to FFABS.
diego
parents: 4000
diff changeset
329 if(FFABS(mv_col[0]) <= 1 && FFABS(mv_col[1]) <= 1){
2396
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
330 if(ref[0] == 0)
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
331 *(uint32_t*)h->mv_cache[0][scan8[i8*4+i4]] = 0;
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
332 if(ref[1] == 0)
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
333 *(uint32_t*)h->mv_cache[1][scan8[i8*4+i4]] = 0;
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
334 }
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
335 }
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
336 }
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
337 }
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
338 }
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
339 }else{ /* direct temporal mv pred */
3316
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
340 const int *map_col_to_list0[2] = {h->map_col_to_list0[0], h->map_col_to_list0[1]};
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
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
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
343
7494
michael
parents: 7493
diff changeset
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
michael
parents: 7493
diff changeset
352 if(IS_INTERLACED(*mb_type) != IS_INTERLACED(mb_type_col[0])){
michael
parents: 7493
diff changeset
353 /* FIXME assumes direct_8x8_inference == 1 */
7495
2090d67bbf16 simplify y_shift/ref_shift code
michael
parents: 7494
diff changeset
354 int y_shift = 2*!IS_INTERLACED(*mb_type);
7494
michael
parents: 7493
diff changeset
355
michael
parents: 7493
diff changeset
356 for(i8=0; i8<4; i8++){
michael
parents: 7493
diff changeset
357 const int x8 = i8&1;
michael
parents: 7493
diff changeset
358 const int y8 = i8>>1;
michael
parents: 7493
diff changeset
359 int ref0, scale;
michael
parents: 7493
diff changeset
360 const int16_t (*l1mv)[2]= l1mv0;
michael
parents: 7493
diff changeset
361
michael
parents: 7493
diff changeset
362 if(is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8]))
michael
parents: 7493
diff changeset
363 continue;
michael
parents: 7493
diff changeset
364 h->sub_mb_type[i8] = sub_mb_type;
michael
parents: 7493
diff changeset
365
michael
parents: 7493
diff changeset
366 fill_rectangle(&h->ref_cache[1][scan8[i8*4]], 2, 2, 8, 0, 1);
michael
parents: 7493
diff changeset
367 if(IS_INTRA(mb_type_col[y8])){
michael
parents: 7493
diff changeset
368 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, 0, 1);
michael
parents: 7493
diff changeset
369 fill_rectangle(&h-> mv_cache[0][scan8[i8*4]], 2, 2, 8, 0, 4);
michael
parents: 7493
diff changeset
370 fill_rectangle(&h-> mv_cache[1][scan8[i8*4]], 2, 2, 8, 0, 4);
michael
parents: 7493
diff changeset
371 continue;
3316
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
372 }
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
373
7494
michael
parents: 7493
diff changeset
374 ref0 = l1ref0[x8 + y8*b8_stride];
michael
parents: 7493
diff changeset
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
michael
parents: 7493
diff changeset
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
michael
parents: 7493
diff changeset
379 l1mv= l1mv1;
3316
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
380 }
7494
michael
parents: 7493
diff changeset
381 scale = dist_scale_factor[ref0];
michael
parents: 7493
diff changeset
382 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, ref0, 1);
michael
parents: 7493
diff changeset
383
michael
parents: 7493
diff changeset
384 {
michael
parents: 7493
diff changeset
385 const int16_t *mv_col = l1mv[x8*3 + y8*b4_stride];
michael
parents: 7493
diff changeset
386 int my_col = (mv_col[1]<<y_shift)/2;
michael
parents: 7493
diff changeset
387 int mx = (scale * mv_col[0] + 128) >> 8;
michael
parents: 7493
diff changeset
388 int my = (scale * my_col + 128) >> 8;
michael
parents: 7493
diff changeset
389 fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, pack16to32(mx,my), 4);
michael
parents: 7493
diff changeset
390 fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, pack16to32(mx-mv_col[0],my-my_col), 4);
michael
parents: 7493
diff changeset
391 }
michael
parents: 7493
diff changeset
392 }
michael
parents: 7493
diff changeset
393 return;
michael
parents: 7493
diff changeset
394 }
3316
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
395
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
396 /* one-to-one mv scaling */
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
397
2396
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
398 if(IS_16X16(*mb_type)){
4541
1c8bc533da57 factorize more calls to fill_rectangle()
michael
parents: 4540
diff changeset
399 int ref, mv0, mv1;
1c8bc533da57 factorize more calls to fill_rectangle()
michael
parents: 4540
diff changeset
400
2396
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
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
1c8bc533da57 factorize more calls to fill_rectangle()
michael
parents: 4540
diff changeset
403 ref=mv0=mv1=0;
2396
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
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
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
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
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
409 int mv_l0[2];
3316
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
410 mv_l0[0] = (scale * mv_col[0] + 128) >> 8;
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
411 mv_l0[1] = (scale * mv_col[1] + 128) >> 8;
4541
1c8bc533da57 factorize more calls to fill_rectangle()
michael
parents: 4540
diff changeset
412 ref= ref0;
1c8bc533da57 factorize more calls to fill_rectangle()
michael
parents: 4540
diff changeset
413 mv0= pack16to32(mv_l0[0],mv_l0[1]);
1c8bc533da57 factorize more calls to fill_rectangle()
michael
parents: 4540
diff changeset
414 mv1= pack16to32(mv_l0[0]-mv_col[0],mv_l0[1]-mv_col[1]);
1c8bc533da57 factorize more calls to fill_rectangle()
michael
parents: 4540
diff changeset
415 }
1c8bc533da57 factorize more calls to fill_rectangle()
michael
parents: 4540
diff changeset
416 fill_rectangle(&h->ref_cache[0][scan8[0]], 4, 4, 8, ref, 1);
1c8bc533da57 factorize more calls to fill_rectangle()
michael
parents: 4540
diff changeset
417 fill_rectangle(&h-> mv_cache[0][scan8[0]], 4, 4, 8, mv0, 4);
1c8bc533da57 factorize more calls to fill_rectangle()
michael
parents: 4540
diff changeset
418 fill_rectangle(&h-> mv_cache[1][scan8[0]], 4, 4, 8, mv1, 4);
2396
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
419 }else{
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
420 for(i8=0; i8<4; i8++){
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
421 const int x8 = i8&1;
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
422 const int y8 = i8>>1;
3316
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
423 int ref0, scale;
2834
fd5d7c732c6b kill a bunch of compiler warnings
mru
parents: 2815
diff changeset
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
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
426 if(is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8]))
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
427 continue;
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
428 h->sub_mb_type[i8] = sub_mb_type;
3316
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
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
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
431 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, 0, 1);
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
432 fill_rectangle(&h-> mv_cache[0][scan8[i8*4]], 2, 2, 8, 0, 4);
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
433 fill_rectangle(&h-> mv_cache[1][scan8[i8*4]], 2, 2, 8, 0, 4);
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
434 continue;
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
435 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
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
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
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
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
444 scale = dist_scale_factor[ref0];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2962
diff changeset
445
2396
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
446 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, ref0, 1);
3002
68d252a8ecd2 fix direct_8x8_inference_flag with 4x4 mvs.
lorenm
parents: 3001
diff changeset
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
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
449 int mx = (scale * mv_col[0] + 128) >> 8;
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
450 int my = (scale * mv_col[1] + 128) >> 8;
3002
68d252a8ecd2 fix direct_8x8_inference_flag with 4x4 mvs.
lorenm
parents: 3001
diff changeset
451 fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, pack16to32(mx,my), 4);
68d252a8ecd2 fix direct_8x8_inference_flag with 4x4 mvs.
lorenm
parents: 3001
diff changeset
452 fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, pack16to32(mx-mv_col[0],my-mv_col[1]), 4);
68d252a8ecd2 fix direct_8x8_inference_flag with 4x4 mvs.
lorenm
parents: 3001
diff changeset
453 }else
2396
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
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
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
456 int16_t *mv_l0 = h->mv_cache[0][scan8[i8*4+i4]];
3316
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
457 mv_l0[0] = (scale * mv_col[0] + 128) >> 8;
7278f730af27 h264: MBAFF interlaced decoding
lorenm
parents: 3315
diff changeset
458 mv_l0[1] = (scale * mv_col[1] + 128) >> 8;
2396
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
459 *(uint32_t*)h->mv_cache[1][scan8[i8*4+i4]] =
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
460 pack16to32(mv_l0[0]-mv_col[0],mv_l0[1]-mv_col[1]);
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
461 }
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
462 }
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
463 }
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
464 }
7e360068b653 implement B_DIRECT and B_SKIP macroblock types.
lorenm
parents: 2395
diff changeset
465 }