summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Togni <r_togni@tiscali.it>2004-10-29 20:45:47 +0000
committerRoberto Togni <r_togni@tiscali.it>2004-10-29 20:45:47 +0000
commit9287acd1970986de093578c6724c8ba1877c7485 (patch)
treea3b1b67ea72246a9d1e1f78c81644b74270f6a62
parentae2ade6bbd06ddda8899856714c301d8869caa40 (diff)
Fix mjpeg-b (padding bytes can exist between end of sos and image data)
Originally committed as revision 3653 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavcodec/mjpeg.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/libavcodec/mjpeg.c b/libavcodec/mjpeg.c
index 738b725185..6f1b908e97 100644
--- a/libavcodec/mjpeg.c
+++ b/libavcodec/mjpeg.c
@@ -837,6 +837,8 @@ typedef struct MJpegDecodeContext {
int buggy_avid;
int interlace_polarity;
+
+ int mjpb_skiptosod;
} MJpegDecodeContext;
static int mjpeg_decode_dht(MJpegDecodeContext *s);
@@ -1517,6 +1519,10 @@ static int mjpeg_decode_sos(MJpegDecodeContext *s)
if(s->avctx->debug & FF_DEBUG_PICT_INFO)
av_log(s->avctx, AV_LOG_DEBUG, "%s %s p:%d >>:%d\n", s->lossless ? "lossless" : "sequencial DCT", s->rgb ? "RGB" : "", predictor, point_transform);
+ /* mjpeg-b can have padding bytes between sos and image data, skip them */
+ for (i = s->mjpb_skiptosod; i > 0; i--)
+ skip_bits(&s->gb, 8);
+
if(s->lossless){
if(s->rgb){
if(ljpeg_decode_rgb_scan(s, predictor, point_transform) < 0)
@@ -1962,7 +1968,7 @@ static int mjpegb_decode_frame(AVCodecContext *avctx,
AVFrame *picture = data;
GetBitContext hgb; /* for the header */
uint32_t dqt_offs, dht_offs, sof_offs, sos_offs, second_field_offs;
- uint32_t field_size;
+ uint32_t field_size, sod_offs;
/* no supplementary picture */
if (buf_size == 0)
@@ -1974,6 +1980,7 @@ static int mjpegb_decode_frame(AVCodecContext *avctx,
read_header:
/* reset on every SOI */
s->restart_interval = 0;
+ s->mjpb_skiptosod = 0;
init_get_bits(&hgb, buf_ptr, /*buf_size*/(buf_end - buf_ptr)*8);
@@ -2023,16 +2030,17 @@ read_header:
sos_offs = get_bits_long(&hgb, 32);
dprintf("sos offs: 0x%x\n", sos_offs);
+ sod_offs = get_bits_long(&hgb, 32);
+ dprintf("sod offs: 0x%x\n", sod_offs);
if (sos_offs)
{
// init_get_bits(&s->gb, buf+sos_offs, (buf_end - (buf+sos_offs))*8);
init_get_bits(&s->gb, buf+sos_offs, field_size*8);
+ s->mjpb_skiptosod = (sod_offs - sos_offs - show_bits(&s->gb, 16));
s->start_code = SOS;
mjpeg_decode_sos(s);
}
- skip_bits(&hgb, 32); /* start of data offset */
-
if (s->interlaced) {
s->bottom_field ^= 1;
/* if not bottom field, do not output image yet */