static void filter(USPPContext *p, uint8_t *dst[3], uint8_t *src[3],

                   int dst_stride[3], int src_stride[3], int width,

                   int height, uint8_t *qp_store, int qp_stride)

{

    int x, y, i, j;

    const int count = 1<<p->log2_count;



    for (i = 0; i < 3; i++) {

        int is_chroma = !!i;

        int w = width  >> (is_chroma ? p->hsub : 0);

        int h = height >> (is_chroma ? p->vsub : 0);

        int stride = p->temp_stride[i];

        int block = BLOCK >> (is_chroma ? p->hsub : 0);



        if (!src[i] || !dst[i])

            continue;

        for (y = 0; y < h; y++) {

            int index = block + block * stride + y * stride;



            memcpy(p->src[i] + index, src[i] + y * src_stride[i], w );

            for (x = 0; x < block; x++) {

                p->src[i][index     - x - 1] = p->src[i][index +     x    ];

                p->src[i][index + w + x    ] = p->src[i][index + w - x - 1];

            }

        }

        for (y = 0; y < block; y++) {

            memcpy(p->src[i] + (  block-1-y) * stride, p->src[i] + (  y+block  ) * stride, stride);

            memcpy(p->src[i] + (h+block  +y) * stride, p->src[i] + (h-y+block-1) * stride, stride);

        }



        p->frame->linesize[i] = stride;

        memset(p->temp[i], 0, (h + 2 * block) * stride * sizeof(int16_t));

    }



    if (p->qp)

        p->frame->quality = p->qp * FF_QP2LAMBDA;

    else {

        int qpsum=0;

        int qpcount = (height>>4) * (height>>4);



        for (y = 0; y < (height>>4); y++) {

            for (x = 0; x < (width>>4); x++)

                qpsum += qp_store[x + y * qp_stride];

        }

        p->frame->quality = norm_qscale((qpsum + qpcount/2) / qpcount, p->qscale_type) * FF_QP2LAMBDA;

    }

//    init per MB qscale stuff FIXME

    p->frame->height = height;

    p->frame->width  = width;



    for (i = 0; i < count; i++) {

        const int x1 = offset[i+count-1][0];

        const int y1 = offset[i+count-1][1];

        const int x1c = x1 >> p->hsub;

        const int y1c = y1 >> p->vsub;

        const int BLOCKc = BLOCK >> p->hsub;

        int offset;

        AVPacket pkt;

        int got_pkt_ptr;



        av_init_packet(&pkt);

        pkt.data = p->outbuf;

        pkt.size = p->outbuf_size;



        p->frame->data[0] = p->src[0] + x1   + y1   * p->frame->linesize[0];

        p->frame->data[1] = p->src[1] + x1c  + y1c  * p->frame->linesize[1];

        p->frame->data[2] = p->src[2] + x1c  + y1c  * p->frame->linesize[2];

        p->frame->format  = p->avctx_enc[i]->pix_fmt;



        avcodec_encode_video2(p->avctx_enc[i], &pkt, p->frame, &got_pkt_ptr);

        p->frame_dec = p->avctx_enc[i]->coded_frame;



        offset = (BLOCK-x1) + (BLOCK-y1) * p->frame_dec->linesize[0];



        for (y = 0; y < height; y++)

            for (x = 0; x < width; x++)

                p->temp[0][x + y * p->temp_stride[0]] += p->frame_dec->data[0][x + y * p->frame_dec->linesize[0] + offset];



        if (!src[2] || !dst[2])

            continue;



        offset = (BLOCKc-x1c) + (BLOCKc-y1c) * p->frame_dec->linesize[1];



        for (y = 0; y < height>>p->vsub; y++) {

            for (x = 0; x < width>>p->hsub; x++) {

                p->temp[1][x + y * p->temp_stride[1]] += p->frame_dec->data[1][x + y * p->frame_dec->linesize[1] + offset];

                p->temp[2][x + y * p->temp_stride[2]] += p->frame_dec->data[2][x + y * p->frame_dec->linesize[2] + offset];

            }

        }

    }



    for (j = 0; j < 3; j++) {

        int is_chroma = !!j;

        if (!dst[j])

            continue;

        store_slice_c(dst[j], p->temp[j], dst_stride[j], p->temp_stride[j],

                      width  >> (is_chroma ? p->hsub : 0),

                      height >> (is_chroma ? p->vsub : 0),

                      8-p->log2_count);

    }

}

