|
|
|
@ -620,6 +620,57 @@ static int j2k_probe(AVProbeData *p) |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int jpeg_probe(AVProbeData *p) |
|
|
|
|
{ |
|
|
|
|
const uint8_t *b = p->buf; |
|
|
|
|
int i, state = 0xD8; |
|
|
|
|
|
|
|
|
|
if (AV_RB16(b) != 0xFFD8 || |
|
|
|
|
AV_RB32(b) == 0xFFD8FFF7) |
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
b += 2; |
|
|
|
|
for (i = 0; i < p->buf_size - 2; i++) { |
|
|
|
|
int c; |
|
|
|
|
if (b[i] != 0xFF) |
|
|
|
|
continue; |
|
|
|
|
c = b[i + 1]; |
|
|
|
|
switch (c) { |
|
|
|
|
case 0xD8: |
|
|
|
|
return 0; |
|
|
|
|
case 0xC0: |
|
|
|
|
case 0xC1: |
|
|
|
|
case 0xC2: |
|
|
|
|
case 0xC3: |
|
|
|
|
case 0xC5: |
|
|
|
|
case 0xC6: |
|
|
|
|
case 0xC7: |
|
|
|
|
if (state != 0xD8) |
|
|
|
|
return 0; |
|
|
|
|
state = 0xC0; |
|
|
|
|
break; |
|
|
|
|
case 0xDA: |
|
|
|
|
if (state != 0xC0) |
|
|
|
|
return 0; |
|
|
|
|
state = 0xDA; |
|
|
|
|
break; |
|
|
|
|
case 0xD9: |
|
|
|
|
if (state != 0xDA) |
|
|
|
|
return 0; |
|
|
|
|
state = 0xD9; |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
if ( (c >= 0x02 && c <= 0xBF) |
|
|
|
|
|| c == 0xC8) |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (state == 0xD9) |
|
|
|
|
return AVPROBE_SCORE_EXTENSION + 1; |
|
|
|
|
return AVPROBE_SCORE_EXTENSION / 8; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int jpegls_probe(AVProbeData *p) |
|
|
|
|
{ |
|
|
|
|
const uint8_t *b = p->buf; |
|
|
|
@ -711,6 +762,7 @@ IMAGEAUTO_DEMUXER(bmp, AV_CODEC_ID_BMP) |
|
|
|
|
IMAGEAUTO_DEMUXER(dpx, AV_CODEC_ID_DPX) |
|
|
|
|
IMAGEAUTO_DEMUXER(exr, AV_CODEC_ID_EXR) |
|
|
|
|
IMAGEAUTO_DEMUXER(j2k, AV_CODEC_ID_JPEG2000) |
|
|
|
|
IMAGEAUTO_DEMUXER(jpeg, AV_CODEC_ID_MJPEG) |
|
|
|
|
IMAGEAUTO_DEMUXER(jpegls, AV_CODEC_ID_JPEGLS) |
|
|
|
|
IMAGEAUTO_DEMUXER(pictor, AV_CODEC_ID_PICTOR) |
|
|
|
|
IMAGEAUTO_DEMUXER(png, AV_CODEC_ID_PNG) |
|
|
|
|