static int decode_group3_1d_line(AVCodecContext *avctx, GetBitContext *gb,
- int pix_left, int *runs, const int *runend)
+ unsigned int pix_left, int *runs, const int *runend)
{
- int mode = 0, run = 0;
+ int mode = 0;
+ unsigned int run=0;
unsigned int t;
for(;;){
t = get_vlc2(gb, ccitt_vlc[mode].table, 9, 2);
av_log(avctx, AV_LOG_ERROR, "Run overrun\n");
return -1;
}
- pix_left -= run;
- if(pix_left <= 0){
- if(!pix_left)
+ if(pix_left <= run){
+ if(pix_left == run)
break;
- runs[-1] += pix_left;
av_log(avctx, AV_LOG_ERROR, "Run went out of bounds\n");
return -1;
}
+ pix_left -= run;
run = 0;
mode = !mode;
}else if((int)t == -1){
}
static int decode_group3_2d_line(AVCodecContext *avctx, GetBitContext *gb,
- int pix_left, int *runs, const int *runend, const int *ref)
+ unsigned int width, int *runs, const int *runend, const int *ref)
{
- int mode = 0, offs = 0, run = 0, saved_run = 0, t;
+ int mode = 0, saved_run = 0, t;
int run_off = *ref++;
- int *run_start = runs;
+ unsigned int offs=0, run= 0;
runend--; // for the last written 0
- while(pix_left > 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 < avctx->width){
- run_off += *ref++;
- run_off += *ref++;
- }
if(!cmode){//pass mode
run_off += *ref++;
run = run_off - offs;
+ offs= run_off;
run_off += *ref++;
- pix_left -= run;
- if(pix_left < 0){
+ if(offs > width){
av_log(avctx, AV_LOG_ERROR, "Run went out of bounds\n");
return -1;
}
- offs += run;
saved_run += run;
}else if(cmode == 1){//horizontal mode
int k;
return -1;
}
saved_run = 0;
- pix_left -= run;
- if(pix_left < 0){
+ offs += run;
+ if(offs > width || run > width){
av_log(avctx, AV_LOG_ERROR, "Run went out of bounds\n");
return -1;
}
- offs += run;
mode = !mode;
}
}else if(cmode == 9 || cmode == 10){
return -1;
}else{//vertical mode
run = run_off - offs + (cmode - 5);
- if(cmode >= 5)
- run_off += *ref++;
- else
- run_off -= *--ref;
- pix_left -= run;
- if(pix_left < 0){
+ run_off -= *--ref;
+ offs += run;
+ if(offs > width || run > width){
av_log(avctx, AV_LOG_ERROR, "Run went out of bounds\n");
return -1;
}
- offs += run;
*runs++ = run + saved_run;
if(runs >= runend){
av_log(avctx, AV_LOG_ERROR, "Run overrun\n");
saved_run = 0;
mode = !mode;
}
+ //sync line pointers
+ while(run_off <= offs){
+ run_off += *ref++;
+ run_off += *ref++;
+ }
}
*runs++ = saved_run;
*runs++ = 0;