static void filter(USPPContext *p, uint8_t *dst[3], uint8_t *src[3],

                   int dst_stride[3], int src_stride[3], int width,

                   int height, uint8_t *qp_store, int qp_stride)

{

    int x, y, i, j;

    const int count = 1<<p->log2_count;



    for (i = 0; i < 3; i++) {

        int is_chroma = !!i;

        int w = width  >> (is_chroma ? p->hsub : 0);

        int h = height >> (is_chroma ? p->vsub : 0);

        int stride = p->temp_stride[i];

        int block = BLOCK >> (is_chroma ? p->hsub : 0);



        if (!src[i] || !dst[i])

            continue;

        for (y = 0; y < h; y++) {

            int index = block + block * stride + y * stride;



            memcpy(p->src[i] + index, src[i] + y * src_stride[i], w );

            for (x = 0; x < block; x++) {

                p->src[i][index     - x - 1] = p->src[i][index +     x    ];

                p->src[i][index + w + x    ] = p->src[i][index + w - x - 1];

            }

        }

        for (y = 0; y < block; y++) {

            memcpy(p->src[i] + (  block-1-y) * stride, p->src[i] + (  y+block  ) * stride, stride);

            memcpy(p->src[i] + (h+block  +y) * stride, p->src[i] + (h-y+block-1) * stride, stride);

        }



        p->frame->linesize[i] = stride;

        memset(p->temp[i], 0, (h + 2 * block) * stride * sizeof(int16_t));

    }



    if (p->qp)

        p->frame->quality = p->qp * FF_QP2LAMBDA;

    else {

        int qpsum=0;

        int qpcount = (height>>4) * (height>>4);



        for (y = 0; y < (height>>4); y++) {

            for (x = 0; x < (width>>4); x++)

                qpsum += qp_store[x + y * qp_stride];

        }

        p->frame->quality = norm_qscale((qpsum + qpcount/2) / qpcount, p->qscale_type) * FF_QP2LAMBDA;

    }



    p->frame->height = height;

    p->frame->width  = width;



    for (i = 0; i < count; i++) {

        const int x1 = offset[i+count-1][0];

        const int y1 = offset[i+count-1][1];

        const int x1c = x1 >> p->hsub;

        const int y1c = y1 >> p->vsub;

        const int BLOCKc = BLOCK >> p->hsub;

        int offset;

        AVPacket pkt;

        int got_pkt_ptr;



        av_init_packet(&pkt);

        pkt.data = p->outbuf;

        pkt.size = p->outbuf_size;



        p->frame->data[0] = p->src[0] + x1   + y1   * p->frame->linesize[0];

        p->frame->data[1] = p->src[1] + x1c  + y1c  * p->frame->linesize[1];

        p->frame->data[2] = p->src[2] + x1c  + y1c  * p->frame->linesize[2];

        p->frame->format  = p->avctx_enc[i]->pix_fmt;



        avcodec_encode_video2(p->avctx_enc[i], &pkt, p->frame, &got_pkt_ptr);

        p->frame_dec = p->avctx_enc[i]->coded_frame;



        offset = (BLOCK-x1) + (BLOCK-y1) * p->frame_dec->linesize[0];



        for (y = 0; y < height; y++)

            for (x = 0; x < width; x++)

                p->temp[0][x + y * p->temp_stride[0]] += p->frame_dec->data[0][x + y * p->frame_dec->linesize[0] + offset];



        if (!src[2] || !dst[2])

            continue;



        offset = (BLOCKc-x1c) + (BLOCKc-y1c) * p->frame_dec->linesize[1];



        for (y = 0; y < height>>p->vsub; y++) {

            for (x = 0; x < width>>p->hsub; x++) {

                p->temp[1][x + y * p->temp_stride[1]] += p->frame_dec->data[1][x + y * p->frame_dec->linesize[1] + offset];

                p->temp[2][x + y * p->temp_stride[2]] += p->frame_dec->data[2][x + y * p->frame_dec->linesize[2] + offset];

            }

        }

    }



    for (j = 0; j < 3; j++) {

        int is_chroma = !!j;

        if (!dst[j])

            continue;

        store_slice_c(dst[j], p->temp[j], dst_stride[j], p->temp_stride[j],

                      width  >> (is_chroma ? p->hsub : 0),

                      height >> (is_chroma ? p->vsub : 0),

                      8-p->log2_count);

    }

}

        AVPacket pkt;
static void FUNC_0(USPPContext *VAR_0, uint8_t *VAR_1[3], uint8_t *VAR_2[3],

                   int VAR_3[3], int VAR_4[3], int VAR_5,

                   int VAR_6, uint8_t *VAR_7, int VAR_8)

