X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fvc1dec.c;h=5f27b3cc53787e0b8fb0f7f1a3858fac52656c0b;hb=5f000d5f386601e2316a243c3e41536dfbbccf4d;hp=5d4dd0633b85c1deb166ebb9ac2789b1621f9d22;hpb=b761659befa6b8d3a238527b31df9ad7c80ce911;p=ffmpeg diff --git a/libavcodec/vc1dec.c b/libavcodec/vc1dec.c index 5d4dd0633b8..5f27b3cc537 100644 --- a/libavcodec/vc1dec.c +++ b/libavcodec/vc1dec.c @@ -124,10 +124,6 @@ static int vc1_init_common(VC1Context *v) &vc1_ac_tables[i][0][1], 8, 4, &vc1_ac_tables[i][0][0], 8, 4, INIT_VLC_USE_NEW_STATIC); } - //FIXME: switching to INIT_VLC_STATIC() results in incorrect decoding - init_vlc(&ff_msmp4_mb_i_vlc, MB_INTRA_VLC_BITS, 64, - &ff_msmp4_mb_i_table[0][1], 4, 2, - &ff_msmp4_mb_i_table[0][0], 4, 2, INIT_VLC_USE_STATIC); done = 1; } @@ -860,8 +856,8 @@ static void vc1_interp_mc(VC1Context *v) } if(v->rangeredfrm - || (unsigned)src_x > s->h_edge_pos - (mx&3) - 16 - s->mspel*3 - || (unsigned)src_y > s->v_edge_pos - (my&3) - 16 - s->mspel*3){ + || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 16 - s->mspel*3 + || (unsigned)(src_y - s->mspel) > s->v_edge_pos - (my&3) - 16 - s->mspel*3){ uint8_t *uvbuf= s->edge_emu_buffer + 19 * s->linesize; srcY -= s->mspel * (1 + s->linesize); @@ -1800,6 +1796,8 @@ static int vc1_decode_intra_block(VC1Context *v, DCTELEM block[64], int n, int c int scale; int q1, q2 = 0; + s->dsp.clear_block(block); + /* XXX: Guard against dumb values of mquant */ mquant = (mquant < 1) ? 0 : ( (mquant>31) ? 31 : mquant ); @@ -1989,6 +1987,8 @@ static int vc1_decode_p_block(VC1Context *v, DCTELEM block[64], int n, int mquan int ttblk = ttmb & 7; int pat = 0; + s->dsp.clear_block(block); + if(ttmb == -1) { ttblk = ff_vc1_ttblk_to_tt[v->tt_index][get_vlc2(gb, ff_vc1_ttblk_vlc[v->tt_index].table, VC1_TTBLK_VLC_BITS, 1)]; } @@ -2028,8 +2028,12 @@ static int vc1_decode_p_block(VC1Context *v, DCTELEM block[64], int n, int mquan block[idx] += (block[idx] < 0) ? -mquant : mquant; } if(!skip_block){ - s->dsp.vc1_inv_trans_8x8(block); - s->dsp.add_pixels_clamped(block, dst, linesize); + if(i==1) + s->dsp.vc1_inv_trans_8x8_dc(dst, linesize, block); + else{ + s->dsp.vc1_inv_trans_8x8(block); + s->dsp.add_pixels_clamped(block, dst, linesize); + } if(apply_filter && cbp_top & 0xC) s->dsp.vc1_v_loop_filter8(dst, linesize, v->pq); if(apply_filter && cbp_left & 0xA) @@ -2053,7 +2057,10 @@ static int vc1_decode_p_block(VC1Context *v, DCTELEM block[64], int n, int mquan block[idx + off] += (block[idx + off] < 0) ? -mquant : mquant; } if(!(subblkpat & (1 << (3 - j))) && !skip_block){ - s->dsp.vc1_inv_trans_4x4(dst + (j&1)*4 + (j&2)*2*linesize, linesize, block + off); + if(i==1) + s->dsp.vc1_inv_trans_4x4_dc(dst + (j&1)*4 + (j&2)*2*linesize, linesize, block + off); + else + s->dsp.vc1_inv_trans_4x4(dst + (j&1)*4 + (j&2)*2*linesize, linesize, block + off); if(apply_filter && (j&2 ? pat & (1<<(j-2)) : (cbp_top & (1 << (j + 2))))) s->dsp.vc1_v_loop_filter4(dst + (j&1)*4 + (j&2)*2*linesize, linesize, v->pq); if(apply_filter && (j&1 ? pat & (1<<(j-1)) : (cbp_left & (1 << (j + 1))))) @@ -2078,7 +2085,10 @@ static int vc1_decode_p_block(VC1Context *v, DCTELEM block[64], int n, int mquan block[idx] += (block[idx] < 0) ? -mquant : mquant; } if(!(subblkpat & (1 << (1 - j))) && !skip_block){ - s->dsp.vc1_inv_trans_8x4(dst + j*4*linesize, linesize, block + off); + if(i==1) + s->dsp.vc1_inv_trans_8x4_dc(dst + j*4*linesize, linesize, block + off); + else + s->dsp.vc1_inv_trans_8x4(dst + j*4*linesize, linesize, block + off); if(apply_filter && j ? pat & 0x3 : (cbp_top & 0xC)) s->dsp.vc1_v_loop_filter8(dst + j*4*linesize, linesize, v->pq); if(apply_filter && cbp_left & (2 << j)) @@ -2103,7 +2113,10 @@ static int vc1_decode_p_block(VC1Context *v, DCTELEM block[64], int n, int mquan block[idx] += (block[idx] < 0) ? -mquant : mquant; } if(!(subblkpat & (1 << (1 - j))) && !skip_block){ - s->dsp.vc1_inv_trans_4x8(dst + j*4, linesize, block + off); + if(i==1) + s->dsp.vc1_inv_trans_4x8_dc(dst + j*4, linesize, block + off); + else + s->dsp.vc1_inv_trans_4x8(dst + j*4, linesize, block + off); if(apply_filter && cbp_top & (2 << j)) s->dsp.vc1_v_loop_filter4(dst + j*4, linesize, v->pq); if(apply_filter && j ? pat & 0x5 : (cbp_left & 0xA)) @@ -2153,8 +2166,6 @@ static int vc1_decode_p_mb(VC1Context *v) else skipped = v->s.mbskip_table[mb_pos]; - s->dsp.clear_blocks(s->block[0]); - apply_loop_filter = s->loop_filter && !(s->avctx->skip_loop_filter >= AVDISCARD_NONKEY); if (!fourmv) /* 1MV mode */ { @@ -2446,7 +2457,6 @@ static void vc1_decode_b_mb(VC1Context *v) else skipped = v->s.mbskip_table[mb_pos]; - s->dsp.clear_blocks(s->block[0]); dmv_x[0] = dmv_x[1] = dmv_y[0] = dmv_y[1] = 0; for(i = 0; i < 6; i++) { v->mb_type[0][s->block_index[i]] = 0; @@ -2603,8 +2613,9 @@ static void vc1_decode_i_blocks(VC1Context *v) s->mb_intra = 1; s->first_slice_line = 1; for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) { - for(s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) { - ff_init_block_index(s); + s->mb_x = 0; + ff_init_block_index(s); + for(; s->mb_x < s->mb_width; s->mb_x++) { ff_update_block_index(s); s->dsp.clear_blocks(s->block[0]); mb_pos = s->mb_x + s->mb_y * s->mb_width; @@ -2716,8 +2727,9 @@ static void vc1_decode_i_blocks_adv(VC1Context *v) s->mb_intra = 1; s->first_slice_line = 1; for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) { - for(s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) { - ff_init_block_index(s); + s->mb_x = 0; + ff_init_block_index(s); + for(;s->mb_x < s->mb_width; s->mb_x++) { ff_update_block_index(s); s->dsp.clear_blocks(s->block[0]); mb_pos = s->mb_x + s->mb_y * s->mb_stride; @@ -2835,10 +2847,10 @@ static void vc1_decode_p_blocks(VC1Context *v) s->first_slice_line = 1; memset(v->cbp_base, 0, sizeof(v->cbp_base[0])*2*s->mb_stride); for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) { - for(s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) { - ff_init_block_index(s); + s->mb_x = 0; + ff_init_block_index(s); + for(; s->mb_x < s->mb_width; s->mb_x++) { ff_update_block_index(s); - s->dsp.clear_blocks(s->block[0]); vc1_decode_p_mb(v); if(get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) { @@ -2885,10 +2897,10 @@ static void vc1_decode_b_blocks(VC1Context *v) s->first_slice_line = 1; for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) { - for(s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) { - ff_init_block_index(s); + s->mb_x = 0; + ff_init_block_index(s); + for(; s->mb_x < s->mb_width; s->mb_x++) { ff_update_block_index(s); - s->dsp.clear_blocks(s->block[0]); vc1_decode_b_mb(v); if(get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) { @@ -2984,6 +2996,8 @@ static av_cold int vc1_decode_init(AVCodecContext *avctx) if(ff_h263_decode_init(avctx) < 0) return -1; if (vc1_init_common(v) < 0) return -1; + // only for ff_msmp4_mb_i_table + if (ff_msmpeg4_decode_init(s) < 0) return -1; avctx->coded_width = avctx->width; avctx->coded_height = avctx->height; @@ -3025,7 +3039,7 @@ static av_cold int vc1_decode_init(AVCodecContext *avctx) } buf2 = av_mallocz(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); - if(start[0]) start++; // in WVC1 extradata first byte is its size + start = find_next_marker(start, end); // in WVC1 extradata first byte is its size, but can be 0 in mkv next = start; for(; next < end; start = next){ next = find_next_marker(start + 4, end); @@ -3177,6 +3191,8 @@ static int vc1_decode_frame(AVCodecContext *avctx, buf_size2 = vc1_unescape_buffer(buf, divider - buf, buf2); // TODO + if(!v->warn_interlaced++) + av_log(v->s.avctx, AV_LOG_ERROR, "Interlaced WVC1 support is not implemented\n"); av_free(buf2);return -1; }else{ buf_size2 = vc1_unescape_buffer(buf, buf_size, buf2); @@ -3240,7 +3256,7 @@ static int vc1_decode_frame(AVCodecContext *avctx, s->me.qpel_put= s->dsp.put_qpel_pixels_tab; s->me.qpel_avg= s->dsp.avg_qpel_pixels_tab; - if ((CONFIG_VC1_VDPAU_DECODER || CONFIG_WMV3_VDPAU_DECODER) + if ((CONFIG_VC1_VDPAU_DECODER) &&s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU) ff_vdpau_vc1_decode_picture(s, buf_start, (buf + buf_size) - buf_start); else if (avctx->hwaccel) { @@ -3317,6 +3333,7 @@ AVCodec vc1_decoder = { .pix_fmts = ff_hwaccel_pixfmt_list_420 }; +#if CONFIG_WMV3_DECODER AVCodec wmv3_decoder = { "wmv3", CODEC_TYPE_VIDEO, @@ -3331,6 +3348,7 @@ AVCodec wmv3_decoder = { .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9"), .pix_fmts = ff_hwaccel_pixfmt_list_420 }; +#endif #if CONFIG_WMV3_VDPAU_DECODER AVCodec wmv3_vdpau_decoder = { @@ -3345,7 +3363,7 @@ AVCodec wmv3_vdpau_decoder = { CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU, NULL, .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9 VDPAU"), - .pix_fmts = (enum PixelFormat[]){PIX_FMT_VDPAU_WMV3, PIX_FMT_NONE} + .pix_fmts = (const enum PixelFormat[]){PIX_FMT_VDPAU_WMV3, PIX_FMT_NONE} }; #endif @@ -3362,6 +3380,6 @@ AVCodec vc1_vdpau_decoder = { CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU, NULL, .long_name = NULL_IF_CONFIG_SMALL("SMPTE VC-1 VDPAU"), - .pix_fmts = (enum PixelFormat[]){PIX_FMT_VDPAU_VC1, PIX_FMT_NONE} + .pix_fmts = (const enum PixelFormat[]){PIX_FMT_VDPAU_VC1, PIX_FMT_NONE} }; #endif