Mercurial > libavcodec.hg
annotate bmpenc.c @ 12043:f9a0bd0888a4 libavcodec
mpegaudio: call ff_mpegaudiodec_init_mmx() only from float decoder
The mmx code is floating-point only, and this function does not know
from which decoder it is called. Without this change, the integer
decoder only "works" because the size of the context struct is smaller
in this case, and the mmx init function writes the function pointer
outside the allocated context.
author | mru |
---|---|
date | Thu, 01 Jul 2010 23:21:17 +0000 |
parents | 8a4984c5cacc |
children |
rev | line source |
---|---|
4477 | 1 /* |
2 * BMP image format encoder | |
3 * Copyright (c) 2006, 2007 Michel Bardiaux | |
9164
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
4 * Copyright (c) 2009 Daniel Verkamp <daniel at drv.nu> |
4477 | 5 * |
6 * This file is part of FFmpeg. | |
7 * | |
8 * FFmpeg is free software; you can redistribute it and/or | |
9 * modify it under the terms of the GNU Lesser General Public | |
10 * License as published by the Free Software Foundation; either | |
11 * version 2.1 of the License, or (at your option) any later version. | |
12 * | |
13 * FFmpeg is distributed in the hope that it will be useful, | |
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
16 * Lesser General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU Lesser General Public | |
19 * License along with FFmpeg; if not, write to the Free Software | |
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
21 */ | |
22 | |
23 #include "avcodec.h" | |
24 #include "bytestream.h" | |
25 #include "bmp.h" | |
26 | |
9164
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
27 static const uint32_t monoblack_pal[] = { 0x000000, 0xFFFFFF }; |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
28 static const uint32_t rgb565_masks[] = { 0xF800, 0x07E0, 0x001F }; |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
29 |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
4477
diff
changeset
|
30 static av_cold int bmp_encode_init(AVCodecContext *avctx){ |
4477 | 31 BMPContext *s = avctx->priv_data; |
32 | |
33 avcodec_get_frame_defaults((AVFrame*)&s->picture); | |
34 avctx->coded_frame = (AVFrame*)&s->picture; | |
35 | |
36 return 0; | |
37 } | |
38 | |
39 static int bmp_encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){ | |
40 BMPContext *s = avctx->priv_data; | |
41 AVFrame *pict = data; | |
42 AVFrame * const p= (AVFrame*)&s->picture; | |
43 int n_bytes_image, n_bytes_per_row, n_bytes, i, n, hsize; | |
9164
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
44 const uint32_t *pal = NULL; |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
45 int pad_bytes_per_row, bit_count, pal_entries = 0, compression = BMP_RGB; |
4477 | 46 uint8_t *ptr; |
47 unsigned char* buf0 = buf; | |
48 *p = *pict; | |
49 p->pict_type= FF_I_TYPE; | |
50 p->key_frame= 1; | |
9164
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
51 switch (avctx->pix_fmt) { |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
52 case PIX_FMT_BGR24: |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
53 bit_count = 24; |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
54 break; |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
55 case PIX_FMT_RGB555: |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
56 bit_count = 16; |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
57 break; |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
58 case PIX_FMT_RGB565: |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
59 bit_count = 16; |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
60 compression = BMP_BITFIELDS; |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
61 pal = rgb565_masks; // abuse pal to hold color masks |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
62 pal_entries = 3; |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
63 break; |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
64 case PIX_FMT_RGB8: |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
65 case PIX_FMT_BGR8: |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
66 case PIX_FMT_RGB4_BYTE: |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
67 case PIX_FMT_BGR4_BYTE: |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
68 case PIX_FMT_GRAY8: |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
69 case PIX_FMT_PAL8: |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
70 bit_count = 8; |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
71 pal = (uint32_t *)p->data[1]; |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
72 break; |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
73 case PIX_FMT_MONOBLACK: |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
74 bit_count = 1; |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
75 pal = monoblack_pal; |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
76 break; |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
77 default: |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
78 return -1; |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
79 } |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
80 if (pal && !pal_entries) pal_entries = 1 << bit_count; |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
81 n_bytes_per_row = ((int64_t)avctx->width * (int64_t)bit_count + 7LL) >> 3LL; |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
82 pad_bytes_per_row = (4 - n_bytes_per_row) & 3; |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
83 n_bytes_image = avctx->height * (n_bytes_per_row + pad_bytes_per_row); |
4477 | 84 |
85 // STRUCTURE.field refer to the MSVC documentation for BITMAPFILEHEADER | |
86 // and related pages. | |
87 #define SIZE_BITMAPFILEHEADER 14 | |
88 #define SIZE_BITMAPINFOHEADER 40 | |
9164
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
89 hsize = SIZE_BITMAPFILEHEADER + SIZE_BITMAPINFOHEADER + (pal_entries << 2); |
4477 | 90 n_bytes = n_bytes_image + hsize; |
91 if(n_bytes>buf_size) { | |
92 av_log(avctx, AV_LOG_ERROR, "buf size too small (need %d, got %d)\n", n_bytes, buf_size); | |
93 return -1; | |
94 } | |
95 bytestream_put_byte(&buf, 'B'); // BITMAPFILEHEADER.bfType | |
96 bytestream_put_byte(&buf, 'M'); // do. | |
97 bytestream_put_le32(&buf, n_bytes); // BITMAPFILEHEADER.bfSize | |
98 bytestream_put_le16(&buf, 0); // BITMAPFILEHEADER.bfReserved1 | |
99 bytestream_put_le16(&buf, 0); // BITMAPFILEHEADER.bfReserved2 | |
100 bytestream_put_le32(&buf, hsize); // BITMAPFILEHEADER.bfOffBits | |
101 bytestream_put_le32(&buf, SIZE_BITMAPINFOHEADER); // BITMAPINFOHEADER.biSize | |
102 bytestream_put_le32(&buf, avctx->width); // BITMAPINFOHEADER.biWidth | |
103 bytestream_put_le32(&buf, avctx->height); // BITMAPINFOHEADER.biHeight | |
104 bytestream_put_le16(&buf, 1); // BITMAPINFOHEADER.biPlanes | |
9164
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
105 bytestream_put_le16(&buf, bit_count); // BITMAPINFOHEADER.biBitCount |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
106 bytestream_put_le32(&buf, compression); // BITMAPINFOHEADER.biCompression |
4477 | 107 bytestream_put_le32(&buf, n_bytes_image); // BITMAPINFOHEADER.biSizeImage |
108 bytestream_put_le32(&buf, 0); // BITMAPINFOHEADER.biXPelsPerMeter | |
109 bytestream_put_le32(&buf, 0); // BITMAPINFOHEADER.biYPelsPerMeter | |
110 bytestream_put_le32(&buf, 0); // BITMAPINFOHEADER.biClrUsed | |
111 bytestream_put_le32(&buf, 0); // BITMAPINFOHEADER.biClrImportant | |
9164
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
112 for (i = 0; i < pal_entries; i++) |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
113 bytestream_put_le32(&buf, pal[i] & 0xFFFFFF); |
4477 | 114 // BMP files are bottom-to-top so we start from the end... |
115 ptr = p->data[0] + (avctx->height - 1) * p->linesize[0]; | |
116 buf = buf0 + hsize; | |
117 for(i = 0; i < avctx->height; i++) { | |
9164
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
118 if (bit_count == 16) { |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
119 const uint16_t *src = (const uint16_t *) ptr; |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
120 uint16_t *dst = (uint16_t *) buf; |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
121 for(n = 0; n < avctx->width; n++) |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
122 AV_WL16(dst + n, src[n]); |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
123 } else { |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
124 memcpy(buf, ptr, n_bytes_per_row); |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
125 } |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
126 buf += n_bytes_per_row; |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
127 memset(buf, 0, pad_bytes_per_row); |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
128 buf += pad_bytes_per_row; |
4477 | 129 ptr -= p->linesize[0]; // ... and go back |
130 } | |
131 return n_bytes; | |
132 } | |
133 | |
134 AVCodec bmp_encoder = { | |
135 "bmp", | |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
10147
diff
changeset
|
136 AVMEDIA_TYPE_VIDEO, |
4477 | 137 CODEC_ID_BMP, |
138 sizeof(BMPContext), | |
139 bmp_encode_init, | |
140 bmp_encode_frame, | |
141 NULL, //encode_end, | |
10147 | 142 .pix_fmts = (const enum PixelFormat[]){ |
9164
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
143 PIX_FMT_BGR24, |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
144 PIX_FMT_RGB555, PIX_FMT_RGB565, |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
145 PIX_FMT_RGB8, PIX_FMT_BGR8, PIX_FMT_RGB4_BYTE, PIX_FMT_BGR4_BYTE, PIX_FMT_GRAY8, PIX_FMT_PAL8, |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
146 PIX_FMT_MONOBLACK, |
c48f55549c06
Add 1bpp, 8bpp, 15bpp, and 16bpp support to BMP encoder.
cehoyos
parents:
7040
diff
changeset
|
147 PIX_FMT_NONE}, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6788
diff
changeset
|
148 .long_name = NULL_IF_CONFIG_SMALL("BMP image"), |
4477 | 149 }; |