diff options
Diffstat (limited to 'src/libffmpeg/libavcodec/mjpeg.c')
-rw-r--r-- | src/libffmpeg/libavcodec/mjpeg.c | 62 |
1 files changed, 29 insertions, 33 deletions
diff --git a/src/libffmpeg/libavcodec/mjpeg.c b/src/libffmpeg/libavcodec/mjpeg.c index 5502083ab..1a948aa56 100644 --- a/src/libffmpeg/libavcodec/mjpeg.c +++ b/src/libffmpeg/libavcodec/mjpeg.c @@ -793,7 +793,7 @@ typedef struct MJpegDecodeContext { VLC vlcs[2][4]; int qscale[4]; ///< quantizer scale calculated from quant_matrixes - int org_width, org_height; /* size given at codec init */ + int org_height; /* size given at codec init */ int first_picture; /* true if decoding first picture */ int interlaced; /* true if interlaced */ int bottom_field; /* true if bottom field */ @@ -855,7 +855,6 @@ static int mjpeg_decode_init(AVCodecContext *avctx) /* ugly way to get the idct & scantable FIXME */ memset(&s2, 0, sizeof(MpegEncContext)); - s2.flags= avctx->flags; s2.avctx= avctx; // s2->out_format = FMT_MJPEG; s2.width = 8; @@ -874,7 +873,6 @@ static int mjpeg_decode_init(AVCodecContext *avctx) return -1; s->start_code = -1; s->first_picture = 1; - s->org_width = avctx->width; s->org_height = avctx->height; build_vlc(&s->vlcs[0][0], bits_dc_luminance, val_dc_luminance, 12); @@ -884,7 +882,7 @@ static int mjpeg_decode_init(AVCodecContext *avctx) if (avctx->flags & CODEC_FLAG_EXTERN_HUFF) { - printf("mjpeg: using external huffman table\n"); + av_log(avctx, AV_LOG_INFO, "mjpeg: using external huffman table\n"); init_get_bits(&s->gb, avctx->extradata, avctx->extradata_size*8); mjpeg_decode_dht(s); /* should check for error - but dunno */ @@ -987,7 +985,7 @@ static int mjpeg_decode_sof(MJpegDecodeContext *s) if(s->bits==9 && !s->pegasus_rct) s->rct=1; //FIXME ugly if (s->bits != 8 && !s->lossless){ - printf("only 8 bits/component accepted\n"); + av_log(s->avctx, AV_LOG_ERROR, "only 8 bits/component accepted\n"); return -1; } height = get_bits(&s->gb, 16); @@ -1027,13 +1025,17 @@ static int mjpeg_decode_sof(MJpegDecodeContext *s) s->width = width; s->height = height; + s->avctx->width = s->width; + s->avctx->height = s->height; + /* test interlaced mode */ if (s->first_picture && s->org_height != 0 && s->height < ((s->org_height * 3) / 4)) { s->interlaced = 1; // s->bottom_field = (s->interlace_polarity) ? 1 : 0; - s->bottom_field = 0; + s->bottom_field = 0; + s->avctx->height *= 2; } s->qscale_table= av_mallocz((s->width+15)/16); @@ -1049,8 +1051,10 @@ static int mjpeg_decode_sof(MJpegDecodeContext *s) case 0x11: if(s->rgb){ s->avctx->pix_fmt = PIX_FMT_RGBA32; - }else + }else if(s->nb_components==3) s->avctx->pix_fmt = PIX_FMT_YUV444P; + else + s->avctx->pix_fmt = PIX_FMT_GRAY8; break; case 0x21: s->avctx->pix_fmt = PIX_FMT_YUV422P; @@ -1066,7 +1070,7 @@ static int mjpeg_decode_sof(MJpegDecodeContext *s) s->picture.reference= 0; if(s->avctx->get_buffer(s->avctx, &s->picture) < 0){ - fprintf(stderr, "get_buffer() failed\n"); + av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n"); return -1; } s->picture.pict_type= I_TYPE; @@ -1369,7 +1373,7 @@ static int mjpeg_decode_sos(MJpegDecodeContext *s) return -1; } /* XXX: only interleaved scan accepted */ - if (nb_components != 3) + if (nb_components != s->nb_components) { dprintf("decode_sos: components(%d) mismatch\n", nb_components); return -1; @@ -1444,7 +1448,7 @@ static int mjpeg_decode_sos(MJpegDecodeContext *s) } if(s->avctx->debug & FF_DEBUG_PICT_INFO) - printf("%s %s p:%d >>:%d\n", s->lossless ? "lossless" : "sequencial DCT", s->rgb ? "RGB" : "", predictor, point_transform); + av_log(s->avctx, AV_LOG_DEBUG, "%s %s p:%d >>:%d\n", s->lossless ? "lossless" : "sequencial DCT", s->rgb ? "RGB" : "", predictor, point_transform); if(s->lossless){ if(s->rgb){ @@ -1489,7 +1493,7 @@ static int mjpeg_decode_app(MJpegDecodeContext *s) len -= 6; if(s->avctx->debug & FF_DEBUG_STARTCODE){ - printf("APPx %8X\n", id); + av_log(s->avctx, AV_LOG_DEBUG, "APPx %8X\n", id); } /* buggy AVID, it puts EOI only at every 10th frame */ @@ -1504,7 +1508,7 @@ static int mjpeg_decode_app(MJpegDecodeContext *s) 4bytes field_size 4bytes field_size_less_padding */ -// s->buggy_avid = 1; + s->buggy_avid = 1; // if (s->first_picture) // printf("mjpeg: workarounding buggy AVID\n"); s->interlace_polarity = get_bits(&s->gb, 8); @@ -1525,7 +1529,7 @@ static int mjpeg_decode_app(MJpegDecodeContext *s) { int t_w, t_h; skip_bits(&s->gb, 8); /* the trailing zero-byte */ - printf("mjpeg: JFIF header found (version: %x.%x)\n", + av_log(s->avctx, AV_LOG_INFO, "mjpeg: JFIF header found (version: %x.%x)\n", get_bits(&s->gb, 8), get_bits(&s->gb, 8)); skip_bits(&s->gb, 8); @@ -1546,7 +1550,7 @@ static int mjpeg_decode_app(MJpegDecodeContext *s) if (id == ff_get_fourcc("Adob") && (get_bits(&s->gb, 8) == 'e')) { - printf("mjpeg: Adobe header found\n"); + av_log(s->avctx, AV_LOG_INFO, "mjpeg: Adobe header found\n"); skip_bits(&s->gb, 16); /* version */ skip_bits(&s->gb, 16); /* flags0 */ skip_bits(&s->gb, 16); /* flags1 */ @@ -1556,7 +1560,7 @@ static int mjpeg_decode_app(MJpegDecodeContext *s) } if (id == ff_get_fourcc("LJIF")){ - printf("Pegasus lossless jpeg header found\n"); + av_log(s->avctx, AV_LOG_INFO, "Pegasus lossless jpeg header found\n"); skip_bits(&s->gb, 16); /* version ? */ skip_bits(&s->gb, 16); /* unknwon always 0? */ skip_bits(&s->gb, 16); /* unknwon always 0? */ @@ -1571,7 +1575,7 @@ static int mjpeg_decode_app(MJpegDecodeContext *s) s->pegasus_rct=1; break; default: - printf("unknown colorspace\n"); + av_log(s->avctx, AV_LOG_ERROR, "unknown colorspace\n"); } len -= 9; goto out; @@ -1596,14 +1600,14 @@ static int mjpeg_decode_app(MJpegDecodeContext *s) skip_bits(&s->gb, 32); /* data off */ #endif if (s->first_picture) - printf("mjpeg: Apple MJPEG-A header found\n"); + av_log(s->avctx, AV_LOG_INFO, "mjpeg: Apple MJPEG-A header found\n"); } } out: /* slow but needed for extreme adobe jpegs */ if (len < 0) - printf("mjpeg: error, decode_app parser read over the end\n"); + av_log(s->avctx, AV_LOG_ERROR, "mjpeg: error, decode_app parser read over the end\n"); while(--len > 0) skip_bits(&s->gb, 8); @@ -1626,7 +1630,7 @@ static int mjpeg_decode_com(MJpegDecodeContext *s) else cbuf[i] = 0; - printf("mjpeg comment: '%s'\n", cbuf); + av_log(s->avctx, AV_LOG_INFO, "mjpeg comment: '%s'\n", cbuf); /* buggy avid, it puts EOI only at every 10th frame */ if (!strcmp(cbuf, "AVID")) @@ -1766,7 +1770,7 @@ static int mjpeg_decode_frame(AVCodecContext *avctx, s->start_code = start_code; if(s->avctx->debug & FF_DEBUG_STARTCODE){ - printf("startcode: %X\n", start_code); + av_log(s->avctx, AV_LOG_DEBUG, "startcode: %X\n", start_code); } /* process markers */ @@ -1791,7 +1795,7 @@ static int mjpeg_decode_frame(AVCodecContext *avctx, break; case DHT: if(mjpeg_decode_dht(s) < 0){ - fprintf(stderr, "huffman table decode error\n"); + av_log(s->avctx, AV_LOG_ERROR, "huffman table decode error\n"); return -1; } break; @@ -1818,10 +1822,6 @@ eoi_parser: } *picture = s->picture; *data_size = sizeof(AVFrame); - avctx->height = s->height; - if (s->interlaced) - avctx->height *= 2; - avctx->width = s->width; if(!s->lossless){ picture->quality= FFMAX(FFMAX(s->qscale[0], s->qscale[1]), s->qscale[2]); @@ -1829,7 +1829,7 @@ eoi_parser: picture->qscale_table= s->qscale_table; memset(picture->qscale_table, picture->quality, (s->width+15)/16); if(avctx->debug & FF_DEBUG_QP) - printf("QP: %d\n", picture->quality); + av_log(s->avctx, AV_LOG_DEBUG, "QP: %d\n", picture->quality); picture->quality*= FF_QP2LAMBDA; } @@ -1858,7 +1858,7 @@ eoi_parser: case SOF14: case SOF15: case JPG: - printf("mjpeg: unsupported coding type (%x)\n", start_code); + av_log(s->avctx, AV_LOG_ERROR, "mjpeg: unsupported coding type (%x)\n", start_code); break; // default: // printf("mjpeg: unsupported marker (%x)\n", start_code); @@ -1976,10 +1976,6 @@ read_header: *picture= s->picture; *data_size = sizeof(AVFrame); - avctx->height = s->height; - if (s->interlaced) - avctx->height *= 2; - avctx->width = s->width; if(!s->lossless){ picture->quality= FFMAX(FFMAX(s->qscale[0], s->qscale[1]), s->qscale[2]); @@ -1987,7 +1983,7 @@ read_header: picture->qscale_table= s->qscale_table; memset(picture->qscale_table, picture->quality, (s->width+15)/16); if(avctx->debug & FF_DEBUG_QP) - printf("QP: %d\n", picture->quality); + av_log(avctx, AV_LOG_DEBUG, "QP: %d\n", picture->quality); picture->quality*= FF_QP2LAMBDA; } @@ -2148,7 +2144,7 @@ static int sp5x_decode_frame(AVCodecContext *avctx, s->mb_width = (s->width * s->h_max * 8 -1) / (s->h_max * 8); s->mb_height = (s->height * s->v_max * 8 -1) / (s->v_max * 8); - init_get_bits(&s->gb, buf, buf_size*8); + init_get_bits(&s->gb, buf+14, (buf_size-14)*8); return mjpeg_decode_scan(s); #endif |