*/
/**
- * @file libavcodec/vc1dec.c
+ * @file
* VC-1 and WMV3 decoder
*
*/
#include "dsputil.h"
#include "avcodec.h"
#include "mpegvideo.h"
+#include "h263.h"
#include "vc1.h"
#include "vc1data.h"
#include "vc1acdata.h"
static void vc1_loop_filter_iblk(MpegEncContext *s, int pq)
{
- int i, j;
- if(!s->first_slice_line)
+ int j;
+ if (!s->first_slice_line) {
s->dsp.vc1_v_loop_filter16(s->dest[0], s->linesize, pq);
- s->dsp.vc1_v_loop_filter16(s->dest[0] + 8*s->linesize, s->linesize, pq);
- for(i = !s->mb_x*8; i < 16; i += 8)
- s->dsp.vc1_h_loop_filter16(s->dest[0] + i, s->linesize, pq);
- for(j = 0; j < 2; j++){
- if(!s->first_slice_line)
+ if (s->mb_x)
+ s->dsp.vc1_h_loop_filter16(s->dest[0] - 16*s->linesize, s->linesize, pq);
+ s->dsp.vc1_h_loop_filter16(s->dest[0] - 16*s->linesize+8, s->linesize, pq);
+ for(j = 0; j < 2; j++){
s->dsp.vc1_v_loop_filter8(s->dest[j+1], s->uvlinesize, pq);
- if(s->mb_x)
- s->dsp.vc1_h_loop_filter8(s->dest[j+1], s->uvlinesize, pq);
+ if (s->mb_x)
+ s->dsp.vc1_h_loop_filter8(s->dest[j+1]-8*s->uvlinesize, s->uvlinesize, pq);
+ }
+ }
+ s->dsp.vc1_v_loop_filter16(s->dest[0] + 8*s->linesize, s->linesize, pq);
+
+ if (s->mb_y == s->mb_height-1) {
+ if (s->mb_x) {
+ s->dsp.vc1_h_loop_filter16(s->dest[0], s->linesize, pq);
+ s->dsp.vc1_h_loop_filter8(s->dest[1], s->uvlinesize, pq);
+ s->dsp.vc1_h_loop_filter8(s->dest[2], s->uvlinesize, pq);
+ }
+ s->dsp.vc1_h_loop_filter16(s->dest[0] + 8, s->linesize, pq);
}
}
{
int last = 0, skip, value;
- const int8_t *zz_table;
+ const uint8_t *zz_table;
int scale;
int k;
if(coded) {
int last = 0, skip, value;
- const int8_t *zz_table;
+ const uint8_t *zz_table;
int k;
if(v->s.ac_pred) {
if(coded) {
int last = 0, skip, value;
- const int8_t *zz_table;
+ const uint8_t *zz_table;
int k;
zz_table = wmv1_scantable[0];
if(ttblk == TT_4X4) {
subblkpat = ~(get_vlc2(gb, ff_vc1_subblkpat_vlc[v->tt_index].table, VC1_SUBBLKPAT_VLC_BITS, 1) + 1);
}
- if((ttblk != TT_8X8 && ttblk != TT_4X4) && (v->ttmbf || (ttmb != -1 && (ttmb & 8) && !first_block))) {
+ if((ttblk != TT_8X8 && ttblk != TT_4X4)
+ && ((v->ttmbf || (ttmb != -1 && (ttmb & 8) && !first_block))
+ || (!v->res_rtm_flag && !first_block))) {
subblkpat = decode012(gb);
if(subblkpat) subblkpat ^= 3; //swap decoded pattern bits
if(ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM) ttblk = TT_8X4;
if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
s->dsp.vc1_inv_trans_8x8(s->block[i]);
if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1;
- s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
+ s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
if(v->pq >= 9 && v->overlap) {
if(v->c_avail)
- s->dsp.vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
+ s->dsp.vc1_h_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
if(v->a_avail)
- s->dsp.vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
+ s->dsp.vc1_v_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
}
if(apply_loop_filter && s->mb_x && s->mb_x != (s->mb_width - 1) && s->mb_y && s->mb_y != (s->mb_height - 1)){
int left_cbp, top_cbp;
s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize);
if(v->pq >= 9 && v->overlap) {
if(v->c_avail)
- s->dsp.vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
+ s->dsp.vc1_h_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
if(v->a_avail)
- s->dsp.vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
+ s->dsp.vc1_v_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
}
if(v->s.loop_filter && s->mb_x && s->mb_x != (s->mb_width - 1) && s->mb_y && s->mb_y != (s->mb_height - 1)){
int left_cbp, top_cbp;
if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
s->dsp.vc1_inv_trans_8x8(s->block[i]);
if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1;
- s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
+ s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
} else if(val) {
vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block, s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize, (i&4) && (s->flags & CODEC_FLAG_GRAY), 0, 0, 0);
if(!v->ttmbf && ttmb < 8) ttmb = -1;
return;
}
}
- ff_draw_horiz_band(s, s->mb_y * 16, 16);
+ if (!v->s.loop_filter)
+ ff_draw_horiz_band(s, s->mb_y * 16, 16);
+ else if (s->mb_y)
+ ff_draw_horiz_band(s, (s->mb_y-1) * 16, 16);
+
s->first_slice_line = 0;
}
+ if (v->s.loop_filter)
+ ff_draw_horiz_band(s, (s->mb_height-1)*16, 16);
ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END));
}
return;
}
}
- ff_draw_horiz_band(s, s->mb_y * 16, 16);
+ if (!v->s.loop_filter)
+ ff_draw_horiz_band(s, s->mb_y * 16, 16);
+ else if (s->mb_y)
+ ff_draw_horiz_band(s, (s->mb_y-1) * 16, 16);
s->first_slice_line = 0;
}
+ if (v->s.loop_filter)
+ ff_draw_horiz_band(s, (s->mb_height-1)*16, 16);
ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END));
}
}
if(v->s.loop_filter) vc1_loop_filter_iblk(s, v->pq);
}
- ff_draw_horiz_band(s, s->mb_y * 16, 16);
+ if (!v->s.loop_filter)
+ ff_draw_horiz_band(s, s->mb_y * 16, 16);
+ else if (s->mb_y)
+ ff_draw_horiz_band(s, (s->mb_y-1) * 16, 16);
s->first_slice_line = 0;
}
+ if (v->s.loop_filter)
+ ff_draw_horiz_band(s, (s->mb_height-1)*16, 16);
ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END));
}
avctx->idct_algo=FF_IDCT_WMV2;
}
- if(ff_h263_decode_init(avctx) < 0)
+ if(ff_msmpeg4_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;
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);
}
}
- if(s->pict_type != FF_I_TYPE && !v->res_rtm_flag){
+ if(v->res_sprite && (s->pict_type!=FF_I_TYPE)){
av_free(buf2);
return -1;
}
AVCodec vc1_decoder = {
"vc1",
- CODEC_TYPE_VIDEO,
+ AVMEDIA_TYPE_VIDEO,
CODEC_ID_VC1,
sizeof(VC1Context),
vc1_decode_init,
#if CONFIG_WMV3_DECODER
AVCodec wmv3_decoder = {
"wmv3",
- CODEC_TYPE_VIDEO,
+ AVMEDIA_TYPE_VIDEO,
CODEC_ID_WMV3,
sizeof(VC1Context),
vc1_decode_init,
#if CONFIG_WMV3_VDPAU_DECODER
AVCodec wmv3_vdpau_decoder = {
"wmv3_vdpau",
- CODEC_TYPE_VIDEO,
+ AVMEDIA_TYPE_VIDEO,
CODEC_ID_WMV3,
sizeof(VC1Context),
vc1_decode_init,
#if CONFIG_VC1_VDPAU_DECODER
AVCodec vc1_vdpau_decoder = {
"vc1_vdpau",
- CODEC_TYPE_VIDEO,
+ AVMEDIA_TYPE_VIDEO,
CODEC_ID_VC1,
sizeof(VC1Context),
vc1_decode_init,