{

    int VAR_9, VAR_10, VAR_11, VAR_12;

    const int VAR_13 = 1<<VAR_0->log2_count;



    for (VAR_11 = 0; VAR_11 < 3; VAR_11++) {

        int VAR_29 = !!VAR_11;

        int VAR_15 = VAR_5  >> (VAR_29 ? VAR_0->hsub : 0);

        int VAR_16 = VAR_6 >> (VAR_29 ? VAR_0->vsub : 0);

        int VAR_17 = VAR_0->temp_stride[VAR_11];

        int VAR_18 = BLOCK >> (VAR_29 ? VAR_0->hsub : 0);



        if (!VAR_2[VAR_11] || !VAR_1[VAR_11])

            continue;

        for (VAR_10 = 0; VAR_10 < VAR_16; VAR_10++) {

            int VAR_19 = VAR_18 + VAR_18 * VAR_17 + VAR_10 * VAR_17;



            memcpy(VAR_0->VAR_2[VAR_11] + VAR_19, VAR_2[VAR_11] + VAR_10 * VAR_4[VAR_11], VAR_15 );

            for (VAR_9 = 0; VAR_9 < VAR_18; VAR_9++) {

                VAR_0->VAR_2[VAR_11][VAR_19     - VAR_9 - 1] = VAR_0->VAR_2[VAR_11][VAR_19 +     VAR_9    ];

                VAR_0->VAR_2[VAR_11][VAR_19 + VAR_15 + VAR_9    ] = VAR_0->VAR_2[VAR_11][VAR_19 + VAR_15 - VAR_9 - 1];

            }

        }

        for (VAR_10 = 0; VAR_10 < VAR_18; VAR_10++) {

            memcpy(VAR_0->VAR_2[VAR_11] + (  VAR_18-1-VAR_10) * VAR_17, VAR_0->VAR_2[VAR_11] + (  VAR_10+VAR_18  ) * VAR_17, VAR_17);

            memcpy(VAR_0->VAR_2[VAR_11] + (VAR_16+VAR_18  +VAR_10) * VAR_17, VAR_0->VAR_2[VAR_11] + (VAR_16-VAR_10+VAR_18-1) * VAR_17, VAR_17);

        }



        VAR_0->frame->linesize[VAR_11] = VAR_17;

        memset(VAR_0->temp[VAR_11], 0, (VAR_16 + 2 * VAR_18) * VAR_17 * sizeof(int16_t));

    }



    if (VAR_0->qp)

        VAR_0->frame->quality = VAR_0->qp * FF_QP2LAMBDA;

    else {

        int VAR_20=0;

        int VAR_21 = (VAR_6>>4) * (VAR_6>>4);



        for (VAR_10 = 0; VAR_10 < (VAR_6>>4); VAR_10++) {

            for (VAR_9 = 0; VAR_9 < (VAR_5>>4); VAR_9++)

                VAR_20 += VAR_7[VAR_9 + VAR_10 * VAR_8];

        }

        VAR_0->frame->quality = norm_qscale((VAR_20 + VAR_21/2) / VAR_21, VAR_0->qscale_type) * FF_QP2LAMBDA;

    }



    VAR_0->frame->VAR_6 = VAR_6;

    VAR_0->frame->VAR_5  = VAR_5;



    for (VAR_11 = 0; VAR_11 < VAR_13; VAR_11++) {

        const int VAR_22 = VAR_27[VAR_11+VAR_13-1][0];

        const int VAR_23 = VAR_27[VAR_11+VAR_13-1][1];

        const int VAR_24 = VAR_22 >> VAR_0->hsub;

        const int VAR_25 = VAR_23 >> VAR_0->vsub;

        const int VAR_26 = BLOCK >> VAR_0->hsub;

        int VAR_27;

        AVPacket pkt;

        int VAR_28;



        av_init_packet(&pkt);

        pkt.data = VAR_0->outbuf;

        pkt.size = VAR_0->outbuf_size;



        VAR_0->frame->data[0] = VAR_0->VAR_2[0] + VAR_22   + VAR_23   * VAR_0->frame->linesize[0];

        VAR_0->frame->data[1] = VAR_0->VAR_2[1] + VAR_24  + VAR_25  * VAR_0->frame->linesize[1];

        VAR_0->frame->data[2] = VAR_0->VAR_2[2] + VAR_24  + VAR_25  * VAR_0->frame->linesize[2];

        VAR_0->frame->format  = VAR_0->avctx_enc[VAR_11]->pix_fmt;



        avcodec_encode_video2(VAR_0->avctx_enc[VAR_11], &pkt, VAR_0->frame, &VAR_28);

        VAR_0->frame_dec = VAR_0->avctx_enc[VAR_11]->coded_frame;



        VAR_27 = (BLOCK-VAR_22) + (BLOCK-VAR_23) * VAR_0->frame_dec->linesize[0];



        for (VAR_10 = 0; VAR_10 < VAR_6; VAR_10++)

            for (VAR_9 = 0; VAR_9 < VAR_5; VAR_9++)

                VAR_0->temp[0][VAR_9 + VAR_10 * VAR_0->temp_stride[0]] += VAR_0->frame_dec->data[0][VAR_9 + VAR_10 * VAR_0->frame_dec->linesize[0] + VAR_27];



        if (!VAR_2[2] || !VAR_1[2])

            continue;



        VAR_27 = (VAR_26-VAR_24) + (VAR_26-VAR_25) * VAR_0->frame_dec->linesize[1];



        for (VAR_10 = 0; VAR_10 < VAR_6>>VAR_0->vsub; VAR_10++) {

            for (VAR_9 = 0; VAR_9 < VAR_5>>VAR_0->hsub; VAR_9++) {

                VAR_0->temp[1][VAR_9 + VAR_10 * VAR_0->temp_stride[1]] += VAR_0->frame_dec->data[1][VAR_9 + VAR_10 * VAR_0->frame_dec->linesize[1] + VAR_27];

                VAR_0->temp[2][VAR_9 + VAR_10 * VAR_0->temp_stride[2]] += VAR_0->frame_dec->data[2][VAR_9 + VAR_10 * VAR_0->frame_dec->linesize[2] + VAR_27];

            }

        }

    }



    for (VAR_12 = 0; VAR_12 < 3; VAR_12++) {

        int VAR_29 = !!VAR_12;

        if (!VAR_1[VAR_12])

            continue;

        store_slice_c(VAR_1[VAR_12], VAR_0->temp[VAR_12], VAR_3[VAR_12], VAR_0->temp_stride[VAR_12],

                      VAR_5  >> (VAR_29 ? VAR_0->hsub : 0),

                      VAR_6 >> (VAR_29 ? VAR_0->vsub : 0),

                      8-VAR_0->log2_count);

    }

}

