1 /*
2 * Targa (.tga) image encoder
3 * Copyright (c) 2007 Bobby Bingham
4 *
5 * This file is part of FFmpeg.
6 *
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.
11 *
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.
16 *
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
20 */
21
22 #include <string.h>
23
31
32 /**
33 * RLE compress the image, with maximum size of out_size
34 * @param outbuf Output buffer
35 * @param out_size Maximum output size
36 * @param pic Image to compress
37 * @param bpp Bytes per pixel
38 * @param w Image width
39 * @param h Image height
40 * @return Size of output in bytes, or -1 if larger than out_size
41 */
43 int bpp, int w, int h)
44 {
47
48 out = outbuf;
49
50 for(y = 0; y < h; y ++) {
52 if(ret == -1){
53 return -1;
54 }
57 }
58
59 return out - outbuf;
60 }
61
63 {
67
68 for(i=0; i < h; i++) {
69 memcpy(out, ptr, n);
72 }
73
74 return out - outbuf;
75 }
76
78 const AVFrame *p,
int *got_packet)
79 {
80 int bpp, picsize, datasize = -1,
ret, i;
82
83 if(avctx->
width > 0xffff || avctx->
height > 0xffff) {
86 }
90
91 /* zero out the header and only set applicable fields */
92 memset(pkt->
data, 0, 12);
95 /* image descriptor byte: origin is always top-left, bits 0-3 specify alpha */
97
98 out = pkt->
data + 18;
/* skip past the header we write */
99
103 int pal_bpp = 24; /* Only write 32bit palette if there is transparency information */
104 for (i = 0; i < 256; i++)
106 pal_bpp = 32;
107 break;
108 }
109 pkt->
data[1] = 1;
/* palette present */
110 pkt->
data[2] =
TGA_PAL;
/* uncompressed palettised image */
111 pkt->
data[6] = 1;
/* palette contains 256 entries */
112 pkt->
data[7] = pal_bpp;
/* palette contains pal_bpp bit entries */
113 pkt->
data[16] = 8;
/* bpp */
114 for (i = 0; i < 256; i++)
115 if (pal_bpp == 32) {
117 } else {
119 }
120 out += 32 * pal_bpp; /* skip past the palette we just output */
121 break;
122 }
124 pkt->
data[2] =
TGA_BW;
/* uncompressed grayscale image */
126 pkt->
data[16] = 8;
/* bpp */
127 break;
129 pkt->
data[2] =
TGA_RGB;
/* uncompressed true-color image */
131 pkt->
data[16] = 16;
/* bpp */
132 break;
134 pkt->
data[2] =
TGA_RGB;
/* uncompressed true-color image */
135 pkt->
data[16] = 24;
/* bpp */
136 break;
138 pkt->
data[2] =
TGA_RGB;
/* uncompressed true-color image */
139 pkt->
data[16] = 32;
/* bpp */
140 break;
141 default:
145 }
146 bpp = pkt->
data[16] >> 3;
147
148 /* try RLE compression */
151
152 /* if that worked well, mark the picture as RLE compressed */
153 if(datasize >= 0)
155
156 /* if RLE didn't make it smaller, go back to no compression */
158
159 out += datasize;
160
161 /* The standard recommends including this section, even if we don't use
162 * any of the features it affords. TODO: take advantage of the pixel
163 * aspect ratio and encoder ID fields available? */
164 memcpy(out, "0円0円0円0円0円0円0円0円TRUEVISION-XFILE.", 26);
165
168 *got_packet = 1;
169
170 return 0;
171 }
172
174 {
178
181
182 return 0;
183 }
184
186 {
188 return 0;
189 }
190
202 },
203 };