static int decode_group3_2d_line(AVCodecContext *avctx, GetBitContext *gb,

                                 unsigned int width, int *runs, const int *runend, const int *ref)

{

    int mode = 0, saved_run = 0, t;

    int run_off = *ref++;

    unsigned int offs=0, run= 0;



    runend--; // for the last written 0



    while(offs < width){

        int cmode = get_vlc2(gb, ccitt_group3_2d_vlc.table, 9, 1);

        if(cmode == -1){

            av_log(avctx, AV_LOG_ERROR, "Incorrect mode VLC\n");

            return -1;

        }

        if(!cmode){//pass mode

            run_off += *ref++;

            run = run_off - offs;

            offs= run_off;

            run_off += *ref++;

            if(offs > width){

                av_log(avctx, AV_LOG_ERROR, "Run went out of bounds\n");

                return -1;

            }

            saved_run += run;

        }else if(cmode == 1){//horizontal mode

            int k;

            for(k = 0; k < 2; k++){

                run = 0;

                for(;;){

                    t = get_vlc2(gb, ccitt_vlc[mode].table, 9, 2);

                    if(t == -1){

                        av_log(avctx, AV_LOG_ERROR, "Incorrect code\n");

                        return -1;

                    }

                    run += t;

                    if(t < 64)

                        break;

                }

                *runs++ = run + saved_run;

                if(runs >= runend){

                    av_log(avctx, AV_LOG_ERROR, "Run overrun\n");

                    return -1;

                }

                saved_run = 0;

                offs += run;

                if(offs > width || run > width){

                    av_log(avctx, AV_LOG_ERROR, "Run went out of bounds\n");

                    return -1;

                }

                mode = !mode;

            }

        }else if(cmode == 9 || cmode == 10){

            av_log(avctx, AV_LOG_ERROR, "Special modes are not supported (yet)\n");

            return -1;

        }else{//vertical mode

            run = run_off - offs + (cmode - 5);

            run_off -= *--ref;

            offs += run;

            if(offs > width || run > width){

                av_log(avctx, AV_LOG_ERROR, "Run went out of bounds\n");

                return -1;

            }

            *runs++ = run + saved_run;

            if(runs >= runend){

                av_log(avctx, AV_LOG_ERROR, "Run overrun\n");

                return -1;

            }

            saved_run = 0;

            mode = !mode;

        }

        //sync line pointers

        while(run_off <= offs){

            run_off += *ref++;

            run_off += *ref++;

        }

    }

    *runs++ = saved_run;

    *runs++ = 0;

    return 0;

}

static int decode_group3_2d_line(AVCodecContext *avctx, GetBitContext *gb,

                                 unsigned int width, int *runs, const int *runend, const int *ref)

{

    int mode = 0, saved_run = 0, t;

    int run_off = *ref++;

    unsigned int offs=0, run= 0;



    runend--; 



    while(offs < width){

        int cmode = get_vlc2(gb, ccitt_group3_2d_vlc.table, 9, 1);

        if(cmode == -1){

            av_log(avctx, AV_LOG_ERROR, "Incorrect mode VLC\n");

            return -1;

        }

        if(!cmode){

            run_off += *ref++;

            run = run_off - offs;

            offs= run_off;

            run_off += *ref++;

            if(offs > width){

                av_log(avctx, AV_LOG_ERROR, "Run went out of bounds\n");

                return -1;

            }

            saved_run += run;

        }else if(cmode == 1){

            int k;

            for(k = 0; k < 2; k++){

                run = 0;

                for(;;){

                    t = get_vlc2(gb, ccitt_vlc[mode].table, 9, 2);

                    if(t == -1){

                        av_log(avctx, AV_LOG_ERROR, "Incorrect code\n");

                        return -1;

                    }

                    run += t;

                    if(t < 64)

                        break;

                }

                *runs++ = run + saved_run;

                if(runs >= runend){

                    av_log(avctx, AV_LOG_ERROR, "Run overrun\n");

                    return -1;

                }

                saved_run = 0;

                offs += run;

                if(offs > width || run > width){

                    av_log(avctx, AV_LOG_ERROR, "Run went out of bounds\n");

                    return -1;

                }

                mode = !mode;

            }

        }else if(cmode == 9 || cmode == 10){

            av_log(avctx, AV_LOG_ERROR, "Special modes are not supported (yet)\n");

            return -1;

        }else{

            run = run_off - offs + (cmode - 5);

            run_off -= *--ref;

            offs += run;

            if(offs > width || run > width){

                av_log(avctx, AV_LOG_ERROR, "Run went out of bounds\n");

                return -1;

            }

            *runs++ = run + saved_run;

            if(runs >= runend){

                av_log(avctx, AV_LOG_ERROR, "Run overrun\n");

                return -1;

            }

            saved_run = 0;

            mode = !mode;

        }

        

        while(run_off <= offs){

            run_off += *ref++;

            run_off += *ref++;

        }

    }

    *runs++ = saved_run;

    *runs++ = 0;

    return 0;

}

static int FUNC_0(AVCodecContext *VAR_0, GetBitContext *VAR_1,

                                 unsigned int VAR_2, int *VAR_3, const int *VAR_4, const int *VAR_5)

