av_log(avctx, AV_LOG_INFO, "mjpeg: using external huffman table\n");
init_get_bits(&s->gb, avctx->extradata, avctx->extradata_size*8);
if (ff_mjpeg_decode_dht(s)) {
- av_log(avctx, AV_LOG_ERROR, "mjpeg: error using external huffman table\n");
- return AVERROR_INVALIDDATA;
+ av_log(avctx, AV_LOG_ERROR, "mjpeg: error using external huffman table, switching back to internal\n");
+ build_basic_mjpeg_vlc(s);
}
}
if (avctx->extradata_size > 9 &&
{
int len, nb_components, i, width, height, pix_fmt_id;
+ s->cur_scan = 0;
+
/* XXX: verify len field validity */
len = get_bits(&s->gb, 16);
s->bits= get_bits(&s->gb, 8);
}
}
- if (s->restart_interval && show_bits(&s->gb, 8) == 0xFF){ /* skip RSTn */
- --s->restart_count;
+ if (s->restart_interval) --s->restart_count;
+ i= 8+((-get_bits_count(&s->gb))&7);
+ if (s->restart_interval && show_bits(&s->gb, i) == (1<<i)-1){ /* skip RSTn */
+ int pos= get_bits_count(&s->gb);
align_get_bits(&s->gb);
while(show_bits(&s->gb, 8) == 0xFF)
skip_bits(&s->gb, 8);
- skip_bits(&s->gb, 8);
- for (i=0; i<nb_components; i++) /* reset dc */
- s->last_dc[i] = 1024;
+ if((get_bits(&s->gb, 8)&0xF8) == 0xD0){
+ for (i=0; i<nb_components; i++) /* reset dc */
+ s->last_dc[i] = 1024;
+ }else{
+ skip_bits_long(&s->gb, pos - get_bits_count(&s->gb));
+ }
}
}
}
s->restart_count = 0;
/* nothing to do on SOI */
+ if (s->got_picture) {
+ av_log(avctx, AV_LOG_WARNING, "EOI missing, emulating\n");
+ goto eoi_parser;
+ }
break;
case DQT:
ff_mjpeg_decode_dqt(s);
return -1;
break;
case EOI:
- s->cur_scan = 0;
if ((s->buggy_avid && !s->interlaced) || s->restart_interval)
break;
eoi_parser:
+ s->cur_scan = 0;
if (!s->got_picture) {
av_log(avctx, AV_LOG_WARNING, "Found EOI before any SOF, ignoring\n");
break;