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

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

{

    int mode = 0, offs = 0, run = 0, saved_run = 0, t;

    int run_off = *ref++;

    int *run_start = runs;



    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;

        }

        //sync line pointers

        if(runs != run_start)while(run_off <= offs){

            run_off += *ref++;

            run_off += *ref++;

        }

        if(!cmode){//pass mode

            run_off += *ref++;

            run = run_off - offs;

            run_off += *ref++;

            offs += run;

            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){

                    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);

            if(cmode >= 5)

                run_off += *ref++;

            else

                run_off -= *--ref;

            offs += run;

            if(offs > 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;

        }

    }

    *runs++ = saved_run;

    *runs++ = 0;

    return 0;

}

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

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

{

    int mode = 0, offs = 0, run = 0, saved_run = 0, t;

    int run_off = *ref++;

    int *run_start = runs;



    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(runs != run_start)while(run_off <= offs){

            run_off += *ref++;

            run_off += *ref++;

        }

        if(!cmode){

            run_off += *ref++;

            run = run_off - offs;

            run_off += *ref++;

            offs += run;

            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){

                    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);

            if(cmode >= 5)

                run_off += *ref++;

            else

                run_off -= *--ref;

            offs += run;

            if(offs > 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;

        }

    }

    *runs++ = saved_run;

    *runs++ = 0;

    return 0;

}

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

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

{

    int VAR_6 = 0, VAR_7 = 0, VAR_8 = 0, VAR_9 = 0, VAR_10;

    int VAR_11 = *VAR_5++;

    int *VAR_12 = VAR_3;



    VAR_4--; 



    while(VAR_7 < VAR_2){

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

        if(VAR_13 == -1){

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

            return -1;

        }

        

        if(VAR_3 != VAR_12)while(VAR_11 <= VAR_7){

            VAR_11 += *VAR_5++;

            VAR_11 += *VAR_5++;

        }

        if(!VAR_13){

            VAR_11 += *VAR_5++;

            VAR_8 = VAR_11 - VAR_7;

            VAR_11 += *VAR_5++;

            VAR_7 += VAR_8;

            if(VAR_7 > VAR_2){

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

                return -1;

            }

            VAR_9 += VAR_8;

        }else if(VAR_13 == 1){

            int VAR_14;

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

                VAR_8 = 0;

                for(;;){

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

                    if(VAR_10 == -1){

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

                        return -1;

                    }

                    VAR_8 += VAR_10;

                    if(VAR_10 < 64)

                        break;

                }

                *VAR_3++ = VAR_8 + VAR_9;

                if(VAR_3 >= VAR_4){

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

                    return -1;

                }

                VAR_9 = 0;

                VAR_7 += VAR_8;

                if(VAR_7 > VAR_2){

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

                    return -1;

                }

                VAR_6 = !VAR_6;

            }

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

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

            return -1;

        }else{

            VAR_8 = VAR_11 - VAR_7 + (VAR_13 - 5);

            if(VAR_13 >= 5)

                VAR_11 += *VAR_5++;

            else

                VAR_11 -= *--VAR_5;

            VAR_7 += VAR_8;

            if(VAR_7 > VAR_2){

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

                return -1;

            }

            *VAR_3++ = VAR_8 + VAR_9;

            if(VAR_3 >= VAR_4){

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

                return -1;

            }

            VAR_9 = 0;

            VAR_6 = !VAR_6;

        }

    }

    *VAR_3++ = VAR_9;

    *VAR_3++ = 0;

    return 0;

}

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