{

    int VAR_6 = 0, VAR_7 = 0, VAR_8;

    int VAR_9 = *VAR_5++;

    unsigned int VAR_10=0, VAR_11= 0;



    VAR_4--; 



    while(VAR_10 < VAR_2){

        int VAR_12 = get_vlc2(VAR_1, ccitt_group3_2d_vlc.table, 9, 1);

        if(VAR_12 == -1){

            av_log(VAR_0, AV_LOG_ERROR, "Incorrect VAR_6 VLC\n");

            return -1;

        }

        if(!VAR_12){

            VAR_9 += *VAR_5++;

            VAR_11 = VAR_9 - VAR_10;

            VAR_10= VAR_9;

            VAR_9 += *VAR_5++;

            if(VAR_10 > VAR_2){

                av_log(VAR_0, AV_LOG_ERROR, "Run went out of bounds\n");

                return -1;

            }

            VAR_7 += VAR_11;

        }else if(VAR_12 == 1){

            int VAR_13;

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

                VAR_11 = 0;

                for(;;){

                    VAR_8 = get_vlc2(VAR_1, ccitt_vlc[VAR_6].table, 9, 2);

                    if(VAR_8 == -1){

                        av_log(VAR_0, AV_LOG_ERROR, "Incorrect code\n");

                        return -1;

                    }

                    VAR_11 += VAR_8;

                    if(VAR_8 < 64)

                        break;

                }

                *VAR_3++ = VAR_11 + VAR_7;

                if(VAR_3 >= VAR_4){

                    av_log(VAR_0, AV_LOG_ERROR, "Run overrun\n");

                    return -1;

                }

                VAR_7 = 0;

                VAR_10 += VAR_11;

                if(VAR_10 > VAR_2 || VAR_11 > VAR_2){

                    av_log(VAR_0, AV_LOG_ERROR, "Run went out of bounds\n");

                    return -1;

                }

                VAR_6 = !VAR_6;

            }

        }else if(VAR_12 == 9 || VAR_12 == 10){

            av_log(VAR_0, AV_LOG_ERROR, "Special modes are not supported (yet)\n");

            return -1;

        }else{

            VAR_11 = VAR_9 - VAR_10 + (VAR_12 - 5);

            VAR_9 -= *--VAR_5;

            VAR_10 += VAR_11;

            if(VAR_10 > VAR_2 || VAR_11 > VAR_2){

                av_log(VAR_0, AV_LOG_ERROR, "Run went out of bounds\n");

                return -1;

            }

            *VAR_3++ = VAR_11 + VAR_7;

            if(VAR_3 >= VAR_4){

                av_log(VAR_0, AV_LOG_ERROR, "Run overrun\n");

                return -1;

            }

            VAR_7 = 0;

            VAR_6 = !VAR_6;

        }

        

        while(VAR_9 <= VAR_10){

            VAR_9 += *VAR_5++;

            VAR_9 += *VAR_5++;

        }

    }

    *VAR_3++ = VAR_7;

    *VAR_3++ = 0;

    return 0;

}

static int FUNC_0(AVCodecContext *VAR_0, GetBitContext *VAR_1,
unsigned int VAR_2, int *VAR_3, const int *VAR_4, const int *VAR_5)
{ int VAR_6 = 0, VAR_7 = 0, VAR_8; int VAR_9 = *VAR_5++; unsigned int VAR_10=0, VAR_11= 0; VAR_4--; while(VAR_10 < VAR_2){ int VAR_12 = get_vlc2(VAR_1, ccitt_group3_2d_vlc.table, 9, 1); if(VAR_12 == -1){ av_log(VAR_0, AV_LOG_ERROR, "Incorrect VAR_6 VLC\n"); return -1; } if(!VAR_12){ VAR_9 += *VAR_5++; VAR_11 = VAR_9 - VAR_10; VAR_10= VAR_9; VAR_9 += *VAR_5++; if(VAR_10 > VAR_2){ av_log(VAR_0, AV_LOG_ERROR, "Run went out of bounds\n"); return -1; } VAR_7 += VAR_11; }else if(VAR_12 == 1){ int VAR_13; for(VAR_13 = 0; VAR_13 < 2; VAR_13++){ VAR_11 = 0; for(;;){ VAR_8 = get_vlc2(VAR_1, ccitt_vlc[VAR_6].table, 9, 2); if(VAR_8 == -1){ av_log(VAR_0, AV_LOG_ERROR, "Incorrect code\n"); return -1; } VAR_11 += VAR_8; if(VAR_8 < 64)
break; } *VAR_3++ = VAR_11 + VAR_7; if(VAR_3 >= VAR_4){ av_log(VAR_0, AV_LOG_ERROR, "Run overrun\n"); return -1; } VAR_7 = 0; VAR_10 += VAR_11; if(VAR_10 > VAR_2 || VAR_11 > VAR_2){ av_log(VAR_0, AV_LOG_ERROR, "Run went out of bounds\n"); return -1; } VAR_6 = !VAR_6; } }else if(VAR_12 == 9 || VAR_12 == 10){ av_log(VAR_0, AV_LOG_ERROR, "Special modes are not supported (yet)\n"); return -1; }else{ VAR_11 = VAR_9 - VAR_10 + (VAR_12 - 5); VAR_9 -= *--VAR_5; VAR_10 += VAR_11; if(VAR_10 > VAR_2 || VAR_11 > VAR_2){ av_log(VAR_0, AV_LOG_ERROR, "Run went out of bounds\n"); return -1; } *VAR_3++ = VAR_11 + VAR_7; if(VAR_3 >= VAR_4){ av_log(VAR_0, AV_LOG_ERROR, "Run overrun\n"); return -1; } VAR_7 = 0; VAR_6 = !VAR_6; } while(VAR_9 <= VAR_10){ VAR_9 += *VAR_5++; VAR_9 += *VAR_5++; } } *VAR_3++ = VAR_7; *VAR_3++ = 0; return 0; }