static void FUNC_0(USPPContext *VAR_0, uint8_t *VAR_1[3], uint8_t *VAR_2[3],
int VAR_3[3], int VAR_4[3], int VAR_5,
int VAR_6, uint8_t *VAR_7, int VAR_8)
{ int VAR_9, VAR_10, VAR_11, VAR_12; const int VAR_13 = 1<<VAR_0->log2_count; for (VAR_11 = 0; VAR_11 < 3; VAR_11++) { int VAR_29 = !!VAR_11; int VAR_15 = VAR_5  >> (VAR_29 ? VAR_0->hsub : 0); int VAR_16 = VAR_6 >> (VAR_29 ? VAR_0->vsub : 0); int VAR_17 = VAR_0->temp_stride[VAR_11]; int VAR_18 = BLOCK >> (VAR_29 ? VAR_0->hsub : 0); if (!VAR_2[VAR_11] || !VAR_1[VAR_11])
continue; for (VAR_10 = 0; VAR_10 < VAR_16; VAR_10++) { int VAR_19 = VAR_18 + VAR_18 * VAR_17 + VAR_10 * VAR_17; memcpy(VAR_0->VAR_2[VAR_11] + VAR_19, VAR_2[VAR_11] + VAR_10 * VAR_4[VAR_11], VAR_15 ); for (VAR_9 = 0; VAR_9 < VAR_18; VAR_9++) { VAR_0->VAR_2[VAR_11][VAR_19     - VAR_9 - 1] = VAR_0->VAR_2[VAR_11][VAR_19 +     VAR_9    ]; VAR_0->VAR_2[VAR_11][VAR_19 + VAR_15 + VAR_9    ] = VAR_0->VAR_2[VAR_11][VAR_19 + VAR_15 - VAR_9 - 1]; } } for (VAR_10 = 0; VAR_10 < VAR_18; VAR_10++) { memcpy(VAR_0->VAR_2[VAR_11] + (  VAR_18-1-VAR_10) * VAR_17, VAR_0->VAR_2[VAR_11] + (  VAR_10+VAR_18  ) * VAR_17, VAR_17); memcpy(VAR_0->VAR_2[VAR_11] + (VAR_16+VAR_18  +VAR_10) * VAR_17, VAR_0->VAR_2[VAR_11] + (VAR_16-VAR_10+VAR_18-1) * VAR_17, VAR_17); } VAR_0->frame->linesize[VAR_11] = VAR_17; memset(VAR_0->temp[VAR_11], 0, (VAR_16 + 2 * VAR_18) * VAR_17 * sizeof(int16_t)); } if (VAR_0->qp)
VAR_0->frame->quality = VAR_0->qp * FF_QP2LAMBDA; else { int VAR_20=0; int VAR_21 = (VAR_6>>4) * (VAR_6>>4); for (VAR_10 = 0; VAR_10 < (VAR_6>>4); VAR_10++) { for (VAR_9 = 0; VAR_9 < (VAR_5>>4); VAR_9++) VAR_20 += VAR_7[VAR_9 + VAR_10 * VAR_8]; } VAR_0->frame->quality = norm_qscale((VAR_20 + VAR_21/2) / VAR_21, VAR_0->qscale_type) * FF_QP2LAMBDA; } VAR_0->frame->VAR_6 = VAR_6; VAR_0->frame->VAR_5  = VAR_5; for (VAR_11 = 0; VAR_11 < VAR_13; VAR_11++) { const int VAR_22 = VAR_27[VAR_11+VAR_13-1][0]; const int VAR_23 = VAR_27[VAR_11+VAR_13-1][1]; const int VAR_24 = VAR_22 >> VAR_0->hsub; const int VAR_25 = VAR_23 >> VAR_0->vsub; const int VAR_26 = BLOCK >> VAR_0->hsub; int VAR_27; AVPacket pkt; int VAR_28; av_init_packet(&pkt); pkt.data = VAR_0->outbuf; pkt.size = VAR_0->outbuf_size; VAR_0->frame->data[0] = VAR_0->VAR_2[0] + VAR_22   + VAR_23   * VAR_0->frame->linesize[0]; VAR_0->frame->data[1] = VAR_0->VAR_2[1] + VAR_24  + VAR_25  * VAR_0->frame->linesize[1]; VAR_0->frame->data[2] = VAR_0->VAR_2[2] + VAR_24  + VAR_25  * VAR_0->frame->linesize[2]; VAR_0->frame->format  = VAR_0->avctx_enc[VAR_11]->pix_fmt; avcodec_encode_video2(VAR_0->avctx_enc[VAR_11], &pkt, VAR_0->frame, &VAR_28); VAR_0->frame_dec = VAR_0->avctx_enc[VAR_11]->coded_frame; VAR_27 = (BLOCK-VAR_22) + (BLOCK-VAR_23) * VAR_0->frame_dec->linesize[0]; for (VAR_10 = 0; VAR_10 < VAR_6; VAR_10++) for (VAR_9 = 0; VAR_9 < VAR_5; VAR_9++) VAR_0->temp[0][VAR_9 + VAR_10 * VAR_0->temp_stride[0]] += VAR_0->frame_dec->data[0][VAR_9 + VAR_10 * VAR_0->frame_dec->linesize[0] + VAR_27]; if (!VAR_2[2] || !VAR_1[2])
continue; VAR_27 = (VAR_26-VAR_24) + (VAR_26-VAR_25) * VAR_0->frame_dec->linesize[1]; for (VAR_10 = 0; VAR_10 < VAR_6>>VAR_0->vsub; VAR_10++) { for (VAR_9 = 0; VAR_9 < VAR_5>>VAR_0->hsub; VAR_9++) { VAR_0->temp[1][VAR_9 + VAR_10 * VAR_0->temp_stride[1]] += VAR_0->frame_dec->data[1][VAR_9 + VAR_10 * VAR_0->frame_dec->linesize[1] + VAR_27]; VAR_0->temp[2][VAR_9 + VAR_10 * VAR_0->temp_stride[2]] += VAR_0->frame_dec->data[2][VAR_9 + VAR_10 * VAR_0->frame_dec->linesize[2] + VAR_27]; } } } for (VAR_12 = 0; VAR_12 < 3; VAR_12++) { int VAR_29 = !!VAR_12; if (!VAR_1[VAR_12])
continue; store_slice_c(VAR_1[VAR_12], VAR_0->temp[VAR_12], VAR_3[VAR_12], VAR_0->temp_stride[VAR_12],
VAR_5  >> (VAR_29 ? VAR_0->hsub : 0),
VAR_6 >> (VAR_29 ? VAR_0->vsub : 0),
8-VAR_0->log2_count); } }