|
@@ -43,7 +43,7 @@ static int pnm_decode_frame(AVCodecContext *avctx, void *data, |
|
|
int buf_size = avpkt->size; |
|
|
int buf_size = avpkt->size; |
|
|
PNMContext * const s = avctx->priv_data; |
|
|
PNMContext * const s = avctx->priv_data; |
|
|
AVFrame * const p = data; |
|
|
AVFrame * const p = data; |
|
|
int i, j, n, linesize, h, upgrade = 0, is_mono = 0; |
|
|
|
|
|
|
|
|
int i, j, k, n, linesize, h, upgrade = 0, is_mono = 0; |
|
|
unsigned char *ptr; |
|
|
unsigned char *ptr; |
|
|
int components, sample_len, ret; |
|
|
int components, sample_len, ret; |
|
|
|
|
|
|
|
@@ -143,10 +143,14 @@ static int pnm_decode_frame(AVCodecContext *avctx, void *data, |
|
|
v = (*s->bytestream++)&1; |
|
|
v = (*s->bytestream++)&1; |
|
|
} else { |
|
|
} else { |
|
|
/* read a sequence of digits */ |
|
|
/* read a sequence of digits */ |
|
|
do { |
|
|
|
|
|
|
|
|
for (k = 0; k < 5 && c <= 9; k += 1) { |
|
|
v = 10*v + c; |
|
|
v = 10*v + c; |
|
|
c = (*s->bytestream++) - '0'; |
|
|
c = (*s->bytestream++) - '0'; |
|
|
} while (c <= 9); |
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
if (v > s->maxval) { |
|
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "value %d larger than maxval %d\n", v, s->maxval); |
|
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
if (sample_len == 16) { |
|
|
if (sample_len == 16) { |
|
|
((uint16_t*)ptr)[j] = (((1<<sample_len)-1)*v + (s->maxval>>1))/s->maxval; |
|
|
((uint16_t*)ptr)[j] = (((1<<sample_len)-1)*v + (s->maxval>>1))/s->maxval; |
|
|