Line | Branch | Exec | Source |
---|---|---|---|
1 | /* | ||
2 | * ITU H.263 bitstream decoder | ||
3 | * Copyright (c) 2000,2001 Fabrice Bellard | ||
4 | * H.263+ support. | ||
5 | * Copyright (c) 2001 Juan J. Sierralta P | ||
6 | * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at> | ||
7 | * | ||
8 | * This file is part of FFmpeg. | ||
9 | * | ||
10 | * FFmpeg is free software; you can redistribute it and/or | ||
11 | * modify it under the terms of the GNU Lesser General Public | ||
12 | * License as published by the Free Software Foundation; either | ||
13 | * version 2.1 of the License, or (at your option) any later version. | ||
14 | * | ||
15 | * FFmpeg is distributed in the hope that it will be useful, | ||
16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
18 | * Lesser General Public License for more details. | ||
19 | * | ||
20 | * You should have received a copy of the GNU Lesser General Public | ||
21 | * License along with FFmpeg; if not, write to the Free Software | ||
22 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
23 | */ | ||
24 | |||
25 | /** | ||
26 | * @file | ||
27 | * H.263 decoder. | ||
28 | */ | ||
29 | |||
30 | #define UNCHECKED_BITSTREAM_READER 1 | ||
31 | |||
32 | #include "config_components.h" | ||
33 | |||
34 | #include "libavutil/attributes.h" | ||
35 | #include "libavutil/imgutils.h" | ||
36 | #include "libavutil/internal.h" | ||
37 | #include "libavutil/mathematics.h" | ||
38 | #include "libavutil/mem_internal.h" | ||
39 | #include "libavutil/thread.h" | ||
40 | #include "avcodec.h" | ||
41 | #include "mpegvideo.h" | ||
42 | #include "h263.h" | ||
43 | #include "h263data.h" | ||
44 | #include "h263dec.h" | ||
45 | #include "mathops.h" | ||
46 | #include "mpegutils.h" | ||
47 | #include "unary.h" | ||
48 | #include "rv10dec.h" | ||
49 | #include "mpeg4video.h" | ||
50 | #include "mpegvideodata.h" | ||
51 | #include "mpegvideodec.h" | ||
52 | #include "mpeg4videodec.h" | ||
53 | #include "mpeg4videodefs.h" | ||
54 | |||
55 | // The defines below define the number of bits that are read at once for | ||
56 | // reading vlc values. Changing these may improve speed and data cache needs | ||
57 | // be aware though that decreasing them may need the number of stages that is | ||
58 | // passed to get_vlc* to be increased. | ||
59 | #define H263_MBTYPE_B_VLC_BITS 6 | ||
60 | #define CBPC_B_VLC_BITS 3 | ||
61 | |||
62 | static const int16_t h263_mb_type_b_map[15]= { | ||
63 | MB_TYPE_DIRECT2 | MB_TYPE_BIDIR_MV, | ||
64 | MB_TYPE_DIRECT2 | MB_TYPE_BIDIR_MV | MB_TYPE_CBP, | ||
65 | MB_TYPE_DIRECT2 | MB_TYPE_BIDIR_MV | MB_TYPE_CBP | MB_TYPE_QUANT, | ||
66 | MB_TYPE_FORWARD_MV | MB_TYPE_16x16, | ||
67 | MB_TYPE_FORWARD_MV | MB_TYPE_CBP | MB_TYPE_16x16, | ||
68 | MB_TYPE_FORWARD_MV | MB_TYPE_CBP | MB_TYPE_QUANT | MB_TYPE_16x16, | ||
69 | MB_TYPE_BACKWARD_MV | MB_TYPE_16x16, | ||
70 | MB_TYPE_BACKWARD_MV | MB_TYPE_CBP | MB_TYPE_16x16, | ||
71 | MB_TYPE_BACKWARD_MV | MB_TYPE_CBP | MB_TYPE_QUANT | MB_TYPE_16x16, | ||
72 | MB_TYPE_BIDIR_MV | MB_TYPE_16x16, | ||
73 | MB_TYPE_BIDIR_MV | MB_TYPE_CBP | MB_TYPE_16x16, | ||
74 | MB_TYPE_BIDIR_MV | MB_TYPE_CBP | MB_TYPE_QUANT | MB_TYPE_16x16, | ||
75 | 0, //stuffing | ||
76 | MB_TYPE_INTRA4x4 | MB_TYPE_CBP, | ||
77 | MB_TYPE_INTRA4x4 | MB_TYPE_CBP | MB_TYPE_QUANT, | ||
78 | }; | ||
79 | |||
80 | 461 | void ff_h263_show_pict_info(H263DecContext *const h, int h263_plus) | |
81 | { | ||
82 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 461 times.
|
461 | if (h->c.avctx->debug&FF_DEBUG_PICT_INFO) { |
83 | ✗ | av_log(h->c.avctx, AV_LOG_DEBUG, "qp:%d %c size:%d rnd:%d%s%s%s%s%s%s%s%s%s %d/%d\n", | |
84 | ✗ | h->c.qscale, av_get_picture_type_char(h->c.pict_type), | |
85 | ✗ | h->gb.size_in_bits, 1-h->c.no_rounding, | |
86 | ✗ | h->c.obmc ? " AP" : "", | |
87 | ✗ | h->umvplus ? " UMV" : "", | |
88 | ✗ | h->h263_long_vectors ? " LONG" : "", | |
89 | h263_plus ? " +" : "", | ||
90 | ✗ | h->c.h263_aic ? " AIC" : "", | |
91 | ✗ | h->alt_inter_vlc ? " AIV" : "", | |
92 | ✗ | h->modified_quant ? " MQ" : "", | |
93 | ✗ | h->loop_filter ? " LOOP" : "", | |
94 | ✗ | h->h263_slice_structured ? " SS" : "", | |
95 | ✗ | h->c.avctx->framerate.num, h->c.avctx->framerate.den); | |
96 | } | ||
97 | 461 | } | |
98 | |||
99 | /***********************************************/ | ||
100 | /* decoding */ | ||
101 | |||
102 | VLCElem ff_h263_intra_MCBPC_vlc[72]; | ||
103 | VLCElem ff_h263_inter_MCBPC_vlc[198]; | ||
104 | VLCElem ff_h263_cbpy_vlc[64]; | ||
105 | VLCElem ff_h263_mv_vlc[538]; | ||
106 | static VLCElem h263_mbtype_b_vlc[80]; | ||
107 | static VLCElem cbpc_b_vlc[8]; | ||
108 | |||
109 | /* init vlcs */ | ||
110 | |||
111 | 164 | static av_cold void h263_decode_init_vlc(void) | |
112 | { | ||
113 | 164 | VLC_INIT_STATIC_TABLE(ff_h263_intra_MCBPC_vlc, INTRA_MCBPC_VLC_BITS, 9, | |
114 | ff_h263_intra_MCBPC_bits, 1, 1, | ||
115 | ff_h263_intra_MCBPC_code, 1, 1, 0); | ||
116 | 164 | VLC_INIT_STATIC_TABLE(ff_h263_inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 28, | |
117 | ff_h263_inter_MCBPC_bits, 1, 1, | ||
118 | ff_h263_inter_MCBPC_code, 1, 1, 0); | ||
119 | 164 | VLC_INIT_STATIC_TABLE(ff_h263_cbpy_vlc, CBPY_VLC_BITS, 16, | |
120 | &ff_h263_cbpy_tab[0][1], 2, 1, | ||
121 | &ff_h263_cbpy_tab[0][0], 2, 1, 0); | ||
122 | 164 | VLC_INIT_STATIC_TABLE(ff_h263_mv_vlc, H263_MV_VLC_BITS, 33, | |
123 | &ff_mvtab[0][1], 2, 1, | ||
124 | &ff_mvtab[0][0], 2, 1, 0); | ||
125 |
2/2✓ Branch 0 taken 5248 times.
✓ Branch 1 taken 164 times.
|
5412 | VLC_INIT_RL(ff_h263_rl_inter, 554); |
126 | 164 | INIT_FIRST_VLC_RL(ff_rl_intra_aic, 554); | |
127 | 164 | VLC_INIT_STATIC_SPARSE_TABLE(h263_mbtype_b_vlc, H263_MBTYPE_B_VLC_BITS, 15, | |
128 | &ff_h263_mbtype_b_tab[0][1], 2, 1, | ||
129 | &ff_h263_mbtype_b_tab[0][0], 2, 1, | ||
130 | h263_mb_type_b_map, 2, 2, 0); | ||
131 | 164 | VLC_INIT_STATIC_TABLE(cbpc_b_vlc, CBPC_B_VLC_BITS, 4, | |
132 | &ff_cbpc_b_tab[0][1], 2, 1, | ||
133 | &ff_cbpc_b_tab[0][0], 2, 1, 0); | ||
134 | 164 | } | |
135 | |||
136 | 290 | av_cold void ff_h263_decode_init_vlc(void) | |
137 | { | ||
138 | static AVOnce init_static_once = AV_ONCE_INIT; | ||
139 | 290 | ff_thread_once(&init_static_once, h263_decode_init_vlc); | |
140 | 290 | } | |
141 | |||
142 | 742 | int ff_h263_decode_mba(H263DecContext *const h) | |
143 | { | ||
144 | int i, mb_pos; | ||
145 | |||
146 |
1/2✓ Branch 0 taken 2226 times.
✗ Branch 1 not taken.
|
2226 | for (i = 0; i < 6; i++) |
147 |
2/2✓ Branch 0 taken 742 times.
✓ Branch 1 taken 1484 times.
|
2226 | if (h->c.mb_num - 1 <= ff_mba_max[i]) |
148 | 742 | break; | |
149 | 742 | mb_pos = get_bits(&h->gb, ff_mba_length[i]); | |
150 | 742 | h->c.mb_x = mb_pos % h->c.mb_width; | |
151 | 742 | h->c.mb_y = mb_pos / h->c.mb_width; | |
152 | |||
153 | 742 | return mb_pos; | |
154 | } | ||
155 | |||
156 | /** | ||
157 | * Decode the group of blocks header or slice header. | ||
158 | * @return <0 if an error occurred | ||
159 | */ | ||
160 | 2544 | static int h263_decode_gob_header(H263DecContext *const h) | |
161 | { | ||
162 | unsigned int val, gob_number; | ||
163 | int left; | ||
164 | |||
165 | /* Check for GOB Start Code */ | ||
166 | 2544 | val = show_bits(&h->gb, 16); | |
167 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2544 times.
|
2544 | if(val) |
168 | ✗ | return -1; | |
169 | |||
170 | /* We have a GBSC probably with GSTUFF */ | ||
171 | 2544 | skip_bits(&h->gb, 16); /* Drop the zeros */ | |
172 | 2544 | left = get_bits_left(&h->gb); | |
173 | 2544 | left = FFMIN(left, 32); | |
174 | //MN: we must check the bits left or we might end in an infinite loop (or segfault) | ||
175 |
1/2✓ Branch 0 taken 11538 times.
✗ Branch 1 not taken.
|
11538 | for(;left>13; left--){ |
176 |
2/2✓ Branch 1 taken 2544 times.
✓ Branch 2 taken 8994 times.
|
11538 | if (get_bits1(&h->gb)) |
177 | 2544 | break; /* Seek the '1' bit */ | |
178 | } | ||
179 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2544 times.
|
2544 | if(left<=13) |
180 | ✗ | return -1; | |
181 | |||
182 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2544 times.
|
2544 | if (h->h263_slice_structured) { |
183 | ✗ | if (check_marker(h->c.avctx, &h->gb, "before MBA")==0) | |
184 | ✗ | return -1; | |
185 | |||
186 | ✗ | ff_h263_decode_mba(h); | |
187 | |||
188 | ✗ | if (h->c.mb_num > 1583) | |
189 | ✗ | if (check_marker(h->c.avctx, &h->gb, "after MBA")==0) | |
190 | ✗ | return -1; | |
191 | |||
192 | ✗ | h->c.qscale = get_bits(&h->gb, 5); /* SQUANT */ | |
193 | ✗ | if (check_marker(h->c.avctx, &h->gb, "after SQUANT")==0) | |
194 | ✗ | return -1; | |
195 | ✗ | skip_bits(&h->gb, 2); /* GFID */ | |
196 | }else{ | ||
197 | 2544 | gob_number = get_bits(&h->gb, 5); /* GN */ | |
198 | 2544 | h->c.mb_x = 0; | |
199 | 2544 | h->c.mb_y = h->gob_index* gob_number; | |
200 | 2544 | skip_bits(&h->gb, 2); /* GFID */ | |
201 | 2544 | h->c.qscale = get_bits(&h->gb, 5); /* GQUANT */ | |
202 | } | ||
203 | |||
204 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2544 times.
|
2544 | if (h->c.mb_y >= h->c.mb_height) |
205 | ✗ | return -1; | |
206 | |||
207 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2544 times.
|
2544 | if (h->c.qscale==0) |
208 | ✗ | return -1; | |
209 | |||
210 | 2544 | return 0; | |
211 | } | ||
212 | |||
213 | /** | ||
214 | * Decode the group of blocks / video packet header / slice header (MPEG-4 Studio). | ||
215 | * @return bit position of the resync_marker, or <0 if none was found | ||
216 | */ | ||
217 | 6480 | int ff_h263_resync(H263DecContext *const h) | |
218 | { | ||
219 | int left, pos, ret; | ||
220 | |||
221 | /* In MPEG-4 studio mode look for a new slice startcode | ||
222 | * and decode slice header */ | ||
223 |
4/4✓ Branch 0 taken 3936 times.
✓ Branch 1 taken 2544 times.
✓ Branch 2 taken 29 times.
✓ Branch 3 taken 3907 times.
|
6480 | if (h->c.codec_id==AV_CODEC_ID_MPEG4 && h->c.studio_profile) { |
224 | 29 | align_get_bits(&h->gb); | |
225 | |||
226 |
2/4✓ Branch 1 taken 29 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 29 times.
|
29 | while (get_bits_left(&h->gb) >= 32 && show_bits_long(&h->gb, 32) != SLICE_STARTCODE) { |
227 | ✗ | get_bits(&h->gb, 8); | |
228 | } | ||
229 | |||
230 |
2/4✓ Branch 1 taken 29 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 29 times.
✗ Branch 5 not taken.
|
29 | if (get_bits_left(&h->gb) >= 32 && show_bits_long(&h->gb, 32) == SLICE_STARTCODE) |
231 | 29 | return get_bits_count(&h->gb); | |
232 | else | ||
233 | ✗ | return -1; | |
234 | } | ||
235 | |||
236 |
2/2✓ Branch 0 taken 3907 times.
✓ Branch 1 taken 2544 times.
|
6451 | if (h->c.codec_id==AV_CODEC_ID_MPEG4){ |
237 | 3907 | skip_bits1(&h->gb); | |
238 | 3907 | align_get_bits(&h->gb); | |
239 | } | ||
240 | |||
241 |
1/2✓ Branch 1 taken 6451 times.
✗ Branch 2 not taken.
|
6451 | if (show_bits(&h->gb, 16) ==0) { |
242 | 6451 | pos = get_bits_count(&h->gb); | |
243 |
2/2✓ Branch 0 taken 3907 times.
✓ Branch 1 taken 2544 times.
|
6451 | if(CONFIG_MPEG4_DECODER && h->c.codec_id==AV_CODEC_ID_MPEG4) |
244 | 3907 | ret = ff_mpeg4_decode_video_packet_header(h); | |
245 | else | ||
246 | 2544 | ret = h263_decode_gob_header(h); | |
247 |
1/2✓ Branch 0 taken 6451 times.
✗ Branch 1 not taken.
|
6451 | if(ret>=0) |
248 | 6451 | return pos; | |
249 | } | ||
250 | //OK, it's not where it is supposed to be ... | ||
251 | ✗ | h->gb = h->last_resync_gb; | |
252 | ✗ | align_get_bits(&h->gb); | |
253 | ✗ | left = get_bits_left(&h->gb); | |
254 | |||
255 | ✗ | for(;left>16+1+5+5; left-=8){ | |
256 | ✗ | if (show_bits(&h->gb, 16) == 0){ | |
257 | ✗ | GetBitContext bak = h->gb; | |
258 | |||
259 | ✗ | pos = get_bits_count(&h->gb); | |
260 | ✗ | if(CONFIG_MPEG4_DECODER && h->c.codec_id==AV_CODEC_ID_MPEG4) | |
261 | ✗ | ret = ff_mpeg4_decode_video_packet_header(h); | |
262 | else | ||
263 | ✗ | ret = h263_decode_gob_header(h); | |
264 | ✗ | if(ret>=0) | |
265 | ✗ | return pos; | |
266 | |||
267 | ✗ | h->gb = bak; | |
268 | } | ||
269 | ✗ | skip_bits(&h->gb, 8); | |
270 | } | ||
271 | |||
272 | ✗ | return -1; | |
273 | } | ||
274 | |||
275 | 3786118 | int ff_h263_decode_motion(H263DecContext *const h, int pred, int f_code) | |
276 | { | ||
277 | int code, val, sign, shift; | ||
278 | 3786118 | code = get_vlc2(&h->gb, ff_h263_mv_vlc, H263_MV_VLC_BITS, 2); | |
279 | |||
280 |
2/2✓ Branch 0 taken 1858349 times.
✓ Branch 1 taken 1927769 times.
|
3786118 | if (code == 0) |
281 | 1858349 | return pred; | |
282 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1927769 times.
|
1927769 | if (code < 0) |
283 | ✗ | return 0xffff; | |
284 | |||
285 | 1927769 | sign = get_bits1(&h->gb); | |
286 | 1927769 | shift = f_code - 1; | |
287 | 1927769 | val = code; | |
288 |
2/2✓ Branch 0 taken 211602 times.
✓ Branch 1 taken 1716167 times.
|
1927769 | if (shift) { |
289 | 211602 | val = (val - 1) << shift; | |
290 | 211602 | val |= get_bits(&h->gb, shift); | |
291 | 211602 | val++; | |
292 | } | ||
293 |
2/2✓ Branch 0 taken 807616 times.
✓ Branch 1 taken 1120153 times.
|
1927769 | if (sign) |
294 | 807616 | val = -val; | |
295 | 1927769 | val += pred; | |
296 | |||
297 | /* modulo decoding */ | ||
298 |
1/2✓ Branch 0 taken 1927769 times.
✗ Branch 1 not taken.
|
1927769 | if (!h->h263_long_vectors) { |
299 | 1927769 | val = sign_extend(val, 5 + f_code); | |
300 | } else { | ||
301 | /* horrible H.263 long vector mode */ | ||
302 | ✗ | if (pred < -31 && val < -63) | |
303 | ✗ | val += 64; | |
304 | ✗ | if (pred > 32 && val > 63) | |
305 | ✗ | val -= 64; | |
306 | |||
307 | } | ||
308 | 1927769 | return val; | |
309 | } | ||
310 | |||
311 | |||
312 | /* Decode RVLC of H.263+ UMV */ | ||
313 | 103298 | static int h263p_decode_umotion(H263DecContext *const h, int pred) | |
314 | { | ||
315 | 103298 | int code = 0, sign; | |
316 | |||
317 |
2/2✓ Branch 1 taken 51255 times.
✓ Branch 2 taken 52043 times.
|
103298 | if (get_bits1(&h->gb)) /* Motion difference = 0 */ |
318 | 51255 | return pred; | |
319 | |||
320 | 52043 | code = 2 + get_bits1(&h->gb); | |
321 | |||
322 |
2/2✓ Branch 1 taken 28759 times.
✓ Branch 2 taken 52043 times.
|
80802 | while (get_bits1(&h->gb)) |
323 | { | ||
324 | 28759 | code <<= 1; | |
325 | 28759 | code += get_bits1(&h->gb); | |
326 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 28759 times.
|
28759 | if (code >= 32768) { |
327 | ✗ | avpriv_request_sample(h->c.avctx, "Huge DMV"); | |
328 | ✗ | return 0xffff; | |
329 | } | ||
330 | } | ||
331 | 52043 | sign = code & 1; | |
332 | 52043 | code >>= 1; | |
333 | |||
334 |
2/2✓ Branch 0 taken 30417 times.
✓ Branch 1 taken 21626 times.
|
52043 | code = (sign) ? (pred - code) : (pred + code); |
335 | ff_tlog(h->c.avctx,"H.263+ UMV Motion = %d\n", code); | ||
336 | 52043 | return code; | |
337 | |||
338 | } | ||
339 | |||
340 | /** | ||
341 | * read the next MVs for OBMC. yes this is an ugly hack, feel free to send a patch :) | ||
342 | */ | ||
343 | 48550 | static void preview_obmc(H263DecContext *const h) | |
344 | { | ||
345 | 48550 | GetBitContext gb = h->gb; | |
346 | |||
347 | int cbpc, i, pred_x, pred_y, mx, my; | ||
348 | int16_t *mot_val; | ||
349 | 48550 | const int xy = h->c.mb_x + 1 + h->c.mb_y * h->c.mb_stride; | |
350 | 48550 | const int stride = h->c.b8_stride * 2; | |
351 | |||
352 |
2/2✓ Branch 0 taken 194200 times.
✓ Branch 1 taken 48550 times.
|
242750 | for(i=0; i<4; i++) |
353 | 194200 | h->c.block_index[i] += 2; | |
354 |
2/2✓ Branch 0 taken 97100 times.
✓ Branch 1 taken 48550 times.
|
145650 | for(i=4; i<6; i++) |
355 | 97100 | h->c.block_index[i] += 1; | |
356 | 48550 | h->c.mb_x++; | |
357 | |||
358 | av_assert2(h->c.pict_type == AV_PICTURE_TYPE_P); | ||
359 | |||
360 | do{ | ||
361 |
2/2✓ Branch 1 taken 654 times.
✓ Branch 2 taken 47896 times.
|
48550 | if (get_bits1(&h->gb)) { |
362 | /* skip mb */ | ||
363 | 654 | mot_val = h->c.cur_pic.motion_val[0][h->c.block_index[0]]; | |
364 | 654 | mot_val[0 ]= mot_val[2 ]= | |
365 | 654 | mot_val[0+stride]= mot_val[2+stride]= 0; | |
366 | 654 | mot_val[1 ]= mot_val[3 ]= | |
367 | 654 | mot_val[1+stride]= mot_val[3+stride]= 0; | |
368 | |||
369 | 654 | h->c.cur_pic.mb_type[xy] = MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_FORWARD_MV; | |
370 | 654 | goto end; | |
371 | } | ||
372 | 47896 | cbpc = get_vlc2(&h->gb, ff_h263_inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 2); | |
373 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 47896 times.
|
47896 | }while(cbpc == 20); |
374 | |||
375 |
2/2✓ Branch 0 taken 957 times.
✓ Branch 1 taken 46939 times.
|
47896 | if(cbpc & 4){ |
376 | 957 | h->c.cur_pic.mb_type[xy] = MB_TYPE_INTRA; | |
377 | }else{ | ||
378 | 46939 | get_vlc2(&h->gb, ff_h263_cbpy_vlc, CBPY_VLC_BITS, 1); | |
379 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 46939 times.
|
46939 | if (cbpc & 8) { |
380 | ✗ | skip_bits(&h->gb, h->modified_quant ? (get_bits1(&h->gb) ? 1 : 5) : 2); | |
381 | } | ||
382 | |||
383 |
1/2✓ Branch 0 taken 46939 times.
✗ Branch 1 not taken.
|
46939 | if ((cbpc & 16) == 0) { |
384 | 46939 | h->c.cur_pic.mb_type[xy] = MB_TYPE_16x16 | MB_TYPE_FORWARD_MV; | |
385 | /* 16x16 motion prediction */ | ||
386 | 46939 | mot_val= ff_h263_pred_motion(&h->c, 0, 0, &pred_x, &pred_y); | |
387 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 46939 times.
|
46939 | if (h->umvplus) |
388 | ✗ | mx = h263p_decode_umotion(h, pred_x); | |
389 | else | ||
390 | 46939 | mx = ff_h263_decode_motion(h, pred_x, 1); | |
391 | |||
392 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 46939 times.
|
46939 | if (h->umvplus) |
393 | ✗ | my = h263p_decode_umotion(h, pred_y); | |
394 | else | ||
395 | 46939 | my = ff_h263_decode_motion(h, pred_y, 1); | |
396 | |||
397 | 46939 | mot_val[0 ]= mot_val[2 ]= | |
398 | 46939 | mot_val[0+stride]= mot_val[2+stride]= mx; | |
399 | 46939 | mot_val[1 ]= mot_val[3 ]= | |
400 | 46939 | mot_val[1+stride]= mot_val[3+stride]= my; | |
401 | } else { | ||
402 | ✗ | h->c.cur_pic.mb_type[xy] = MB_TYPE_8x8 | MB_TYPE_FORWARD_MV; | |
403 | ✗ | for(i=0;i<4;i++) { | |
404 | ✗ | mot_val = ff_h263_pred_motion(&h->c, i, 0, &pred_x, &pred_y); | |
405 | ✗ | if (h->umvplus) | |
406 | ✗ | mx = h263p_decode_umotion(h, pred_x); | |
407 | else | ||
408 | ✗ | mx = ff_h263_decode_motion(h, pred_x, 1); | |
409 | |||
410 | ✗ | if (h->umvplus) | |
411 | ✗ | my = h263p_decode_umotion(h, pred_y); | |
412 | else | ||
413 | ✗ | my = ff_h263_decode_motion(h, pred_y, 1); | |
414 | ✗ | if (h->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1) | |
415 | ✗ | skip_bits1(&h->gb); /* Bit stuffing to prevent PSC */ | |
416 | ✗ | mot_val[0] = mx; | |
417 | ✗ | mot_val[1] = my; | |
418 | } | ||
419 | } | ||
420 | } | ||
421 | ✗ | end: | |
422 | |||
423 |
2/2✓ Branch 0 taken 194200 times.
✓ Branch 1 taken 48550 times.
|
242750 | for(i=0; i<4; i++) |
424 | 194200 | h->c.block_index[i] -= 2; | |
425 |
2/2✓ Branch 0 taken 97100 times.
✓ Branch 1 taken 48550 times.
|
145650 | for(i=4; i<6; i++) |
426 | 97100 | h->c.block_index[i] -= 1; | |
427 | 48550 | h->c.mb_x--; | |
428 | |||
429 | 48550 | h->gb = gb; | |
430 | 48550 | } | |
431 | |||
432 | ✗ | static void h263_decode_dquant(H263DecContext *const h) | |
433 | { | ||
434 | static const int8_t quant_tab[4] = { -1, -2, 1, 2 }; | ||
435 | int qscale; | ||
436 | |||
437 | ✗ | if (h->modified_quant) { | |
438 | ✗ | if (get_bits1(&h->gb)) | |
439 | ✗ | qscale = ff_modified_quant_tab[get_bits1(&h->gb)][h->c.qscale]; | |
440 | else | ||
441 | ✗ | qscale = get_bits(&h->gb, 5); | |
442 | }else | ||
443 | ✗ | qscale = h->c.qscale + quant_tab[get_bits(&h->gb, 2)]; | |
444 | ✗ | ff_set_qscale(&h->c, qscale); | |
445 | ✗ | } | |
446 | |||
447 | 91098 | static void h263_pred_acdc(MpegEncContext * s, int16_t *block, int n) | |
448 | { | ||
449 | int wrap, a, c, pred_dc, scale; | ||
450 | 91098 | const int xy = s->block_index[n]; | |
451 | 91098 | int16_t *const dc_val = s->dc_val + xy; | |
452 | 91098 | int16_t *const ac_val = (s->ac_val + xy)[0]; | |
453 | |||
454 | /* find prediction */ | ||
455 |
2/2✓ Branch 0 taken 60732 times.
✓ Branch 1 taken 30366 times.
|
91098 | if (n < 4) { |
456 | 60732 | wrap = s->b8_stride; | |
457 | 60732 | scale = s->y_dc_scale; | |
458 | } else { | ||
459 | 30366 | wrap = s->mb_stride; | |
460 | 30366 | scale = s->c_dc_scale; | |
461 | } | ||
462 | |||
463 | /* B C | ||
464 | * A X | ||
465 | */ | ||
466 | 91098 | a = dc_val[-1]; | |
467 | 91098 | c = dc_val[-wrap]; | |
468 | |||
469 | /* No prediction outside GOB boundary */ | ||
470 |
4/4✓ Branch 0 taken 54174 times.
✓ Branch 1 taken 36924 times.
✓ Branch 2 taken 45145 times.
✓ Branch 3 taken 9029 times.
|
91098 | if (s->first_slice_line && n != 3) { |
471 |
2/2✓ Branch 0 taken 36116 times.
✓ Branch 1 taken 9029 times.
|
45145 | if (n != 2) c= 1024; |
472 |
4/4✓ Branch 0 taken 36116 times.
✓ Branch 1 taken 9029 times.
✓ Branch 2 taken 1348 times.
✓ Branch 3 taken 34768 times.
|
45145 | if (n != 1 && s->mb_x == s->resync_mb_x) a= 1024; |
473 | } | ||
474 | |||
475 |
2/2✓ Branch 0 taken 4434 times.
✓ Branch 1 taken 86664 times.
|
91098 | if (s->ac_pred) { |
476 | 4434 | pred_dc = 1024; | |
477 |
2/2✓ Branch 0 taken 1596 times.
✓ Branch 1 taken 2838 times.
|
4434 | if (s->h263_aic_dir) { |
478 | /* left prediction */ | ||
479 |
2/2✓ Branch 0 taken 1576 times.
✓ Branch 1 taken 20 times.
|
1596 | if (a != 1024) { |
480 | 1576 | int16_t *const ac_val2 = ac_val - 16; | |
481 |
2/2✓ Branch 0 taken 11032 times.
✓ Branch 1 taken 1576 times.
|
12608 | for (int i = 1; i < 8; i++) { |
482 | 11032 | block[s->idsp.idct_permutation[i << 3]] += ac_val2[i]; | |
483 | } | ||
484 | 1576 | pred_dc = a; | |
485 | } | ||
486 | } else { | ||
487 | /* top prediction */ | ||
488 |
2/2✓ Branch 0 taken 1910 times.
✓ Branch 1 taken 928 times.
|
2838 | if (c != 1024) { |
489 | 1910 | int16_t *const ac_val2 = ac_val - 16 * wrap; | |
490 |
2/2✓ Branch 0 taken 13370 times.
✓ Branch 1 taken 1910 times.
|
15280 | for (int i = 1; i < 8; i++) { |
491 | 13370 | block[s->idsp.idct_permutation[i]] += ac_val2[i + 8]; | |
492 | } | ||
493 | 1910 | pred_dc = c; | |
494 | } | ||
495 | } | ||
496 | } else { | ||
497 | /* just DC prediction */ | ||
498 |
4/4✓ Branch 0 taken 81140 times.
✓ Branch 1 taken 5524 times.
✓ Branch 2 taken 50003 times.
✓ Branch 3 taken 31137 times.
|
86664 | if (a != 1024 && c != 1024) |
499 | 50003 | pred_dc = (a + c) >> 1; | |
500 |
2/2✓ Branch 0 taken 31137 times.
✓ Branch 1 taken 5524 times.
|
36661 | else if (a != 1024) |
501 | 31137 | pred_dc = a; | |
502 | else | ||
503 | 5524 | pred_dc = c; | |
504 | } | ||
505 | |||
506 | /* we assume pred is positive */ | ||
507 | 91098 | block[0] = block[0] * scale + pred_dc; | |
508 | |||
509 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 91098 times.
|
91098 | if (block[0] < 0) |
510 | ✗ | block[0] = 0; | |
511 | else | ||
512 | 91098 | block[0] |= 1; | |
513 | |||
514 | /* Update AC/DC tables */ | ||
515 | 91098 | *dc_val = block[0]; | |
516 | |||
517 | /* left copy */ | ||
518 |
2/2✓ Branch 0 taken 637686 times.
✓ Branch 1 taken 91098 times.
|
728784 | for (int i = 1; i < 8; i++) |
519 | 637686 | ac_val[i] = block[s->idsp.idct_permutation[i << 3]]; | |
520 | /* top copy */ | ||
521 |
2/2✓ Branch 0 taken 637686 times.
✓ Branch 1 taken 91098 times.
|
728784 | for (int i = 1; i < 8; i++) |
522 | 637686 | ac_val[8 + i] = block[s->idsp.idct_permutation[i]]; | |
523 | 91098 | } | |
524 | |||
525 | 2590998 | static int h263_decode_block(H263DecContext *const h, int16_t block[64], | |
526 | int n, int coded) | ||
527 | { | ||
528 | int level, i, j, run; | ||
529 | 2590998 | const RLTable *rl = &ff_h263_rl_inter; | |
530 | const uint8_t *scan_table; | ||
531 | 2590998 | GetBitContext gb = h->gb; | |
532 | |||
533 | 2590998 | scan_table = h->c.intra_scantable.permutated; | |
534 |
4/4✓ Branch 0 taken 400992 times.
✓ Branch 1 taken 2190006 times.
✓ Branch 2 taken 91098 times.
✓ Branch 3 taken 309894 times.
|
2590998 | if (h->c.h263_aic && h->c.mb_intra) { |
535 | 91098 | i = 0; | |
536 |
2/2✓ Branch 0 taken 3823 times.
✓ Branch 1 taken 87275 times.
|
91098 | if (!coded) |
537 | 3823 | goto not_coded; | |
538 | 87275 | rl = &ff_rl_intra_aic; | |
539 |
2/2✓ Branch 0 taken 3073 times.
✓ Branch 1 taken 84202 times.
|
87275 | if (h->c.ac_pred) { |
540 |
2/2✓ Branch 0 taken 1148 times.
✓ Branch 1 taken 1925 times.
|
3073 | if (h->c.h263_aic_dir) |
541 | 1148 | scan_table = h->c.permutated_intra_v_scantable; /* left */ | |
542 | else | ||
543 | 1925 | scan_table = h->c.permutated_intra_h_scantable; /* top */ | |
544 | } | ||
545 |
2/2✓ Branch 0 taken 300744 times.
✓ Branch 1 taken 2199156 times.
|
2499900 | } else if (h->c.mb_intra) { |
546 | /* DC coef */ | ||
547 |
2/2✓ Branch 0 taken 46710 times.
✓ Branch 1 taken 254034 times.
|
300744 | if (CONFIG_RV10_DECODER && h->c.codec_id == AV_CODEC_ID_RV10) { |
548 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 46710 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
46710 | if (h->rv10_version == 3 && h->c.pict_type == AV_PICTURE_TYPE_I) { |
549 | ✗ | int component = (n <= 3 ? 0 : n - 4 + 1); | |
550 | ✗ | level = h->c.last_dc[component]; | |
551 | ✗ | if (h->rv10_first_dc_coded[component]) { | |
552 | ✗ | int diff = ff_rv_decode_dc(h, n); | |
553 | ✗ | if (diff < 0) | |
554 | ✗ | return -1; | |
555 | ✗ | level += diff; | |
556 | ✗ | level = level & 0xff; /* handle wrap round */ | |
557 | ✗ | h->c.last_dc[component] = level; | |
558 | } else { | ||
559 | ✗ | h->rv10_first_dc_coded[component] = 1; | |
560 | } | ||
561 | } else { | ||
562 | 46710 | level = get_bits(&h->gb, 8); | |
563 |
2/2✓ Branch 0 taken 542 times.
✓ Branch 1 taken 46168 times.
|
46710 | if (level == 255) |
564 | 542 | level = 128; | |
565 | } | ||
566 | }else{ | ||
567 | 254034 | level = get_bits(&h->gb, 8); | |
568 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 254034 times.
|
254034 | if((level&0x7F) == 0){ |
569 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "illegal dc %d at %d %d\n", | |
570 | level, h->c.mb_x, h->c.mb_y); | ||
571 | ✗ | if (h->c.avctx->err_recognition & (AV_EF_BITSTREAM|AV_EF_COMPLIANT)) | |
572 | ✗ | return -1; | |
573 | } | ||
574 |
2/2✓ Branch 0 taken 3049 times.
✓ Branch 1 taken 250985 times.
|
254034 | if (level == 255) |
575 | 3049 | level = 128; | |
576 | } | ||
577 | 300744 | block[0] = level; | |
578 | 300744 | i = 1; | |
579 | } else { | ||
580 | 2199156 | i = 0; | |
581 | } | ||
582 |
2/2✓ Branch 0 taken 1345756 times.
✓ Branch 1 taken 1241419 times.
|
2587175 | if (!coded) { |
583 | 1241419 | h->c.block_last_index[n] = i - 1; | |
584 | 1241419 | return 0; | |
585 | } | ||
586 | 1345756 | retry: | |
587 | { | ||
588 | 1412215 | OPEN_READER(re, &h->gb); | |
589 | 1412215 | i--; // offset by -1 to allow direct indexing of scan_table | |
590 | for(;;) { | ||
591 | 26689671 | UPDATE_CACHE(re, &h->gb); | |
592 |
2/2✓ Branch 1 taken 893282 times.
✓ Branch 2 taken 13157661 times.
|
14050943 | GET_RL_VLC(level, run, re, &h->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); |
593 |
2/2✓ Branch 0 taken 587695 times.
✓ Branch 1 taken 13463248 times.
|
14050943 | if (run == 66) { |
594 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 587695 times.
|
587695 | if (level){ |
595 | ✗ | CLOSE_READER(re, &h->gb); | |
596 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "illegal ac vlc code at %dx%d\n", | |
597 | h->c.mb_x, h->c.mb_y); | ||
598 | ✗ | return -1; | |
599 | } | ||
600 | /* escape */ | ||
601 |
2/2✓ Branch 0 taken 117640 times.
✓ Branch 1 taken 470055 times.
|
587695 | if (CONFIG_FLV_DECODER && h->flv) { |
602 | 117640 | int is11 = SHOW_UBITS(re, &h->gb, 1); | |
603 | 117640 | SKIP_CACHE(re, &h->gb, 1); | |
604 | 117640 | run = SHOW_UBITS(re, &h->gb, 7) + 1; | |
605 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 117640 times.
|
117640 | if (is11) { |
606 | ✗ | SKIP_COUNTER(re, &h->gb, 1 + 7); | |
607 | ✗ | UPDATE_CACHE(re, &h->gb); | |
608 | ✗ | level = SHOW_SBITS(re, &h->gb, 11); | |
609 | ✗ | SKIP_COUNTER(re, &h->gb, 11); | |
610 | } else { | ||
611 | 117640 | SKIP_CACHE(re, &h->gb, 7); | |
612 | 117640 | level = SHOW_SBITS(re, &h->gb, 7); | |
613 | 117640 | SKIP_COUNTER(re, &h->gb, 1 + 7 + 7); | |
614 | } | ||
615 | } else { | ||
616 | 470055 | run = SHOW_UBITS(re, &h->gb, 7) + 1; | |
617 | 470055 | SKIP_CACHE(re, &h->gb, 7); | |
618 | 470055 | level = (int8_t)SHOW_UBITS(re, &h->gb, 8); | |
619 | 470055 | SKIP_COUNTER(re, &h->gb, 7 + 8); | |
620 |
2/2✓ Branch 0 taken 3157 times.
✓ Branch 1 taken 466898 times.
|
470055 | if(level == -128){ |
621 | 3157 | UPDATE_CACHE(re, &h->gb); | |
622 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3157 times.
|
3157 | if (h->c.codec_id == AV_CODEC_ID_RV10) { |
623 | /* XXX: should patch encoder too */ | ||
624 | ✗ | level = SHOW_SBITS(re, &h->gb, 12); | |
625 | ✗ | SKIP_COUNTER(re, &h->gb, 12); | |
626 | }else{ | ||
627 | 3157 | level = SHOW_UBITS(re, &h->gb, 5); | |
628 | 3157 | SKIP_CACHE(re, &h->gb, 5); | |
629 | 3157 | level |= SHOW_SBITS(re, &h->gb, 6) * (1<<5); | |
630 | 3157 | SKIP_COUNTER(re, &h->gb, 5 + 6); | |
631 | } | ||
632 | } | ||
633 | } | ||
634 | } else { | ||
635 |
2/2✓ Branch 1 taken 6708475 times.
✓ Branch 2 taken 6754773 times.
|
13463248 | if (SHOW_UBITS(re, &h->gb, 1)) |
636 | 6708475 | level = -level; | |
637 | 13463248 | SKIP_COUNTER(re, &h->gb, 1); | |
638 | } | ||
639 | 14050943 | i += run; | |
640 |
2/2✓ Branch 0 taken 1412215 times.
✓ Branch 1 taken 12638728 times.
|
14050943 | if (i >= 64){ |
641 | 1412215 | CLOSE_READER(re, &h->gb); | |
642 | // redo update without last flag, revert -1 offset | ||
643 | 1412215 | i = i - run + ((run-1)&63) + 1; | |
644 |
2/2✓ Branch 0 taken 1345756 times.
✓ Branch 1 taken 66459 times.
|
1412215 | if (i < 64) { |
645 | // only last marker, no overrun | ||
646 | 1345756 | block[scan_table[i]] = level; | |
647 | 1345756 | break; | |
648 | } | ||
649 |
3/6✓ Branch 0 taken 66459 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 66459 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 66459 times.
✗ Branch 5 not taken.
|
66459 | if(h->alt_inter_vlc && rl == &ff_h263_rl_inter && !h->c.mb_intra){ |
650 | //Looks like a hack but no, it's the way it is supposed to work ... | ||
651 | 66459 | rl = &ff_rl_intra_aic; | |
652 | 66459 | i = 0; | |
653 | 66459 | h->gb = gb; | |
654 | 66459 | h->c.bdsp.clear_block(block); | |
655 | 66459 | goto retry; | |
656 | } | ||
657 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "run overflow at %dx%d i:%d\n", | |
658 | h->c.mb_x, h->c.mb_y, h->c.mb_intra); | ||
659 | ✗ | return -1; | |
660 | } | ||
661 | 12638728 | j = scan_table[i]; | |
662 | 12638728 | block[j] = level; | |
663 | } | ||
664 | } | ||
665 |
4/4✓ Branch 0 taken 350482 times.
✓ Branch 1 taken 995274 times.
✓ Branch 2 taken 87275 times.
✓ Branch 3 taken 263207 times.
|
1345756 | if (h->c.mb_intra && h->c.h263_aic) { |
666 | 87275 | not_coded: | |
667 | 91098 | h263_pred_acdc(&h->c, block, n); | |
668 | } | ||
669 | 1349579 | h->c.block_last_index[n] = i; | |
670 | 1349579 | return 0; | |
671 | } | ||
672 | |||
673 | ✗ | static int h263_skip_b_part(H263DecContext *const h, int cbp) | |
674 | { | ||
675 | ✗ | LOCAL_ALIGNED_32(int16_t, dblock, [64]); | |
676 | int i, mbi; | ||
677 | int bli[6]; | ||
678 | |||
679 | /* we have to set h->c.mb_intra to zero to decode B-part of PB-frame correctly | ||
680 | * but real value should be restored in order to be used later (in OBMC condition) | ||
681 | */ | ||
682 | ✗ | mbi = h->c.mb_intra; | |
683 | ✗ | memcpy(bli, h->c.block_last_index, sizeof(bli)); | |
684 | ✗ | h->c.mb_intra = 0; | |
685 | ✗ | for (i = 0; i < 6; i++) { | |
686 | ✗ | if (h263_decode_block(h, dblock, i, cbp&32) < 0) | |
687 | ✗ | return -1; | |
688 | ✗ | cbp+=cbp; | |
689 | } | ||
690 | ✗ | h->c.mb_intra = mbi; | |
691 | ✗ | memcpy(h->c.block_last_index, bli, sizeof(bli)); | |
692 | ✗ | return 0; | |
693 | } | ||
694 | |||
695 | ✗ | static int h263_get_modb(GetBitContext *gb, int pb_frame, int *cbpb) | |
696 | { | ||
697 | ✗ | int c, mv = 1; | |
698 | |||
699 | ✗ | if (pb_frame < 3) { // h.263 Annex G and i263 PB-frame | |
700 | ✗ | c = get_bits1(gb); | |
701 | ✗ | if (pb_frame == 2 && c) | |
702 | ✗ | mv = !get_bits1(gb); | |
703 | } else { // h.263 Annex M improved PB-frame | ||
704 | ✗ | mv = get_unary(gb, 0, 4) + 1; | |
705 | ✗ | c = mv & 1; | |
706 | ✗ | mv = !!(mv & 2); | |
707 | } | ||
708 | ✗ | if(c) | |
709 | ✗ | *cbpb = get_bits(gb, 6); | |
710 | ✗ | return mv; | |
711 | } | ||
712 | |||
713 | #define tab_size ((signed)FF_ARRAY_ELEMS(s->direct_scale_mv[0])) | ||
714 | #define tab_bias (tab_size / 2) | ||
715 | 15407 | static inline void set_one_direct_mv(MpegEncContext *s, const MPVPicture *p, int i) | |
716 | { | ||
717 | 15407 | int xy = s->block_index[i]; | |
718 | 15407 | uint16_t time_pp = s->pp_time; | |
719 | 15407 | uint16_t time_pb = s->pb_time; | |
720 | int p_mx, p_my; | ||
721 | |||
722 | 15407 | p_mx = p->motion_val[0][xy][0]; | |
723 |
1/2✓ Branch 0 taken 15407 times.
✗ Branch 1 not taken.
|
15407 | if ((unsigned)(p_mx + tab_bias) < tab_size) { |
724 | 15407 | s->mv[0][i][0] = s->direct_scale_mv[0][p_mx + tab_bias]; | |
725 | 15407 | s->mv[1][i][0] = s->direct_scale_mv[1][p_mx + tab_bias]; | |
726 | } else { | ||
727 | ✗ | s->mv[0][i][0] = p_mx * time_pb / time_pp; | |
728 | ✗ | s->mv[1][i][0] = p_mx * (time_pb - time_pp) / time_pp; | |
729 | } | ||
730 | 15407 | p_my = p->motion_val[0][xy][1]; | |
731 |
1/2✓ Branch 0 taken 15407 times.
✗ Branch 1 not taken.
|
15407 | if ((unsigned)(p_my + tab_bias) < tab_size) { |
732 | 15407 | s->mv[0][i][1] = s->direct_scale_mv[0][p_my + tab_bias]; | |
733 | 15407 | s->mv[1][i][1] = s->direct_scale_mv[1][p_my + tab_bias]; | |
734 | } else { | ||
735 | ✗ | s->mv[0][i][1] = p_my * time_pb / time_pp; | |
736 | ✗ | s->mv[1][i][1] = p_my * (time_pb - time_pp) / time_pp; | |
737 | } | ||
738 | 15407 | } | |
739 | |||
740 | /** | ||
741 | * @return the mb_type | ||
742 | */ | ||
743 | 15266 | static int set_direct_mv(MpegEncContext *s) | |
744 | { | ||
745 | 15266 | const int mb_index = s->mb_x + s->mb_y * s->mb_stride; | |
746 | 15266 | const MPVPicture *p = s->next_pic.ptr; | |
747 | 15266 | int colocated_mb_type = p->mb_type[mb_index]; | |
748 | int i; | ||
749 | |||
750 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 15266 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
15266 | if (s->codec_tag == AV_RL32("U263") && p->f->pict_type == AV_PICTURE_TYPE_I) { |
751 | ✗ | p = s->last_pic.ptr; | |
752 | ✗ | colocated_mb_type = p->mb_type[mb_index]; | |
753 | } | ||
754 | |||
755 |
2/2✓ Branch 0 taken 47 times.
✓ Branch 1 taken 15219 times.
|
15266 | if (IS_8X8(colocated_mb_type)) { |
756 | 47 | s->mv_type = MV_TYPE_8X8; | |
757 |
2/2✓ Branch 0 taken 188 times.
✓ Branch 1 taken 47 times.
|
235 | for (i = 0; i < 4; i++) |
758 | 188 | set_one_direct_mv(s, p, i); | |
759 | 47 | return MB_TYPE_DIRECT2 | MB_TYPE_8x8 | MB_TYPE_BIDIR_MV; | |
760 | } else { | ||
761 | 15219 | set_one_direct_mv(s, p, 0); | |
762 | 15219 | s->mv[0][1][0] = | |
763 | 15219 | s->mv[0][2][0] = | |
764 | 15219 | s->mv[0][3][0] = s->mv[0][0][0]; | |
765 | 15219 | s->mv[0][1][1] = | |
766 | 15219 | s->mv[0][2][1] = | |
767 | 15219 | s->mv[0][3][1] = s->mv[0][0][1]; | |
768 | 15219 | s->mv[1][1][0] = | |
769 | 15219 | s->mv[1][2][0] = | |
770 | 15219 | s->mv[1][3][0] = s->mv[1][0][0]; | |
771 | 15219 | s->mv[1][1][1] = | |
772 | 15219 | s->mv[1][2][1] = | |
773 | 15219 | s->mv[1][3][1] = s->mv[1][0][1]; | |
774 | 15219 | s->mv_type = MV_TYPE_8X8; | |
775 | // Note see prev line | ||
776 | 15219 | return MB_TYPE_DIRECT2 | MB_TYPE_16x16 | MB_TYPE_BIDIR_MV; | |
777 | } | ||
778 | } | ||
779 | |||
780 | 441138 | int ff_h263_decode_mb(H263DecContext *const h) | |
781 | { | ||
782 | int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant; | ||
783 | int16_t *mot_val; | ||
784 | 441138 | const int xy = h->c.mb_x + h->c.mb_y * h->c.mb_stride; | |
785 | 441138 | int cbpb = 0, pb_mv_count = 0; | |
786 | |||
787 | av_assert2(!h->c.h263_pred); | ||
788 | |||
789 |
2/2✓ Branch 0 taken 367701 times.
✓ Branch 1 taken 73437 times.
|
441138 | if (h->c.pict_type == AV_PICTURE_TYPE_P) { |
790 | do{ | ||
791 |
2/2✓ Branch 1 taken 9305 times.
✓ Branch 2 taken 358396 times.
|
367701 | if (get_bits1(&h->gb)) { |
792 | /* skip mb */ | ||
793 | 9305 | h->c.mb_intra = 0; | |
794 |
2/2✓ Branch 0 taken 55830 times.
✓ Branch 1 taken 9305 times.
|
65135 | for(i=0;i<6;i++) |
795 | 55830 | h->c.block_last_index[i] = -1; | |
796 | 9305 | h->c.mv_dir = MV_DIR_FORWARD; | |
797 | 9305 | h->c.mv_type = MV_TYPE_16X16; | |
798 | 9305 | h->c.cur_pic.mb_type[xy] = MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_FORWARD_MV; | |
799 | 9305 | h->c.mv[0][0][0] = 0; | |
800 | 9305 | h->c.mv[0][0][1] = 0; | |
801 | 9305 | h->c.mb_skipped = !(h->c.obmc | h->loop_filter); | |
802 | 9305 | goto end; | |
803 | } | ||
804 | 358396 | cbpc = get_vlc2(&h->gb, ff_h263_inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 2); | |
805 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 358396 times.
|
358396 | if (cbpc < 0){ |
806 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "cbpc damaged at %d %d\n", | |
807 | h->c.mb_x, h->c.mb_y); | ||
808 | ✗ | return SLICE_ERROR; | |
809 | } | ||
810 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 358396 times.
|
358396 | }while(cbpc == 20); |
811 | |||
812 | 358396 | h->c.bdsp.clear_blocks(h->block[0]); | |
813 | |||
814 | 358396 | dquant = cbpc & 8; | |
815 | 358396 | h->c.mb_intra = ((cbpc & 4) != 0); | |
816 |
2/2✓ Branch 0 taken 13424 times.
✓ Branch 1 taken 344972 times.
|
358396 | if (h->c.mb_intra) |
817 | 13424 | goto intra; | |
818 | |||
819 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 344972 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
|
344972 | if (h->pb_frame && get_bits1(&h->gb)) |
820 | ✗ | pb_mv_count = h263_get_modb(&h->gb, h->pb_frame, &cbpb); | |
821 | 344972 | cbpy = get_vlc2(&h->gb, ff_h263_cbpy_vlc, CBPY_VLC_BITS, 1); | |
822 | |||
823 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 344972 times.
|
344972 | if (cbpy < 0) { |
824 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "cbpy damaged at %d %d\n", | |
825 | h->c.mb_x, h->c.mb_y); | ||
826 | ✗ | return SLICE_ERROR; | |
827 | } | ||
828 | |||
829 |
4/4✓ Branch 0 taken 51649 times.
✓ Branch 1 taken 293323 times.
✓ Branch 2 taken 13805 times.
✓ Branch 3 taken 37844 times.
|
344972 | if (!h->alt_inter_vlc|| (cbpc & 3)!=3) |
830 | 307128 | cbpy ^= 0xF; | |
831 | |||
832 | 344972 | cbp = (cbpc & 3) | (cbpy << 2); | |
833 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 344972 times.
|
344972 | if (dquant) { |
834 | ✗ | h263_decode_dquant(h); | |
835 | } | ||
836 | |||
837 | 344972 | h->c.mv_dir = MV_DIR_FORWARD; | |
838 |
2/2✓ Branch 0 taken 343929 times.
✓ Branch 1 taken 1043 times.
|
344972 | if ((cbpc & 16) == 0) { |
839 | 343929 | h->c.cur_pic.mb_type[xy] = MB_TYPE_16x16 | MB_TYPE_FORWARD_MV; | |
840 | /* 16x16 motion prediction */ | ||
841 | 343929 | h->c.mv_type = MV_TYPE_16X16; | |
842 | 343929 | ff_h263_pred_motion(&h->c, 0, 0, &pred_x, &pred_y); | |
843 |
2/2✓ Branch 0 taken 51649 times.
✓ Branch 1 taken 292280 times.
|
343929 | if (h->umvplus) |
844 | 51649 | mx = h263p_decode_umotion(h, pred_x); | |
845 | else | ||
846 | 292280 | mx = ff_h263_decode_motion(h, pred_x, 1); | |
847 | |||
848 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 343929 times.
|
343929 | if (mx >= 0xffff) |
849 | ✗ | return SLICE_ERROR; | |
850 | |||
851 |
2/2✓ Branch 0 taken 51649 times.
✓ Branch 1 taken 292280 times.
|
343929 | if (h->umvplus) |
852 | 51649 | my = h263p_decode_umotion(h, pred_y); | |
853 | else | ||
854 | 292280 | my = ff_h263_decode_motion(h, pred_y, 1); | |
855 | |||
856 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 343929 times.
|
343929 | if (my >= 0xffff) |
857 | ✗ | return SLICE_ERROR; | |
858 | 343929 | h->c.mv[0][0][0] = mx; | |
859 | 343929 | h->c.mv[0][0][1] = my; | |
860 | |||
861 |
6/6✓ Branch 0 taken 51649 times.
✓ Branch 1 taken 292280 times.
✓ Branch 2 taken 10131 times.
✓ Branch 3 taken 41518 times.
✓ Branch 4 taken 340 times.
✓ Branch 5 taken 9791 times.
|
343929 | if (h->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1) |
862 | 340 | skip_bits1(&h->gb); /* Bit stuffing to prevent PSC */ | |
863 | } else { | ||
864 | 1043 | h->c.cur_pic.mb_type[xy] = MB_TYPE_8x8 | MB_TYPE_FORWARD_MV; | |
865 | 1043 | h->c.mv_type = MV_TYPE_8X8; | |
866 |
2/2✓ Branch 0 taken 4172 times.
✓ Branch 1 taken 1043 times.
|
5215 | for(i=0;i<4;i++) { |
867 | 4172 | mot_val = ff_h263_pred_motion(&h->c, i, 0, &pred_x, &pred_y); | |
868 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4172 times.
|
4172 | if (h->umvplus) |
869 | ✗ | mx = h263p_decode_umotion(h, pred_x); | |
870 | else | ||
871 | 4172 | mx = ff_h263_decode_motion(h, pred_x, 1); | |
872 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4172 times.
|
4172 | if (mx >= 0xffff) |
873 | ✗ | return SLICE_ERROR; | |
874 | |||
875 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4172 times.
|
4172 | if (h->umvplus) |
876 | ✗ | my = h263p_decode_umotion(h, pred_y); | |
877 | else | ||
878 | 4172 | my = ff_h263_decode_motion(h, pred_y, 1); | |
879 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4172 times.
|
4172 | if (my >= 0xffff) |
880 | ✗ | return SLICE_ERROR; | |
881 | 4172 | h->c.mv[0][i][0] = mx; | |
882 | 4172 | h->c.mv[0][i][1] = my; | |
883 |
1/6✗ Branch 0 not taken.
✓ Branch 1 taken 4172 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
4172 | if (h->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1) |
884 | ✗ | skip_bits1(&h->gb); /* Bit stuffing to prevent PSC */ | |
885 | 4172 | mot_val[0] = mx; | |
886 | 4172 | mot_val[1] = my; | |
887 | } | ||
888 | } | ||
889 |
2/2✓ Branch 0 taken 21600 times.
✓ Branch 1 taken 51837 times.
|
73437 | } else if (h->c.pict_type==AV_PICTURE_TYPE_B) { |
890 | int mb_type; | ||
891 | 21600 | const int stride = h->c.b8_stride; | |
892 | 21600 | int16_t *mot_val0 = h->c.cur_pic.motion_val[0][2 * (h->c.mb_x + h->c.mb_y * stride)]; | |
893 | 21600 | int16_t *mot_val1 = h->c.cur_pic.motion_val[1][2 * (h->c.mb_x + h->c.mb_y * stride)]; | |
894 | // const int mv_xy = h->c.mb_x + 1 + h->c.mb_y * h->c.mb_stride; | ||
895 | |||
896 | //FIXME ugly | ||
897 | 21600 | mot_val0[0 ]= mot_val0[2 ]= mot_val0[0+2*stride]= mot_val0[2+2*stride]= | |
898 | 21600 | mot_val0[1 ]= mot_val0[3 ]= mot_val0[1+2*stride]= mot_val0[3+2*stride]= | |
899 | 21600 | mot_val1[0 ]= mot_val1[2 ]= mot_val1[0+2*stride]= mot_val1[2+2*stride]= | |
900 | 21600 | mot_val1[1 ]= mot_val1[3 ]= mot_val1[1+2*stride]= mot_val1[3+2*stride]= 0; | |
901 | |||
902 | do{ | ||
903 | 21600 | mb_type = get_vlc2(&h->gb, h263_mbtype_b_vlc, | |
904 | H263_MBTYPE_B_VLC_BITS, 2); | ||
905 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 21600 times.
|
21600 | if (mb_type < 0){ |
906 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "b mb_type damaged at %d %d\n", | |
907 | h->c.mb_x, h->c.mb_y); | ||
908 | ✗ | return SLICE_ERROR; | |
909 | } | ||
910 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 21600 times.
|
21600 | }while(!mb_type); |
911 | |||
912 | 21600 | h->c.mb_intra = IS_INTRA(mb_type); | |
913 |
2/2✓ Branch 0 taken 11402 times.
✓ Branch 1 taken 10198 times.
|
21600 | if(HAS_CBP(mb_type)){ |
914 | 11402 | h->c.bdsp.clear_blocks(h->block[0]); | |
915 | 11402 | cbpc = get_vlc2(&h->gb, cbpc_b_vlc, CBPC_B_VLC_BITS, 1); | |
916 |
2/2✓ Branch 0 taken 46 times.
✓ Branch 1 taken 11356 times.
|
11402 | if (h->c.mb_intra) { |
917 | 46 | dquant = IS_QUANT(mb_type); | |
918 | 46 | goto intra; | |
919 | } | ||
920 | |||
921 | 11356 | cbpy = get_vlc2(&h->gb, ff_h263_cbpy_vlc, CBPY_VLC_BITS, 1); | |
922 | |||
923 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 11356 times.
|
11356 | if (cbpy < 0){ |
924 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "b cbpy damaged at %d %d\n", | |
925 | h->c.mb_x, h->c.mb_y); | ||
926 | ✗ | return SLICE_ERROR; | |
927 | } | ||
928 | |||
929 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 11356 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
11356 | if (!h->alt_inter_vlc || (cbpc & 3)!=3) |
930 | 11356 | cbpy ^= 0xF; | |
931 | |||
932 | 11356 | cbp = (cbpc & 3) | (cbpy << 2); | |
933 | }else | ||
934 | 10198 | cbp=0; | |
935 | |||
936 | av_assert2(!h->c.mb_intra); | ||
937 | |||
938 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 21554 times.
|
21554 | if(IS_QUANT(mb_type)){ |
939 | ✗ | h263_decode_dquant(h); | |
940 | } | ||
941 | |||
942 |
2/2✓ Branch 0 taken 15266 times.
✓ Branch 1 taken 6288 times.
|
21554 | if(IS_DIRECT(mb_type)){ |
943 | 15266 | h->c.mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT; | |
944 | 15266 | mb_type |= set_direct_mv(&h->c); | |
945 | }else{ | ||
946 | 6288 | h->c.mv_dir = 0; | |
947 | 6288 | h->c.mv_type = MV_TYPE_16X16; | |
948 | //FIXME UMV | ||
949 | |||
950 |
2/2✓ Branch 0 taken 2594 times.
✓ Branch 1 taken 3694 times.
|
6288 | if (HAS_FORWARD_MV(mb_type)) { |
951 | 2594 | int16_t *mot_val = ff_h263_pred_motion(&h->c, 0, 0, &pred_x, &pred_y); | |
952 | 2594 | h->c.mv_dir = MV_DIR_FORWARD; | |
953 | |||
954 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2594 times.
|
2594 | if (h->umvplus) |
955 | ✗ | mx = h263p_decode_umotion(h, pred_x); | |
956 | else | ||
957 | 2594 | mx = ff_h263_decode_motion(h, pred_x, 1); | |
958 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2594 times.
|
2594 | if (mx >= 0xffff) |
959 | ✗ | return SLICE_ERROR; | |
960 | |||
961 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2594 times.
|
2594 | if (h->umvplus) |
962 | ✗ | my = h263p_decode_umotion(h, pred_y); | |
963 | else | ||
964 | 2594 | my = ff_h263_decode_motion(h, pred_y, 1); | |
965 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2594 times.
|
2594 | if (my >= 0xffff) |
966 | ✗ | return SLICE_ERROR; | |
967 | |||
968 |
1/6✗ Branch 0 not taken.
✓ Branch 1 taken 2594 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
2594 | if (h->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1) |
969 | ✗ | skip_bits1(&h->gb); /* Bit stuffing to prevent PSC */ | |
970 | |||
971 | 2594 | h->c.mv[0][0][0] = mx; | |
972 | 2594 | h->c.mv[0][0][1] = my; | |
973 | 2594 | mot_val[0 ]= mot_val[2 ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx; | |
974 | 2594 | mot_val[1 ]= mot_val[3 ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my; | |
975 | } | ||
976 | |||
977 |
2/2✓ Branch 0 taken 3694 times.
✓ Branch 1 taken 2594 times.
|
6288 | if (HAS_BACKWARD_MV(mb_type)) { |
978 | 3694 | int16_t *mot_val = ff_h263_pred_motion(&h->c, 0, 1, &pred_x, &pred_y); | |
979 | 3694 | h->c.mv_dir |= MV_DIR_BACKWARD; | |
980 | |||
981 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3694 times.
|
3694 | if (h->umvplus) |
982 | ✗ | mx = h263p_decode_umotion(h, pred_x); | |
983 | else | ||
984 | 3694 | mx = ff_h263_decode_motion(h, pred_x, 1); | |
985 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3694 times.
|
3694 | if (mx >= 0xffff) |
986 | ✗ | return SLICE_ERROR; | |
987 | |||
988 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3694 times.
|
3694 | if (h->umvplus) |
989 | ✗ | my = h263p_decode_umotion(h, pred_y); | |
990 | else | ||
991 | 3694 | my = ff_h263_decode_motion(h, pred_y, 1); | |
992 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3694 times.
|
3694 | if (my >= 0xffff) |
993 | ✗ | return SLICE_ERROR; | |
994 | |||
995 |
1/6✗ Branch 0 not taken.
✓ Branch 1 taken 3694 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
3694 | if (h->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1) |
996 | ✗ | skip_bits1(&h->gb); /* Bit stuffing to prevent PSC */ | |
997 | |||
998 | 3694 | h->c.mv[1][0][0] = mx; | |
999 | 3694 | h->c.mv[1][0][1] = my; | |
1000 | 3694 | mot_val[0 ]= mot_val[2 ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx; | |
1001 | 3694 | mot_val[1 ]= mot_val[3 ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my; | |
1002 | } | ||
1003 | } | ||
1004 | |||
1005 | 21554 | h->c.cur_pic.mb_type[xy] = mb_type; | |
1006 | } else { /* I-Frame */ | ||
1007 | do{ | ||
1008 | 51837 | cbpc = get_vlc2(&h->gb, ff_h263_intra_MCBPC_vlc, INTRA_MCBPC_VLC_BITS, 2); | |
1009 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 51837 times.
|
51837 | if (cbpc < 0){ |
1010 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "I cbpc damaged at %d %d\n", | |
1011 | h->c.mb_x, h->c.mb_y); | ||
1012 | ✗ | return SLICE_ERROR; | |
1013 | } | ||
1014 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 51837 times.
|
51837 | }while(cbpc == 8); |
1015 | |||
1016 | 51837 | h->c.bdsp.clear_blocks(h->block[0]); | |
1017 | |||
1018 | 51837 | dquant = cbpc & 4; | |
1019 | 51837 | h->c.mb_intra = 1; | |
1020 | 65307 | intra: | |
1021 | 65307 | h->c.cur_pic.mb_type[xy] = MB_TYPE_INTRA; | |
1022 |
2/2✓ Branch 0 taken 15183 times.
✓ Branch 1 taken 50124 times.
|
65307 | if (h->c.h263_aic) { |
1023 | 15183 | h->c.ac_pred = get_bits1(&h->gb); | |
1024 |
2/2✓ Branch 0 taken 739 times.
✓ Branch 1 taken 14444 times.
|
15183 | if (h->c.ac_pred) { |
1025 | 739 | h->c.cur_pic.mb_type[xy] = MB_TYPE_INTRA | MB_TYPE_ACPRED; | |
1026 | |||
1027 | 739 | h->c.h263_aic_dir = get_bits1(&h->gb); | |
1028 | } | ||
1029 | }else | ||
1030 | 50124 | h->c.ac_pred = 0; | |
1031 | |||
1032 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 65307 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
|
65307 | if (h->pb_frame && get_bits1(&h->gb)) |
1033 | ✗ | pb_mv_count = h263_get_modb(&h->gb, h->pb_frame, &cbpb); | |
1034 | 65307 | cbpy = get_vlc2(&h->gb, ff_h263_cbpy_vlc, CBPY_VLC_BITS, 1); | |
1035 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 65307 times.
|
65307 | if(cbpy<0){ |
1036 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", | |
1037 | h->c.mb_x, h->c.mb_y); | ||
1038 | ✗ | return SLICE_ERROR; | |
1039 | } | ||
1040 | 65307 | cbp = (cbpc & 3) | (cbpy << 2); | |
1041 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 65307 times.
|
65307 | if (dquant) { |
1042 | ✗ | h263_decode_dquant(h); | |
1043 | } | ||
1044 | |||
1045 | 65307 | pb_mv_count += !!h->pb_frame; | |
1046 | } | ||
1047 | |||
1048 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 431833 times.
|
431833 | while(pb_mv_count--){ |
1049 | ✗ | ff_h263_decode_motion(h, 0, 1); | |
1050 | ✗ | ff_h263_decode_motion(h, 0, 1); | |
1051 | } | ||
1052 | |||
1053 | /* decode each block */ | ||
1054 |
2/2✓ Branch 0 taken 2590998 times.
✓ Branch 1 taken 431833 times.
|
3022831 | for (i = 0; i < 6; i++) { |
1055 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 2590998 times.
|
2590998 | if (h263_decode_block(h, h->block[i], i, cbp&32) < 0) |
1056 | ✗ | return -1; | |
1057 | 2590998 | cbp+=cbp; | |
1058 | } | ||
1059 | |||
1060 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 431833 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
|
431833 | if (h->pb_frame && h263_skip_b_part(h, cbpb) < 0) |
1061 | ✗ | return -1; | |
1062 |
4/4✓ Branch 0 taken 373249 times.
✓ Branch 1 taken 58584 times.
✓ Branch 2 taken 7779 times.
✓ Branch 3 taken 50805 times.
|
431833 | if (h->c.obmc && !h->c.mb_intra) { |
1063 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 50805 times.
|
50805 | if (h->c.pict_type == AV_PICTURE_TYPE_P && |
1064 |
3/4✓ Branch 0 taken 2255 times.
✓ Branch 1 taken 48550 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 48550 times.
|
50805 | h->c.mb_x + 1 < h->c.mb_width && h->mb_num_left != 1) |
1065 | 48550 | preview_obmc(h); | |
1066 | } | ||
1067 | 383283 | end: | |
1068 | |||
1069 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 441138 times.
|
441138 | if (get_bits_left(&h->gb) < 0) |
1070 | ✗ | return AVERROR_INVALIDDATA; | |
1071 | |||
1072 | /* per-MB end of slice check */ | ||
1073 | { | ||
1074 | 441138 | int v = show_bits(&h->gb, 16); | |
1075 | |||
1076 |
2/2✓ Branch 1 taken 1616 times.
✓ Branch 2 taken 439522 times.
|
441138 | if (get_bits_left(&h->gb) < 16) { |
1077 | 1616 | v >>= 16 - get_bits_left(&h->gb); | |
1078 | } | ||
1079 | |||
1080 |
2/2✓ Branch 0 taken 3742 times.
✓ Branch 1 taken 437396 times.
|
441138 | if(v==0) |
1081 | 3742 | return SLICE_END; | |
1082 | } | ||
1083 | |||
1084 | 437396 | return SLICE_OK; | |
1085 | } | ||
1086 | |||
1087 | /* Most is hardcoded; should extend to handle all H.263 streams. */ | ||
1088 | 461 | int ff_h263_decode_picture_header(H263DecContext *const h) | |
1089 | { | ||
1090 | int width, height, i, ret; | ||
1091 | int h263_plus; | ||
1092 | |||
1093 | 461 | align_get_bits(&h->gb); | |
1094 | |||
1095 |
1/4✗ Branch 1 not taken.
✓ Branch 2 taken 461 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
|
461 | if (show_bits(&h->gb, 2) == 2 && h->c.avctx->frame_num == 0) { |
1096 | ✗ | av_log(h->c.avctx, AV_LOG_WARNING, "Header looks like RTP instead of H.263\n"); | |
1097 | } | ||
1098 | |||
1099 | 461 | uint32_t startcode = get_bits(&h->gb, 22-8); | |
1100 | |||
1101 |
1/2✓ Branch 1 taken 461 times.
✗ Branch 2 not taken.
|
461 | for (i = get_bits_left(&h->gb); i>24; i -= 8) { |
1102 | 461 | startcode = ((startcode << 8) | get_bits(&h->gb, 8)) & 0x003FFFFF; | |
1103 | |||
1104 |
1/2✓ Branch 0 taken 461 times.
✗ Branch 1 not taken.
|
461 | if(startcode == 0x20) |
1105 | 461 | break; | |
1106 | } | ||
1107 | |||
1108 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 461 times.
|
461 | if (startcode != 0x20) { |
1109 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "Bad picture start code\n"); | |
1110 | ✗ | return -1; | |
1111 | } | ||
1112 | /* temporal reference */ | ||
1113 | 461 | i = get_bits(&h->gb, 8); /* picture timestamp */ | |
1114 | |||
1115 | 461 | i -= (i - (h->picture_number & 0xFF) + 128) & ~0xFF; | |
1116 | |||
1117 | 461 | h->picture_number = (h->picture_number&~0xFF) + i; | |
1118 | |||
1119 | /* PTYPE starts here */ | ||
1120 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 461 times.
|
461 | if (check_marker(h->c.avctx, &h->gb, "in PTYPE") != 1) { |
1121 | ✗ | return -1; | |
1122 | } | ||
1123 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 461 times.
|
461 | if (get_bits1(&h->gb) != 0) { |
1124 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "Bad H.263 id\n"); | |
1125 | ✗ | return -1; /* H.263 id */ | |
1126 | } | ||
1127 | 461 | skip_bits1(&h->gb); /* split screen off */ | |
1128 | 461 | skip_bits1(&h->gb); /* camera off */ | |
1129 | 461 | skip_bits1(&h->gb); /* freeze picture release off */ | |
1130 | |||
1131 | 461 | int format = get_bits(&h->gb, 3); | |
1132 | /* | ||
1133 | 0 forbidden | ||
1134 | 1 sub-QCIF | ||
1135 | 10 QCIF | ||
1136 | 7 extended PTYPE (PLUSPTYPE) | ||
1137 | */ | ||
1138 | |||
1139 |
3/4✓ Branch 0 taken 307 times.
✓ Branch 1 taken 154 times.
✓ Branch 2 taken 307 times.
✗ Branch 3 not taken.
|
461 | if (format != 7 && format != 6) { |
1140 | 307 | h263_plus = 0; | |
1141 | /* H.263v1 */ | ||
1142 | 307 | width = ff_h263_format[format][0]; | |
1143 | 307 | height = ff_h263_format[format][1]; | |
1144 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 307 times.
|
307 | if (!width) |
1145 | ✗ | return -1; | |
1146 | |||
1147 | 307 | h->c.pict_type = AV_PICTURE_TYPE_I + get_bits1(&h->gb); | |
1148 | |||
1149 | 307 | h->h263_long_vectors = get_bits1(&h->gb); | |
1150 | |||
1151 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 307 times.
|
307 | if (get_bits1(&h->gb) != 0) { |
1152 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "H.263 SAC not supported\n"); | |
1153 | ✗ | return -1; /* SAC: off */ | |
1154 | } | ||
1155 | 307 | h->c.obmc = get_bits1(&h->gb); /* Advanced prediction mode */ | |
1156 | |||
1157 | 307 | h->pb_frame = get_bits1(&h->gb); | |
1158 | 307 | h->c.chroma_qscale = h->c.qscale = get_bits(&h->gb, 5); | |
1159 | 307 | skip_bits1(&h->gb); /* Continuous Presence Multipoint mode: off */ | |
1160 | |||
1161 | 307 | h->c.width = width; | |
1162 | 307 | h->c.height = height; | |
1163 | 307 | h->c.avctx->sample_aspect_ratio= (AVRational){12,11}; | |
1164 | 307 | h->c.avctx->framerate = (AVRational){ 30000, 1001 }; | |
1165 | } else { | ||
1166 | int ufep; | ||
1167 | |||
1168 | /* H.263v2 */ | ||
1169 | 154 | h263_plus = 1; | |
1170 | 154 | ufep = get_bits(&h->gb, 3); /* Update Full Extended PTYPE */ | |
1171 | |||
1172 | /* ufep other than 0 and 1 are reserved */ | ||
1173 |
1/2✓ Branch 0 taken 154 times.
✗ Branch 1 not taken.
|
154 | if (ufep == 1) { |
1174 | /* OPPTYPE */ | ||
1175 | 154 | format = get_bits(&h->gb, 3); | |
1176 | ff_dlog(h->c.avctx, "ufep=1, format: %d\n", format); | ||
1177 | 154 | h->custom_pcf = get_bits1(&h->gb); | |
1178 | 154 | h->umvplus = get_bits1(&h->gb); /* Unrestricted Motion Vector */ | |
1179 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 154 times.
|
154 | if (get_bits1(&h->gb) != 0) { |
1180 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "Syntax-based Arithmetic Coding (SAC) not supported\n"); | |
1181 | } | ||
1182 | 154 | h->c.obmc = get_bits1(&h->gb); /* Advanced prediction mode */ | |
1183 | 154 | h->c.h263_aic = get_bits1(&h->gb); /* Advanced Intra Coding (AIC) */ | |
1184 | 154 | h->loop_filter = get_bits1(&h->gb); | |
1185 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 154 times.
|
154 | if (h->c.avctx->lowres) |
1186 | ✗ | h->loop_filter = 0; | |
1187 | |||
1188 | 154 | h->h263_slice_structured = get_bits1(&h->gb); | |
1189 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 154 times.
|
154 | if (get_bits1(&h->gb) != 0) { |
1190 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "Reference Picture Selection not supported\n"); | |
1191 | } | ||
1192 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 154 times.
|
154 | if (get_bits1(&h->gb) != 0) { |
1193 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "Independent Segment Decoding not supported\n"); | |
1194 | } | ||
1195 | 154 | h->alt_inter_vlc = get_bits1(&h->gb); | |
1196 | 154 | h->modified_quant = get_bits1(&h->gb); | |
1197 |
1/2✓ Branch 0 taken 154 times.
✗ Branch 1 not taken.
|
154 | if (h->modified_quant) |
1198 | 154 | h->c.chroma_qscale_table= ff_h263_chroma_qscale_table; | |
1199 | |||
1200 | 154 | skip_bits(&h->gb, 1); /* Prevent start code emulation */ | |
1201 | |||
1202 | 154 | skip_bits(&h->gb, 3); /* Reserved */ | |
1203 | ✗ | } else if (ufep != 0) { | |
1204 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "Bad UFEP type (%d)\n", ufep); | |
1205 | ✗ | return -1; | |
1206 | } | ||
1207 | |||
1208 | /* MPPTYPE */ | ||
1209 | 154 | h->c.pict_type = get_bits(&h->gb, 3); | |
1210 |
2/6✓ Branch 0 taken 19 times.
✓ Branch 1 taken 135 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
154 | switch (h->c.pict_type) { |
1211 | 19 | case 0: h->c.pict_type = AV_PICTURE_TYPE_I; break; | |
1212 | 135 | case 1: h->c.pict_type = AV_PICTURE_TYPE_P; break; | |
1213 | ✗ | case 2: h->c.pict_type = AV_PICTURE_TYPE_P; h->pb_frame = 3; break; | |
1214 | ✗ | case 3: h->c.pict_type = AV_PICTURE_TYPE_B; break; | |
1215 | ✗ | case 7: h->c.pict_type = AV_PICTURE_TYPE_I; break; //ZYGO | |
1216 | ✗ | default: | |
1217 | ✗ | return -1; | |
1218 | } | ||
1219 | 154 | skip_bits(&h->gb, 2); | |
1220 | 154 | h->c.no_rounding = get_bits1(&h->gb); | |
1221 | 154 | skip_bits(&h->gb, 4); | |
1222 | |||
1223 | /* Get the picture dimensions */ | ||
1224 |
1/2✓ Branch 0 taken 154 times.
✗ Branch 1 not taken.
|
154 | if (ufep) { |
1225 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 154 times.
|
154 | if (format == 6) { |
1226 | /* Custom Picture Format (CPFMT) */ | ||
1227 | ✗ | int aspect_ratio_info = get_bits(&h->gb, 4); | |
1228 | ff_dlog(h->c.avctx, "aspect: %d\n", aspect_ratio_info); | ||
1229 | /* aspect ratios: | ||
1230 | 0 - forbidden | ||
1231 | 1 - 1:1 | ||
1232 | 2 - 12:11 (CIF 4:3) | ||
1233 | 3 - 10:11 (525-type 4:3) | ||
1234 | 4 - 16:11 (CIF 16:9) | ||
1235 | 5 - 40:33 (525-type 16:9) | ||
1236 | 6-14 - reserved | ||
1237 | */ | ||
1238 | ✗ | width = (get_bits(&h->gb, 9) + 1) * 4; | |
1239 | ✗ | check_marker(h->c.avctx, &h->gb, "in dimensions"); | |
1240 | ✗ | height = get_bits(&h->gb, 9) * 4; | |
1241 | ff_dlog(h->c.avctx, "\nH.263+ Custom picture: %dx%d\n",width,height); | ||
1242 | ✗ | if (aspect_ratio_info == FF_ASPECT_EXTENDED) { | |
1243 | /* expected dimensions */ | ||
1244 | ✗ | h->c.avctx->sample_aspect_ratio.num = get_bits(&h->gb, 8); | |
1245 | ✗ | h->c.avctx->sample_aspect_ratio.den = get_bits(&h->gb, 8); | |
1246 | }else{ | ||
1247 | ✗ | h->c.avctx->sample_aspect_ratio= ff_h263_pixel_aspect[aspect_ratio_info]; | |
1248 | } | ||
1249 | } else { | ||
1250 | 154 | width = ff_h263_format[format][0]; | |
1251 | 154 | height = ff_h263_format[format][1]; | |
1252 | 154 | h->c.avctx->sample_aspect_ratio = (AVRational){12,11}; | |
1253 | } | ||
1254 | 154 | h->c.avctx->sample_aspect_ratio.den <<= h->ehc_mode; | |
1255 |
2/4✓ Branch 0 taken 154 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 154 times.
|
154 | if ((width == 0) || (height == 0)) |
1256 | ✗ | return -1; | |
1257 | 154 | h->c.width = width; | |
1258 | 154 | h->c.height = height; | |
1259 | |||
1260 |
1/2✓ Branch 0 taken 154 times.
✗ Branch 1 not taken.
|
154 | if (h->custom_pcf) { |
1261 | 154 | h->c.avctx->framerate.num = 1800000; | |
1262 | 154 | h->c.avctx->framerate.den = 1000 + get_bits1(&h->gb); | |
1263 | 154 | h->c.avctx->framerate.den *= get_bits(&h->gb, 7); | |
1264 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 154 times.
|
154 | if (h->c.avctx->framerate.den == 0) { |
1265 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "zero framerate\n"); | |
1266 | ✗ | return -1; | |
1267 | } | ||
1268 | 154 | int gcd = av_gcd(h->c.avctx->framerate.den, h->c.avctx->framerate.num); | |
1269 | 154 | h->c.avctx->framerate.den /= gcd; | |
1270 | 154 | h->c.avctx->framerate.num /= gcd; | |
1271 | }else{ | ||
1272 | ✗ | h->c.avctx->framerate = (AVRational){ 30000, 1001 }; | |
1273 | } | ||
1274 | } | ||
1275 | |||
1276 |
1/2✓ Branch 0 taken 154 times.
✗ Branch 1 not taken.
|
154 | if (h->custom_pcf) |
1277 | 154 | skip_bits(&h->gb, 2); //extended Temporal reference | |
1278 | |||
1279 |
1/2✓ Branch 0 taken 154 times.
✗ Branch 1 not taken.
|
154 | if (ufep) { |
1280 |
1/2✓ Branch 0 taken 154 times.
✗ Branch 1 not taken.
|
154 | if (h->umvplus) { |
1281 |
1/2✓ Branch 1 taken 154 times.
✗ Branch 2 not taken.
|
154 | if (get_bits1(&h->gb)==0) /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */ |
1282 | 154 | skip_bits1(&h->gb); | |
1283 | } | ||
1284 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 154 times.
|
154 | if (h->h263_slice_structured) { |
1285 | ✗ | if (get_bits1(&h->gb) != 0) { | |
1286 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "rectangular slices not supported\n"); | |
1287 | } | ||
1288 | ✗ | if (get_bits1(&h->gb) != 0) { | |
1289 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "unordered slices not supported\n"); | |
1290 | } | ||
1291 | } | ||
1292 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 154 times.
|
154 | if (h->c.pict_type == AV_PICTURE_TYPE_B) { |
1293 | ✗ | skip_bits(&h->gb, 4); //ELNUM | |
1294 | ✗ | if (ufep == 1) { | |
1295 | ✗ | skip_bits(&h->gb, 4); // RLNUM | |
1296 | } | ||
1297 | } | ||
1298 | } | ||
1299 | |||
1300 | 154 | h->c.qscale = get_bits(&h->gb, 5); | |
1301 | } | ||
1302 | |||
1303 | 461 | ret = av_image_check_size(h->c.width, h->c.height, 0, h->c.avctx); | |
1304 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 461 times.
|
461 | if (ret < 0) |
1305 | ✗ | return ret; | |
1306 | |||
1307 |
1/2✓ Branch 0 taken 461 times.
✗ Branch 1 not taken.
|
461 | if (!(h->c.avctx->flags2 & AV_CODEC_FLAG2_CHUNKS)) { |
1308 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 461 times.
|
461 | if ((h->c.width * h->c.height / 256 / 8) > get_bits_left(&h->gb)) |
1309 | ✗ | return AVERROR_INVALIDDATA; | |
1310 | } | ||
1311 | |||
1312 | 461 | h->c.mb_width = (h->c.width + 15U) / 16; | |
1313 | 461 | h->c.mb_height = (h->c.height + 15U) / 16; | |
1314 | 461 | h->c.mb_num = h->c.mb_width * h->c.mb_height; | |
1315 | |||
1316 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 461 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
461 | h->gob_index = H263_GOB_HEIGHT(h->c.height); |
1317 | |||
1318 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 461 times.
|
461 | if (h->pb_frame) { |
1319 | ✗ | skip_bits(&h->gb, 3); /* Temporal reference for B-pictures */ | |
1320 | ✗ | if (h->custom_pcf) | |
1321 | ✗ | skip_bits(&h->gb, 2); //extended Temporal reference | |
1322 | ✗ | skip_bits(&h->gb, 2); /* Quantization information for B-pictures */ | |
1323 | } | ||
1324 | |||
1325 |
1/2✓ Branch 0 taken 461 times.
✗ Branch 1 not taken.
|
461 | if (h->c.pict_type!=AV_PICTURE_TYPE_B) { |
1326 | 461 | h->c.time = h->picture_number; | |
1327 | 461 | h->c.pp_time = h->c.time - h->c.last_non_b_time; | |
1328 | 461 | h->c.last_non_b_time = h->c.time; | |
1329 | }else{ | ||
1330 | ✗ | h->c.time = h->picture_number; | |
1331 | ✗ | h->c.pb_time = h->c.pp_time - (h->c.last_non_b_time - h->c.time); | |
1332 | ✗ | if (h->c.pp_time <= h->c.pb_time || | |
1333 | ✗ | h->c.pp_time <= h->c.pp_time - h->c.pb_time || | |
1334 | ✗ | h->c.pp_time <= 0) { | |
1335 | ✗ | h->c.pp_time = 2; | |
1336 | ✗ | h->c.pb_time = 1; | |
1337 | } | ||
1338 | ✗ | ff_mpeg4_init_direct_mv(&h->c); | |
1339 | } | ||
1340 | |||
1341 | /* PEI */ | ||
1342 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 461 times.
|
461 | if (skip_1stop_8data_bits(&h->gb) < 0) |
1343 | ✗ | return AVERROR_INVALIDDATA; | |
1344 | |||
1345 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 461 times.
|
461 | if (h->h263_slice_structured) { |
1346 | ✗ | if (check_marker(h->c.avctx, &h->gb, "SEPB1") != 1) { | |
1347 | ✗ | return -1; | |
1348 | } | ||
1349 | |||
1350 | ✗ | ff_h263_decode_mba(h); | |
1351 | |||
1352 | ✗ | if (check_marker(h->c.avctx, &h->gb, "SEPB2") != 1) { | |
1353 | ✗ | return -1; | |
1354 | } | ||
1355 | } | ||
1356 | |||
1357 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 461 times.
|
461 | if (h->c.pict_type == AV_PICTURE_TYPE_B) |
1358 | ✗ | h->c.low_delay = 0; | |
1359 | |||
1360 |
2/2✓ Branch 0 taken 154 times.
✓ Branch 1 taken 307 times.
|
461 | if (h->c.h263_aic) { |
1361 | 154 | h->c.y_dc_scale_table = | |
1362 | 154 | h->c.c_dc_scale_table = ff_aic_dc_scale_table; | |
1363 | }else{ | ||
1364 | 307 | h->c.y_dc_scale_table = | |
1365 | 307 | h->c.c_dc_scale_table = ff_mpeg1_dc_scale_table; | |
1366 | } | ||
1367 | |||
1368 | 461 | ff_h263_show_pict_info(h, h263_plus); | |
1369 | |||
1370 |
3/6✓ Branch 0 taken 56 times.
✓ Branch 1 taken 405 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 56 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
|
461 | if (h->c.pict_type == AV_PICTURE_TYPE_I && h->c.codec_tag == AV_RL32("ZYGO") && get_bits_left(&h->gb) >= 85 + 13*3*16 + 50){ |
1371 | int i,j; | ||
1372 | ✗ | for(i=0; i<85; i++) av_log(h->c.avctx, AV_LOG_DEBUG, "%d", get_bits1(&h->gb)); | |
1373 | ✗ | av_log(h->c.avctx, AV_LOG_DEBUG, "\n"); | |
1374 | ✗ | for(i=0; i<13; i++){ | |
1375 | ✗ | for(j=0; j<3; j++){ | |
1376 | ✗ | int v= get_bits(&h->gb, 8); | |
1377 | ✗ | v |= get_sbits(&h->gb, 8) * (1 << 8); | |
1378 | ✗ | av_log(h->c.avctx, AV_LOG_DEBUG, " %5d", v); | |
1379 | } | ||
1380 | ✗ | av_log(h->c.avctx, AV_LOG_DEBUG, "\n"); | |
1381 | } | ||
1382 | ✗ | for(i=0; i<50; i++) av_log(h->c.avctx, AV_LOG_DEBUG, "%d", get_bits1(&h->gb)); | |
1383 | } | ||
1384 | |||
1385 | 461 | return 0; | |
1386 | } | ||
1387 |