Mercurial > libavcodec.hg
annotate targaenc.c @ 4676:046456cf7d31 libavcodec
Add 15 bit support, patch by Bobby Bingham, uhmmmm gmail com.
author | diego |
---|---|
date | Sat, 17 Mar 2007 12:56:34 +0000 |
parents | e7bc1cf41f9f |
children | 47237f2638b2 |
rev | line source |
---|---|
4673 | 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 "avcodec.h" | |
23 | |
24 static int targa_encode_frame(AVCodecContext *avctx, | |
25 unsigned char *outbuf, | |
26 int buf_size, void *data){ | |
27 AVFrame *p = data; | |
28 int i, n, linesize; | |
29 uint8_t *ptr, *out; | |
30 | |
31 if(avctx->width > 0xffff || avctx->height > 0xffff) { | |
32 av_log(avctx, AV_LOG_ERROR, "image dimensions too large\n"); | |
33 return -1; | |
34 } | |
35 if(buf_size < avpicture_get_size(avctx->pix_fmt, avctx->width, avctx->height) + 45) { | |
36 av_log(avctx, AV_LOG_ERROR, "encoded frame too large\n"); | |
37 return -1; | |
38 } | |
39 | |
40 p->pict_type= FF_I_TYPE; | |
41 p->key_frame= 1; | |
42 | |
43 /* zero out the header and only set applicable fields */ | |
44 memset(outbuf, 0, 11); | |
45 AV_WL16(outbuf+12, avctx->width); | |
46 AV_WL16(outbuf+14, avctx->height); | |
47 outbuf[17] = 0x20; /* origin is top-left. no alpha */ | |
48 | |
4676
046456cf7d31
Add 15 bit support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4673
diff
changeset
|
49 /* TODO: support alpha channel and RLE */ |
4673 | 50 switch(avctx->pix_fmt) { |
51 case PIX_FMT_GRAY8: | |
52 outbuf[2] = 3; /* uncompressed grayscale image */ | |
53 outbuf[16] = 8; /* bpp */ | |
54 n = avctx->width; | |
55 break; | |
4676
046456cf7d31
Add 15 bit support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4673
diff
changeset
|
56 case PIX_FMT_RGB555: |
046456cf7d31
Add 15 bit support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4673
diff
changeset
|
57 outbuf[2] = 2; /* uncompresses true-color image */ |
046456cf7d31
Add 15 bit support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4673
diff
changeset
|
58 outbuf[16] = 16; /* bpp */ |
046456cf7d31
Add 15 bit support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4673
diff
changeset
|
59 n = 2 * avctx->width; |
046456cf7d31
Add 15 bit support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4673
diff
changeset
|
60 break; |
4673 | 61 case PIX_FMT_BGR24: |
62 outbuf[2] = 2; /* uncompressed true-color image */ | |
63 outbuf[16] = 24; /* bpp */ | |
64 n = 3 * avctx->width; | |
65 break; | |
66 default: | |
67 return -1; | |
68 } | |
69 | |
70 out = outbuf + 18; /* skip past the header we just output */ | |
71 ptr = p->data[0]; | |
72 linesize = p->linesize[0]; | |
73 | |
74 for(i=0; i < avctx->height; i++) { | |
75 memcpy(out, ptr, n); | |
76 out += n; | |
77 ptr += linesize; | |
78 } | |
79 | |
80 /* The standard recommends including this section, even if we don't use | |
81 * any of the features it affords. TODO: take advantage of the pixel | |
82 * aspect ratio and encoder ID fields available? */ | |
83 memcpy(out, "\0\0\0\0\0\0\0\0TRUEVISION-XFILE.", 26); | |
84 | |
85 return out + 26 - outbuf; | |
86 } | |
87 | |
88 static int targa_encode_init(AVCodecContext *avctx) | |
89 { | |
90 return 0; | |
91 } | |
92 | |
93 AVCodec targa_encoder = { | |
94 .name = "targa", | |
95 .type = CODEC_TYPE_VIDEO, | |
96 .id = CODEC_ID_TARGA, | |
97 .priv_data_size = 0, | |
98 .init = targa_encode_init, | |
99 .encode = targa_encode_frame, | |
4676
046456cf7d31
Add 15 bit support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4673
diff
changeset
|
100 .pix_fmts= (enum PixelFormat[]){PIX_FMT_BGR24, PIX_FMT_RGB555, PIX_FMT_GRAY8, -1}, |
4673 | 101 }; |