yading@10: /* yading@10: * ITU H263 bitstream decoder yading@10: * Copyright (c) 2000,2001 Fabrice Bellard yading@10: * H263+ support. yading@10: * Copyright (c) 2001 Juan J. Sierralta P yading@10: * Copyright (c) 2002-2004 Michael Niedermayer yading@10: * yading@10: * This file is part of FFmpeg. yading@10: * yading@10: * FFmpeg is free software; you can redistribute it and/or yading@10: * modify it under the terms of the GNU Lesser General Public yading@10: * License as published by the Free Software Foundation; either yading@10: * version 2.1 of the License, or (at your option) any later version. yading@10: * yading@10: * FFmpeg is distributed in the hope that it will be useful, yading@10: * but WITHOUT ANY WARRANTY; without even the implied warranty of yading@10: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU yading@10: * Lesser General Public License for more details. yading@10: * yading@10: * You should have received a copy of the GNU Lesser General Public yading@10: * License along with FFmpeg; if not, write to the Free Software yading@10: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA yading@10: */ yading@10: yading@10: /** yading@10: * @file yading@10: * h263 decoder. yading@10: */ yading@10: yading@10: #define UNCHECKED_BITSTREAM_READER 1 yading@10: yading@10: //#define DEBUG yading@10: #include yading@10: yading@10: #include "libavutil/internal.h" yading@10: #include "libavutil/mathematics.h" yading@10: #include "avcodec.h" yading@10: #include "mpegvideo.h" yading@10: #include "h263.h" yading@10: #include "mathops.h" yading@10: #include "unary.h" yading@10: #include "flv.h" yading@10: #include "mpeg4video.h" yading@10: yading@10: // The defines below define the number of bits that are read at once for yading@10: // reading vlc values. Changing these may improve speed and data cache needs yading@10: // be aware though that decreasing them may need the number of stages that is yading@10: // passed to get_vlc* to be increased. yading@10: #define MV_VLC_BITS 9 yading@10: #define H263_MBTYPE_B_VLC_BITS 6 yading@10: #define CBPC_B_VLC_BITS 3 yading@10: yading@10: static const int h263_mb_type_b_map[15]= { yading@10: MB_TYPE_DIRECT2 | MB_TYPE_L0L1, yading@10: MB_TYPE_DIRECT2 | MB_TYPE_L0L1 | MB_TYPE_CBP, yading@10: MB_TYPE_DIRECT2 | MB_TYPE_L0L1 | MB_TYPE_CBP | MB_TYPE_QUANT, yading@10: MB_TYPE_L0 | MB_TYPE_16x16, yading@10: MB_TYPE_L0 | MB_TYPE_CBP | MB_TYPE_16x16, yading@10: MB_TYPE_L0 | MB_TYPE_CBP | MB_TYPE_QUANT | MB_TYPE_16x16, yading@10: MB_TYPE_L1 | MB_TYPE_16x16, yading@10: MB_TYPE_L1 | MB_TYPE_CBP | MB_TYPE_16x16, yading@10: MB_TYPE_L1 | MB_TYPE_CBP | MB_TYPE_QUANT | MB_TYPE_16x16, yading@10: MB_TYPE_L0L1 | MB_TYPE_16x16, yading@10: MB_TYPE_L0L1 | MB_TYPE_CBP | MB_TYPE_16x16, yading@10: MB_TYPE_L0L1 | MB_TYPE_CBP | MB_TYPE_QUANT | MB_TYPE_16x16, yading@10: 0, //stuffing yading@10: MB_TYPE_INTRA4x4 | MB_TYPE_CBP, yading@10: MB_TYPE_INTRA4x4 | MB_TYPE_CBP | MB_TYPE_QUANT, yading@10: }; yading@10: yading@10: void ff_h263_show_pict_info(MpegEncContext *s){ yading@10: if(s->avctx->debug&FF_DEBUG_PICT_INFO){ yading@10: av_log(s->avctx, AV_LOG_DEBUG, "qp:%d %c size:%d rnd:%d%s%s%s%s%s%s%s%s%s %d/%d\n", yading@10: s->qscale, av_get_picture_type_char(s->pict_type), yading@10: s->gb.size_in_bits, 1-s->no_rounding, yading@10: s->obmc ? " AP" : "", yading@10: s->umvplus ? " UMV" : "", yading@10: s->h263_long_vectors ? " LONG" : "", yading@10: s->h263_plus ? " +" : "", yading@10: s->h263_aic ? " AIC" : "", yading@10: s->alt_inter_vlc ? " AIV" : "", yading@10: s->modified_quant ? " MQ" : "", yading@10: s->loop_filter ? " LOOP" : "", yading@10: s->h263_slice_structured ? " SS" : "", yading@10: s->avctx->time_base.den, s->avctx->time_base.num yading@10: ); yading@10: } yading@10: } yading@10: yading@10: /***********************************************/ yading@10: /* decoding */ yading@10: yading@10: VLC ff_h263_intra_MCBPC_vlc; yading@10: VLC ff_h263_inter_MCBPC_vlc; yading@10: VLC ff_h263_cbpy_vlc; yading@10: static VLC mv_vlc; yading@10: static VLC h263_mbtype_b_vlc; yading@10: static VLC cbpc_b_vlc; yading@10: yading@10: /* init vlcs */ yading@10: yading@10: /* XXX: find a better solution to handle static init */ yading@10: void ff_h263_decode_init_vlc(void) yading@10: { yading@10: static volatile int done = 0; yading@10: yading@10: if (!done) { yading@10: INIT_VLC_STATIC(&ff_h263_intra_MCBPC_vlc, INTRA_MCBPC_VLC_BITS, 9, yading@10: ff_h263_intra_MCBPC_bits, 1, 1, yading@10: ff_h263_intra_MCBPC_code, 1, 1, 72); yading@10: INIT_VLC_STATIC(&ff_h263_inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 28, yading@10: ff_h263_inter_MCBPC_bits, 1, 1, yading@10: ff_h263_inter_MCBPC_code, 1, 1, 198); yading@10: INIT_VLC_STATIC(&ff_h263_cbpy_vlc, CBPY_VLC_BITS, 16, yading@10: &ff_h263_cbpy_tab[0][1], 2, 1, yading@10: &ff_h263_cbpy_tab[0][0], 2, 1, 64); yading@10: INIT_VLC_STATIC(&mv_vlc, MV_VLC_BITS, 33, yading@10: &ff_mvtab[0][1], 2, 1, yading@10: &ff_mvtab[0][0], 2, 1, 538); yading@10: ff_init_rl(&ff_h263_rl_inter, ff_h263_static_rl_table_store[0]); yading@10: ff_init_rl(&ff_rl_intra_aic, ff_h263_static_rl_table_store[1]); yading@10: INIT_VLC_RL(ff_h263_rl_inter, 554); yading@10: INIT_VLC_RL(ff_rl_intra_aic, 554); yading@10: INIT_VLC_STATIC(&h263_mbtype_b_vlc, H263_MBTYPE_B_VLC_BITS, 15, yading@10: &ff_h263_mbtype_b_tab[0][1], 2, 1, yading@10: &ff_h263_mbtype_b_tab[0][0], 2, 1, 80); yading@10: INIT_VLC_STATIC(&cbpc_b_vlc, CBPC_B_VLC_BITS, 4, yading@10: &ff_cbpc_b_tab[0][1], 2, 1, yading@10: &ff_cbpc_b_tab[0][0], 2, 1, 8); yading@10: done = 1; yading@10: } yading@10: } yading@10: yading@10: int ff_h263_decode_mba(MpegEncContext *s) yading@10: { yading@10: int i, mb_pos; yading@10: yading@10: for(i=0; i<6; i++){ yading@10: if(s->mb_num-1 <= ff_mba_max[i]) break; yading@10: } yading@10: mb_pos= get_bits(&s->gb, ff_mba_length[i]); yading@10: s->mb_x= mb_pos % s->mb_width; yading@10: s->mb_y= mb_pos / s->mb_width; yading@10: yading@10: return mb_pos; yading@10: } yading@10: yading@10: /** yading@10: * Decode the group of blocks header or slice header. yading@10: * @return <0 if an error occurred yading@10: */ yading@10: static int h263_decode_gob_header(MpegEncContext *s) yading@10: { yading@10: unsigned int val, gob_number; yading@10: int left; yading@10: yading@10: /* Check for GOB Start Code */ yading@10: val = show_bits(&s->gb, 16); yading@10: if(val) yading@10: return -1; yading@10: yading@10: /* We have a GBSC probably with GSTUFF */ yading@10: skip_bits(&s->gb, 16); /* Drop the zeros */ yading@10: left= get_bits_left(&s->gb); yading@10: //MN: we must check the bits left or we might end in a infinite loop (or segfault) yading@10: for(;left>13; left--){ yading@10: if(get_bits1(&s->gb)) break; /* Seek the '1' bit */ yading@10: } yading@10: if(left<=13) yading@10: return -1; yading@10: yading@10: if(s->h263_slice_structured){ yading@10: if(get_bits1(&s->gb)==0) yading@10: return -1; yading@10: yading@10: ff_h263_decode_mba(s); yading@10: yading@10: if(s->mb_num > 1583) yading@10: if(get_bits1(&s->gb)==0) yading@10: return -1; yading@10: yading@10: s->qscale = get_bits(&s->gb, 5); /* SQUANT */ yading@10: if(get_bits1(&s->gb)==0) yading@10: return -1; yading@10: skip_bits(&s->gb, 2); /* GFID */ yading@10: }else{ yading@10: gob_number = get_bits(&s->gb, 5); /* GN */ yading@10: s->mb_x= 0; yading@10: s->mb_y= s->gob_index* gob_number; yading@10: skip_bits(&s->gb, 2); /* GFID */ yading@10: s->qscale = get_bits(&s->gb, 5); /* GQUANT */ yading@10: } yading@10: yading@10: if(s->mb_y >= s->mb_height) yading@10: return -1; yading@10: yading@10: if(s->qscale==0) yading@10: return -1; yading@10: yading@10: return 0; yading@10: } yading@10: yading@10: /** yading@10: * Find the next resync_marker. yading@10: * @param p pointer to buffer to scan yading@10: * @param end pointer to the end of the buffer yading@10: * @return pointer to the next resync_marker, or end if none was found yading@10: */ yading@10: const uint8_t *ff_h263_find_resync_marker(MpegEncContext *s, const uint8_t *av_restrict p, const uint8_t *av_restrict end) yading@10: { yading@10: av_assert2(p < end); yading@10: yading@10: end-=2; yading@10: p++; yading@10: if(s->resync_marker){ yading@10: int prefix_len = ff_mpeg4_get_video_packet_prefix_length(s); yading@10: for(;p> (23-prefix_len)) == 1)) return p - 1; yading@10: else if (!p[ 1] && ((p[2] >> (23-prefix_len)) == 1)) return p; yading@10: } yading@10: } yading@10: } yading@10: return end+2; yading@10: } yading@10: yading@10: /** yading@10: * Decode the group of blocks / video packet header. yading@10: * @return bit position of the resync_marker, or <0 if none was found yading@10: */ yading@10: int ff_h263_resync(MpegEncContext *s){ yading@10: int left, pos, ret; yading@10: yading@10: if(s->codec_id==AV_CODEC_ID_MPEG4){ yading@10: skip_bits1(&s->gb); yading@10: align_get_bits(&s->gb); yading@10: } yading@10: yading@10: if(show_bits(&s->gb, 16)==0){ yading@10: pos= get_bits_count(&s->gb); yading@10: if(CONFIG_MPEG4_DECODER && s->codec_id==AV_CODEC_ID_MPEG4) yading@10: ret= ff_mpeg4_decode_video_packet_header(s); yading@10: else yading@10: ret= h263_decode_gob_header(s); yading@10: if(ret>=0) yading@10: return pos; yading@10: } yading@10: //OK, it's not where it is supposed to be ... yading@10: s->gb= s->last_resync_gb; yading@10: align_get_bits(&s->gb); yading@10: left= get_bits_left(&s->gb); yading@10: yading@10: for(;left>16+1+5+5; left-=8){ yading@10: if(show_bits(&s->gb, 16)==0){ yading@10: GetBitContext bak= s->gb; yading@10: yading@10: pos= get_bits_count(&s->gb); yading@10: if(CONFIG_MPEG4_DECODER && s->codec_id==AV_CODEC_ID_MPEG4) yading@10: ret= ff_mpeg4_decode_video_packet_header(s); yading@10: else yading@10: ret= h263_decode_gob_header(s); yading@10: if(ret>=0) yading@10: return pos; yading@10: yading@10: s->gb= bak; yading@10: } yading@10: skip_bits(&s->gb, 8); yading@10: } yading@10: yading@10: return -1; yading@10: } yading@10: yading@10: int ff_h263_decode_motion(MpegEncContext * s, int pred, int f_code) yading@10: { yading@10: int code, val, sign, shift; yading@10: code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2); yading@10: yading@10: if (code == 0) yading@10: return pred; yading@10: if (code < 0) yading@10: return 0xffff; yading@10: yading@10: sign = get_bits1(&s->gb); yading@10: shift = f_code - 1; yading@10: val = code; yading@10: if (shift) { yading@10: val = (val - 1) << shift; yading@10: val |= get_bits(&s->gb, shift); yading@10: val++; yading@10: } yading@10: if (sign) yading@10: val = -val; yading@10: val += pred; yading@10: yading@10: /* modulo decoding */ yading@10: if (!s->h263_long_vectors) { yading@10: val = sign_extend(val, 5 + f_code); yading@10: } else { yading@10: /* horrible h263 long vector mode */ yading@10: if (pred < -31 && val < -63) yading@10: val += 64; yading@10: if (pred > 32 && val > 63) yading@10: val -= 64; yading@10: yading@10: } yading@10: return val; yading@10: } yading@10: yading@10: yading@10: /* Decode RVLC of H.263+ UMV */ yading@10: static int h263p_decode_umotion(MpegEncContext * s, int pred) yading@10: { yading@10: int code = 0, sign; yading@10: yading@10: if (get_bits1(&s->gb)) /* Motion difference = 0 */ yading@10: return pred; yading@10: yading@10: code = 2 + get_bits1(&s->gb); yading@10: yading@10: while (get_bits1(&s->gb)) yading@10: { yading@10: code <<= 1; yading@10: code += get_bits1(&s->gb); yading@10: } yading@10: sign = code & 1; yading@10: code >>= 1; yading@10: yading@10: code = (sign) ? (pred - code) : (pred + code); yading@10: av_dlog(s->avctx,"H.263+ UMV Motion = %d\n", code); yading@10: return code; yading@10: yading@10: } yading@10: yading@10: /** yading@10: * read the next MVs for OBMC. yes this is a ugly hack, feel free to send a patch :) yading@10: */ yading@10: static void preview_obmc(MpegEncContext *s){ yading@10: GetBitContext gb= s->gb; yading@10: yading@10: int cbpc, i, pred_x, pred_y, mx, my; yading@10: int16_t *mot_val; yading@10: const int xy= s->mb_x + 1 + s->mb_y * s->mb_stride; yading@10: const int stride= s->b8_stride*2; yading@10: yading@10: for(i=0; i<4; i++) yading@10: s->block_index[i]+= 2; yading@10: for(i=4; i<6; i++) yading@10: s->block_index[i]+= 1; yading@10: s->mb_x++; yading@10: yading@10: av_assert2(s->pict_type == AV_PICTURE_TYPE_P); yading@10: yading@10: do{ yading@10: if (get_bits1(&s->gb)) { yading@10: /* skip mb */ yading@10: mot_val = s->current_picture.motion_val[0][s->block_index[0]]; yading@10: mot_val[0 ]= mot_val[2 ]= yading@10: mot_val[0+stride]= mot_val[2+stride]= 0; yading@10: mot_val[1 ]= mot_val[3 ]= yading@10: mot_val[1+stride]= mot_val[3+stride]= 0; yading@10: yading@10: s->current_picture.mb_type[xy] = MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0; yading@10: goto end; yading@10: } yading@10: cbpc = get_vlc2(&s->gb, ff_h263_inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2); yading@10: }while(cbpc == 20); yading@10: yading@10: if(cbpc & 4){ yading@10: s->current_picture.mb_type[xy] = MB_TYPE_INTRA; yading@10: }else{ yading@10: get_vlc2(&s->gb, ff_h263_cbpy_vlc.table, CBPY_VLC_BITS, 1); yading@10: if (cbpc & 8) { yading@10: if(s->modified_quant){ yading@10: if(get_bits1(&s->gb)) skip_bits(&s->gb, 1); yading@10: else skip_bits(&s->gb, 5); yading@10: }else yading@10: skip_bits(&s->gb, 2); yading@10: } yading@10: yading@10: if ((cbpc & 16) == 0) { yading@10: s->current_picture.mb_type[xy] = MB_TYPE_16x16 | MB_TYPE_L0; yading@10: /* 16x16 motion prediction */ yading@10: mot_val= ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y); yading@10: if (s->umvplus) yading@10: mx = h263p_decode_umotion(s, pred_x); yading@10: else yading@10: mx = ff_h263_decode_motion(s, pred_x, 1); yading@10: yading@10: if (s->umvplus) yading@10: my = h263p_decode_umotion(s, pred_y); yading@10: else yading@10: my = ff_h263_decode_motion(s, pred_y, 1); yading@10: yading@10: mot_val[0 ]= mot_val[2 ]= yading@10: mot_val[0+stride]= mot_val[2+stride]= mx; yading@10: mot_val[1 ]= mot_val[3 ]= yading@10: mot_val[1+stride]= mot_val[3+stride]= my; yading@10: } else { yading@10: s->current_picture.mb_type[xy] = MB_TYPE_8x8 | MB_TYPE_L0; yading@10: for(i=0;i<4;i++) { yading@10: mot_val = ff_h263_pred_motion(s, i, 0, &pred_x, &pred_y); yading@10: if (s->umvplus) yading@10: mx = h263p_decode_umotion(s, pred_x); yading@10: else yading@10: mx = ff_h263_decode_motion(s, pred_x, 1); yading@10: yading@10: if (s->umvplus) yading@10: my = h263p_decode_umotion(s, pred_y); yading@10: else yading@10: my = ff_h263_decode_motion(s, pred_y, 1); yading@10: if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1) yading@10: skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */ yading@10: mot_val[0] = mx; yading@10: mot_val[1] = my; yading@10: } yading@10: } yading@10: } yading@10: end: yading@10: yading@10: for(i=0; i<4; i++) yading@10: s->block_index[i]-= 2; yading@10: for(i=4; i<6; i++) yading@10: s->block_index[i]-= 1; yading@10: s->mb_x--; yading@10: yading@10: s->gb= gb; yading@10: } yading@10: yading@10: static void h263_decode_dquant(MpegEncContext *s){ yading@10: static const int8_t quant_tab[4] = { -1, -2, 1, 2 }; yading@10: yading@10: if(s->modified_quant){ yading@10: if(get_bits1(&s->gb)) yading@10: s->qscale= ff_modified_quant_tab[get_bits1(&s->gb)][ s->qscale ]; yading@10: else yading@10: s->qscale= get_bits(&s->gb, 5); yading@10: }else yading@10: s->qscale += quant_tab[get_bits(&s->gb, 2)]; yading@10: ff_set_qscale(s, s->qscale); yading@10: } yading@10: yading@10: static int h263_decode_block(MpegEncContext * s, int16_t * block, yading@10: int n, int coded) yading@10: { yading@10: int code, level, i, j, last, run; yading@10: RLTable *rl = &ff_h263_rl_inter; yading@10: const uint8_t *scan_table; yading@10: GetBitContext gb= s->gb; yading@10: yading@10: scan_table = s->intra_scantable.permutated; yading@10: if (s->h263_aic && s->mb_intra) { yading@10: rl = &ff_rl_intra_aic; yading@10: i = 0; yading@10: if (s->ac_pred) { yading@10: if (s->h263_aic_dir) yading@10: scan_table = s->intra_v_scantable.permutated; /* left */ yading@10: else yading@10: scan_table = s->intra_h_scantable.permutated; /* top */ yading@10: } yading@10: } else if (s->mb_intra) { yading@10: /* DC coef */ yading@10: if(s->codec_id == AV_CODEC_ID_RV10){ yading@10: #if CONFIG_RV10_DECODER yading@10: if (s->rv10_version == 3 && s->pict_type == AV_PICTURE_TYPE_I) { yading@10: int component, diff; yading@10: component = (n <= 3 ? 0 : n - 4 + 1); yading@10: level = s->last_dc[component]; yading@10: if (s->rv10_first_dc_coded[component]) { yading@10: diff = ff_rv_decode_dc(s, n); yading@10: if (diff == 0xffff) yading@10: return -1; yading@10: level += diff; yading@10: level = level & 0xff; /* handle wrap round */ yading@10: s->last_dc[component] = level; yading@10: } else { yading@10: s->rv10_first_dc_coded[component] = 1; yading@10: } yading@10: } else { yading@10: level = get_bits(&s->gb, 8); yading@10: if (level == 255) yading@10: level = 128; yading@10: } yading@10: #endif yading@10: }else{ yading@10: level = get_bits(&s->gb, 8); yading@10: if((level&0x7F) == 0){ yading@10: av_log(s->avctx, AV_LOG_ERROR, "illegal dc %d at %d %d\n", level, s->mb_x, s->mb_y); yading@10: if(s->err_recognition & (AV_EF_BITSTREAM|AV_EF_COMPLIANT)) yading@10: return -1; yading@10: } yading@10: if (level == 255) yading@10: level = 128; yading@10: } yading@10: block[0] = level; yading@10: i = 1; yading@10: } else { yading@10: i = 0; yading@10: } yading@10: if (!coded) { yading@10: if (s->mb_intra && s->h263_aic) yading@10: goto not_coded; yading@10: s->block_last_index[n] = i - 1; yading@10: return 0; yading@10: } yading@10: retry: yading@10: for(;;) { yading@10: code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2); yading@10: if (code < 0){ yading@10: av_log(s->avctx, AV_LOG_ERROR, "illegal ac vlc code at %dx%d\n", s->mb_x, s->mb_y); yading@10: return -1; yading@10: } yading@10: if (code == rl->n) { yading@10: /* escape */ yading@10: if (CONFIG_FLV_DECODER && s->h263_flv > 1) { yading@10: ff_flv2_decode_ac_esc(&s->gb, &level, &run, &last); yading@10: } else { yading@10: last = get_bits1(&s->gb); yading@10: run = get_bits(&s->gb, 6); yading@10: level = (int8_t)get_bits(&s->gb, 8); yading@10: if(level == -128){ yading@10: if (s->codec_id == AV_CODEC_ID_RV10) { yading@10: /* XXX: should patch encoder too */ yading@10: level = get_sbits(&s->gb, 12); yading@10: }else{ yading@10: level = get_bits(&s->gb, 5); yading@10: level |= get_sbits(&s->gb, 6)<<5; yading@10: } yading@10: } yading@10: } yading@10: } else { yading@10: run = rl->table_run[code]; yading@10: level = rl->table_level[code]; yading@10: last = code >= rl->last; yading@10: if (get_bits1(&s->gb)) yading@10: level = -level; yading@10: } yading@10: i += run; yading@10: if (i >= 64){ yading@10: if(s->alt_inter_vlc && rl == &ff_h263_rl_inter && !s->mb_intra){ yading@10: //Looks like a hack but no, it's the way it is supposed to work ... yading@10: rl = &ff_rl_intra_aic; yading@10: i = 0; yading@10: s->gb= gb; yading@10: s->dsp.clear_block(block); yading@10: goto retry; yading@10: } yading@10: av_log(s->avctx, AV_LOG_ERROR, "run overflow at %dx%d i:%d\n", s->mb_x, s->mb_y, s->mb_intra); yading@10: return -1; yading@10: } yading@10: j = scan_table[i]; yading@10: block[j] = level; yading@10: if (last) yading@10: break; yading@10: i++; yading@10: } yading@10: not_coded: yading@10: if (s->mb_intra && s->h263_aic) { yading@10: ff_h263_pred_acdc(s, block, n); yading@10: i = 63; yading@10: } yading@10: s->block_last_index[n] = i; yading@10: return 0; yading@10: } yading@10: yading@10: static int h263_skip_b_part(MpegEncContext *s, int cbp) yading@10: { yading@10: LOCAL_ALIGNED_16(int16_t, dblock, [64]); yading@10: int i, mbi; yading@10: int bli[6]; yading@10: yading@10: /* we have to set s->mb_intra to zero to decode B-part of PB-frame correctly yading@10: * but real value should be restored in order to be used later (in OBMC condition) yading@10: */ yading@10: mbi = s->mb_intra; yading@10: memcpy(bli, s->block_last_index, sizeof(bli)); yading@10: s->mb_intra = 0; yading@10: for (i = 0; i < 6; i++) { yading@10: if (h263_decode_block(s, dblock, i, cbp&32) < 0) yading@10: return -1; yading@10: cbp+=cbp; yading@10: } yading@10: s->mb_intra = mbi; yading@10: memcpy(s->block_last_index, bli, sizeof(bli)); yading@10: return 0; yading@10: } yading@10: yading@10: static int h263_get_modb(GetBitContext *gb, int pb_frame, int *cbpb) yading@10: { yading@10: int c, mv = 1; yading@10: yading@10: if (pb_frame < 3) { // h.263 Annex G and i263 PB-frame yading@10: c = get_bits1(gb); yading@10: if (pb_frame == 2 && c) yading@10: mv = !get_bits1(gb); yading@10: } else { // h.263 Annex M improved PB-frame yading@10: mv = get_unary(gb, 0, 4) + 1; yading@10: c = mv & 1; yading@10: mv = !!(mv & 2); yading@10: } yading@10: if(c) yading@10: *cbpb = get_bits(gb, 6); yading@10: return mv; yading@10: } yading@10: yading@10: int ff_h263_decode_mb(MpegEncContext *s, yading@10: int16_t block[6][64]) yading@10: { yading@10: int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant; yading@10: int16_t *mot_val; yading@10: const int xy= s->mb_x + s->mb_y * s->mb_stride; yading@10: int cbpb = 0, pb_mv_count = 0; yading@10: yading@10: av_assert2(!s->h263_pred); yading@10: yading@10: if (s->pict_type == AV_PICTURE_TYPE_P) { yading@10: do{ yading@10: if (get_bits1(&s->gb)) { yading@10: /* skip mb */ yading@10: s->mb_intra = 0; yading@10: for(i=0;i<6;i++) yading@10: s->block_last_index[i] = -1; yading@10: s->mv_dir = MV_DIR_FORWARD; yading@10: s->mv_type = MV_TYPE_16X16; yading@10: s->current_picture.mb_type[xy] = MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0; yading@10: s->mv[0][0][0] = 0; yading@10: s->mv[0][0][1] = 0; yading@10: s->mb_skipped = !(s->obmc | s->loop_filter); yading@10: goto end; yading@10: } yading@10: cbpc = get_vlc2(&s->gb, ff_h263_inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2); yading@10: if (cbpc < 0){ yading@10: av_log(s->avctx, AV_LOG_ERROR, "cbpc damaged at %d %d\n", s->mb_x, s->mb_y); yading@10: return -1; yading@10: } yading@10: }while(cbpc == 20); yading@10: yading@10: s->dsp.clear_blocks(s->block[0]); yading@10: yading@10: dquant = cbpc & 8; yading@10: s->mb_intra = ((cbpc & 4) != 0); yading@10: if (s->mb_intra) goto intra; yading@10: yading@10: if(s->pb_frame && get_bits1(&s->gb)) yading@10: pb_mv_count = h263_get_modb(&s->gb, s->pb_frame, &cbpb); yading@10: cbpy = get_vlc2(&s->gb, ff_h263_cbpy_vlc.table, CBPY_VLC_BITS, 1); yading@10: yading@10: if(s->alt_inter_vlc==0 || (cbpc & 3)!=3) yading@10: cbpy ^= 0xF; yading@10: yading@10: cbp = (cbpc & 3) | (cbpy << 2); yading@10: if (dquant) { yading@10: h263_decode_dquant(s); yading@10: } yading@10: yading@10: s->mv_dir = MV_DIR_FORWARD; yading@10: if ((cbpc & 16) == 0) { yading@10: s->current_picture.mb_type[xy] = MB_TYPE_16x16 | MB_TYPE_L0; yading@10: /* 16x16 motion prediction */ yading@10: s->mv_type = MV_TYPE_16X16; yading@10: ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y); yading@10: if (s->umvplus) yading@10: mx = h263p_decode_umotion(s, pred_x); yading@10: else yading@10: mx = ff_h263_decode_motion(s, pred_x, 1); yading@10: yading@10: if (mx >= 0xffff) yading@10: return -1; yading@10: yading@10: if (s->umvplus) yading@10: my = h263p_decode_umotion(s, pred_y); yading@10: else yading@10: my = ff_h263_decode_motion(s, pred_y, 1); yading@10: yading@10: if (my >= 0xffff) yading@10: return -1; yading@10: s->mv[0][0][0] = mx; yading@10: s->mv[0][0][1] = my; yading@10: yading@10: if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1) yading@10: skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */ yading@10: } else { yading@10: s->current_picture.mb_type[xy] = MB_TYPE_8x8 | MB_TYPE_L0; yading@10: s->mv_type = MV_TYPE_8X8; yading@10: for(i=0;i<4;i++) { yading@10: mot_val = ff_h263_pred_motion(s, i, 0, &pred_x, &pred_y); yading@10: if (s->umvplus) yading@10: mx = h263p_decode_umotion(s, pred_x); yading@10: else yading@10: mx = ff_h263_decode_motion(s, pred_x, 1); yading@10: if (mx >= 0xffff) yading@10: return -1; yading@10: yading@10: if (s->umvplus) yading@10: my = h263p_decode_umotion(s, pred_y); yading@10: else yading@10: my = ff_h263_decode_motion(s, pred_y, 1); yading@10: if (my >= 0xffff) yading@10: return -1; yading@10: s->mv[0][i][0] = mx; yading@10: s->mv[0][i][1] = my; yading@10: if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1) yading@10: skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */ yading@10: mot_val[0] = mx; yading@10: mot_val[1] = my; yading@10: } yading@10: } yading@10: } else if(s->pict_type==AV_PICTURE_TYPE_B) { yading@10: int mb_type; yading@10: const int stride= s->b8_stride; yading@10: int16_t *mot_val0 = s->current_picture.motion_val[0][2 * (s->mb_x + s->mb_y * stride)]; yading@10: int16_t *mot_val1 = s->current_picture.motion_val[1][2 * (s->mb_x + s->mb_y * stride)]; yading@10: // const int mv_xy= s->mb_x + 1 + s->mb_y * s->mb_stride; yading@10: yading@10: //FIXME ugly yading@10: mot_val0[0 ]= mot_val0[2 ]= mot_val0[0+2*stride]= mot_val0[2+2*stride]= yading@10: mot_val0[1 ]= mot_val0[3 ]= mot_val0[1+2*stride]= mot_val0[3+2*stride]= yading@10: mot_val1[0 ]= mot_val1[2 ]= mot_val1[0+2*stride]= mot_val1[2+2*stride]= yading@10: mot_val1[1 ]= mot_val1[3 ]= mot_val1[1+2*stride]= mot_val1[3+2*stride]= 0; yading@10: yading@10: do{ yading@10: mb_type= get_vlc2(&s->gb, h263_mbtype_b_vlc.table, H263_MBTYPE_B_VLC_BITS, 2); yading@10: if (mb_type < 0){ yading@10: av_log(s->avctx, AV_LOG_ERROR, "b mb_type damaged at %d %d\n", s->mb_x, s->mb_y); yading@10: return -1; yading@10: } yading@10: yading@10: mb_type= h263_mb_type_b_map[ mb_type ]; yading@10: }while(!mb_type); yading@10: yading@10: s->mb_intra = IS_INTRA(mb_type); yading@10: if(HAS_CBP(mb_type)){ yading@10: s->dsp.clear_blocks(s->block[0]); yading@10: cbpc = get_vlc2(&s->gb, cbpc_b_vlc.table, CBPC_B_VLC_BITS, 1); yading@10: if(s->mb_intra){ yading@10: dquant = IS_QUANT(mb_type); yading@10: goto intra; yading@10: } yading@10: yading@10: cbpy = get_vlc2(&s->gb, ff_h263_cbpy_vlc.table, CBPY_VLC_BITS, 1); yading@10: yading@10: if (cbpy < 0){ yading@10: av_log(s->avctx, AV_LOG_ERROR, "b cbpy damaged at %d %d\n", s->mb_x, s->mb_y); yading@10: return -1; yading@10: } yading@10: yading@10: if(s->alt_inter_vlc==0 || (cbpc & 3)!=3) yading@10: cbpy ^= 0xF; yading@10: yading@10: cbp = (cbpc & 3) | (cbpy << 2); yading@10: }else yading@10: cbp=0; yading@10: yading@10: av_assert2(!s->mb_intra); yading@10: yading@10: if(IS_QUANT(mb_type)){ yading@10: h263_decode_dquant(s); yading@10: } yading@10: yading@10: if(IS_DIRECT(mb_type)){ yading@10: s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT; yading@10: mb_type |= ff_mpeg4_set_direct_mv(s, 0, 0); yading@10: }else{ yading@10: s->mv_dir = 0; yading@10: s->mv_type= MV_TYPE_16X16; yading@10: //FIXME UMV yading@10: yading@10: if(USES_LIST(mb_type, 0)){ yading@10: int16_t *mot_val= ff_h263_pred_motion(s, 0, 0, &mx, &my); yading@10: s->mv_dir = MV_DIR_FORWARD; yading@10: yading@10: mx = ff_h263_decode_motion(s, mx, 1); yading@10: my = ff_h263_decode_motion(s, my, 1); yading@10: yading@10: s->mv[0][0][0] = mx; yading@10: s->mv[0][0][1] = my; yading@10: mot_val[0 ]= mot_val[2 ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx; yading@10: mot_val[1 ]= mot_val[3 ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my; yading@10: } yading@10: yading@10: if(USES_LIST(mb_type, 1)){ yading@10: int16_t *mot_val= ff_h263_pred_motion(s, 0, 1, &mx, &my); yading@10: s->mv_dir |= MV_DIR_BACKWARD; yading@10: yading@10: mx = ff_h263_decode_motion(s, mx, 1); yading@10: my = ff_h263_decode_motion(s, my, 1); yading@10: yading@10: s->mv[1][0][0] = mx; yading@10: s->mv[1][0][1] = my; yading@10: mot_val[0 ]= mot_val[2 ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx; yading@10: mot_val[1 ]= mot_val[3 ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my; yading@10: } yading@10: } yading@10: yading@10: s->current_picture.mb_type[xy] = mb_type; yading@10: } else { /* I-Frame */ yading@10: do{ yading@10: cbpc = get_vlc2(&s->gb, ff_h263_intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2); yading@10: if (cbpc < 0){ yading@10: av_log(s->avctx, AV_LOG_ERROR, "I cbpc damaged at %d %d\n", s->mb_x, s->mb_y); yading@10: return -1; yading@10: } yading@10: }while(cbpc == 8); yading@10: yading@10: s->dsp.clear_blocks(s->block[0]); yading@10: yading@10: dquant = cbpc & 4; yading@10: s->mb_intra = 1; yading@10: intra: yading@10: s->current_picture.mb_type[xy] = MB_TYPE_INTRA; yading@10: if (s->h263_aic) { yading@10: s->ac_pred = get_bits1(&s->gb); yading@10: if(s->ac_pred){ yading@10: s->current_picture.mb_type[xy] = MB_TYPE_INTRA | MB_TYPE_ACPRED; yading@10: yading@10: s->h263_aic_dir = get_bits1(&s->gb); yading@10: } yading@10: }else yading@10: s->ac_pred = 0; yading@10: yading@10: if(s->pb_frame && get_bits1(&s->gb)) yading@10: pb_mv_count = h263_get_modb(&s->gb, s->pb_frame, &cbpb); yading@10: cbpy = get_vlc2(&s->gb, ff_h263_cbpy_vlc.table, CBPY_VLC_BITS, 1); yading@10: if(cbpy<0){ yading@10: av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y); yading@10: return -1; yading@10: } yading@10: cbp = (cbpc & 3) | (cbpy << 2); yading@10: if (dquant) { yading@10: h263_decode_dquant(s); yading@10: } yading@10: yading@10: pb_mv_count += !!s->pb_frame; yading@10: } yading@10: yading@10: while(pb_mv_count--){ yading@10: ff_h263_decode_motion(s, 0, 1); yading@10: ff_h263_decode_motion(s, 0, 1); yading@10: } yading@10: yading@10: /* decode each block */ yading@10: for (i = 0; i < 6; i++) { yading@10: if (h263_decode_block(s, block[i], i, cbp&32) < 0) yading@10: return -1; yading@10: cbp+=cbp; yading@10: } yading@10: yading@10: if(s->pb_frame && h263_skip_b_part(s, cbpb) < 0) yading@10: return -1; yading@10: if(s->obmc && !s->mb_intra){ yading@10: if(s->pict_type == AV_PICTURE_TYPE_P && s->mb_x+1mb_width && s->mb_num_left != 1) yading@10: preview_obmc(s); yading@10: } yading@10: end: yading@10: yading@10: /* per-MB end of slice check */ yading@10: { yading@10: int v= show_bits(&s->gb, 16); yading@10: yading@10: if (get_bits_left(&s->gb) < 16) { yading@10: v >>= 16 - get_bits_left(&s->gb); yading@10: } yading@10: yading@10: if(v==0) yading@10: return SLICE_END; yading@10: } yading@10: yading@10: return SLICE_OK; yading@10: } yading@10: yading@10: /* most is hardcoded. should extend to handle all h263 streams */ yading@10: int ff_h263_decode_picture_header(MpegEncContext *s) yading@10: { yading@10: int format, width, height, i; yading@10: uint32_t startcode; yading@10: yading@10: align_get_bits(&s->gb); yading@10: yading@10: startcode= get_bits(&s->gb, 22-8); yading@10: yading@10: for(i= get_bits_left(&s->gb); i>24; i-=8) { yading@10: startcode = ((startcode << 8) | get_bits(&s->gb, 8)) & 0x003FFFFF; yading@10: yading@10: if(startcode == 0x20) yading@10: break; yading@10: } yading@10: yading@10: if (startcode != 0x20) { yading@10: av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n"); yading@10: return -1; yading@10: } yading@10: /* temporal reference */ yading@10: i = get_bits(&s->gb, 8); /* picture timestamp */ yading@10: if( (s->picture_number&~0xFF)+i < s->picture_number) yading@10: i+= 256; yading@10: s->current_picture_ptr->f.pts = yading@10: s->picture_number= (s->picture_number&~0xFF) + i; yading@10: yading@10: /* PTYPE starts here */ yading@10: if (get_bits1(&s->gb) != 1) { yading@10: /* marker */ yading@10: av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n"); yading@10: return -1; yading@10: } yading@10: if (get_bits1(&s->gb) != 0) { yading@10: av_log(s->avctx, AV_LOG_ERROR, "Bad H263 id\n"); yading@10: return -1; /* h263 id */ yading@10: } yading@10: skip_bits1(&s->gb); /* split screen off */ yading@10: skip_bits1(&s->gb); /* camera off */ yading@10: skip_bits1(&s->gb); /* freeze picture release off */ yading@10: yading@10: format = get_bits(&s->gb, 3); yading@10: /* yading@10: 0 forbidden yading@10: 1 sub-QCIF yading@10: 10 QCIF yading@10: 7 extended PTYPE (PLUSPTYPE) yading@10: */ yading@10: yading@10: if (format != 7 && format != 6) { yading@10: s->h263_plus = 0; yading@10: /* H.263v1 */ yading@10: width = ff_h263_format[format][0]; yading@10: height = ff_h263_format[format][1]; yading@10: if (!width) yading@10: return -1; yading@10: yading@10: s->pict_type = AV_PICTURE_TYPE_I + get_bits1(&s->gb); yading@10: yading@10: s->h263_long_vectors = get_bits1(&s->gb); yading@10: yading@10: if (get_bits1(&s->gb) != 0) { yading@10: av_log(s->avctx, AV_LOG_ERROR, "H263 SAC not supported\n"); yading@10: return -1; /* SAC: off */ yading@10: } yading@10: s->obmc= get_bits1(&s->gb); /* Advanced prediction mode */ yading@10: s->unrestricted_mv = s->h263_long_vectors || s->obmc; yading@10: yading@10: s->pb_frame = get_bits1(&s->gb); yading@10: s->chroma_qscale= s->qscale = get_bits(&s->gb, 5); yading@10: skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */ yading@10: yading@10: s->width = width; yading@10: s->height = height; yading@10: s->avctx->sample_aspect_ratio= (AVRational){12,11}; yading@10: s->avctx->time_base= (AVRational){1001, 30000}; yading@10: } else { yading@10: int ufep; yading@10: yading@10: /* H.263v2 */ yading@10: s->h263_plus = 1; yading@10: ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */ yading@10: yading@10: /* ufep other than 0 and 1 are reserved */ yading@10: if (ufep == 1) { yading@10: /* OPPTYPE */ yading@10: format = get_bits(&s->gb, 3); yading@10: av_dlog(s->avctx, "ufep=1, format: %d\n", format); yading@10: s->custom_pcf= get_bits1(&s->gb); yading@10: s->umvplus = get_bits1(&s->gb); /* Unrestricted Motion Vector */ yading@10: if (get_bits1(&s->gb) != 0) { yading@10: av_log(s->avctx, AV_LOG_ERROR, "Syntax-based Arithmetic Coding (SAC) not supported\n"); yading@10: } yading@10: s->obmc= get_bits1(&s->gb); /* Advanced prediction mode */ yading@10: s->h263_aic = get_bits1(&s->gb); /* Advanced Intra Coding (AIC) */ yading@10: s->loop_filter= get_bits1(&s->gb); yading@10: s->unrestricted_mv = s->umvplus || s->obmc || s->loop_filter; yading@10: if(s->avctx->lowres) yading@10: s->loop_filter = 0; yading@10: yading@10: s->h263_slice_structured= get_bits1(&s->gb); yading@10: if (get_bits1(&s->gb) != 0) { yading@10: av_log(s->avctx, AV_LOG_ERROR, "Reference Picture Selection not supported\n"); yading@10: } yading@10: if (get_bits1(&s->gb) != 0) { yading@10: av_log(s->avctx, AV_LOG_ERROR, "Independent Segment Decoding not supported\n"); yading@10: } yading@10: s->alt_inter_vlc= get_bits1(&s->gb); yading@10: s->modified_quant= get_bits1(&s->gb); yading@10: if(s->modified_quant) yading@10: s->chroma_qscale_table= ff_h263_chroma_qscale_table; yading@10: yading@10: skip_bits(&s->gb, 1); /* Prevent start code emulation */ yading@10: yading@10: skip_bits(&s->gb, 3); /* Reserved */ yading@10: } else if (ufep != 0) { yading@10: av_log(s->avctx, AV_LOG_ERROR, "Bad UFEP type (%d)\n", ufep); yading@10: return -1; yading@10: } yading@10: yading@10: /* MPPTYPE */ yading@10: s->pict_type = get_bits(&s->gb, 3); yading@10: switch(s->pict_type){ yading@10: case 0: s->pict_type= AV_PICTURE_TYPE_I;break; yading@10: case 1: s->pict_type= AV_PICTURE_TYPE_P;break; yading@10: case 2: s->pict_type= AV_PICTURE_TYPE_P;s->pb_frame = 3;break; yading@10: case 3: s->pict_type= AV_PICTURE_TYPE_B;break; yading@10: case 7: s->pict_type= AV_PICTURE_TYPE_I;break; //ZYGO yading@10: default: yading@10: return -1; yading@10: } yading@10: skip_bits(&s->gb, 2); yading@10: s->no_rounding = get_bits1(&s->gb); yading@10: skip_bits(&s->gb, 4); yading@10: yading@10: /* Get the picture dimensions */ yading@10: if (ufep) { yading@10: if (format == 6) { yading@10: /* Custom Picture Format (CPFMT) */ yading@10: s->aspect_ratio_info = get_bits(&s->gb, 4); yading@10: av_dlog(s->avctx, "aspect: %d\n", s->aspect_ratio_info); yading@10: /* aspect ratios: yading@10: 0 - forbidden yading@10: 1 - 1:1 yading@10: 2 - 12:11 (CIF 4:3) yading@10: 3 - 10:11 (525-type 4:3) yading@10: 4 - 16:11 (CIF 16:9) yading@10: 5 - 40:33 (525-type 16:9) yading@10: 6-14 - reserved yading@10: */ yading@10: width = (get_bits(&s->gb, 9) + 1) * 4; yading@10: skip_bits1(&s->gb); yading@10: height = get_bits(&s->gb, 9) * 4; yading@10: av_dlog(s->avctx, "\nH.263+ Custom picture: %dx%d\n",width,height); yading@10: if (s->aspect_ratio_info == FF_ASPECT_EXTENDED) { yading@10: /* aspected dimensions */ yading@10: s->avctx->sample_aspect_ratio.num= get_bits(&s->gb, 8); yading@10: s->avctx->sample_aspect_ratio.den= get_bits(&s->gb, 8); yading@10: }else{ yading@10: s->avctx->sample_aspect_ratio= ff_h263_pixel_aspect[s->aspect_ratio_info]; yading@10: } yading@10: } else { yading@10: width = ff_h263_format[format][0]; yading@10: height = ff_h263_format[format][1]; yading@10: s->avctx->sample_aspect_ratio= (AVRational){12,11}; yading@10: } yading@10: if ((width == 0) || (height == 0)) yading@10: return -1; yading@10: s->width = width; yading@10: s->height = height; yading@10: yading@10: if(s->custom_pcf){ yading@10: int gcd; yading@10: s->avctx->time_base.den= 1800000; yading@10: s->avctx->time_base.num= 1000 + get_bits1(&s->gb); yading@10: s->avctx->time_base.num*= get_bits(&s->gb, 7); yading@10: if(s->avctx->time_base.num == 0){ yading@10: av_log(s, AV_LOG_ERROR, "zero framerate\n"); yading@10: return -1; yading@10: } yading@10: gcd= av_gcd(s->avctx->time_base.den, s->avctx->time_base.num); yading@10: s->avctx->time_base.den /= gcd; yading@10: s->avctx->time_base.num /= gcd; yading@10: }else{ yading@10: s->avctx->time_base= (AVRational){1001, 30000}; yading@10: } yading@10: } yading@10: yading@10: if(s->custom_pcf){ yading@10: skip_bits(&s->gb, 2); //extended Temporal reference yading@10: } yading@10: yading@10: if (ufep) { yading@10: if (s->umvplus) { yading@10: if(get_bits1(&s->gb)==0) /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */ yading@10: skip_bits1(&s->gb); yading@10: } yading@10: if(s->h263_slice_structured){ yading@10: if (get_bits1(&s->gb) != 0) { yading@10: av_log(s->avctx, AV_LOG_ERROR, "rectangular slices not supported\n"); yading@10: } yading@10: if (get_bits1(&s->gb) != 0) { yading@10: av_log(s->avctx, AV_LOG_ERROR, "unordered slices not supported\n"); yading@10: } yading@10: } yading@10: } yading@10: yading@10: s->qscale = get_bits(&s->gb, 5); yading@10: } yading@10: yading@10: if (s->width == 0 || s->height == 0) { yading@10: av_log(s->avctx, AV_LOG_ERROR, "dimensions 0\n"); yading@10: return -1; yading@10: } yading@10: s->mb_width = (s->width + 15) / 16; yading@10: s->mb_height = (s->height + 15) / 16; yading@10: s->mb_num = s->mb_width * s->mb_height; yading@10: yading@10: if (s->pb_frame) { yading@10: skip_bits(&s->gb, 3); /* Temporal reference for B-pictures */ yading@10: if (s->custom_pcf) yading@10: skip_bits(&s->gb, 2); //extended Temporal reference yading@10: skip_bits(&s->gb, 2); /* Quantization information for B-pictures */ yading@10: } yading@10: yading@10: if (s->pict_type!=AV_PICTURE_TYPE_B) { yading@10: s->time = s->picture_number; yading@10: s->pp_time = s->time - s->last_non_b_time; yading@10: s->last_non_b_time = s->time; yading@10: }else{ yading@10: s->time = s->picture_number; yading@10: s->pb_time = s->pp_time - (s->last_non_b_time - s->time); yading@10: if (s->pp_time <=s->pb_time || yading@10: s->pp_time <= s->pp_time - s->pb_time || yading@10: s->pp_time <= 0){ yading@10: s->pp_time = 2; yading@10: s->pb_time = 1; yading@10: } yading@10: ff_mpeg4_init_direct_mv(s); yading@10: } yading@10: yading@10: /* PEI */ yading@10: while (get_bits1(&s->gb) != 0) { yading@10: skip_bits(&s->gb, 8); yading@10: } yading@10: yading@10: if(s->h263_slice_structured){ yading@10: if (get_bits1(&s->gb) != 1) { yading@10: av_log(s->avctx, AV_LOG_ERROR, "SEPB1 marker missing\n"); yading@10: return -1; yading@10: } yading@10: yading@10: ff_h263_decode_mba(s); yading@10: yading@10: if (get_bits1(&s->gb) != 1) { yading@10: av_log(s->avctx, AV_LOG_ERROR, "SEPB2 marker missing\n"); yading@10: return -1; yading@10: } yading@10: } yading@10: s->f_code = 1; yading@10: yading@10: if(s->h263_aic){ yading@10: s->y_dc_scale_table= yading@10: s->c_dc_scale_table= ff_aic_dc_scale_table; yading@10: }else{ yading@10: s->y_dc_scale_table= yading@10: s->c_dc_scale_table= ff_mpeg1_dc_scale_table; yading@10: } yading@10: yading@10: ff_h263_show_pict_info(s); yading@10: if (s->pict_type == AV_PICTURE_TYPE_I && s->codec_tag == AV_RL32("ZYGO") && get_bits_left(&s->gb) >= 85 + 13*3*16 + 50){ yading@10: int i,j; yading@10: for(i=0; i<85; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb)); yading@10: av_log(s->avctx, AV_LOG_DEBUG, "\n"); yading@10: for(i=0; i<13; i++){ yading@10: for(j=0; j<3; j++){ yading@10: int v= get_bits(&s->gb, 8); yading@10: v |= get_sbits(&s->gb, 8)<<8; yading@10: av_log(s->avctx, AV_LOG_DEBUG, " %5d", v); yading@10: } yading@10: av_log(s->avctx, AV_LOG_DEBUG, "\n"); yading@10: } yading@10: for(i=0; i<50; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb)); yading@10: } yading@10: yading@10: return 0; yading@10: }