|
|
|
@@ -132,23 +132,25 @@ static int scan_file(AVFormatContext *avctx, AVStream *vst, AVStream *ast, int f |
|
|
|
break; |
|
|
|
size -= 16; |
|
|
|
if (vst && type == MKTAG('R','A','W','I') && size >= 164) { |
|
|
|
vst->codecpar->width = avio_rl16(pb); |
|
|
|
vst->codecpar->height = avio_rl16(pb); |
|
|
|
ret = av_image_check_size(vst->codecpar->width, vst->codecpar->height, 0, avctx); |
|
|
|
unsigned width = avio_rl16(pb); |
|
|
|
unsigned height = avio_rl16(pb); |
|
|
|
unsigned bits_per_coded_sample; |
|
|
|
ret = av_image_check_size(width, height, 0, avctx); |
|
|
|
if (ret < 0) |
|
|
|
return ret; |
|
|
|
if (avio_rl32(pb) != 1) |
|
|
|
avpriv_request_sample(avctx, "raw api version"); |
|
|
|
avio_skip(pb, 20); // pointer, width, height, pitch, frame_size |
|
|
|
vst->codecpar->bits_per_coded_sample = avio_rl32(pb); |
|
|
|
if (vst->codecpar->bits_per_coded_sample < 0 || |
|
|
|
vst->codecpar->bits_per_coded_sample > (INT_MAX - 7) / (vst->codecpar->width * vst->codecpar->height)) { |
|
|
|
bits_per_coded_sample = avio_rl32(pb); |
|
|
|
if (bits_per_coded_sample > (INT_MAX - 7) / (width * height)) { |
|
|
|
av_log(avctx, AV_LOG_ERROR, |
|
|
|
"invalid bits_per_coded_sample %d (size: %dx%d)\n", |
|
|
|
vst->codecpar->bits_per_coded_sample, |
|
|
|
vst->codecpar->width, vst->codecpar->height); |
|
|
|
"invalid bits_per_coded_sample %u (size: %ux%u)\n", |
|
|
|
bits_per_coded_sample, width, height); |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
} |
|
|
|
vst->codecpar->width = width; |
|
|
|
vst->codecpar->height = height; |
|
|
|
vst->codecpar->bits_per_coded_sample = bits_per_coded_sample; |
|
|
|
avio_skip(pb, 8 + 16 + 24); // black_level, white_level, xywh, active_area, exposure_bias |
|
|
|
if (avio_rl32(pb) != 0x2010100) /* RGGB */ |
|
|
|
avpriv_request_sample(avctx, "cfa_pattern"); |
|
|
|
|