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;