Mercurial > libavcodec.hg
comparison targaenc.c @ 4673:e7bc1cf41f9f libavcodec
Targa (.tga) encoder,
patch by Bobby Bingham % uhmmmm A gmail P com %
Only handles 24-bit BGR and 8-bit grayscale, no RLE at the moment either.
Original thread:
Date: Mar 11, 2007 7:58 PM
Subject: [Ffmpeg-devel] [PATCH] Targa encoder
author | gpoirier |
---|---|
date | Thu, 15 Mar 2007 12:23:08 +0000 |
parents | |
children | 046456cf7d31 |
comparison
equal
deleted
inserted
replaced
4672:41fdd1901c18 | 4673:e7bc1cf41f9f |
---|---|
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 | |
49 /* TODO: support alpha channel and other bit-depths. and RLE? */ | |
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; | |
56 case PIX_FMT_BGR24: | |
57 outbuf[2] = 2; /* uncompressed true-color image */ | |
58 outbuf[16] = 24; /* bpp */ | |
59 n = 3 * avctx->width; | |
60 break; | |
61 default: | |
62 return -1; | |
63 } | |
64 | |
65 out = outbuf + 18; /* skip past the header we just output */ | |
66 ptr = p->data[0]; | |
67 linesize = p->linesize[0]; | |
68 | |
69 for(i=0; i < avctx->height; i++) { | |
70 memcpy(out, ptr, n); | |
71 out += n; | |
72 ptr += linesize; | |
73 } | |
74 | |
75 /* The standard recommends including this section, even if we don't use | |
76 * any of the features it affords. TODO: take advantage of the pixel | |
77 * aspect ratio and encoder ID fields available? */ | |
78 memcpy(out, "\0\0\0\0\0\0\0\0TRUEVISION-XFILE.", 26); | |
79 | |
80 return out + 26 - outbuf; | |
81 } | |
82 | |
83 static int targa_encode_init(AVCodecContext *avctx) | |
84 { | |
85 return 0; | |
86 } | |
87 | |
88 AVCodec targa_encoder = { | |
89 .name = "targa", | |
90 .type = CODEC_TYPE_VIDEO, | |
91 .id = CODEC_ID_TARGA, | |
92 .priv_data_size = 0, | |
93 .init = targa_encode_init, | |
94 .encode = targa_encode_frame, | |
95 .pix_fmts= (enum PixelFormat[]){PIX_FMT_BGR24, PIX_FMT_GRAY8, -1}, | |
96 }; |