annotate mpegvideo_xvmc.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents fdafbcef52f5
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8831
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
1 /*
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
2 * XVideo Motion Compensation
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
3 * Copyright (c) 2003 Ivan Kalvachev
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
4 *
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
5 * This file is part of FFmpeg.
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
6 *
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
11 *
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
15 * Lesser General Public License for more details.
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
16 *
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
20 */
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
21
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
22 #include <limits.h>
8980
8ebe84eae835 Directly #include required X11/XvMC header.
diego
parents: 8962
diff changeset
23 #include <X11/extensions/XvMC.h>
8831
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
24
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
25 #include "avcodec.h"
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
26 #include "dsputil.h"
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
27 #include "mpegvideo.h"
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
28
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
29 #undef NDEBUG
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
30 #include <assert.h>
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
31
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
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
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
34
8902
aa49d3e97b70 Doxygen comment/explanation for ff_xvmc_init_block().
diego
parents: 8897
diff changeset
35 /**
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 10461
diff changeset
36 * Initialize the block field of the MpegEncContext pointer passed as
8902
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
8987e082c09f spelling/grammar/wording fixes for Doxygen comments
diego
parents: 8927
diff changeset
38 * In order to implement something like direct rendering instead of decoding
8987e082c09f spelling/grammar/wording fixes for Doxygen comments
diego
parents: 8927
diff changeset
39 * coefficients in s->blocks and then copying them, copy them directly
8926
b8da7a21372c Document all functions in mpegvideo_xvmc.
iive
parents: 8925
diff changeset
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
6ce8ebfc9d86 use ff_xvmc for function names instead of XVMC_
iive
parents: 8845
diff changeset
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
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
48 }
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
49
8926
b8da7a21372c Document all functions in mpegvideo_xvmc.
iive
parents: 8925
diff changeset
50 /**
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 10461
diff changeset
51 * Fill individual block pointers, so there are no gaps in the data_block array
8961
22227c45a1fd small Doxygen comment grammar fix
diego
parents: 8960
diff changeset
52 * in case not all blocks in the macroblock are coded.
8926
b8da7a21372c Document all functions in mpegvideo_xvmc.
iive
parents: 8925
diff changeset
53 */
8855
6ce8ebfc9d86 use ff_xvmc for function names instead of XVMC_
iive
parents: 8845
diff changeset
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
b4838c71d52a Merge some declarations and initializations.
diego
parents: 8888
diff changeset
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
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
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
1f4d7469a663 whitespace cosmetics: Fix indentation depth.
diego
parents: 8833
diff changeset
64 s->pblocks[i] = NULL;
8947
8d3722a5973a whitespace cosmetics: Place spaces around += for better readability.
diego
parents: 8944
diff changeset
65 cbp += cbp;
8831
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
66 }
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
67 }
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
68
8893
1f3e03da966a Doxygenize ff_xvmc_field_start() comment.
diego
parents: 8892
diff changeset
69 /**
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 10461
diff changeset
70 * Find and store the surfaces that are used as reference frames.
8893
1f3e03da966a Doxygenize ff_xvmc_field_start() comment.
diego
parents: 8892
diff changeset
71 * This function should be called for every new field and/or frame.
1f3e03da966a Doxygenize ff_xvmc_field_start() comment.
diego
parents: 8892
diff changeset
72 * It should be safe to call the function a few times for the same field.
1f3e03da966a Doxygenize ff_xvmc_field_start() comment.
diego
parents: 8892
diff changeset
73 */
8942
9dcb220e968c whitespace cosmetics
diego
parents: 8941
diff changeset
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
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
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
436e7d43db62 Add more paranoid checks of xvmc token.
iive
parents: 8980
diff changeset
81 !render->data_blocks || !render->mv_blocks ||
436e7d43db62 Add more paranoid checks of xvmc token.
iive
parents: 8980
diff changeset
82 (unsigned int)render->allocated_mv_blocks > INT_MAX/(64*6) ||
436e7d43db62 Add more paranoid checks of xvmc token.
iive
parents: 8980
diff changeset
83 (unsigned int)render->allocated_data_blocks > INT_MAX/64 ||
436e7d43db62 Add more paranoid checks of xvmc token.
iive
parents: 8980
diff changeset
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
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
89
8885
d3f806fb5f71 cosmetics: K&R style
diego
parents: 8884
diff changeset
90 if (render->filled_mv_blocks_num) {
8884
a054304f57d4 Give nice message for failed assert.
iive
parents: 8881
diff changeset
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
d3f806fb5f71 cosmetics: K&R style
diego
parents: 8884
diff changeset
93 render->filled_mv_blocks_num);
8888
5b7c6ebb4a36 Return error instead of triggering assert.
iive
parents: 8887
diff changeset
94 return -1;
8884
a054304f57d4 Give nice message for failed assert.
iive
parents: 8881
diff changeset
95 }
8941
42a048ecbba3 Give struct members more sensible names:
diego
parents: 8934
diff changeset
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
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
106
8917
422a9dbebb53 Almost cosmetics.
iive
parents: 8916
diff changeset
107 render->picture_structure = s->picture_structure;
422a9dbebb53 Almost cosmetics.
iive
parents: 8916
diff changeset
108 render->flags = s->first_field ? 0 : XVMC_SECOND_FIELD;
8918
b27254b4f633 Cosmetics. Vertical align.
iive
parents: 8917
diff changeset
109 render->p_future_surface = NULL;
b27254b4f633 Cosmetics. Vertical align.
iive
parents: 8917
diff changeset
110 render->p_past_surface = NULL;
8831
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
111
8871
199e9809eb5a some more K&R whitespace cosmetics
diego
parents: 8870
diff changeset
112 switch(s->pict_type) {
8831
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
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
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
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
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
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
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
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
706274a30a80 Remove one more commented-out line.
diego
parents: 8871
diff changeset
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
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
129 render->p_past_surface = last->p_surface;
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
130 return 0;
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
131 }
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
132
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
133 return -1;
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
134 }
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
135
8897
fa198e44b199 Add Doxygen comment similar to ff_xvmc_field_start() to ff_xvmc_field_end().
diego
parents: 8896
diff changeset
136 /**
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 10461
diff changeset
137 * Complete frame/field rendering by passing any remaining blocks.
8930
8987e082c09f spelling/grammar/wording fixes for Doxygen comments
diego
parents: 8927
diff changeset
138 * Normally ff_draw_horiz_band() is called for each slice, however,
8987e082c09f spelling/grammar/wording fixes for Doxygen comments
diego
parents: 8927
diff changeset
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
6ce8ebfc9d86 use ff_xvmc for function names instead of XVMC_
iive
parents: 8845
diff changeset
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
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
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
4044a647cb2a another (last?) round of K&R whitespace cosmetics
diego
parents: 8876
diff changeset
148 ff_draw_horiz_band(s, 0, 0);
8831
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
149 }
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
150
8926
b8da7a21372c Document all functions in mpegvideo_xvmc.
iive
parents: 8925
diff changeset
151 /**
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 10461
diff changeset
152 * Synthesize the data needed by XvMC to render one macroblock of data.
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 10461
diff changeset
153 * Fill all relevant fields, if necessary do IDCT.
8926
b8da7a21372c Document all functions in mpegvideo_xvmc.
iive
parents: 8925
diff changeset
154 */
8855
6ce8ebfc9d86 use ff_xvmc for function names instead of XVMC_
iive
parents: 8845
diff changeset
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
199e9809eb5a some more K&R whitespace cosmetics
diego
parents: 8870
diff changeset
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
199e9809eb5a some more K&R whitespace cosmetics
diego
parents: 8870
diff changeset
159 int i, cbp, blocks_per_mb;
8831
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
160
8834
1f4d7469a663 whitespace cosmetics: Fix indentation depth.
diego
parents: 8833
diff changeset
161 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
8831
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
162
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
163
8835
8c11ebbca9b3 whitespace cosmetics: consistent (more or less) K&R style
diego
parents: 8834
diff changeset
164 if (s->encoding) {
8831
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
165 av_log(s->avctx, AV_LOG_ERROR, "XVMC doesn't support encoding!!!\n");
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
166 return;
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
167 }
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
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
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
170 if (!s->mb_intra) {
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
171 s->last_dc[0] =
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
172 s->last_dc[1] =
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
173 s->last_dc[2] = 128 << s->intra_dc_precision;
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
174 }
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
175
8867
0694627caaea whitespace cosmetics: consistently format all comments
diego
parents: 8866
diff changeset
176 // MC doesn't skip blocks
8831
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
177 s->mb_skipped = 0;
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
178
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
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
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
182 s->current_picture.qscale_table[mb_xy] = s->qscale;
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
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
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
188 assert(render->mv_blocks);
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
189
8867
0694627caaea whitespace cosmetics: consistently format all comments
diego
parents: 8866
diff changeset
190 // take the next free macroblock
8831
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
191 mv_block = &render->mv_blocks[render->start_mv_blocks_num +
8896
96f244848498 whitespace cosmetics: remove stray space
diego
parents: 8893
diff changeset
192 render->filled_mv_blocks_num];
8831
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
193
8837
867767165fa8 whitespace cosmetics: vertical alignment
diego
parents: 8836
diff changeset
194 mv_block->x = s->mb_x;
867767165fa8 whitespace cosmetics: vertical alignment
diego
parents: 8836
diff changeset
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
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
200 mv_block->macroblock_type = XVMC_MB_TYPE_PATTERN;
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
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
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
205 mv_block->PMV[0][0][0] = s->mv[0][0][0];
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
206 mv_block->PMV[0][0][1] = s->mv[0][0][1];
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
207 mv_block->PMV[1][0][0] = s->mv[0][1][0];
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
208 mv_block->PMV[1][0][1] = s->mv[0][1][1];
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
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
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
212 mv_block->PMV[0][1][0] = s->mv[1][0][0];
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
213 mv_block->PMV[0][1][1] = s->mv[1][0][1];
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
214 mv_block->PMV[1][1][0] = s->mv[1][1][0];
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
215 mv_block->PMV[1][1][1] = s->mv[1][1][1];
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
216 }
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
217
8877
4044a647cb2a another (last?) round of K&R whitespace cosmetics
diego
parents: 8876
diff changeset
218 switch(s->mv_type) {
8831
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
219 case MV_TYPE_16X16:
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
220 mv_block->motion_type = XVMC_PREDICTION_FRAME;
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
221 break;
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
222 case MV_TYPE_16X8:
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
223 mv_block->motion_type = XVMC_PREDICTION_16x8;
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
224 break;
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
225 case MV_TYPE_FIELD:
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
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
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
232 }
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
233 break;
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
234 case MV_TYPE_DMV:
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
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
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
237
8876
ae637f4c4e55 whitespace cosmetics: Align some comments.
diego
parents: 8875
diff changeset
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
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
240
8876
ae637f4c4e55 whitespace cosmetics: Align some comments.
diego
parents: 8875
diff changeset
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
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
243
8876
ae637f4c4e55 whitespace cosmetics: Align some comments.
diego
parents: 8875
diff changeset
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
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
246
8876
ae637f4c4e55 whitespace cosmetics: Align some comments.
diego
parents: 8875
diff changeset
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
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
249
8861
da23b389e856 cosmetics: Consistently format all if/else statements in K&R style
diego
parents: 8860
diff changeset
250 } else {
8876
ae637f4c4e55 whitespace cosmetics: Align some comments.
diego
parents: 8875
diff changeset
251 mv_block->PMV[0][1][0] = s->mv[0][2][0]; // dmv00
ae637f4c4e55 whitespace cosmetics: Align some comments.
diego
parents: 8875
diff changeset
252 mv_block->PMV[0][1][1] = s->mv[0][2][1]; // dmv01
8831
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
253 }
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
254 break;
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
255 default:
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
256 assert(0);
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
257 }
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
258
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
259 mv_block->motion_vertical_field_select = 0;
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
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
5aa3cfee2291 get rid of the branch prediction
iive
parents: 8861
diff changeset
263 mv_block->motion_vertical_field_select |= s->field_select[0][0];
8871
199e9809eb5a some more K&R whitespace cosmetics
diego
parents: 8870
diff changeset
264 mv_block->motion_vertical_field_select |= s->field_select[1][0] << 1;
199e9809eb5a some more K&R whitespace cosmetics
diego
parents: 8870
diff changeset
265 mv_block->motion_vertical_field_select |= s->field_select[0][1] << 2;
199e9809eb5a some more K&R whitespace cosmetics
diego
parents: 8870
diff changeset
266 mv_block->motion_vertical_field_select |= s->field_select[1][1] << 3;
8831
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
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
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
270 mv_block->index = render->next_free_data_block_num;
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
271
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
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
e5cf06287032 remove some useless ()
iive
parents: 8855
diff changeset
274 blocks_per_mb = 4 + (1 << s->chroma_format);
8831
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
275 }
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
276
8867
0694627caaea whitespace cosmetics: consistently format all comments
diego
parents: 8866
diff changeset
277 // calculate cbp
8831
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
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
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
282 cbp++;
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
283 }
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
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
ae637f4c4e55 whitespace cosmetics: Align some comments.
diego
parents: 8875
diff changeset
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
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
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
ae637f4c4e55 whitespace cosmetics: Align some comments.
diego
parents: 8875
diff changeset
294 blocks_per_mb = 4; // luminance blocks only
8831
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
295 }
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
296 }
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
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
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
299 mv_block->macroblock_type &= ~XVMC_MB_TYPE_PATTERN;
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
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
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
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
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
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
e5cf06287032 remove some useless ()
iive
parents: 8855
diff changeset
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
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
317 }
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
318 render->next_free_data_block_num++;
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
319 }
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
320 }
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
321 render->filled_mv_blocks_num++;
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
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
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
328
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
329
8941
42a048ecbba3 Give struct members more sensible names:
diego
parents: 8934
diff changeset
330 if (render->filled_mv_blocks_num == render->allocated_mv_blocks)
8871
199e9809eb5a some more K&R whitespace cosmetics
diego
parents: 8870
diff changeset
331 ff_draw_horiz_band(s, 0, 0);
8831
27616b326d57 Rename xvmc.c --> mpegvideo_xvmc.c as suggested by Ivan.
diego
parents:
diff changeset
332 }