Mercurial > libavcodec.hg
comparison mjpega_dump_header_bsf.c @ 8305:1408a8907da9 libavcodec
fix mjpega bitfilter when dht, dqt, sof0 are not ordered as expected, patch by Jay Freeman, saurik at saurik com
author | bcoudurier |
---|---|
date | Fri, 12 Dec 2008 01:40:00 +0000 |
parents | 325557621708 |
children | b20c590170cc |
comparison
equal
deleted
inserted
replaced
8304:3cddc18caeca | 8305:1408a8907da9 |
---|---|
33 static int mjpega_dump_header(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args, | 33 static int mjpega_dump_header(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args, |
34 uint8_t **poutbuf, int *poutbuf_size, | 34 uint8_t **poutbuf, int *poutbuf_size, |
35 const uint8_t *buf, int buf_size, int keyframe) | 35 const uint8_t *buf, int buf_size, int keyframe) |
36 { | 36 { |
37 uint8_t *poutbufp; | 37 uint8_t *poutbufp; |
38 unsigned dqt = 0, dht = 0, sof0 = 0; | |
38 int i; | 39 int i; |
39 | 40 |
40 if (avctx->codec_id != CODEC_ID_MJPEG) { | 41 if (avctx->codec_id != CODEC_ID_MJPEG) { |
41 av_log(avctx, AV_LOG_ERROR, "mjpega bitstream filter only applies to mjpeg codec\n"); | 42 av_log(avctx, AV_LOG_ERROR, "mjpega bitstream filter only applies to mjpeg codec\n"); |
42 return 0; | 43 return 0; |
57 bytestream_put_be32(&poutbufp, 0); /* next ptr */ | 58 bytestream_put_be32(&poutbufp, 0); /* next ptr */ |
58 | 59 |
59 for (i = 0; i < buf_size - 1; i++) { | 60 for (i = 0; i < buf_size - 1; i++) { |
60 if (buf[i] == 0xff) { | 61 if (buf[i] == 0xff) { |
61 switch (buf[i + 1]) { | 62 switch (buf[i + 1]) { |
62 case DQT: /* quant off */ | 63 case DQT: dqt = i + 46; break; |
63 case DHT: /* huff off */ | 64 case DHT: dht = i + 46; break; |
64 case SOF0: /* image off */ | 65 case SOF0: sof0 = i + 46; break; |
65 bytestream_put_be32(&poutbufp, i + 46); | |
66 break; | |
67 case SOS: | 66 case SOS: |
67 bytestream_put_be32(&poutbufp, dqt); /* quant off */ | |
68 bytestream_put_be32(&poutbufp, dht); /* huff off */ | |
69 bytestream_put_be32(&poutbufp, sof0); /* image off */ | |
68 bytestream_put_be32(&poutbufp, i + 46); /* scan off */ | 70 bytestream_put_be32(&poutbufp, i + 46); /* scan off */ |
69 bytestream_put_be32(&poutbufp, i + 46 + AV_RB16(buf + i + 2)); /* data off */ | 71 bytestream_put_be32(&poutbufp, i + 46 + AV_RB16(buf + i + 2)); /* data off */ |
70 bytestream_put_buffer(&poutbufp, buf + 2, buf_size - 2); /* skip already written SOI */ | 72 bytestream_put_buffer(&poutbufp, buf + 2, buf_size - 2); /* skip already written SOI */ |
71 *poutbuf_size = poutbufp - *poutbuf; | 73 *poutbuf_size = poutbufp - *poutbuf; |
72 return 1; | 74 return 1; |