| 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 | #if CONFIG_MPEG4_DECODER | ||
| 244 | 2/2✓ Branch 0 taken 3907 times. ✓ Branch 1 taken 2544 times. | 6451 | if (h->c.codec_id == AV_CODEC_ID_MPEG4) | 
| 245 | 3907 | ret = ff_mpeg4_decode_video_packet_header(h); | |
| 246 | else | ||
| 247 | #endif | ||
| 248 | 2544 | ret = h263_decode_gob_header(h); | |
| 249 | 1/2✓ Branch 0 taken 6451 times. ✗ Branch 1 not taken. | 6451 | if(ret>=0) | 
| 250 | 6451 | return pos; | |
| 251 | } | ||
| 252 | //OK, it's not where it is supposed to be ... | ||
| 253 | ✗ | h->gb = h->last_resync_gb; | |
| 254 | ✗ | align_get_bits(&h->gb); | |
| 255 | ✗ | left = get_bits_left(&h->gb); | |
| 256 | |||
| 257 | ✗ | for(;left>16+1+5+5; left-=8){ | |
| 258 | ✗ | if (show_bits(&h->gb, 16) == 0){ | |
| 259 | ✗ | GetBitContext bak = h->gb; | |
| 260 | |||
| 261 | ✗ | pos = get_bits_count(&h->gb); | |
| 262 | #if CONFIG_MPEG4_DECODER | ||
| 263 | ✗ | if (h->c.codec_id == AV_CODEC_ID_MPEG4) | |
| 264 | ✗ | ret = ff_mpeg4_decode_video_packet_header(h); | |
| 265 | else | ||
| 266 | #endif | ||
| 267 | ✗ | ret = h263_decode_gob_header(h); | |
| 268 | ✗ | if(ret>=0) | |
| 269 | ✗ | return pos; | |
| 270 | |||
| 271 | ✗ | h->gb = bak; | |
| 272 | } | ||
| 273 | ✗ | skip_bits(&h->gb, 8); | |
| 274 | } | ||
| 275 | |||
| 276 | ✗ | return -1; | |
| 277 | } | ||
| 278 | |||
| 279 | 3776878 | int ff_h263_decode_motion(H263DecContext *const h, int pred, int f_code) | |
| 280 | { | ||
| 281 | int code, val, sign, shift; | ||
| 282 | 3776878 | code = get_vlc2(&h->gb, ff_h263_mv_vlc, H263_MV_VLC_BITS, 2); | |
| 283 | |||
| 284 | 2/2✓ Branch 0 taken 1854435 times. ✓ Branch 1 taken 1922443 times. | 3776878 | if (code == 0) | 
| 285 | 1854435 | return pred; | |
| 286 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 1922443 times. | 1922443 | if (code < 0) | 
| 287 | ✗ | return 0xffff; | |
| 288 | |||
| 289 | 1922443 | sign = get_bits1(&h->gb); | |
| 290 | 1922443 | shift = f_code - 1; | |
| 291 | 1922443 | val = code; | |
| 292 | 2/2✓ Branch 0 taken 210536 times. ✓ Branch 1 taken 1711907 times. | 1922443 | if (shift) { | 
| 293 | 210536 | val = (val - 1) << shift; | |
| 294 | 210536 | val |= get_bits(&h->gb, shift); | |
| 295 | 210536 | val++; | |
| 296 | } | ||
| 297 | 2/2✓ Branch 0 taken 804810 times. ✓ Branch 1 taken 1117633 times. | 1922443 | if (sign) | 
| 298 | 804810 | val = -val; | |
| 299 | 1922443 | val += pred; | |
| 300 | |||
| 301 | /* modulo decoding */ | ||
| 302 | 1/2✓ Branch 0 taken 1922443 times. ✗ Branch 1 not taken. | 1922443 | if (!h->h263_long_vectors) { | 
| 303 | 1922443 | val = sign_extend(val, 5 + f_code); | |
| 304 | } else { | ||
| 305 | /* horrible H.263 long vector mode */ | ||
| 306 | ✗ | if (pred < -31 && val < -63) | |
| 307 | ✗ | val += 64; | |
| 308 | ✗ | if (pred > 32 && val > 63) | |
| 309 | ✗ | val -= 64; | |
| 310 | |||
| 311 | } | ||
| 312 | 1922443 | return val; | |
| 313 | } | ||
| 314 | |||
| 315 | |||
| 316 | /* Decode RVLC of H.263+ UMV */ | ||
| 317 | 103298 | static int h263p_decode_umotion(H263DecContext *const h, int pred) | |
| 318 | { | ||
| 319 | 103298 | int code = 0, sign; | |
| 320 | |||
| 321 | 2/2✓ Branch 1 taken 51255 times. ✓ Branch 2 taken 52043 times. | 103298 | if (get_bits1(&h->gb)) /* Motion difference = 0 */ | 
| 322 | 51255 | return pred; | |
| 323 | |||
| 324 | 52043 | code = 2 + get_bits1(&h->gb); | |
| 325 | |||
| 326 | 2/2✓ Branch 1 taken 28759 times. ✓ Branch 2 taken 52043 times. | 80802 | while (get_bits1(&h->gb)) | 
| 327 | { | ||
| 328 | 28759 | code <<= 1; | |
| 329 | 28759 | code += get_bits1(&h->gb); | |
| 330 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 28759 times. | 28759 | if (code >= 32768) { | 
| 331 | ✗ | avpriv_request_sample(h->c.avctx, "Huge DMV"); | |
| 332 | ✗ | return 0xffff; | |
| 333 | } | ||
| 334 | } | ||
| 335 | 52043 | sign = code & 1; | |
| 336 | 52043 | code >>= 1; | |
| 337 | |||
| 338 | 2/2✓ Branch 0 taken 30417 times. ✓ Branch 1 taken 21626 times. | 52043 | code = (sign) ? (pred - code) : (pred + code); | 
| 339 | ff_tlog(h->c.avctx,"H.263+ UMV Motion = %d\n", code); | ||
| 340 | 52043 | return code; | |
| 341 | |||
| 342 | } | ||
| 343 | |||
| 344 | /** | ||
| 345 | * read the next MVs for OBMC. yes this is an ugly hack, feel free to send a patch :) | ||
| 346 | */ | ||
| 347 | 48550 | static void preview_obmc(H263DecContext *const h) | |
| 348 | { | ||
| 349 | 48550 | GetBitContext gb = h->gb; | |
| 350 | |||
| 351 | int cbpc, i, pred_x, pred_y, mx, my; | ||
| 352 | int16_t *mot_val; | ||
| 353 | 48550 | const int xy = h->c.mb_x + 1 + h->c.mb_y * h->c.mb_stride; | |
| 354 | 48550 | const int stride = h->c.b8_stride * 2; | |
| 355 | |||
| 356 | 2/2✓ Branch 0 taken 194200 times. ✓ Branch 1 taken 48550 times. | 242750 | for(i=0; i<4; i++) | 
| 357 | 194200 | h->c.block_index[i] += 2; | |
| 358 | 2/2✓ Branch 0 taken 97100 times. ✓ Branch 1 taken 48550 times. | 145650 | for(i=4; i<6; i++) | 
| 359 | 97100 | h->c.block_index[i] += 1; | |
| 360 | 48550 | h->c.mb_x++; | |
| 361 | |||
| 362 | av_assert2(h->c.pict_type == AV_PICTURE_TYPE_P); | ||
| 363 | |||
| 364 | do{ | ||
| 365 | 2/2✓ Branch 1 taken 654 times. ✓ Branch 2 taken 47896 times. | 48550 | if (get_bits1(&h->gb)) { | 
| 366 | /* skip mb */ | ||
| 367 | 654 | mot_val = h->c.cur_pic.motion_val[0][h->c.block_index[0]]; | |
| 368 | 654 | mot_val[0 ]= mot_val[2 ]= | |
| 369 | 654 | mot_val[0+stride]= mot_val[2+stride]= 0; | |
| 370 | 654 | mot_val[1 ]= mot_val[3 ]= | |
| 371 | 654 | mot_val[1+stride]= mot_val[3+stride]= 0; | |
| 372 | |||
| 373 | 654 | h->c.cur_pic.mb_type[xy] = MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_FORWARD_MV; | |
| 374 | 654 | goto end; | |
| 375 | } | ||
| 376 | 47896 | cbpc = get_vlc2(&h->gb, ff_h263_inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 2); | |
| 377 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 47896 times. | 47896 | }while(cbpc == 20); | 
| 378 | |||
| 379 | 2/2✓ Branch 0 taken 957 times. ✓ Branch 1 taken 46939 times. | 47896 | if(cbpc & 4){ | 
| 380 | 957 | h->c.cur_pic.mb_type[xy] = MB_TYPE_INTRA; | |
| 381 | }else{ | ||
| 382 | 46939 | get_vlc2(&h->gb, ff_h263_cbpy_vlc, CBPY_VLC_BITS, 1); | |
| 383 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 46939 times. | 46939 | if (cbpc & 8) { | 
| 384 | ✗ | skip_bits(&h->gb, h->modified_quant ? (get_bits1(&h->gb) ? 1 : 5) : 2); | |
| 385 | } | ||
| 386 | |||
| 387 | 1/2✓ Branch 0 taken 46939 times. ✗ Branch 1 not taken. | 46939 | if ((cbpc & 16) == 0) { | 
| 388 | 46939 | h->c.cur_pic.mb_type[xy] = MB_TYPE_16x16 | MB_TYPE_FORWARD_MV; | |
| 389 | /* 16x16 motion prediction */ | ||
| 390 | 46939 | mot_val= ff_h263_pred_motion(&h->c, 0, 0, &pred_x, &pred_y); | |
| 391 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 46939 times. | 46939 | if (h->umvplus) | 
| 392 | ✗ | mx = h263p_decode_umotion(h, pred_x); | |
| 393 | else | ||
| 394 | 46939 | mx = ff_h263_decode_motion(h, pred_x, 1); | |
| 395 | |||
| 396 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 46939 times. | 46939 | if (h->umvplus) | 
| 397 | ✗ | my = h263p_decode_umotion(h, pred_y); | |
| 398 | else | ||
| 399 | 46939 | my = ff_h263_decode_motion(h, pred_y, 1); | |
| 400 | |||
| 401 | 46939 | mot_val[0 ]= mot_val[2 ]= | |
| 402 | 46939 | mot_val[0+stride]= mot_val[2+stride]= mx; | |
| 403 | 46939 | mot_val[1 ]= mot_val[3 ]= | |
| 404 | 46939 | mot_val[1+stride]= mot_val[3+stride]= my; | |
| 405 | } else { | ||
| 406 | ✗ | h->c.cur_pic.mb_type[xy] = MB_TYPE_8x8 | MB_TYPE_FORWARD_MV; | |
| 407 | ✗ | for(i=0;i<4;i++) { | |
| 408 | ✗ | mot_val = ff_h263_pred_motion(&h->c, i, 0, &pred_x, &pred_y); | |
| 409 | ✗ | if (h->umvplus) | |
| 410 | ✗ | mx = h263p_decode_umotion(h, pred_x); | |
| 411 | else | ||
| 412 | ✗ | mx = ff_h263_decode_motion(h, pred_x, 1); | |
| 413 | |||
| 414 | ✗ | if (h->umvplus) | |
| 415 | ✗ | my = h263p_decode_umotion(h, pred_y); | |
| 416 | else | ||
| 417 | ✗ | my = ff_h263_decode_motion(h, pred_y, 1); | |
| 418 | ✗ | if (h->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1) | |
| 419 | ✗ | skip_bits1(&h->gb); /* Bit stuffing to prevent PSC */ | |
| 420 | ✗ | mot_val[0] = mx; | |
| 421 | ✗ | mot_val[1] = my; | |
| 422 | } | ||
| 423 | } | ||
| 424 | } | ||
| 425 | ✗ | end: | |
| 426 | |||
| 427 | 2/2✓ Branch 0 taken 194200 times. ✓ Branch 1 taken 48550 times. | 242750 | for(i=0; i<4; i++) | 
| 428 | 194200 | h->c.block_index[i] -= 2; | |
| 429 | 2/2✓ Branch 0 taken 97100 times. ✓ Branch 1 taken 48550 times. | 145650 | for(i=4; i<6; i++) | 
| 430 | 97100 | h->c.block_index[i] -= 1; | |
| 431 | 48550 | h->c.mb_x--; | |
| 432 | |||
| 433 | 48550 | h->gb = gb; | |
| 434 | 48550 | } | |
| 435 | |||
| 436 | ✗ | static void h263_decode_dquant(H263DecContext *const h) | |
| 437 | { | ||
| 438 | static const int8_t quant_tab[4] = { -1, -2, 1, 2 }; | ||
| 439 | int qscale; | ||
| 440 | |||
| 441 | ✗ | if (h->modified_quant) { | |
| 442 | ✗ | if (get_bits1(&h->gb)) | |
| 443 | ✗ | qscale = ff_modified_quant_tab[get_bits1(&h->gb)][h->c.qscale]; | |
| 444 | else | ||
| 445 | ✗ | qscale = get_bits(&h->gb, 5); | |
| 446 | }else | ||
| 447 | ✗ | qscale = h->c.qscale + quant_tab[get_bits(&h->gb, 2)]; | |
| 448 | ✗ | ff_set_qscale(&h->c, qscale); | |
| 449 | ✗ | } | |
| 450 | |||
| 451 | 91098 | static void h263_pred_acdc(MpegEncContext * s, int16_t *block, int n) | |
| 452 | { | ||
| 453 | int wrap, a, c, pred_dc, scale; | ||
| 454 | 91098 | const int xy = s->block_index[n]; | |
| 455 | 91098 | int16_t *const dc_val = s->dc_val + xy; | |
| 456 | 91098 | int16_t *const ac_val = (s->ac_val + xy)[0]; | |
| 457 | |||
| 458 | /* find prediction */ | ||
| 459 | 2/2✓ Branch 0 taken 60732 times. ✓ Branch 1 taken 30366 times. | 91098 | if (n < 4) { | 
| 460 | 60732 | wrap = s->b8_stride; | |
| 461 | 60732 | scale = s->y_dc_scale; | |
| 462 | } else { | ||
| 463 | 30366 | wrap = s->mb_stride; | |
| 464 | 30366 | scale = s->c_dc_scale; | |
| 465 | } | ||
| 466 | |||
| 467 | /* B C | ||
| 468 | * A X | ||
| 469 | */ | ||
| 470 | 91098 | a = dc_val[-1]; | |
| 471 | 91098 | c = dc_val[-wrap]; | |
| 472 | |||
| 473 | /* No prediction outside GOB boundary */ | ||
| 474 | 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) { | 
| 475 | 2/2✓ Branch 0 taken 36116 times. ✓ Branch 1 taken 9029 times. | 45145 | if (n != 2) c= 1024; | 
| 476 | 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; | 
| 477 | } | ||
| 478 | |||
| 479 | 2/2✓ Branch 0 taken 4434 times. ✓ Branch 1 taken 86664 times. | 91098 | if (s->ac_pred) { | 
| 480 | 4434 | pred_dc = 1024; | |
| 481 | 2/2✓ Branch 0 taken 1596 times. ✓ Branch 1 taken 2838 times. | 4434 | if (s->h263_aic_dir) { | 
| 482 | /* left prediction */ | ||
| 483 | 2/2✓ Branch 0 taken 1576 times. ✓ Branch 1 taken 20 times. | 1596 | if (a != 1024) { | 
| 484 | 1576 | int16_t *const ac_val2 = ac_val - 16; | |
| 485 | 2/2✓ Branch 0 taken 11032 times. ✓ Branch 1 taken 1576 times. | 12608 | for (int i = 1; i < 8; i++) { | 
| 486 | 11032 | block[s->idsp.idct_permutation[i << 3]] += ac_val2[i]; | |
| 487 | } | ||
| 488 | 1576 | pred_dc = a; | |
| 489 | } | ||
| 490 | } else { | ||
| 491 | /* top prediction */ | ||
| 492 | 2/2✓ Branch 0 taken 1910 times. ✓ Branch 1 taken 928 times. | 2838 | if (c != 1024) { | 
| 493 | 1910 | int16_t *const ac_val2 = ac_val - 16 * wrap; | |
| 494 | 2/2✓ Branch 0 taken 13370 times. ✓ Branch 1 taken 1910 times. | 15280 | for (int i = 1; i < 8; i++) { | 
| 495 | 13370 | block[s->idsp.idct_permutation[i]] += ac_val2[i + 8]; | |
| 496 | } | ||
| 497 | 1910 | pred_dc = c; | |
| 498 | } | ||
| 499 | } | ||
| 500 | } else { | ||
| 501 | /* just DC prediction */ | ||
| 502 | 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) | 
| 503 | 50003 | pred_dc = (a + c) >> 1; | |
| 504 | 2/2✓ Branch 0 taken 31137 times. ✓ Branch 1 taken 5524 times. | 36661 | else if (a != 1024) | 
| 505 | 31137 | pred_dc = a; | |
| 506 | else | ||
| 507 | 5524 | pred_dc = c; | |
| 508 | } | ||
| 509 | |||
| 510 | /* we assume pred is positive */ | ||
| 511 | 91098 | block[0] = block[0] * scale + pred_dc; | |
| 512 | |||
| 513 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 91098 times. | 91098 | if (block[0] < 0) | 
| 514 | ✗ | block[0] = 0; | |
| 515 | else | ||
| 516 | 91098 | block[0] |= 1; | |
| 517 | |||
| 518 | /* Update AC/DC tables */ | ||
| 519 | 91098 | *dc_val = block[0]; | |
| 520 | |||
| 521 | /* left copy */ | ||
| 522 | 2/2✓ Branch 0 taken 637686 times. ✓ Branch 1 taken 91098 times. | 728784 | for (int i = 1; i < 8; i++) | 
| 523 | 637686 | ac_val[i] = block[s->idsp.idct_permutation[i << 3]]; | |
| 524 | /* top copy */ | ||
| 525 | 2/2✓ Branch 0 taken 637686 times. ✓ Branch 1 taken 91098 times. | 728784 | for (int i = 1; i < 8; i++) | 
| 526 | 637686 | ac_val[8 + i] = block[s->idsp.idct_permutation[i]]; | |
| 527 | 91098 | } | |
| 528 | |||
| 529 | 2590998 | static int h263_decode_block(H263DecContext *const h, int16_t block[64], | |
| 530 | int n, int coded) | ||
| 531 | { | ||
| 532 | int level, i, j, run; | ||
| 533 | 2590998 | const RLTable *rl = &ff_h263_rl_inter; | |
| 534 | const uint8_t *scan_table; | ||
| 535 | 2590998 | GetBitContext gb = h->gb; | |
| 536 | |||
| 537 | 2590998 | scan_table = h->c.intra_scantable.permutated; | |
| 538 | 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) { | 
| 539 | 91098 | i = 0; | |
| 540 | 2/2✓ Branch 0 taken 3823 times. ✓ Branch 1 taken 87275 times. | 91098 | if (!coded) | 
| 541 | 3823 | goto not_coded; | |
| 542 | 87275 | rl = &ff_rl_intra_aic; | |
| 543 | 2/2✓ Branch 0 taken 3073 times. ✓ Branch 1 taken 84202 times. | 87275 | if (h->c.ac_pred) { | 
| 544 | 2/2✓ Branch 0 taken 1148 times. ✓ Branch 1 taken 1925 times. | 3073 | if (h->c.h263_aic_dir) | 
| 545 | 1148 | scan_table = h->c.permutated_intra_v_scantable; /* left */ | |
| 546 | else | ||
| 547 | 1925 | scan_table = h->c.permutated_intra_h_scantable; /* top */ | |
| 548 | } | ||
| 549 | 2/2✓ Branch 0 taken 300744 times. ✓ Branch 1 taken 2199156 times. | 2499900 | } else if (h->c.mb_intra) { | 
| 550 | /* DC coef */ | ||
| 551 | 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) { | 
| 552 | 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) { | 
| 553 | ✗ | int component = (n <= 3 ? 0 : n - 4 + 1); | |
| 554 | ✗ | level = h->c.last_dc[component]; | |
| 555 | ✗ | if (h->rv10_first_dc_coded[component]) { | |
| 556 | ✗ | int diff = ff_rv_decode_dc(h, n); | |
| 557 | ✗ | if (diff < 0) | |
| 558 | ✗ | return -1; | |
| 559 | ✗ | level += diff; | |
| 560 | ✗ | level = level & 0xff; /* handle wrap round */ | |
| 561 | ✗ | h->c.last_dc[component] = level; | |
| 562 | } else { | ||
| 563 | ✗ | h->rv10_first_dc_coded[component] = 1; | |
| 564 | } | ||
| 565 | } else { | ||
| 566 | 46710 | level = get_bits(&h->gb, 8); | |
| 567 | 2/2✓ Branch 0 taken 542 times. ✓ Branch 1 taken 46168 times. | 46710 | if (level == 255) | 
| 568 | 542 | level = 128; | |
| 569 | } | ||
| 570 | }else{ | ||
| 571 | 254034 | level = get_bits(&h->gb, 8); | |
| 572 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 254034 times. | 254034 | if((level&0x7F) == 0){ | 
| 573 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "illegal dc %d at %d %d\n", | |
| 574 | level, h->c.mb_x, h->c.mb_y); | ||
| 575 | ✗ | if (h->c.avctx->err_recognition & (AV_EF_BITSTREAM|AV_EF_COMPLIANT)) | |
| 576 | ✗ | return -1; | |
| 577 | } | ||
| 578 | 2/2✓ Branch 0 taken 3049 times. ✓ Branch 1 taken 250985 times. | 254034 | if (level == 255) | 
| 579 | 3049 | level = 128; | |
| 580 | } | ||
| 581 | 300744 | block[0] = level; | |
| 582 | 300744 | i = 1; | |
| 583 | } else { | ||
| 584 | 2199156 | i = 0; | |
| 585 | } | ||
| 586 | 2/2✓ Branch 0 taken 1345756 times. ✓ Branch 1 taken 1241419 times. | 2587175 | if (!coded) { | 
| 587 | 1241419 | h->c.block_last_index[n] = i - 1; | |
| 588 | 1241419 | return 0; | |
| 589 | } | ||
| 590 | 1345756 | retry: | |
| 591 | { | ||
| 592 | 1412215 | OPEN_READER(re, &h->gb); | |
| 593 | 1412215 | i--; // offset by -1 to allow direct indexing of scan_table | |
| 594 | for(;;) { | ||
| 595 | 26689671 | UPDATE_CACHE(re, &h->gb); | |
| 596 | 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); | 
| 597 | 2/2✓ Branch 0 taken 587695 times. ✓ Branch 1 taken 13463248 times. | 14050943 | if (run == 66) { | 
| 598 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 587695 times. | 587695 | if (level){ | 
| 599 | ✗ | CLOSE_READER(re, &h->gb); | |
| 600 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "illegal ac vlc code at %dx%d\n", | |
| 601 | h->c.mb_x, h->c.mb_y); | ||
| 602 | ✗ | return -1; | |
| 603 | } | ||
| 604 | /* escape */ | ||
| 605 | 2/2✓ Branch 0 taken 117640 times. ✓ Branch 1 taken 470055 times. | 587695 | if (CONFIG_FLV_DECODER && h->flv) { | 
| 606 | 117640 | int is11 = SHOW_UBITS(re, &h->gb, 1); | |
| 607 | 117640 | SKIP_CACHE(re, &h->gb, 1); | |
| 608 | 117640 | run = SHOW_UBITS(re, &h->gb, 7) + 1; | |
| 609 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 117640 times. | 117640 | if (is11) { | 
| 610 | ✗ | SKIP_COUNTER(re, &h->gb, 1 + 7); | |
| 611 | ✗ | UPDATE_CACHE(re, &h->gb); | |
| 612 | ✗ | level = SHOW_SBITS(re, &h->gb, 11); | |
| 613 | ✗ | SKIP_COUNTER(re, &h->gb, 11); | |
| 614 | } else { | ||
| 615 | 117640 | SKIP_CACHE(re, &h->gb, 7); | |
| 616 | 117640 | level = SHOW_SBITS(re, &h->gb, 7); | |
| 617 | 117640 | SKIP_COUNTER(re, &h->gb, 1 + 7 + 7); | |
| 618 | } | ||
| 619 | } else { | ||
| 620 | 470055 | run = SHOW_UBITS(re, &h->gb, 7) + 1; | |
| 621 | 470055 | SKIP_CACHE(re, &h->gb, 7); | |
| 622 | 470055 | level = (int8_t)SHOW_UBITS(re, &h->gb, 8); | |
| 623 | 470055 | SKIP_COUNTER(re, &h->gb, 7 + 8); | |
| 624 | 2/2✓ Branch 0 taken 3157 times. ✓ Branch 1 taken 466898 times. | 470055 | if(level == -128){ | 
| 625 | 3157 | UPDATE_CACHE(re, &h->gb); | |
| 626 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 3157 times. | 3157 | if (h->c.codec_id == AV_CODEC_ID_RV10) { | 
| 627 | /* XXX: should patch encoder too */ | ||
| 628 | ✗ | level = SHOW_SBITS(re, &h->gb, 12); | |
| 629 | ✗ | SKIP_COUNTER(re, &h->gb, 12); | |
| 630 | }else{ | ||
| 631 | 3157 | level = SHOW_UBITS(re, &h->gb, 5); | |
| 632 | 3157 | SKIP_CACHE(re, &h->gb, 5); | |
| 633 | 3157 | level |= SHOW_SBITS(re, &h->gb, 6) * (1<<5); | |
| 634 | 3157 | SKIP_COUNTER(re, &h->gb, 5 + 6); | |
| 635 | } | ||
| 636 | } | ||
| 637 | } | ||
| 638 | } else { | ||
| 639 | 2/2✓ Branch 1 taken 6708475 times. ✓ Branch 2 taken 6754773 times. | 13463248 | if (SHOW_UBITS(re, &h->gb, 1)) | 
| 640 | 6708475 | level = -level; | |
| 641 | 13463248 | SKIP_COUNTER(re, &h->gb, 1); | |
| 642 | } | ||
| 643 | 14050943 | i += run; | |
| 644 | 2/2✓ Branch 0 taken 1412215 times. ✓ Branch 1 taken 12638728 times. | 14050943 | if (i >= 64){ | 
| 645 | 1412215 | CLOSE_READER(re, &h->gb); | |
| 646 | // redo update without last flag, revert -1 offset | ||
| 647 | 1412215 | i = i - run + ((run-1)&63) + 1; | |
| 648 | 2/2✓ Branch 0 taken 1345756 times. ✓ Branch 1 taken 66459 times. | 1412215 | if (i < 64) { | 
| 649 | // only last marker, no overrun | ||
| 650 | 1345756 | block[scan_table[i]] = level; | |
| 651 | 1345756 | break; | |
| 652 | } | ||
| 653 | 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){ | 
| 654 | //Looks like a hack but no, it's the way it is supposed to work ... | ||
| 655 | 66459 | rl = &ff_rl_intra_aic; | |
| 656 | 66459 | i = 0; | |
| 657 | 66459 | h->gb = gb; | |
| 658 | 66459 | h->c.bdsp.clear_block(block); | |
| 659 | 66459 | goto retry; | |
| 660 | } | ||
| 661 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "run overflow at %dx%d i:%d\n", | |
| 662 | h->c.mb_x, h->c.mb_y, h->c.mb_intra); | ||
| 663 | ✗ | return -1; | |
| 664 | } | ||
| 665 | 12638728 | j = scan_table[i]; | |
| 666 | 12638728 | block[j] = level; | |
| 667 | } | ||
| 668 | } | ||
| 669 | 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) { | 
| 670 | 87275 | not_coded: | |
| 671 | 91098 | h263_pred_acdc(&h->c, block, n); | |
| 672 | } | ||
| 673 | 1349579 | h->c.block_last_index[n] = i; | |
| 674 | 1349579 | return 0; | |
| 675 | } | ||
| 676 | |||
| 677 | ✗ | static int h263_skip_b_part(H263DecContext *const h, int cbp) | |
| 678 | { | ||
| 679 | ✗ | LOCAL_ALIGNED_32(int16_t, dblock, [64]); | |
| 680 | int i, mbi; | ||
| 681 | int bli[6]; | ||
| 682 | |||
| 683 | /* we have to set h->c.mb_intra to zero to decode B-part of PB-frame correctly | ||
| 684 | * but real value should be restored in order to be used later (in OBMC condition) | ||
| 685 | */ | ||
| 686 | ✗ | mbi = h->c.mb_intra; | |
| 687 | ✗ | memcpy(bli, h->c.block_last_index, sizeof(bli)); | |
| 688 | ✗ | h->c.mb_intra = 0; | |
| 689 | ✗ | for (i = 0; i < 6; i++) { | |
| 690 | ✗ | if (h263_decode_block(h, dblock, i, cbp&32) < 0) | |
| 691 | ✗ | return -1; | |
| 692 | ✗ | cbp+=cbp; | |
| 693 | } | ||
| 694 | ✗ | h->c.mb_intra = mbi; | |
| 695 | ✗ | memcpy(h->c.block_last_index, bli, sizeof(bli)); | |
| 696 | ✗ | return 0; | |
| 697 | } | ||
| 698 | |||
| 699 | ✗ | static int h263_get_modb(GetBitContext *gb, int pb_frame, int *cbpb) | |
| 700 | { | ||
| 701 | ✗ | int c, mv = 1; | |
| 702 | |||
| 703 | ✗ | if (pb_frame < 3) { // h.263 Annex G and i263 PB-frame | |
| 704 | ✗ | c = get_bits1(gb); | |
| 705 | ✗ | if (pb_frame == 2 && c) | |
| 706 | ✗ | mv = !get_bits1(gb); | |
| 707 | } else { // h.263 Annex M improved PB-frame | ||
| 708 | ✗ | mv = get_unary(gb, 0, 4) + 1; | |
| 709 | ✗ | c = mv & 1; | |
| 710 | ✗ | mv = !!(mv & 2); | |
| 711 | } | ||
| 712 | ✗ | if(c) | |
| 713 | ✗ | *cbpb = get_bits(gb, 6); | |
| 714 | ✗ | return mv; | |
| 715 | } | ||
| 716 | |||
| 717 | #define tab_size ((signed)FF_ARRAY_ELEMS(s->direct_scale_mv[0])) | ||
| 718 | #define tab_bias (tab_size / 2) | ||
| 719 | 15407 | static inline void set_one_direct_mv(MpegEncContext *s, const MPVPicture *p, int i) | |
| 720 | { | ||
| 721 | 15407 | int xy = s->block_index[i]; | |
| 722 | 15407 | uint16_t time_pp = s->pp_time; | |
| 723 | 15407 | uint16_t time_pb = s->pb_time; | |
| 724 | int p_mx, p_my; | ||
| 725 | |||
| 726 | 15407 | p_mx = p->motion_val[0][xy][0]; | |
| 727 | 1/2✓ Branch 0 taken 15407 times. ✗ Branch 1 not taken. | 15407 | if ((unsigned)(p_mx + tab_bias) < tab_size) { | 
| 728 | 15407 | s->mv[0][i][0] = s->direct_scale_mv[0][p_mx + tab_bias]; | |
| 729 | 15407 | s->mv[1][i][0] = s->direct_scale_mv[1][p_mx + tab_bias]; | |
| 730 | } else { | ||
| 731 | ✗ | s->mv[0][i][0] = p_mx * time_pb / time_pp; | |
| 732 | ✗ | s->mv[1][i][0] = p_mx * (time_pb - time_pp) / time_pp; | |
| 733 | } | ||
| 734 | 15407 | p_my = p->motion_val[0][xy][1]; | |
| 735 | 1/2✓ Branch 0 taken 15407 times. ✗ Branch 1 not taken. | 15407 | if ((unsigned)(p_my + tab_bias) < tab_size) { | 
| 736 | 15407 | s->mv[0][i][1] = s->direct_scale_mv[0][p_my + tab_bias]; | |
| 737 | 15407 | s->mv[1][i][1] = s->direct_scale_mv[1][p_my + tab_bias]; | |
| 738 | } else { | ||
| 739 | ✗ | s->mv[0][i][1] = p_my * time_pb / time_pp; | |
| 740 | ✗ | s->mv[1][i][1] = p_my * (time_pb - time_pp) / time_pp; | |
| 741 | } | ||
| 742 | 15407 | } | |
| 743 | |||
| 744 | /** | ||
| 745 | * @return the mb_type | ||
| 746 | */ | ||
| 747 | 15266 | static int set_direct_mv(MpegEncContext *s) | |
| 748 | { | ||
| 749 | 15266 | const int mb_index = s->mb_x + s->mb_y * s->mb_stride; | |
| 750 | 15266 | const MPVPicture *p = s->next_pic.ptr; | |
| 751 | 15266 | int colocated_mb_type = p->mb_type[mb_index]; | |
| 752 | int i; | ||
| 753 | |||
| 754 | 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) { | 
| 755 | ✗ | p = s->last_pic.ptr; | |
| 756 | ✗ | colocated_mb_type = p->mb_type[mb_index]; | |
| 757 | } | ||
| 758 | |||
| 759 | 2/2✓ Branch 0 taken 47 times. ✓ Branch 1 taken 15219 times. | 15266 | if (IS_8X8(colocated_mb_type)) { | 
| 760 | 47 | s->mv_type = MV_TYPE_8X8; | |
| 761 | 2/2✓ Branch 0 taken 188 times. ✓ Branch 1 taken 47 times. | 235 | for (i = 0; i < 4; i++) | 
| 762 | 188 | set_one_direct_mv(s, p, i); | |
| 763 | 47 | return MB_TYPE_DIRECT2 | MB_TYPE_8x8 | MB_TYPE_BIDIR_MV; | |
| 764 | } else { | ||
| 765 | 15219 | set_one_direct_mv(s, p, 0); | |
| 766 | 15219 | s->mv[0][1][0] = | |
| 767 | 15219 | s->mv[0][2][0] = | |
| 768 | 15219 | s->mv[0][3][0] = s->mv[0][0][0]; | |
| 769 | 15219 | s->mv[0][1][1] = | |
| 770 | 15219 | s->mv[0][2][1] = | |
| 771 | 15219 | s->mv[0][3][1] = s->mv[0][0][1]; | |
| 772 | 15219 | s->mv[1][1][0] = | |
| 773 | 15219 | s->mv[1][2][0] = | |
| 774 | 15219 | s->mv[1][3][0] = s->mv[1][0][0]; | |
| 775 | 15219 | s->mv[1][1][1] = | |
| 776 | 15219 | s->mv[1][2][1] = | |
| 777 | 15219 | s->mv[1][3][1] = s->mv[1][0][1]; | |
| 778 | 15219 | s->mv_type = MV_TYPE_8X8; | |
| 779 | // Note see prev line | ||
| 780 | 15219 | return MB_TYPE_DIRECT2 | MB_TYPE_16x16 | MB_TYPE_BIDIR_MV; | |
| 781 | } | ||
| 782 | } | ||
| 783 | |||
| 784 | 441138 | int ff_h263_decode_mb(H263DecContext *const h) | |
| 785 | { | ||
| 786 | int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant; | ||
| 787 | int16_t *mot_val; | ||
| 788 | 441138 | const int xy = h->c.mb_x + h->c.mb_y * h->c.mb_stride; | |
| 789 | 441138 | int cbpb = 0, pb_mv_count = 0; | |
| 790 | |||
| 791 | av_assert2(!h->c.h263_pred); | ||
| 792 | |||
| 793 | 2/2✓ Branch 0 taken 367701 times. ✓ Branch 1 taken 73437 times. | 441138 | if (h->c.pict_type == AV_PICTURE_TYPE_P) { | 
| 794 | do{ | ||
| 795 | 2/2✓ Branch 1 taken 9305 times. ✓ Branch 2 taken 358396 times. | 367701 | if (get_bits1(&h->gb)) { | 
| 796 | /* skip mb */ | ||
| 797 | 9305 | h->c.mb_intra = 0; | |
| 798 | 2/2✓ Branch 0 taken 55830 times. ✓ Branch 1 taken 9305 times. | 65135 | for(i=0;i<6;i++) | 
| 799 | 55830 | h->c.block_last_index[i] = -1; | |
| 800 | 9305 | h->c.mv_dir = MV_DIR_FORWARD; | |
| 801 | 9305 | h->c.mv_type = MV_TYPE_16X16; | |
| 802 | 9305 | h->c.cur_pic.mb_type[xy] = MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_FORWARD_MV; | |
| 803 | 9305 | h->c.mv[0][0][0] = 0; | |
| 804 | 9305 | h->c.mv[0][0][1] = 0; | |
| 805 | 9305 | h->c.mb_skipped = !(h->c.obmc | h->loop_filter); | |
| 806 | 9305 | goto end; | |
| 807 | } | ||
| 808 | 358396 | cbpc = get_vlc2(&h->gb, ff_h263_inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 2); | |
| 809 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 358396 times. | 358396 | if (cbpc < 0){ | 
| 810 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "cbpc damaged at %d %d\n", | |
| 811 | h->c.mb_x, h->c.mb_y); | ||
| 812 | ✗ | return SLICE_ERROR; | |
| 813 | } | ||
| 814 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 358396 times. | 358396 | }while(cbpc == 20); | 
| 815 | |||
| 816 | 358396 | h->c.bdsp.clear_blocks(h->block[0]); | |
| 817 | |||
| 818 | 358396 | dquant = cbpc & 8; | |
| 819 | 358396 | h->c.mb_intra = ((cbpc & 4) != 0); | |
| 820 | 2/2✓ Branch 0 taken 13424 times. ✓ Branch 1 taken 344972 times. | 358396 | if (h->c.mb_intra) | 
| 821 | 13424 | goto intra; | |
| 822 | |||
| 823 | 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)) | 
| 824 | ✗ | pb_mv_count = h263_get_modb(&h->gb, h->pb_frame, &cbpb); | |
| 825 | 344972 | cbpy = get_vlc2(&h->gb, ff_h263_cbpy_vlc, CBPY_VLC_BITS, 1); | |
| 826 | |||
| 827 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 344972 times. | 344972 | if (cbpy < 0) { | 
| 828 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "cbpy damaged at %d %d\n", | |
| 829 | h->c.mb_x, h->c.mb_y); | ||
| 830 | ✗ | return SLICE_ERROR; | |
| 831 | } | ||
| 832 | |||
| 833 | 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) | 
| 834 | 307128 | cbpy ^= 0xF; | |
| 835 | |||
| 836 | 344972 | cbp = (cbpc & 3) | (cbpy << 2); | |
| 837 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 344972 times. | 344972 | if (dquant) { | 
| 838 | ✗ | h263_decode_dquant(h); | |
| 839 | } | ||
| 840 | |||
| 841 | 344972 | h->c.mv_dir = MV_DIR_FORWARD; | |
| 842 | 2/2✓ Branch 0 taken 343929 times. ✓ Branch 1 taken 1043 times. | 344972 | if ((cbpc & 16) == 0) { | 
| 843 | 343929 | h->c.cur_pic.mb_type[xy] = MB_TYPE_16x16 | MB_TYPE_FORWARD_MV; | |
| 844 | /* 16x16 motion prediction */ | ||
| 845 | 343929 | h->c.mv_type = MV_TYPE_16X16; | |
| 846 | 343929 | ff_h263_pred_motion(&h->c, 0, 0, &pred_x, &pred_y); | |
| 847 | 2/2✓ Branch 0 taken 51649 times. ✓ Branch 1 taken 292280 times. | 343929 | if (h->umvplus) | 
| 848 | 51649 | mx = h263p_decode_umotion(h, pred_x); | |
| 849 | else | ||
| 850 | 292280 | mx = ff_h263_decode_motion(h, pred_x, 1); | |
| 851 | |||
| 852 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 343929 times. | 343929 | if (mx >= 0xffff) | 
| 853 | ✗ | return SLICE_ERROR; | |
| 854 | |||
| 855 | 2/2✓ Branch 0 taken 51649 times. ✓ Branch 1 taken 292280 times. | 343929 | if (h->umvplus) | 
| 856 | 51649 | my = h263p_decode_umotion(h, pred_y); | |
| 857 | else | ||
| 858 | 292280 | my = ff_h263_decode_motion(h, pred_y, 1); | |
| 859 | |||
| 860 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 343929 times. | 343929 | if (my >= 0xffff) | 
| 861 | ✗ | return SLICE_ERROR; | |
| 862 | 343929 | h->c.mv[0][0][0] = mx; | |
| 863 | 343929 | h->c.mv[0][0][1] = my; | |
| 864 | |||
| 865 | 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) | 
| 866 | 340 | skip_bits1(&h->gb); /* Bit stuffing to prevent PSC */ | |
| 867 | } else { | ||
| 868 | 1043 | h->c.cur_pic.mb_type[xy] = MB_TYPE_8x8 | MB_TYPE_FORWARD_MV; | |
| 869 | 1043 | h->c.mv_type = MV_TYPE_8X8; | |
| 870 | 2/2✓ Branch 0 taken 4172 times. ✓ Branch 1 taken 1043 times. | 5215 | for(i=0;i<4;i++) { | 
| 871 | 4172 | mot_val = ff_h263_pred_motion(&h->c, i, 0, &pred_x, &pred_y); | |
| 872 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 4172 times. | 4172 | if (h->umvplus) | 
| 873 | ✗ | mx = h263p_decode_umotion(h, pred_x); | |
| 874 | else | ||
| 875 | 4172 | mx = ff_h263_decode_motion(h, pred_x, 1); | |
| 876 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 4172 times. | 4172 | if (mx >= 0xffff) | 
| 877 | ✗ | return SLICE_ERROR; | |
| 878 | |||
| 879 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 4172 times. | 4172 | if (h->umvplus) | 
| 880 | ✗ | my = h263p_decode_umotion(h, pred_y); | |
| 881 | else | ||
| 882 | 4172 | my = ff_h263_decode_motion(h, pred_y, 1); | |
| 883 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 4172 times. | 4172 | if (my >= 0xffff) | 
| 884 | ✗ | return SLICE_ERROR; | |
| 885 | 4172 | h->c.mv[0][i][0] = mx; | |
| 886 | 4172 | h->c.mv[0][i][1] = my; | |
| 887 | 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) | 
| 888 | ✗ | skip_bits1(&h->gb); /* Bit stuffing to prevent PSC */ | |
| 889 | 4172 | mot_val[0] = mx; | |
| 890 | 4172 | mot_val[1] = my; | |
| 891 | } | ||
| 892 | } | ||
| 893 | 2/2✓ Branch 0 taken 21600 times. ✓ Branch 1 taken 51837 times. | 73437 | } else if (h->c.pict_type==AV_PICTURE_TYPE_B) { | 
| 894 | int mb_type; | ||
| 895 | 21600 | const int stride = h->c.b8_stride; | |
| 896 | 21600 | int16_t *mot_val0 = h->c.cur_pic.motion_val[0][2 * (h->c.mb_x + h->c.mb_y * stride)]; | |
| 897 | 21600 | int16_t *mot_val1 = h->c.cur_pic.motion_val[1][2 * (h->c.mb_x + h->c.mb_y * stride)]; | |
| 898 | // const int mv_xy = h->c.mb_x + 1 + h->c.mb_y * h->c.mb_stride; | ||
| 899 | |||
| 900 | //FIXME ugly | ||
| 901 | 21600 | mot_val0[0 ]= mot_val0[2 ]= mot_val0[0+2*stride]= mot_val0[2+2*stride]= | |
| 902 | 21600 | mot_val0[1 ]= mot_val0[3 ]= mot_val0[1+2*stride]= mot_val0[3+2*stride]= | |
| 903 | 21600 | mot_val1[0 ]= mot_val1[2 ]= mot_val1[0+2*stride]= mot_val1[2+2*stride]= | |
| 904 | 21600 | mot_val1[1 ]= mot_val1[3 ]= mot_val1[1+2*stride]= mot_val1[3+2*stride]= 0; | |
| 905 | |||
| 906 | do{ | ||
| 907 | 21600 | mb_type = get_vlc2(&h->gb, h263_mbtype_b_vlc, | |
| 908 | H263_MBTYPE_B_VLC_BITS, 2); | ||
| 909 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 21600 times. | 21600 | if (mb_type < 0){ | 
| 910 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "b mb_type damaged at %d %d\n", | |
| 911 | h->c.mb_x, h->c.mb_y); | ||
| 912 | ✗ | return SLICE_ERROR; | |
| 913 | } | ||
| 914 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 21600 times. | 21600 | }while(!mb_type); | 
| 915 | |||
| 916 | 21600 | h->c.mb_intra = IS_INTRA(mb_type); | |
| 917 | 2/2✓ Branch 0 taken 11402 times. ✓ Branch 1 taken 10198 times. | 21600 | if(HAS_CBP(mb_type)){ | 
| 918 | 11402 | h->c.bdsp.clear_blocks(h->block[0]); | |
| 919 | 11402 | cbpc = get_vlc2(&h->gb, cbpc_b_vlc, CBPC_B_VLC_BITS, 1); | |
| 920 | 2/2✓ Branch 0 taken 46 times. ✓ Branch 1 taken 11356 times. | 11402 | if (h->c.mb_intra) { | 
| 921 | 46 | dquant = IS_QUANT(mb_type); | |
| 922 | 46 | goto intra; | |
| 923 | } | ||
| 924 | |||
| 925 | 11356 | cbpy = get_vlc2(&h->gb, ff_h263_cbpy_vlc, CBPY_VLC_BITS, 1); | |
| 926 | |||
| 927 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 11356 times. | 11356 | if (cbpy < 0){ | 
| 928 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "b cbpy damaged at %d %d\n", | |
| 929 | h->c.mb_x, h->c.mb_y); | ||
| 930 | ✗ | return SLICE_ERROR; | |
| 931 | } | ||
| 932 | |||
| 933 | 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) | 
| 934 | 11356 | cbpy ^= 0xF; | |
| 935 | |||
| 936 | 11356 | cbp = (cbpc & 3) | (cbpy << 2); | |
| 937 | }else | ||
| 938 | 10198 | cbp=0; | |
| 939 | |||
| 940 | av_assert2(!h->c.mb_intra); | ||
| 941 | |||
| 942 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 21554 times. | 21554 | if(IS_QUANT(mb_type)){ | 
| 943 | ✗ | h263_decode_dquant(h); | |
| 944 | } | ||
| 945 | |||
| 946 | 2/2✓ Branch 0 taken 15266 times. ✓ Branch 1 taken 6288 times. | 21554 | if(IS_DIRECT(mb_type)){ | 
| 947 | 15266 | h->c.mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT; | |
| 948 | 15266 | mb_type |= set_direct_mv(&h->c); | |
| 949 | }else{ | ||
| 950 | 6288 | h->c.mv_dir = 0; | |
| 951 | 6288 | h->c.mv_type = MV_TYPE_16X16; | |
| 952 | //FIXME UMV | ||
| 953 | |||
| 954 | 2/2✓ Branch 0 taken 2594 times. ✓ Branch 1 taken 3694 times. | 6288 | if (HAS_FORWARD_MV(mb_type)) { | 
| 955 | 2594 | int16_t *mot_val = ff_h263_pred_motion(&h->c, 0, 0, &pred_x, &pred_y); | |
| 956 | 2594 | h->c.mv_dir = MV_DIR_FORWARD; | |
| 957 | |||
| 958 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 2594 times. | 2594 | if (h->umvplus) | 
| 959 | ✗ | mx = h263p_decode_umotion(h, pred_x); | |
| 960 | else | ||
| 961 | 2594 | mx = ff_h263_decode_motion(h, pred_x, 1); | |
| 962 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 2594 times. | 2594 | if (mx >= 0xffff) | 
| 963 | ✗ | return SLICE_ERROR; | |
| 964 | |||
| 965 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 2594 times. | 2594 | if (h->umvplus) | 
| 966 | ✗ | my = h263p_decode_umotion(h, pred_y); | |
| 967 | else | ||
| 968 | 2594 | my = ff_h263_decode_motion(h, pred_y, 1); | |
| 969 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 2594 times. | 2594 | if (my >= 0xffff) | 
| 970 | ✗ | return SLICE_ERROR; | |
| 971 | |||
| 972 | 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) | 
| 973 | ✗ | skip_bits1(&h->gb); /* Bit stuffing to prevent PSC */ | |
| 974 | |||
| 975 | 2594 | h->c.mv[0][0][0] = mx; | |
| 976 | 2594 | h->c.mv[0][0][1] = my; | |
| 977 | 2594 | mot_val[0 ]= mot_val[2 ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx; | |
| 978 | 2594 | mot_val[1 ]= mot_val[3 ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my; | |
| 979 | } | ||
| 980 | |||
| 981 | 2/2✓ Branch 0 taken 3694 times. ✓ Branch 1 taken 2594 times. | 6288 | if (HAS_BACKWARD_MV(mb_type)) { | 
| 982 | 3694 | int16_t *mot_val = ff_h263_pred_motion(&h->c, 0, 1, &pred_x, &pred_y); | |
| 983 | 3694 | h->c.mv_dir |= MV_DIR_BACKWARD; | |
| 984 | |||
| 985 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 3694 times. | 3694 | if (h->umvplus) | 
| 986 | ✗ | mx = h263p_decode_umotion(h, pred_x); | |
| 987 | else | ||
| 988 | 3694 | mx = ff_h263_decode_motion(h, pred_x, 1); | |
| 989 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 3694 times. | 3694 | if (mx >= 0xffff) | 
| 990 | ✗ | return SLICE_ERROR; | |
| 991 | |||
| 992 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 3694 times. | 3694 | if (h->umvplus) | 
| 993 | ✗ | my = h263p_decode_umotion(h, pred_y); | |
| 994 | else | ||
| 995 | 3694 | my = ff_h263_decode_motion(h, pred_y, 1); | |
| 996 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 3694 times. | 3694 | if (my >= 0xffff) | 
| 997 | ✗ | return SLICE_ERROR; | |
| 998 | |||
| 999 | 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) | 
| 1000 | ✗ | skip_bits1(&h->gb); /* Bit stuffing to prevent PSC */ | |
| 1001 | |||
| 1002 | 3694 | h->c.mv[1][0][0] = mx; | |
| 1003 | 3694 | h->c.mv[1][0][1] = my; | |
| 1004 | 3694 | mot_val[0 ]= mot_val[2 ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx; | |
| 1005 | 3694 | mot_val[1 ]= mot_val[3 ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my; | |
| 1006 | } | ||
| 1007 | } | ||
| 1008 | |||
| 1009 | 21554 | h->c.cur_pic.mb_type[xy] = mb_type; | |
| 1010 | } else { /* I-Frame */ | ||
| 1011 | do{ | ||
| 1012 | 51837 | cbpc = get_vlc2(&h->gb, ff_h263_intra_MCBPC_vlc, INTRA_MCBPC_VLC_BITS, 2); | |
| 1013 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 51837 times. | 51837 | if (cbpc < 0){ | 
| 1014 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "I cbpc damaged at %d %d\n", | |
| 1015 | h->c.mb_x, h->c.mb_y); | ||
| 1016 | ✗ | return SLICE_ERROR; | |
| 1017 | } | ||
| 1018 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 51837 times. | 51837 | }while(cbpc == 8); | 
| 1019 | |||
| 1020 | 51837 | h->c.bdsp.clear_blocks(h->block[0]); | |
| 1021 | |||
| 1022 | 51837 | dquant = cbpc & 4; | |
| 1023 | 51837 | h->c.mb_intra = 1; | |
| 1024 | 65307 | intra: | |
| 1025 | 65307 | h->c.cur_pic.mb_type[xy] = MB_TYPE_INTRA; | |
| 1026 | 2/2✓ Branch 0 taken 15183 times. ✓ Branch 1 taken 50124 times. | 65307 | if (h->c.h263_aic) { | 
| 1027 | 15183 | h->c.ac_pred = get_bits1(&h->gb); | |
| 1028 | 2/2✓ Branch 0 taken 739 times. ✓ Branch 1 taken 14444 times. | 15183 | if (h->c.ac_pred) { | 
| 1029 | 739 | h->c.cur_pic.mb_type[xy] = MB_TYPE_INTRA | MB_TYPE_ACPRED; | |
| 1030 | |||
| 1031 | 739 | h->c.h263_aic_dir = get_bits1(&h->gb); | |
| 1032 | } | ||
| 1033 | }else | ||
| 1034 | 50124 | h->c.ac_pred = 0; | |
| 1035 | |||
| 1036 | 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)) | 
| 1037 | ✗ | pb_mv_count = h263_get_modb(&h->gb, h->pb_frame, &cbpb); | |
| 1038 | 65307 | cbpy = get_vlc2(&h->gb, ff_h263_cbpy_vlc, CBPY_VLC_BITS, 1); | |
| 1039 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 65307 times. | 65307 | if(cbpy<0){ | 
| 1040 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", | |
| 1041 | h->c.mb_x, h->c.mb_y); | ||
| 1042 | ✗ | return SLICE_ERROR; | |
| 1043 | } | ||
| 1044 | 65307 | cbp = (cbpc & 3) | (cbpy << 2); | |
| 1045 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 65307 times. | 65307 | if (dquant) { | 
| 1046 | ✗ | h263_decode_dquant(h); | |
| 1047 | } | ||
| 1048 | |||
| 1049 | 65307 | pb_mv_count += !!h->pb_frame; | |
| 1050 | } | ||
| 1051 | |||
| 1052 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 431833 times. | 431833 | while(pb_mv_count--){ | 
| 1053 | ✗ | ff_h263_decode_motion(h, 0, 1); | |
| 1054 | ✗ | ff_h263_decode_motion(h, 0, 1); | |
| 1055 | } | ||
| 1056 | |||
| 1057 | /* decode each block */ | ||
| 1058 | 2/2✓ Branch 0 taken 2590998 times. ✓ Branch 1 taken 431833 times. | 3022831 | for (i = 0; i < 6; i++) { | 
| 1059 | 1/2✗ Branch 1 not taken. ✓ Branch 2 taken 2590998 times. | 2590998 | if (h263_decode_block(h, h->block[i], i, cbp&32) < 0) | 
| 1060 | ✗ | return -1; | |
| 1061 | 2590998 | cbp+=cbp; | |
| 1062 | } | ||
| 1063 | |||
| 1064 | 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) | 
| 1065 | ✗ | return -1; | |
| 1066 | 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) { | 
| 1067 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 50805 times. | 50805 | if (h->c.pict_type == AV_PICTURE_TYPE_P && | 
| 1068 | 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) | 
| 1069 | 48550 | preview_obmc(h); | |
| 1070 | } | ||
| 1071 | 383283 | end: | |
| 1072 | |||
| 1073 | 1/2✗ Branch 1 not taken. ✓ Branch 2 taken 441138 times. | 441138 | if (get_bits_left(&h->gb) < 0) | 
| 1074 | ✗ | return AVERROR_INVALIDDATA; | |
| 1075 | |||
| 1076 | /* per-MB end of slice check */ | ||
| 1077 | { | ||
| 1078 | 441138 | int v = show_bits(&h->gb, 16); | |
| 1079 | |||
| 1080 | 2/2✓ Branch 1 taken 1616 times. ✓ Branch 2 taken 439522 times. | 441138 | if (get_bits_left(&h->gb) < 16) { | 
| 1081 | 1616 | v >>= 16 - get_bits_left(&h->gb); | |
| 1082 | } | ||
| 1083 | |||
| 1084 | 2/2✓ Branch 0 taken 3742 times. ✓ Branch 1 taken 437396 times. | 441138 | if(v==0) | 
| 1085 | 3742 | return SLICE_END; | |
| 1086 | } | ||
| 1087 | |||
| 1088 | 437396 | return SLICE_OK; | |
| 1089 | } | ||
| 1090 | |||
| 1091 | /* Most is hardcoded; should extend to handle all H.263 streams. */ | ||
| 1092 | 461 | int ff_h263_decode_picture_header(H263DecContext *const h) | |
| 1093 | { | ||
| 1094 | int width, height, i, ret; | ||
| 1095 | int h263_plus; | ||
| 1096 | |||
| 1097 | 461 | align_get_bits(&h->gb); | |
| 1098 | |||
| 1099 | 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) { | 
| 1100 | ✗ | av_log(h->c.avctx, AV_LOG_WARNING, "Header looks like RTP instead of H.263\n"); | |
| 1101 | } | ||
| 1102 | |||
| 1103 | 461 | uint32_t startcode = get_bits(&h->gb, 22-8); | |
| 1104 | |||
| 1105 | 1/2✓ Branch 1 taken 461 times. ✗ Branch 2 not taken. | 461 | for (i = get_bits_left(&h->gb); i>24; i -= 8) { | 
| 1106 | 461 | startcode = ((startcode << 8) | get_bits(&h->gb, 8)) & 0x003FFFFF; | |
| 1107 | |||
| 1108 | 1/2✓ Branch 0 taken 461 times. ✗ Branch 1 not taken. | 461 | if(startcode == 0x20) | 
| 1109 | 461 | break; | |
| 1110 | } | ||
| 1111 | |||
| 1112 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 461 times. | 461 | if (startcode != 0x20) { | 
| 1113 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "Bad picture start code\n"); | |
| 1114 | ✗ | return -1; | |
| 1115 | } | ||
| 1116 | /* temporal reference */ | ||
| 1117 | 461 | i = get_bits(&h->gb, 8); /* picture timestamp */ | |
| 1118 | |||
| 1119 | 461 | i -= (i - (h->picture_number & 0xFF) + 128) & ~0xFF; | |
| 1120 | |||
| 1121 | 461 | h->picture_number = (h->picture_number&~0xFF) + i; | |
| 1122 | |||
| 1123 | /* PTYPE starts here */ | ||
| 1124 | 1/2✗ Branch 1 not taken. ✓ Branch 2 taken 461 times. | 461 | if (check_marker(h->c.avctx, &h->gb, "in PTYPE") != 1) { | 
| 1125 | ✗ | return -1; | |
| 1126 | } | ||
| 1127 | 1/2✗ Branch 1 not taken. ✓ Branch 2 taken 461 times. | 461 | if (get_bits1(&h->gb) != 0) { | 
| 1128 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "Bad H.263 id\n"); | |
| 1129 | ✗ | return -1; /* H.263 id */ | |
| 1130 | } | ||
| 1131 | 461 | skip_bits1(&h->gb); /* split screen off */ | |
| 1132 | 461 | skip_bits1(&h->gb); /* camera off */ | |
| 1133 | 461 | skip_bits1(&h->gb); /* freeze picture release off */ | |
| 1134 | |||
| 1135 | 461 | int format = get_bits(&h->gb, 3); | |
| 1136 | /* | ||
| 1137 | 0 forbidden | ||
| 1138 | 1 sub-QCIF | ||
| 1139 | 10 QCIF | ||
| 1140 | 7 extended PTYPE (PLUSPTYPE) | ||
| 1141 | */ | ||
| 1142 | |||
| 1143 | 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) { | 
| 1144 | 307 | h263_plus = 0; | |
| 1145 | /* H.263v1 */ | ||
| 1146 | 307 | width = ff_h263_format[format][0]; | |
| 1147 | 307 | height = ff_h263_format[format][1]; | |
| 1148 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 307 times. | 307 | if (!width) | 
| 1149 | ✗ | return -1; | |
| 1150 | |||
| 1151 | 307 | h->c.pict_type = AV_PICTURE_TYPE_I + get_bits1(&h->gb); | |
| 1152 | |||
| 1153 | 307 | h->h263_long_vectors = get_bits1(&h->gb); | |
| 1154 | |||
| 1155 | 1/2✗ Branch 1 not taken. ✓ Branch 2 taken 307 times. | 307 | if (get_bits1(&h->gb) != 0) { | 
| 1156 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "H.263 SAC not supported\n"); | |
| 1157 | ✗ | return -1; /* SAC: off */ | |
| 1158 | } | ||
| 1159 | 307 | h->c.obmc = get_bits1(&h->gb); /* Advanced prediction mode */ | |
| 1160 | |||
| 1161 | 307 | h->pb_frame = get_bits1(&h->gb); | |
| 1162 | 307 | h->c.chroma_qscale = h->c.qscale = get_bits(&h->gb, 5); | |
| 1163 | 307 | skip_bits1(&h->gb); /* Continuous Presence Multipoint mode: off */ | |
| 1164 | |||
| 1165 | 307 | h->c.width = width; | |
| 1166 | 307 | h->c.height = height; | |
| 1167 | 307 | h->c.avctx->sample_aspect_ratio= (AVRational){12,11}; | |
| 1168 | 307 | h->c.avctx->framerate = (AVRational){ 30000, 1001 }; | |
| 1169 | } else { | ||
| 1170 | int ufep; | ||
| 1171 | |||
| 1172 | /* H.263v2 */ | ||
| 1173 | 154 | h263_plus = 1; | |
| 1174 | 154 | ufep = get_bits(&h->gb, 3); /* Update Full Extended PTYPE */ | |
| 1175 | |||
| 1176 | /* ufep other than 0 and 1 are reserved */ | ||
| 1177 | 1/2✓ Branch 0 taken 154 times. ✗ Branch 1 not taken. | 154 | if (ufep == 1) { | 
| 1178 | /* OPPTYPE */ | ||
| 1179 | 154 | format = get_bits(&h->gb, 3); | |
| 1180 | ff_dlog(h->c.avctx, "ufep=1, format: %d\n", format); | ||
| 1181 | 154 | h->custom_pcf = get_bits1(&h->gb); | |
| 1182 | 154 | h->umvplus = get_bits1(&h->gb); /* Unrestricted Motion Vector */ | |
| 1183 | 1/2✗ Branch 1 not taken. ✓ Branch 2 taken 154 times. | 154 | if (get_bits1(&h->gb) != 0) { | 
| 1184 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "Syntax-based Arithmetic Coding (SAC) not supported\n"); | |
| 1185 | } | ||
| 1186 | 154 | h->c.obmc = get_bits1(&h->gb); /* Advanced prediction mode */ | |
| 1187 | 154 | h->c.h263_aic = get_bits1(&h->gb); /* Advanced Intra Coding (AIC) */ | |
| 1188 | 154 | h->loop_filter = get_bits1(&h->gb); | |
| 1189 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 154 times. | 154 | if (h->c.avctx->lowres) | 
| 1190 | ✗ | h->loop_filter = 0; | |
| 1191 | |||
| 1192 | 154 | h->h263_slice_structured = get_bits1(&h->gb); | |
| 1193 | 1/2✗ Branch 1 not taken. ✓ Branch 2 taken 154 times. | 154 | if (get_bits1(&h->gb) != 0) { | 
| 1194 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "Reference Picture Selection not supported\n"); | |
| 1195 | } | ||
| 1196 | 1/2✗ Branch 1 not taken. ✓ Branch 2 taken 154 times. | 154 | if (get_bits1(&h->gb) != 0) { | 
| 1197 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "Independent Segment Decoding not supported\n"); | |
| 1198 | } | ||
| 1199 | 154 | h->alt_inter_vlc = get_bits1(&h->gb); | |
| 1200 | 154 | h->modified_quant = get_bits1(&h->gb); | |
| 1201 | 1/2✓ Branch 0 taken 154 times. ✗ Branch 1 not taken. | 154 | if (h->modified_quant) | 
| 1202 | 154 | h->c.chroma_qscale_table= ff_h263_chroma_qscale_table; | |
| 1203 | |||
| 1204 | 154 | skip_bits(&h->gb, 1); /* Prevent start code emulation */ | |
| 1205 | |||
| 1206 | 154 | skip_bits(&h->gb, 3); /* Reserved */ | |
| 1207 | ✗ | } else if (ufep != 0) { | |
| 1208 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "Bad UFEP type (%d)\n", ufep); | |
| 1209 | ✗ | return -1; | |
| 1210 | } | ||
| 1211 | |||
| 1212 | /* MPPTYPE */ | ||
| 1213 | 154 | h->c.pict_type = get_bits(&h->gb, 3); | |
| 1214 | 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) { | 
| 1215 | 19 | case 0: h->c.pict_type = AV_PICTURE_TYPE_I; break; | |
| 1216 | 135 | case 1: h->c.pict_type = AV_PICTURE_TYPE_P; break; | |
| 1217 | ✗ | case 2: h->c.pict_type = AV_PICTURE_TYPE_P; h->pb_frame = 3; break; | |
| 1218 | ✗ | case 3: h->c.pict_type = AV_PICTURE_TYPE_B; break; | |
| 1219 | ✗ | case 7: h->c.pict_type = AV_PICTURE_TYPE_I; break; //ZYGO | |
| 1220 | ✗ | default: | |
| 1221 | ✗ | return -1; | |
| 1222 | } | ||
| 1223 | 154 | skip_bits(&h->gb, 2); | |
| 1224 | 154 | h->c.no_rounding = get_bits1(&h->gb); | |
| 1225 | 154 | skip_bits(&h->gb, 4); | |
| 1226 | |||
| 1227 | /* Get the picture dimensions */ | ||
| 1228 | 1/2✓ Branch 0 taken 154 times. ✗ Branch 1 not taken. | 154 | if (ufep) { | 
| 1229 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 154 times. | 154 | if (format == 6) { | 
| 1230 | /* Custom Picture Format (CPFMT) */ | ||
| 1231 | ✗ | int aspect_ratio_info = get_bits(&h->gb, 4); | |
| 1232 | ff_dlog(h->c.avctx, "aspect: %d\n", aspect_ratio_info); | ||
| 1233 | /* aspect ratios: | ||
| 1234 | 0 - forbidden | ||
| 1235 | 1 - 1:1 | ||
| 1236 | 2 - 12:11 (CIF 4:3) | ||
| 1237 | 3 - 10:11 (525-type 4:3) | ||
| 1238 | 4 - 16:11 (CIF 16:9) | ||
| 1239 | 5 - 40:33 (525-type 16:9) | ||
| 1240 | 6-14 - reserved | ||
| 1241 | */ | ||
| 1242 | ✗ | width = (get_bits(&h->gb, 9) + 1) * 4; | |
| 1243 | ✗ | check_marker(h->c.avctx, &h->gb, "in dimensions"); | |
| 1244 | ✗ | height = get_bits(&h->gb, 9) * 4; | |
| 1245 | ff_dlog(h->c.avctx, "\nH.263+ Custom picture: %dx%d\n",width,height); | ||
| 1246 | ✗ | if (aspect_ratio_info == FF_ASPECT_EXTENDED) { | |
| 1247 | /* expected dimensions */ | ||
| 1248 | ✗ | h->c.avctx->sample_aspect_ratio.num = get_bits(&h->gb, 8); | |
| 1249 | ✗ | h->c.avctx->sample_aspect_ratio.den = get_bits(&h->gb, 8); | |
| 1250 | }else{ | ||
| 1251 | ✗ | h->c.avctx->sample_aspect_ratio= ff_h263_pixel_aspect[aspect_ratio_info]; | |
| 1252 | } | ||
| 1253 | } else { | ||
| 1254 | 154 | width = ff_h263_format[format][0]; | |
| 1255 | 154 | height = ff_h263_format[format][1]; | |
| 1256 | 154 | h->c.avctx->sample_aspect_ratio = (AVRational){12,11}; | |
| 1257 | } | ||
| 1258 | 154 | h->c.avctx->sample_aspect_ratio.den <<= h->ehc_mode; | |
| 1259 | 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)) | 
| 1260 | ✗ | return -1; | |
| 1261 | 154 | h->c.width = width; | |
| 1262 | 154 | h->c.height = height; | |
| 1263 | |||
| 1264 | 1/2✓ Branch 0 taken 154 times. ✗ Branch 1 not taken. | 154 | if (h->custom_pcf) { | 
| 1265 | 154 | h->c.avctx->framerate.num = 1800000; | |
| 1266 | 154 | h->c.avctx->framerate.den = 1000 + get_bits1(&h->gb); | |
| 1267 | 154 | h->c.avctx->framerate.den *= get_bits(&h->gb, 7); | |
| 1268 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 154 times. | 154 | if (h->c.avctx->framerate.den == 0) { | 
| 1269 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "zero framerate\n"); | |
| 1270 | ✗ | return -1; | |
| 1271 | } | ||
| 1272 | 154 | int gcd = av_gcd(h->c.avctx->framerate.den, h->c.avctx->framerate.num); | |
| 1273 | 154 | h->c.avctx->framerate.den /= gcd; | |
| 1274 | 154 | h->c.avctx->framerate.num /= gcd; | |
| 1275 | }else{ | ||
| 1276 | ✗ | h->c.avctx->framerate = (AVRational){ 30000, 1001 }; | |
| 1277 | } | ||
| 1278 | } | ||
| 1279 | |||
| 1280 | 1/2✓ Branch 0 taken 154 times. ✗ Branch 1 not taken. | 154 | if (h->custom_pcf) | 
| 1281 | 154 | skip_bits(&h->gb, 2); //extended Temporal reference | |
| 1282 | |||
| 1283 | 1/2✓ Branch 0 taken 154 times. ✗ Branch 1 not taken. | 154 | if (ufep) { | 
| 1284 | 1/2✓ Branch 0 taken 154 times. ✗ Branch 1 not taken. | 154 | if (h->umvplus) { | 
| 1285 | 1/2✓ Branch 1 taken 154 times. ✗ Branch 2 not taken. | 154 | if (get_bits1(&h->gb)==0) /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */ | 
| 1286 | 154 | skip_bits1(&h->gb); | |
| 1287 | } | ||
| 1288 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 154 times. | 154 | if (h->h263_slice_structured) { | 
| 1289 | ✗ | if (get_bits1(&h->gb) != 0) { | |
| 1290 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "rectangular slices not supported\n"); | |
| 1291 | } | ||
| 1292 | ✗ | if (get_bits1(&h->gb) != 0) { | |
| 1293 | ✗ | av_log(h->c.avctx, AV_LOG_ERROR, "unordered slices not supported\n"); | |
| 1294 | } | ||
| 1295 | } | ||
| 1296 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 154 times. | 154 | if (h->c.pict_type == AV_PICTURE_TYPE_B) { | 
| 1297 | ✗ | skip_bits(&h->gb, 4); //ELNUM | |
| 1298 | ✗ | if (ufep == 1) { | |
| 1299 | ✗ | skip_bits(&h->gb, 4); // RLNUM | |
| 1300 | } | ||
| 1301 | } | ||
| 1302 | } | ||
| 1303 | |||
| 1304 | 154 | h->c.qscale = get_bits(&h->gb, 5); | |
| 1305 | } | ||
| 1306 | |||
| 1307 | 461 | ret = av_image_check_size(h->c.width, h->c.height, 0, h->c.avctx); | |
| 1308 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 461 times. | 461 | if (ret < 0) | 
| 1309 | ✗ | return ret; | |
| 1310 | |||
| 1311 | 1/2✓ Branch 0 taken 461 times. ✗ Branch 1 not taken. | 461 | if (!(h->c.avctx->flags2 & AV_CODEC_FLAG2_CHUNKS)) { | 
| 1312 | 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)) | 
| 1313 | ✗ | return AVERROR_INVALIDDATA; | |
| 1314 | } | ||
| 1315 | |||
| 1316 | 461 | h->c.mb_width = (h->c.width + 15U) / 16; | |
| 1317 | 461 | h->c.mb_height = (h->c.height + 15U) / 16; | |
| 1318 | 461 | h->c.mb_num = h->c.mb_width * h->c.mb_height; | |
| 1319 | |||
| 1320 | 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); | 
| 1321 | |||
| 1322 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 461 times. | 461 | if (h->pb_frame) { | 
| 1323 | ✗ | skip_bits(&h->gb, 3); /* Temporal reference for B-pictures */ | |
| 1324 | ✗ | if (h->custom_pcf) | |
| 1325 | ✗ | skip_bits(&h->gb, 2); //extended Temporal reference | |
| 1326 | ✗ | skip_bits(&h->gb, 2); /* Quantization information for B-pictures */ | |
| 1327 | } | ||
| 1328 | |||
| 1329 | 1/2✓ Branch 0 taken 461 times. ✗ Branch 1 not taken. | 461 | if (h->c.pict_type!=AV_PICTURE_TYPE_B) { | 
| 1330 | 461 | h->c.time = h->picture_number; | |
| 1331 | 461 | h->c.pp_time = h->c.time - h->c.last_non_b_time; | |
| 1332 | 461 | h->c.last_non_b_time = h->c.time; | |
| 1333 | }else{ | ||
| 1334 | ✗ | h->c.time = h->picture_number; | |
| 1335 | ✗ | h->c.pb_time = h->c.pp_time - (h->c.last_non_b_time - h->c.time); | |
| 1336 | ✗ | if (h->c.pp_time <= h->c.pb_time || | |
| 1337 | ✗ | h->c.pp_time <= h->c.pp_time - h->c.pb_time || | |
| 1338 | ✗ | h->c.pp_time <= 0) { | |
| 1339 | ✗ | h->c.pp_time = 2; | |
| 1340 | ✗ | h->c.pb_time = 1; | |
| 1341 | } | ||
| 1342 | ✗ | ff_mpeg4_init_direct_mv(&h->c); | |
| 1343 | } | ||
| 1344 | |||
| 1345 | /* PEI */ | ||
| 1346 | 1/2✗ Branch 1 not taken. ✓ Branch 2 taken 461 times. | 461 | if (skip_1stop_8data_bits(&h->gb) < 0) | 
| 1347 | ✗ | return AVERROR_INVALIDDATA; | |
| 1348 | |||
| 1349 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 461 times. | 461 | if (h->h263_slice_structured) { | 
| 1350 | ✗ | if (check_marker(h->c.avctx, &h->gb, "SEPB1") != 1) { | |
| 1351 | ✗ | return -1; | |
| 1352 | } | ||
| 1353 | |||
| 1354 | ✗ | ff_h263_decode_mba(h); | |
| 1355 | |||
| 1356 | ✗ | if (check_marker(h->c.avctx, &h->gb, "SEPB2") != 1) { | |
| 1357 | ✗ | return -1; | |
| 1358 | } | ||
| 1359 | } | ||
| 1360 | |||
| 1361 | 1/2✗ Branch 0 not taken. ✓ Branch 1 taken 461 times. | 461 | if (h->c.pict_type == AV_PICTURE_TYPE_B) | 
| 1362 | ✗ | h->c.low_delay = 0; | |
| 1363 | |||
| 1364 | 2/2✓ Branch 0 taken 154 times. ✓ Branch 1 taken 307 times. | 461 | if (h->c.h263_aic) { | 
| 1365 | 154 | h->c.y_dc_scale_table = | |
| 1366 | 154 | h->c.c_dc_scale_table = ff_aic_dc_scale_table; | |
| 1367 | }else{ | ||
| 1368 | 307 | h->c.y_dc_scale_table = | |
| 1369 | 307 | h->c.c_dc_scale_table = ff_mpeg1_dc_scale_table; | |
| 1370 | } | ||
| 1371 | |||
| 1372 | 461 | ff_h263_show_pict_info(h, h263_plus); | |
| 1373 | |||
| 1374 | 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){ | 
| 1375 | int i,j; | ||
| 1376 | ✗ | for(i=0; i<85; i++) av_log(h->c.avctx, AV_LOG_DEBUG, "%d", get_bits1(&h->gb)); | |
| 1377 | ✗ | av_log(h->c.avctx, AV_LOG_DEBUG, "\n"); | |
| 1378 | ✗ | for(i=0; i<13; i++){ | |
| 1379 | ✗ | for(j=0; j<3; j++){ | |
| 1380 | ✗ | int v= get_bits(&h->gb, 8); | |
| 1381 | ✗ | v |= get_sbits(&h->gb, 8) * (1 << 8); | |
| 1382 | ✗ | av_log(h->c.avctx, AV_LOG_DEBUG, " %5d", v); | |
| 1383 | } | ||
| 1384 | ✗ | av_log(h->c.avctx, AV_LOG_DEBUG, "\n"); | |
| 1385 | } | ||
| 1386 | ✗ | for(i=0; i<50; i++) av_log(h->c.avctx, AV_LOG_DEBUG, "%d", get_bits1(&h->gb)); | |
| 1387 | } | ||
| 1388 | |||
| 1389 | 461 | return 0; | |
| 1390 | } | ||
| 1391 |