Mercurial > libavcodec.hg
annotate mpegvideo_xvmc.c @ 9003:b595a8a59967 libavcodec
Change the type of pblocks from pointers to short array into
pointers to array of 64 DCTELEM, similarly to other block fields.
This also get rid of some casts and fixes a warning.
author | iive |
---|---|
date | Sun, 22 Feb 2009 09:02:06 +0000 |
parents | 436e7d43db62 |
children | bfb6c7ff97b4 |
rev | line source |
---|---|
8831 | 1 /* |
2 * XVideo Motion Compensation | |
3 * Copyright (c) 2003 Ivan Kalvachev | |
4 * | |
5 * This file is part of FFmpeg. | |
6 * | |
7 * FFmpeg is free software; you can redistribute it and/or | |
8 * modify it under the terms of the GNU Lesser General Public | |
9 * License as published by the Free Software Foundation; either | |
10 * version 2.1 of the License, or (at your option) any later version. | |
11 * | |
12 * FFmpeg is distributed in the hope that it will be useful, | |
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 | |
18 * License along with FFmpeg; if not, write to the Free Software | |
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
20 */ | |
21 | |
22 #include <limits.h> | |
8980 | 23 #include <X11/extensions/XvMC.h> |
8831 | 24 |
25 #include "avcodec.h" | |
26 #include "dsputil.h" | |
27 #include "mpegvideo.h" | |
28 | |
29 #undef NDEBUG | |
30 #include <assert.h> | |
31 | |
32 #include "xvmc.h" | |
8881
f8042554d4c8
Add xvmc_internal.h that contains all internal xvmc function declarations.
diego
parents:
8880
diff
changeset
|
33 #include "xvmc_internal.h" |
8831 | 34 |
8902
aa49d3e97b70
Doxygen comment/explanation for ff_xvmc_init_block().
diego
parents:
8897
diff
changeset
|
35 /** |
aa49d3e97b70
Doxygen comment/explanation for ff_xvmc_init_block().
diego
parents:
8897
diff
changeset
|
36 * Initializes the block field of the MpegEncContext pointer passed as |
aa49d3e97b70
Doxygen comment/explanation for ff_xvmc_init_block().
diego
parents:
8897
diff
changeset
|
37 * parameter after making sure that the data is not corrupted. |
8930 | 38 * In order to implement something like direct rendering instead of decoding |
39 * coefficients in s->blocks and then copying them, copy them directly | |
8926 | 40 * into the data_blocks array provided by xvmc. |
8902
aa49d3e97b70
Doxygen comment/explanation for ff_xvmc_init_block().
diego
parents:
8897
diff
changeset
|
41 */ |
8855 | 42 void ff_xvmc_init_block(MpegEncContext *s) |
8835
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
43 { |
8925
23051e3e9d25
Rename xvmc_pixfmt_render structure to xvmc_pix_fmt.
diego
parents:
8924
diff
changeset
|
44 struct xvmc_pix_fmt *render = (struct xvmc_pix_fmt*)s->current_picture.data[2]; |
8934
a613cd6b6071
Rename AV_XVMC_RENDER_MAGIC constant to AV_XVMC_ID to reflect a similar
diego
parents:
8932
diff
changeset
|
45 assert(render && render->xvmc_id == AV_XVMC_ID); |
8916
bd643af669df
Check all critical xvmc struct fields in ff_xvmc_field_start()
iive
parents:
8915
diff
changeset
|
46 |
9003
b595a8a59967
Change the type of pblocks from pointers to short array into
iive
parents:
8983
diff
changeset
|
47 s->block = (DCTELEM (*)[64])(render->data_blocks + render->next_free_data_block_num * 64); |
8831 | 48 } |
49 | |
8926 | 50 /** |
51 * Fill individual block pointers, so there are no gaps in the data_block array | |
8961 | 52 * in case not all blocks in the macroblock are coded. |
8926 | 53 */ |
8855 | 54 void ff_xvmc_pack_pblocks(MpegEncContext *s, int cbp) |
8835
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
55 { |
8889 | 56 int i, j = 0; |
8835
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
57 const int mb_block_count = 4 + (1 << s->chroma_format); |
8831 | 58 |
8835
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
59 cbp <<= 12-mb_block_count; |
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
60 for (i = 0; i < mb_block_count; i++) { |
8861
da23b389e856
cosmetics: Consistently format all if/else statements in K&R style
diego
parents:
8860
diff
changeset
|
61 if (cbp & (1 << 11)) |
9003
b595a8a59967
Change the type of pblocks from pointers to short array into
iive
parents:
8983
diff
changeset
|
62 s->pblocks[i] = &s->block[j++]; |
8861
da23b389e856
cosmetics: Consistently format all if/else statements in K&R style
diego
parents:
8860
diff
changeset
|
63 else |
8834 | 64 s->pblocks[i] = NULL; |
8947
8d3722a5973a
whitespace cosmetics: Place spaces around += for better readability.
diego
parents:
8944
diff
changeset
|
65 cbp += cbp; |
8831 | 66 } |
67 } | |
68 | |
8893 | 69 /** |
8926 | 70 * Find and store the surfaces that are used as reference frames. |
8893 | 71 * This function should be called for every new field and/or frame. |
72 * It should be safe to call the function a few times for the same field. | |
73 */ | |
8942 | 74 int ff_xvmc_field_start(MpegEncContext *s, AVCodecContext *avctx) |
8835
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
75 { |
8925
23051e3e9d25
Rename xvmc_pixfmt_render structure to xvmc_pix_fmt.
diego
parents:
8924
diff
changeset
|
76 struct xvmc_pix_fmt *last, *next, *render = (struct xvmc_pix_fmt*)s->current_picture.data[2]; |
8916
bd643af669df
Check all critical xvmc struct fields in ff_xvmc_field_start()
iive
parents:
8915
diff
changeset
|
77 const int mb_block_count = 4 + (1 << s->chroma_format); |
8831 | 78 |
8844
9ea7195b2ed4
Replace all (x == NULL) or (x != NULL) in assert and if conditions by !x and x.
diego
parents:
8842
diff
changeset
|
79 assert(avctx); |
8934
a613cd6b6071
Rename AV_XVMC_RENDER_MAGIC constant to AV_XVMC_ID to reflect a similar
diego
parents:
8932
diff
changeset
|
80 if (!render || render->xvmc_id != AV_XVMC_ID || |
8983 | 81 !render->data_blocks || !render->mv_blocks || |
82 (unsigned int)render->allocated_mv_blocks > INT_MAX/(64*6) || | |
83 (unsigned int)render->allocated_data_blocks > INT_MAX/64 || | |
84 !render->p_surface) { | |
8916
bd643af669df
Check all critical xvmc struct fields in ff_xvmc_field_start()
iive
parents:
8915
diff
changeset
|
85 av_log(avctx, AV_LOG_ERROR, |
bd643af669df
Check all critical xvmc struct fields in ff_xvmc_field_start()
iive
parents:
8915
diff
changeset
|
86 "Render token doesn't look as expected.\n"); |
8870
c5112df7f8b8
cosmetics: grammar/spelling/wording fixes in comments
diego
parents:
8869
diff
changeset
|
87 return -1; // make sure that this is a render packet |
8916
bd643af669df
Check all critical xvmc struct fields in ff_xvmc_field_start()
iive
parents:
8915
diff
changeset
|
88 } |
8831 | 89 |
8885 | 90 if (render->filled_mv_blocks_num) { |
8884 | 91 av_log(avctx, AV_LOG_ERROR, |
8916
bd643af669df
Check all critical xvmc struct fields in ff_xvmc_field_start()
iive
parents:
8915
diff
changeset
|
92 "Rendering surface contains %i unprocessed blocks.\n", |
8885 | 93 render->filled_mv_blocks_num); |
8888 | 94 return -1; |
8884 | 95 } |
8941 | 96 if (render->allocated_mv_blocks < 1 || |
8953
5e70bdb97d0c
Thoroughly check all fields set by the application in xvmc struct.
iive
parents:
8947
diff
changeset
|
97 render->allocated_data_blocks < render->allocated_mv_blocks*mb_block_count || |
5e70bdb97d0c
Thoroughly check all fields set by the application in xvmc struct.
iive
parents:
8947
diff
changeset
|
98 render->start_mv_blocks_num >= render->allocated_mv_blocks || |
5e70bdb97d0c
Thoroughly check all fields set by the application in xvmc struct.
iive
parents:
8947
diff
changeset
|
99 render->next_free_data_block_num > |
5e70bdb97d0c
Thoroughly check all fields set by the application in xvmc struct.
iive
parents:
8947
diff
changeset
|
100 render->allocated_data_blocks - |
5e70bdb97d0c
Thoroughly check all fields set by the application in xvmc struct.
iive
parents:
8947
diff
changeset
|
101 mb_block_count*(render->allocated_mv_blocks-render->start_mv_blocks_num)) { |
8916
bd643af669df
Check all critical xvmc struct fields in ff_xvmc_field_start()
iive
parents:
8915
diff
changeset
|
102 av_log(avctx, AV_LOG_ERROR, |
bd643af669df
Check all critical xvmc struct fields in ff_xvmc_field_start()
iive
parents:
8915
diff
changeset
|
103 "Rendering surface doesn't provide enough block structures to work with.\n"); |
bd643af669df
Check all critical xvmc struct fields in ff_xvmc_field_start()
iive
parents:
8915
diff
changeset
|
104 return -1; |
bd643af669df
Check all critical xvmc struct fields in ff_xvmc_field_start()
iive
parents:
8915
diff
changeset
|
105 } |
8831 | 106 |
8917 | 107 render->picture_structure = s->picture_structure; |
108 render->flags = s->first_field ? 0 : XVMC_SECOND_FIELD; | |
8918 | 109 render->p_future_surface = NULL; |
110 render->p_past_surface = NULL; | |
8831 | 111 |
8871 | 112 switch(s->pict_type) { |
8831 | 113 case FF_I_TYPE: |
8867
0694627caaea
whitespace cosmetics: consistently format all comments
diego
parents:
8866
diff
changeset
|
114 return 0; // no prediction from other frames |
8831 | 115 case FF_B_TYPE: |
8925
23051e3e9d25
Rename xvmc_pixfmt_render structure to xvmc_pix_fmt.
diego
parents:
8924
diff
changeset
|
116 next = (struct xvmc_pix_fmt*)s->next_picture.data[2]; |
8844
9ea7195b2ed4
Replace all (x == NULL) or (x != NULL) in assert and if conditions by !x and x.
diego
parents:
8842
diff
changeset
|
117 if (!next) |
8835
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
118 return -1; |
8934
a613cd6b6071
Rename AV_XVMC_RENDER_MAGIC constant to AV_XVMC_ID to reflect a similar
diego
parents:
8932
diff
changeset
|
119 if (next->xvmc_id != AV_XVMC_ID) |
8835
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
120 return -1; |
8831 | 121 render->p_future_surface = next->p_surface; |
8867
0694627caaea
whitespace cosmetics: consistently format all comments
diego
parents:
8866
diff
changeset
|
122 // no return here, going to set forward prediction |
8831 | 123 case FF_P_TYPE: |
8925
23051e3e9d25
Rename xvmc_pixfmt_render structure to xvmc_pix_fmt.
diego
parents:
8924
diff
changeset
|
124 last = (struct xvmc_pix_fmt*)s->last_picture.data[2]; |
8872 | 125 if (!last) |
8867
0694627caaea
whitespace cosmetics: consistently format all comments
diego
parents:
8866
diff
changeset
|
126 last = render; // predict second field from the first |
8934
a613cd6b6071
Rename AV_XVMC_RENDER_MAGIC constant to AV_XVMC_ID to reflect a similar
diego
parents:
8932
diff
changeset
|
127 if (last->xvmc_id != AV_XVMC_ID) |
8835
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
128 return -1; |
8831 | 129 render->p_past_surface = last->p_surface; |
130 return 0; | |
131 } | |
132 | |
133 return -1; | |
134 } | |
135 | |
8897
fa198e44b199
Add Doxygen comment similar to ff_xvmc_field_start() to ff_xvmc_field_end().
diego
parents:
8896
diff
changeset
|
136 /** |
8926 | 137 * Complete frame/field rendering by passing any remaining blocks. |
8930 | 138 * Normally ff_draw_horiz_band() is called for each slice, however, |
139 * some leftover blocks, for example from error_resilience(), may remain. | |
8897
fa198e44b199
Add Doxygen comment similar to ff_xvmc_field_start() to ff_xvmc_field_end().
diego
parents:
8896
diff
changeset
|
140 * It should be safe to call the function a few times for the same field. |
fa198e44b199
Add Doxygen comment similar to ff_xvmc_field_start() to ff_xvmc_field_end().
diego
parents:
8896
diff
changeset
|
141 */ |
8855 | 142 void ff_xvmc_field_end(MpegEncContext *s) |
8835
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
143 { |
8925
23051e3e9d25
Rename xvmc_pixfmt_render structure to xvmc_pix_fmt.
diego
parents:
8924
diff
changeset
|
144 struct xvmc_pix_fmt *render = (struct xvmc_pix_fmt*)s->current_picture.data[2]; |
8844
9ea7195b2ed4
Replace all (x == NULL) or (x != NULL) in assert and if conditions by !x and x.
diego
parents:
8842
diff
changeset
|
145 assert(render); |
8831 | 146 |
8835
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
147 if (render->filled_mv_blocks_num > 0) |
8877 | 148 ff_draw_horiz_band(s, 0, 0); |
8831 | 149 } |
150 | |
8926 | 151 /** |
152 * Synthesize the data needed by XvMC to render one macroblock of data. | |
8932 | 153 * Fill all relevant fields, if necessary do IDCT. |
8926 | 154 */ |
8855 | 155 void ff_xvmc_decode_mb(MpegEncContext *s) |
8835
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
156 { |
8871 | 157 XvMCMacroBlock *mv_block; |
8925
23051e3e9d25
Rename xvmc_pixfmt_render structure to xvmc_pix_fmt.
diego
parents:
8924
diff
changeset
|
158 struct xvmc_pix_fmt *render; |
8871 | 159 int i, cbp, blocks_per_mb; |
8831 | 160 |
8834 | 161 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x; |
8831 | 162 |
163 | |
8835
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
164 if (s->encoding) { |
8831 | 165 av_log(s->avctx, AV_LOG_ERROR, "XVMC doesn't support encoding!!!\n"); |
166 return; | |
167 } | |
168 | |
8867
0694627caaea
whitespace cosmetics: consistently format all comments
diego
parents:
8866
diff
changeset
|
169 // from MPV_decode_mb(), update DC predictors for P macroblocks |
8831 | 170 if (!s->mb_intra) { |
171 s->last_dc[0] = | |
172 s->last_dc[1] = | |
173 s->last_dc[2] = 128 << s->intra_dc_precision; | |
174 } | |
175 | |
8867
0694627caaea
whitespace cosmetics: consistently format all comments
diego
parents:
8866
diff
changeset
|
176 // MC doesn't skip blocks |
8831 | 177 s->mb_skipped = 0; |
178 | |
179 | |
8866
09d0ff5cdc81
whitespace cosmetics: Correctly indent all comments.
diego
parents:
8865
diff
changeset
|
180 // Do I need to export quant when I could not perform postprocessing? |
09d0ff5cdc81
whitespace cosmetics: Correctly indent all comments.
diego
parents:
8865
diff
changeset
|
181 // Anyway, it doesn't hurt. |
8831 | 182 s->current_picture.qscale_table[mb_xy] = s->qscale; |
183 | |
8870
c5112df7f8b8
cosmetics: grammar/spelling/wording fixes in comments
diego
parents:
8869
diff
changeset
|
184 // start of XVMC-specific code |
8925
23051e3e9d25
Rename xvmc_pixfmt_render structure to xvmc_pix_fmt.
diego
parents:
8924
diff
changeset
|
185 render = (struct xvmc_pix_fmt*)s->current_picture.data[2]; |
8844
9ea7195b2ed4
Replace all (x == NULL) or (x != NULL) in assert and if conditions by !x and x.
diego
parents:
8842
diff
changeset
|
186 assert(render); |
8934
a613cd6b6071
Rename AV_XVMC_RENDER_MAGIC constant to AV_XVMC_ID to reflect a similar
diego
parents:
8932
diff
changeset
|
187 assert(render->xvmc_id == AV_XVMC_ID); |
8831 | 188 assert(render->mv_blocks); |
189 | |
8867
0694627caaea
whitespace cosmetics: consistently format all comments
diego
parents:
8866
diff
changeset
|
190 // take the next free macroblock |
8831 | 191 mv_block = &render->mv_blocks[render->start_mv_blocks_num + |
8896 | 192 render->filled_mv_blocks_num]; |
8831 | 193 |
8837 | 194 mv_block->x = s->mb_x; |
195 mv_block->y = s->mb_y; | |
8867
0694627caaea
whitespace cosmetics: consistently format all comments
diego
parents:
8866
diff
changeset
|
196 mv_block->dct_type = s->interlaced_dct; // XVMC_DCT_TYPE_FRAME/FIELD; |
8861
da23b389e856
cosmetics: Consistently format all if/else statements in K&R style
diego
parents:
8860
diff
changeset
|
197 if (s->mb_intra) { |
8867
0694627caaea
whitespace cosmetics: consistently format all comments
diego
parents:
8866
diff
changeset
|
198 mv_block->macroblock_type = XVMC_MB_TYPE_INTRA; // no MC, all done |
8861
da23b389e856
cosmetics: Consistently format all if/else statements in K&R style
diego
parents:
8860
diff
changeset
|
199 } else { |
8831 | 200 mv_block->macroblock_type = XVMC_MB_TYPE_PATTERN; |
201 | |
8835
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
202 if (s->mv_dir & MV_DIR_FORWARD) { |
8836
4c175e9d492e
whitespace cosmetics: another round of formatting consistency fixes
diego
parents:
8835
diff
changeset
|
203 mv_block->macroblock_type |= XVMC_MB_TYPE_MOTION_FORWARD; |
8873
02c59b74ba71
Make one comment slightly clearer and more readable.
diego
parents:
8872
diff
changeset
|
204 // PMV[n][dir][xy] = mv[dir][n][xy] |
8831 | 205 mv_block->PMV[0][0][0] = s->mv[0][0][0]; |
206 mv_block->PMV[0][0][1] = s->mv[0][0][1]; | |
207 mv_block->PMV[1][0][0] = s->mv[0][1][0]; | |
208 mv_block->PMV[1][0][1] = s->mv[0][1][1]; | |
209 } | |
8835
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
210 if (s->mv_dir & MV_DIR_BACKWARD) { |
8836
4c175e9d492e
whitespace cosmetics: another round of formatting consistency fixes
diego
parents:
8835
diff
changeset
|
211 mv_block->macroblock_type |= XVMC_MB_TYPE_MOTION_BACKWARD; |
8831 | 212 mv_block->PMV[0][1][0] = s->mv[1][0][0]; |
213 mv_block->PMV[0][1][1] = s->mv[1][0][1]; | |
214 mv_block->PMV[1][1][0] = s->mv[1][1][0]; | |
215 mv_block->PMV[1][1][1] = s->mv[1][1][1]; | |
216 } | |
217 | |
8877 | 218 switch(s->mv_type) { |
8831 | 219 case MV_TYPE_16X16: |
220 mv_block->motion_type = XVMC_PREDICTION_FRAME; | |
221 break; | |
222 case MV_TYPE_16X8: | |
223 mv_block->motion_type = XVMC_PREDICTION_16x8; | |
224 break; | |
225 case MV_TYPE_FIELD: | |
226 mv_block->motion_type = XVMC_PREDICTION_FIELD; | |
8835
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
227 if (s->picture_structure == PICT_FRAME) { |
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
228 mv_block->PMV[0][0][1] <<= 1; |
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
229 mv_block->PMV[1][0][1] <<= 1; |
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
230 mv_block->PMV[0][1][1] <<= 1; |
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
231 mv_block->PMV[1][1][1] <<= 1; |
8831 | 232 } |
233 break; | |
234 case MV_TYPE_DMV: | |
235 mv_block->motion_type = XVMC_PREDICTION_DUAL_PRIME; | |
8835
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
236 if (s->picture_structure == PICT_FRAME) { |
8831 | 237 |
8876 | 238 mv_block->PMV[0][0][0] = s->mv[0][0][0]; // top from top |
8875
266bd7d64985
whitespace cosmetics: Put some spaces around operators for better readability.
diego
parents:
8874
diff
changeset
|
239 mv_block->PMV[0][0][1] = s->mv[0][0][1] << 1; |
8831 | 240 |
8876 | 241 mv_block->PMV[0][1][0] = s->mv[0][0][0]; // bottom from bottom |
8875
266bd7d64985
whitespace cosmetics: Put some spaces around operators for better readability.
diego
parents:
8874
diff
changeset
|
242 mv_block->PMV[0][1][1] = s->mv[0][0][1] << 1; |
8831 | 243 |
8876 | 244 mv_block->PMV[1][0][0] = s->mv[0][2][0]; // dmv00, top from bottom |
8875
266bd7d64985
whitespace cosmetics: Put some spaces around operators for better readability.
diego
parents:
8874
diff
changeset
|
245 mv_block->PMV[1][0][1] = s->mv[0][2][1] << 1; // dmv01 |
8831 | 246 |
8876 | 247 mv_block->PMV[1][1][0] = s->mv[0][3][0]; // dmv10, bottom from top |
8875
266bd7d64985
whitespace cosmetics: Put some spaces around operators for better readability.
diego
parents:
8874
diff
changeset
|
248 mv_block->PMV[1][1][1] = s->mv[0][3][1] << 1; // dmv11 |
8831 | 249 |
8861
da23b389e856
cosmetics: Consistently format all if/else statements in K&R style
diego
parents:
8860
diff
changeset
|
250 } else { |
8876 | 251 mv_block->PMV[0][1][0] = s->mv[0][2][0]; // dmv00 |
252 mv_block->PMV[0][1][1] = s->mv[0][2][1]; // dmv01 | |
8831 | 253 } |
254 break; | |
255 default: | |
256 assert(0); | |
257 } | |
258 | |
259 mv_block->motion_vertical_field_select = 0; | |
260 | |
8867
0694627caaea
whitespace cosmetics: consistently format all comments
diego
parents:
8866
diff
changeset
|
261 // set correct field references |
8835
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
262 if (s->mv_type == MV_TYPE_FIELD || s->mv_type == MV_TYPE_16X8) { |
8862 | 263 mv_block->motion_vertical_field_select |= s->field_select[0][0]; |
8871 | 264 mv_block->motion_vertical_field_select |= s->field_select[1][0] << 1; |
265 mv_block->motion_vertical_field_select |= s->field_select[0][1] << 2; | |
266 mv_block->motion_vertical_field_select |= s->field_select[1][1] << 3; | |
8831 | 267 } |
8867
0694627caaea
whitespace cosmetics: consistently format all comments
diego
parents:
8866
diff
changeset
|
268 } // !intra |
8870
c5112df7f8b8
cosmetics: grammar/spelling/wording fixes in comments
diego
parents:
8869
diff
changeset
|
269 // time to handle data blocks |
8831 | 270 mv_block->index = render->next_free_data_block_num; |
271 | |
272 blocks_per_mb = 6; | |
8835
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
273 if (s->chroma_format >= 2) { |
8856 | 274 blocks_per_mb = 4 + (1 << s->chroma_format); |
8831 | 275 } |
276 | |
8867
0694627caaea
whitespace cosmetics: consistently format all comments
diego
parents:
8866
diff
changeset
|
277 // calculate cbp |
8831 | 278 cbp = 0; |
8835
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
279 for (i = 0; i < blocks_per_mb; i++) { |
8836
4c175e9d492e
whitespace cosmetics: another round of formatting consistency fixes
diego
parents:
8835
diff
changeset
|
280 cbp += cbp; |
8835
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
281 if (s->block_last_index[i] >= 0) |
8831 | 282 cbp++; |
283 } | |
284 | |
8835
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
285 if (s->flags & CODEC_FLAG_GRAY) { |
8876 | 286 if (s->mb_intra) { // intra frames are always full chroma blocks |
8835
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
287 for (i = 4; i < blocks_per_mb; i++) { |
9003
b595a8a59967
Change the type of pblocks from pointers to short array into
iive
parents:
8983
diff
changeset
|
288 memset(s->pblocks[i], 0, sizeof(*s->pblocks[i])); // so we need to clear them |
8835
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
289 if (!render->unsigned_intra) |
9003
b595a8a59967
Change the type of pblocks from pointers to short array into
iive
parents:
8983
diff
changeset
|
290 *s->pblocks[i][0] = 1 << 10; |
8831 | 291 } |
8861
da23b389e856
cosmetics: Consistently format all if/else statements in K&R style
diego
parents:
8860
diff
changeset
|
292 } else { |
8835
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
293 cbp &= 0xf << (blocks_per_mb - 4); |
8876 | 294 blocks_per_mb = 4; // luminance blocks only |
8831 | 295 } |
296 } | |
297 mv_block->coded_block_pattern = cbp; | |
8835
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
298 if (cbp == 0) |
8831 | 299 mv_block->macroblock_type &= ~XVMC_MB_TYPE_PATTERN; |
300 | |
8835
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
301 for (i = 0; i < blocks_per_mb; i++) { |
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
302 if (s->block_last_index[i] >= 0) { |
8831 | 303 // I do not have unsigned_intra MOCO to test, hope it is OK. |
8868
2534e44a9472
Restore one set of parentheses to avoid the warning:
diego
parents:
8867
diff
changeset
|
304 if (s->mb_intra && (render->idct || (!render->idct && !render->unsigned_intra))) |
9003
b595a8a59967
Change the type of pblocks from pointers to short array into
iive
parents:
8983
diff
changeset
|
305 *s->pblocks[i][0] -= 1 << 10; |
8835
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
306 if (!render->idct) { |
9003
b595a8a59967
Change the type of pblocks from pointers to short array into
iive
parents:
8983
diff
changeset
|
307 s->dsp.idct(*s->pblocks[i]); |
8870
c5112df7f8b8
cosmetics: grammar/spelling/wording fixes in comments
diego
parents:
8869
diff
changeset
|
308 /* It is unclear if MC hardware requires pixel diff values to be |
c5112df7f8b8
cosmetics: grammar/spelling/wording fixes in comments
diego
parents:
8869
diff
changeset
|
309 * in the range [-255;255]. TODO: Clipping if such hardware is |
c5112df7f8b8
cosmetics: grammar/spelling/wording fixes in comments
diego
parents:
8869
diff
changeset
|
310 * ever found. As of now it would only be an unnecessary |
c5112df7f8b8
cosmetics: grammar/spelling/wording fixes in comments
diego
parents:
8869
diff
changeset
|
311 * slowdown. */ |
8831 | 312 } |
8867
0694627caaea
whitespace cosmetics: consistently format all comments
diego
parents:
8866
diff
changeset
|
313 // copy blocks only if the codec doesn't support pblocks reordering |
8835
8c11ebbca9b3
whitespace cosmetics: consistent (more or less) K&R style
diego
parents:
8834
diff
changeset
|
314 if (s->avctx->xvmc_acceleration == 1) { |
8856 | 315 memcpy(&render->data_blocks[render->next_free_data_block_num*64], |
9003
b595a8a59967
Change the type of pblocks from pointers to short array into
iive
parents:
8983
diff
changeset
|
316 s->pblocks[i], sizeof(*s->pblocks[i])); |
8831 | 317 } |
318 render->next_free_data_block_num++; | |
319 } | |
320 } | |
321 render->filled_mv_blocks_num++; | |
322 | |
8960
a8c7a467a287
Revert converting two asserts into if checks and error messages.
diego
parents:
8953
diff
changeset
|
323 assert(render->filled_mv_blocks_num <= render->allocated_mv_blocks); |
a8c7a467a287
Revert converting two asserts into if checks and error messages.
diego
parents:
8953
diff
changeset
|
324 assert(render->next_free_data_block_num <= render->allocated_data_blocks); |
a8c7a467a287
Revert converting two asserts into if checks and error messages.
diego
parents:
8953
diff
changeset
|
325 /* The above conditions should not be able to fail as long as this function |
a8c7a467a287
Revert converting two asserts into if checks and error messages.
diego
parents:
8953
diff
changeset
|
326 * is used and the following 'if ()' automatically calls a callback to free |
a8c7a467a287
Revert converting two asserts into if checks and error messages.
diego
parents:
8953
diff
changeset
|
327 * blocks. */ |
8831 | 328 |
329 | |
8941 | 330 if (render->filled_mv_blocks_num == render->allocated_mv_blocks) |
8871 | 331 ff_draw_horiz_band(s, 0, 0); |
8831 | 332 } |