+#define FILTSIGN(a) ((a) >= 0 ? 1 : -1)
+/**
+ * VC-1 in-loop deblocking filter for one line
+ * @param src source block type
+ * @param pq block quantizer
+ * @return whether other 3 pairs should be filtered or not
+ * @see 8.6
+ */
+static int vc1_filter_line(uint8_t* src, int stride, int pq){
+ int a0, a1, a2, a3, d, clip, filt3 = 0;
+ uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
+
+ a0 = (2*(src[-2*stride] - src[ 1*stride]) - 5*(src[-1*stride] - src[ 0*stride]) + 4) >> 3;
+ if(FFABS(a0) < pq){
+ a1 = (2*(src[-4*stride] - src[-1*stride]) - 5*(src[-3*stride] - src[-2*stride]) + 4) >> 3;
+ a2 = (2*(src[ 0*stride] - src[ 3*stride]) - 5*(src[ 1*stride] - src[ 2*stride]) + 4) >> 3;
+ a3 = FFMIN(FFABS(a1), FFABS(a2));
+ if(a3 < FFABS(a0)){
+ d = 5 * ((a0 >=0 ? a3 : -a3) - a0) / 8;
+ clip = (src[-1*stride] - src[ 0*stride])/2;
+ if(clip){
+ filt3 = 1;
+ if(clip > 0)
+ d = av_clip(d, 0, clip);
+ else
+ d = av_clip(d, clip, 0);
+ src[-1*stride] = cm[src[-1*stride] - d];
+ src[ 0*stride] = cm[src[ 0*stride] + d];
+ }
+ }
+ }
+ return filt3;
+}
+
+/**
+ * VC-1 in-loop deblocking filter
+ * @param src source block type
+ * @param len edge length to filter (4 or 8 pixels)
+ * @param pq block quantizer
+ * @see 8.6
+ */
+static void vc1_loop_filter(uint8_t* src, int step, int stride, int len, int pq)
+{
+ int i;
+ int filt3;
+
+ for(i = 0; i < len; i += 4){
+ filt3 = vc1_filter_line(src + 2*step, stride, pq);
+ if(filt3){
+ vc1_filter_line(src + 0*step, stride, pq);
+ vc1_filter_line(src + 1*step, stride, pq);
+ vc1_filter_line(src + 3*step, stride, pq);
+ }
+ src += step * 4;
+ }
+}
+
+static void vc1_loop_filter_iblk(MpegEncContext *s, int pq)
+{
+ int i, j;
+ if(!s->first_slice_line)
+ vc1_loop_filter(s->dest[0], 1, s->linesize, 16, pq);
+ vc1_loop_filter(s->dest[0] + 8*s->linesize, 1, s->linesize, 16, pq);
+ for(i = !s->mb_x*8; i < 16; i += 8)
+ vc1_loop_filter(s->dest[0] + i, s->linesize, 1, 16, pq);
+ for(j = 0; j < 2; j++){
+ if(!s->first_slice_line)
+ vc1_loop_filter(s->dest[j+1], 1, s->uvlinesize, 8, pq);
+ if(s->mb_x)
+ vc1_loop_filter(s->dest[j+1], s->uvlinesize, 1, 8, pq);
+ }
+}
+