2 * MJPEG A dump header bitstream filter
3 * Copyright (c) 2006 Baptiste Coudurier.
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 * @file mjpega_dump_header_bsf.c
24 * MJPEG A dump header bitstream filter
25 * modifies bitstream to be decoded by quicktime
29 #include "bytestream.h"
33 static int mjpega_dump_header(AVBitStreamFilterContext
*bsfc
, AVCodecContext
*avctx
, const char *args
,
34 uint8_t **poutbuf
, int *poutbuf_size
,
35 const uint8_t *buf
, int buf_size
, int keyframe
)
40 if (avctx
->codec_id
!= CODEC_ID_MJPEG
) {
41 av_log(avctx
, AV_LOG_ERROR
, "mjpega bitstream filter only applies to mjpeg codec\n");
46 *poutbuf
= av_malloc(buf_size
+ 44 + FF_INPUT_BUFFER_PADDING_SIZE
);
48 bytestream_put_byte(&poutbufp
, 0xff);
49 bytestream_put_byte(&poutbufp
, SOI
);
50 bytestream_put_byte(&poutbufp
, 0xff);
51 bytestream_put_byte(&poutbufp
, APP1
);
52 bytestream_put_be16(&poutbufp
, 42); /* size */
53 bytestream_put_be32(&poutbufp
, 0);
54 bytestream_put_buffer(&poutbufp
, "mjpg", 4);
55 bytestream_put_be32(&poutbufp
, buf_size
+ 44); /* field size */
56 bytestream_put_be32(&poutbufp
, buf_size
+ 44); /* pad field size */
57 bytestream_put_be32(&poutbufp
, 0); /* next ptr */
59 for (i
= 0; i
< buf_size
- 1; i
++) {
62 case DQT
: /* quant off */
63 case DHT
: /* huff off */
64 case SOF0
: /* image off */
65 bytestream_put_be32(&poutbufp
, i
+ 46);
68 bytestream_put_be32(&poutbufp
, i
+ 46); /* scan off */
69 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 */
71 *poutbuf_size
= poutbufp
- *poutbuf
;
74 if (i
+ 8 < buf_size
&& AV_RL32(buf
+ i
+ 8) == ff_get_fourcc("mjpg")) {
75 av_log(avctx
, AV_LOG_ERROR
, "bitstream already formatted\n");
76 memcpy(*poutbuf
, buf
, buf_size
);
77 *poutbuf_size
= buf_size
;
84 av_log(avctx
, AV_LOG_ERROR
, "could not find SOS marker in bitstream\n");
88 AVBitStreamFilter mjpega_dump_header_bsf
= {