annotate gif.c @ 1166:e89500dd9064 libavformat

remove STATS code (probably hasnt been used for years ..., and its not completely clear what it was good for anyway)
author michael
date Sun, 09 Jul 2006 10:33:49 +0000
parents 6992dd78ff68
children d89d7ef290da
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1 /*
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2 * Animated GIF encoder
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
3 * Copyright (c) 2000 Fabrice Bellard.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
4 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
8 * version 2 of the License, or (at your option) any later version.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
9 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
13 * Lesser General Public License for more details.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
14 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
896
edbe5c3717f9 Update licensing information: The FSF changed postal address.
diego
parents: 887
diff changeset
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
18 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
19
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
20 /*
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
21 * First version by Francois Revol revol@free.fr
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
22 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
23 * Features and limitations:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
24 * - currently no compression is performed,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
25 * in fact the size of the data is 9/8 the size of the image in 8bpp
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
26 * - uses only a global standard palette
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
27 * - tested with IE 5.0, Opera for BeOS, NetPositive (BeOS), and Mozilla (BeOS).
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
28 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
29 * Reference documents:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
30 * http://www.goice.co.jp/member/mo/formats/gif.html
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
31 * http://astronomy.swin.edu.au/pbourke/dataformats/gif/
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
32 * http://www.dcs.ed.ac.uk/home/mxr/gfx/2d/GIF89a.txt
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
33 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
34 * this url claims to have an LZW algorithm not covered by Unisys patent:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
35 * http://www.msg.net/utility/whirlgif/gifencod.html
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
36 * could help reduce the size of the files _a lot_...
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
37 * some sites mentions an RLE type compression also.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
38 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
39
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
40 #include "avformat.h"
628
8909a59c9461 common.h -> common.h/bitstream.h
michael
parents: 507
diff changeset
41 #include "bitstream.h"
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
42
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
43 /* bitstream minipacket size */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
44 #define GIF_CHUNKS 100
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
45
790
80aec794c2ed Animated GIF looping patch by (Todd Kirby // ffmpeg.php gmail com)
michael
parents: 743
diff changeset
46 /* slows down the decoding (and some browsers don't like it) */
80aec794c2ed Animated GIF looping patch by (Todd Kirby // ffmpeg.php gmail com)
michael
parents: 743
diff changeset
47 /* update on the 'some browsers don't like it issue from above: this was probably due to missing 'Data Sub-block Terminator' (byte 19) in the app_header */
80aec794c2ed Animated GIF looping patch by (Todd Kirby // ffmpeg.php gmail com)
michael
parents: 743
diff changeset
48 #define GIF_ADD_APP_HEADER // required to enable looping of animated gif
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
49
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
50 typedef struct {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
51 unsigned char r;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
52 unsigned char g;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
53 unsigned char b;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
54 } rgb_triplet;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
55
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
56 /* we use the standard 216 color palette */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
57
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
58 /* this script was used to create the palette:
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
59 * for r in 00 33 66 99 cc ff; do for g in 00 33 66 99 cc ff; do echo -n " "; for b in 00 33 66 99 cc ff; do
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
60 * echo -n "{ 0x$r, 0x$g, 0x$b }, "; done; echo ""; done; done
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
61 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
62
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
63 static const rgb_triplet gif_clut[216] = {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
64 { 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x33 }, { 0x00, 0x00, 0x66 }, { 0x00, 0x00, 0x99 }, { 0x00, 0x00, 0xcc }, { 0x00, 0x00, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
65 { 0x00, 0x33, 0x00 }, { 0x00, 0x33, 0x33 }, { 0x00, 0x33, 0x66 }, { 0x00, 0x33, 0x99 }, { 0x00, 0x33, 0xcc }, { 0x00, 0x33, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
66 { 0x00, 0x66, 0x00 }, { 0x00, 0x66, 0x33 }, { 0x00, 0x66, 0x66 }, { 0x00, 0x66, 0x99 }, { 0x00, 0x66, 0xcc }, { 0x00, 0x66, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
67 { 0x00, 0x99, 0x00 }, { 0x00, 0x99, 0x33 }, { 0x00, 0x99, 0x66 }, { 0x00, 0x99, 0x99 }, { 0x00, 0x99, 0xcc }, { 0x00, 0x99, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
68 { 0x00, 0xcc, 0x00 }, { 0x00, 0xcc, 0x33 }, { 0x00, 0xcc, 0x66 }, { 0x00, 0xcc, 0x99 }, { 0x00, 0xcc, 0xcc }, { 0x00, 0xcc, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
69 { 0x00, 0xff, 0x00 }, { 0x00, 0xff, 0x33 }, { 0x00, 0xff, 0x66 }, { 0x00, 0xff, 0x99 }, { 0x00, 0xff, 0xcc }, { 0x00, 0xff, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
70 { 0x33, 0x00, 0x00 }, { 0x33, 0x00, 0x33 }, { 0x33, 0x00, 0x66 }, { 0x33, 0x00, 0x99 }, { 0x33, 0x00, 0xcc }, { 0x33, 0x00, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
71 { 0x33, 0x33, 0x00 }, { 0x33, 0x33, 0x33 }, { 0x33, 0x33, 0x66 }, { 0x33, 0x33, 0x99 }, { 0x33, 0x33, 0xcc }, { 0x33, 0x33, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
72 { 0x33, 0x66, 0x00 }, { 0x33, 0x66, 0x33 }, { 0x33, 0x66, 0x66 }, { 0x33, 0x66, 0x99 }, { 0x33, 0x66, 0xcc }, { 0x33, 0x66, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
73 { 0x33, 0x99, 0x00 }, { 0x33, 0x99, 0x33 }, { 0x33, 0x99, 0x66 }, { 0x33, 0x99, 0x99 }, { 0x33, 0x99, 0xcc }, { 0x33, 0x99, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
74 { 0x33, 0xcc, 0x00 }, { 0x33, 0xcc, 0x33 }, { 0x33, 0xcc, 0x66 }, { 0x33, 0xcc, 0x99 }, { 0x33, 0xcc, 0xcc }, { 0x33, 0xcc, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
75 { 0x33, 0xff, 0x00 }, { 0x33, 0xff, 0x33 }, { 0x33, 0xff, 0x66 }, { 0x33, 0xff, 0x99 }, { 0x33, 0xff, 0xcc }, { 0x33, 0xff, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
76 { 0x66, 0x00, 0x00 }, { 0x66, 0x00, 0x33 }, { 0x66, 0x00, 0x66 }, { 0x66, 0x00, 0x99 }, { 0x66, 0x00, 0xcc }, { 0x66, 0x00, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
77 { 0x66, 0x33, 0x00 }, { 0x66, 0x33, 0x33 }, { 0x66, 0x33, 0x66 }, { 0x66, 0x33, 0x99 }, { 0x66, 0x33, 0xcc }, { 0x66, 0x33, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
78 { 0x66, 0x66, 0x00 }, { 0x66, 0x66, 0x33 }, { 0x66, 0x66, 0x66 }, { 0x66, 0x66, 0x99 }, { 0x66, 0x66, 0xcc }, { 0x66, 0x66, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
79 { 0x66, 0x99, 0x00 }, { 0x66, 0x99, 0x33 }, { 0x66, 0x99, 0x66 }, { 0x66, 0x99, 0x99 }, { 0x66, 0x99, 0xcc }, { 0x66, 0x99, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
80 { 0x66, 0xcc, 0x00 }, { 0x66, 0xcc, 0x33 }, { 0x66, 0xcc, 0x66 }, { 0x66, 0xcc, 0x99 }, { 0x66, 0xcc, 0xcc }, { 0x66, 0xcc, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
81 { 0x66, 0xff, 0x00 }, { 0x66, 0xff, 0x33 }, { 0x66, 0xff, 0x66 }, { 0x66, 0xff, 0x99 }, { 0x66, 0xff, 0xcc }, { 0x66, 0xff, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
82 { 0x99, 0x00, 0x00 }, { 0x99, 0x00, 0x33 }, { 0x99, 0x00, 0x66 }, { 0x99, 0x00, 0x99 }, { 0x99, 0x00, 0xcc }, { 0x99, 0x00, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
83 { 0x99, 0x33, 0x00 }, { 0x99, 0x33, 0x33 }, { 0x99, 0x33, 0x66 }, { 0x99, 0x33, 0x99 }, { 0x99, 0x33, 0xcc }, { 0x99, 0x33, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
84 { 0x99, 0x66, 0x00 }, { 0x99, 0x66, 0x33 }, { 0x99, 0x66, 0x66 }, { 0x99, 0x66, 0x99 }, { 0x99, 0x66, 0xcc }, { 0x99, 0x66, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
85 { 0x99, 0x99, 0x00 }, { 0x99, 0x99, 0x33 }, { 0x99, 0x99, 0x66 }, { 0x99, 0x99, 0x99 }, { 0x99, 0x99, 0xcc }, { 0x99, 0x99, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
86 { 0x99, 0xcc, 0x00 }, { 0x99, 0xcc, 0x33 }, { 0x99, 0xcc, 0x66 }, { 0x99, 0xcc, 0x99 }, { 0x99, 0xcc, 0xcc }, { 0x99, 0xcc, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
87 { 0x99, 0xff, 0x00 }, { 0x99, 0xff, 0x33 }, { 0x99, 0xff, 0x66 }, { 0x99, 0xff, 0x99 }, { 0x99, 0xff, 0xcc }, { 0x99, 0xff, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
88 { 0xcc, 0x00, 0x00 }, { 0xcc, 0x00, 0x33 }, { 0xcc, 0x00, 0x66 }, { 0xcc, 0x00, 0x99 }, { 0xcc, 0x00, 0xcc }, { 0xcc, 0x00, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
89 { 0xcc, 0x33, 0x00 }, { 0xcc, 0x33, 0x33 }, { 0xcc, 0x33, 0x66 }, { 0xcc, 0x33, 0x99 }, { 0xcc, 0x33, 0xcc }, { 0xcc, 0x33, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
90 { 0xcc, 0x66, 0x00 }, { 0xcc, 0x66, 0x33 }, { 0xcc, 0x66, 0x66 }, { 0xcc, 0x66, 0x99 }, { 0xcc, 0x66, 0xcc }, { 0xcc, 0x66, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
91 { 0xcc, 0x99, 0x00 }, { 0xcc, 0x99, 0x33 }, { 0xcc, 0x99, 0x66 }, { 0xcc, 0x99, 0x99 }, { 0xcc, 0x99, 0xcc }, { 0xcc, 0x99, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
92 { 0xcc, 0xcc, 0x00 }, { 0xcc, 0xcc, 0x33 }, { 0xcc, 0xcc, 0x66 }, { 0xcc, 0xcc, 0x99 }, { 0xcc, 0xcc, 0xcc }, { 0xcc, 0xcc, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
93 { 0xcc, 0xff, 0x00 }, { 0xcc, 0xff, 0x33 }, { 0xcc, 0xff, 0x66 }, { 0xcc, 0xff, 0x99 }, { 0xcc, 0xff, 0xcc }, { 0xcc, 0xff, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
94 { 0xff, 0x00, 0x00 }, { 0xff, 0x00, 0x33 }, { 0xff, 0x00, 0x66 }, { 0xff, 0x00, 0x99 }, { 0xff, 0x00, 0xcc }, { 0xff, 0x00, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
95 { 0xff, 0x33, 0x00 }, { 0xff, 0x33, 0x33 }, { 0xff, 0x33, 0x66 }, { 0xff, 0x33, 0x99 }, { 0xff, 0x33, 0xcc }, { 0xff, 0x33, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
96 { 0xff, 0x66, 0x00 }, { 0xff, 0x66, 0x33 }, { 0xff, 0x66, 0x66 }, { 0xff, 0x66, 0x99 }, { 0xff, 0x66, 0xcc }, { 0xff, 0x66, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
97 { 0xff, 0x99, 0x00 }, { 0xff, 0x99, 0x33 }, { 0xff, 0x99, 0x66 }, { 0xff, 0x99, 0x99 }, { 0xff, 0x99, 0xcc }, { 0xff, 0x99, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
98 { 0xff, 0xcc, 0x00 }, { 0xff, 0xcc, 0x33 }, { 0xff, 0xcc, 0x66 }, { 0xff, 0xcc, 0x99 }, { 0xff, 0xcc, 0xcc }, { 0xff, 0xcc, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
99 { 0xff, 0xff, 0x00 }, { 0xff, 0xff, 0x33 }, { 0xff, 0xff, 0x66 }, { 0xff, 0xff, 0x99 }, { 0xff, 0xff, 0xcc }, { 0xff, 0xff, 0xff },
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
100 };
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
101
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
102 /* The GIF format uses reversed order for bitstreams... */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
103 /* at least they don't use PDP_ENDIAN :) */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
104 /* so we 'extend' PutBitContext. hmmm, OOP :) */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
105 /* seems this thing changed slightly since I wrote it... */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
106
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
107 #ifdef ALT_BITSTREAM_WRITER
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
108 # error no ALT_BITSTREAM_WRITER support for now
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
109 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
110
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
111 static void gif_put_bits_rev(PutBitContext *s, int n, unsigned int value)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
112 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
113 unsigned int bit_buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
114 int bit_cnt;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
115
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
116 // printf("put_bits=%d %x\n", n, value);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
117 assert(n == 32 || value < (1U << n));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
118
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
119 bit_buf = s->bit_buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
120 bit_cnt = 32 - s->bit_left; /* XXX:lazyness... was = s->bit_cnt; */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
121
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
122 // printf("n=%d value=%x cnt=%d buf=%x\n", n, value, bit_cnt, bit_buf);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
123 /* XXX: optimize */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
124 if (n < (32-bit_cnt)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
125 bit_buf |= value << (bit_cnt);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
126 bit_cnt+=n;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
127 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
128 bit_buf |= value << (bit_cnt);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
129
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
130 *s->buf_ptr = bit_buf & 0xff;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
131 s->buf_ptr[1] = (bit_buf >> 8) & 0xff;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
132 s->buf_ptr[2] = (bit_buf >> 16) & 0xff;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
133 s->buf_ptr[3] = (bit_buf >> 24) & 0xff;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
134
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
135 //printf("bitbuf = %08x\n", bit_buf);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
136 s->buf_ptr+=4;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
137 if (s->buf_ptr >= s->buf_end)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
138 puts("bit buffer overflow !!"); // should never happen ! who got rid of the callback ???
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
139 // flush_buffer_rev(s);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
140 bit_cnt=bit_cnt + n - 32;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
141 if (bit_cnt == 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
142 bit_buf = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
143 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
144 bit_buf = value >> (n - bit_cnt);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
145 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
146 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
147
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
148 s->bit_buf = bit_buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
149 s->bit_left = 32 - bit_cnt;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
150 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
151
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
152 /* pad the end of the output stream with zeros */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
153 static void gif_flush_put_bits_rev(PutBitContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
154 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
155 while (s->bit_left < 32) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
156 /* XXX: should test end of buffer */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
157 *s->buf_ptr++=s->bit_buf & 0xff;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
158 s->bit_buf>>=8;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
159 s->bit_left+=8;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
160 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
161 // flush_buffer_rev(s);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
162 s->bit_left=32;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
163 s->bit_buf=0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
164 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
165
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
166 /* !RevPutBitContext */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
167
51
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
168 /* GIF header */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
169 static int gif_image_write_header(ByteIOContext *pb,
790
80aec794c2ed Animated GIF looping patch by (Todd Kirby // ffmpeg.php gmail com)
michael
parents: 743
diff changeset
170 int width, int height, int loop_count,
80aec794c2ed Animated GIF looping patch by (Todd Kirby // ffmpeg.php gmail com)
michael
parents: 743
diff changeset
171 uint32_t *palette)
51
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
172 {
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
173 int i;
60
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
174 unsigned int v;
51
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
175
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
176 put_tag(pb, "GIF");
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
177 put_tag(pb, "89a");
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
178 put_le16(pb, width);
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
179 put_le16(pb, height);
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
180
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
181 put_byte(pb, 0xf7); /* flags: global clut, 256 entries */
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
182 put_byte(pb, 0x1f); /* background color index */
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
183 put_byte(pb, 0); /* aspect ratio */
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
184
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
185 /* the global palette */
60
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
186 if (!palette) {
1123
6992dd78ff68 Add (mostly) const to variable and parameter declaration, where a char* was
diego
parents: 896
diff changeset
187 put_buffer(pb, (const unsigned char *)gif_clut, 216*3);
60
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
188 for(i=0;i<((256-216)*3);i++)
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
189 put_byte(pb, 0);
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
190 } else {
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
191 for(i=0;i<256;i++) {
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
192 v = palette[i];
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
193 put_byte(pb, (v >> 16) & 0xff);
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
194 put_byte(pb, (v >> 8) & 0xff);
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
195 put_byte(pb, (v) & 0xff);
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
196 }
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
197 }
51
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
198
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
199 /* update: this is the 'NETSCAPE EXTENSION' that allows for looped animated gif
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
200 see http://members.aol.com/royalef/gifabout.htm#net-extension
790
80aec794c2ed Animated GIF looping patch by (Todd Kirby // ffmpeg.php gmail com)
michael
parents: 743
diff changeset
201
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
202 byte 1 : 33 (hex 0x21) GIF Extension code
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
203 byte 2 : 255 (hex 0xFF) Application Extension Label
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
204 byte 3 : 11 (hex (0x0B) Length of Application Block
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
205 (eleven bytes of data to follow)
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
206 bytes 4 to 11 : "NETSCAPE"
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
207 bytes 12 to 14 : "2.0"
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
208 byte 15 : 3 (hex 0x03) Length of Data Sub-Block
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
209 (three bytes of data to follow)
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
210 byte 16 : 1 (hex 0x01)
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
211 bytes 17 to 18 : 0 to 65535, an unsigned integer in
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
212 lo-hi byte format. This indicate the
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
213 number of iterations the loop should
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
214 be executed.
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
215 bytes 19 : 0 (hex 0x00) a Data Sub-block Terminator
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
216 */
790
80aec794c2ed Animated GIF looping patch by (Todd Kirby // ffmpeg.php gmail com)
michael
parents: 743
diff changeset
217
51
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
218 /* application extension header */
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
219 #ifdef GIF_ADD_APP_HEADER
790
80aec794c2ed Animated GIF looping patch by (Todd Kirby // ffmpeg.php gmail com)
michael
parents: 743
diff changeset
220 if (loop_count >= 0 && loop_count <= 65535) {
51
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
221 put_byte(pb, 0x21);
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
222 put_byte(pb, 0xff);
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
223 put_byte(pb, 0x0b);
790
80aec794c2ed Animated GIF looping patch by (Todd Kirby // ffmpeg.php gmail com)
michael
parents: 743
diff changeset
224 put_tag(pb, "NETSCAPE2.0"); // bytes 4 to 14
80aec794c2ed Animated GIF looping patch by (Todd Kirby // ffmpeg.php gmail com)
michael
parents: 743
diff changeset
225 put_byte(pb, 0x03); // byte 15
80aec794c2ed Animated GIF looping patch by (Todd Kirby // ffmpeg.php gmail com)
michael
parents: 743
diff changeset
226 put_byte(pb, 0x01); // byte 16
80aec794c2ed Animated GIF looping patch by (Todd Kirby // ffmpeg.php gmail com)
michael
parents: 743
diff changeset
227 put_le16(pb, (uint16_t)loop_count);
80aec794c2ed Animated GIF looping patch by (Todd Kirby // ffmpeg.php gmail com)
michael
parents: 743
diff changeset
228 put_byte(pb, 0x00); // byte 19
80aec794c2ed Animated GIF looping patch by (Todd Kirby // ffmpeg.php gmail com)
michael
parents: 743
diff changeset
229 }
51
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
230 #endif
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
231 return 0;
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
232 }
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
233
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
234 /* this is maybe slow, but allows for extensions */
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 60
diff changeset
235 static inline unsigned char gif_clut_index(uint8_t r, uint8_t g, uint8_t b)
51
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
236 {
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
237 return ((((r)/47)%6)*6*6+(((g)/47)%6)*6+(((b)/47)%6));
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
238 }
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
239
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
240
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
241 static int gif_image_write_image(ByteIOContext *pb,
51
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
242 int x1, int y1, int width, int height,
241
3d92f793fd67 64 bit pts for writing - more const usage
bellard
parents: 85
diff changeset
243 const uint8_t *buf, int linesize, int pix_fmt)
51
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
244 {
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
245 PutBitContext p;
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 60
diff changeset
246 uint8_t buffer[200]; /* 100 * 9 / 8 = 113 */
60
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
247 int i, left, w, v;
241
3d92f793fd67 64 bit pts for writing - more const usage
bellard
parents: 85
diff changeset
248 const uint8_t *ptr;
51
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
249 /* image block */
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
250
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
251 put_byte(pb, 0x2c);
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
252 put_le16(pb, x1);
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
253 put_le16(pb, y1);
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
254 put_le16(pb, width);
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
255 put_le16(pb, height);
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
256 put_byte(pb, 0x00); /* flags */
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
257 /* no local clut */
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
258
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
259 put_byte(pb, 0x08);
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
260
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
261 left= width * height;
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
262
276
3dd3646e0164 init_put_bits changed
alex
parents: 241
diff changeset
263 init_put_bits(&p, buffer, 130);
51
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
264
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
265 /*
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
266 * the thing here is the bitstream is written as little packets, with a size byte before
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
267 * but it's still the same bitstream between packets (no flush !)
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
268 */
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
269 ptr = buf;
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
270 w = width;
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
271 while(left>0) {
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
272
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
273 gif_put_bits_rev(&p, 9, 0x0100); /* clear code */
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
274
507
f998b32632d6 * fixing a buffer overrun in gif.c
romansh
parents: 468
diff changeset
275 for(i=(left<GIF_CHUNKS)?left:GIF_CHUNKS;i;i--) {
60
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
276 if (pix_fmt == PIX_FMT_RGB24) {
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
277 v = gif_clut_index(ptr[0], ptr[1], ptr[2]);
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
278 ptr+=3;
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
279 } else {
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
280 v = *ptr++;
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
281 }
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
282 gif_put_bits_rev(&p, 9, v);
51
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
283 if (--w == 0) {
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
284 w = width;
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
285 buf += linesize;
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
286 ptr = buf;
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
287 }
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
288 }
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
289
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
290 if(left<=GIF_CHUNKS) {
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
291 gif_put_bits_rev(&p, 9, 0x101); /* end of stream */
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
292 gif_flush_put_bits_rev(&p);
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
293 }
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
294 if(pbBufPtr(&p) - p.buf > 0) {
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
295 put_byte(pb, pbBufPtr(&p) - p.buf); /* byte count of the packet */
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
296 put_buffer(pb, p.buf, pbBufPtr(&p) - p.buf); /* the actual buffer */
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
297 p.buf_ptr = p.buf; /* dequeue the bytes off the bitstream */
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
298 }
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
299 left-=GIF_CHUNKS;
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
300 }
507
f998b32632d6 * fixing a buffer overrun in gif.c
romansh
parents: 468
diff changeset
301 put_byte(pb, 0x00); /* end of image block */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
302
51
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
303 return 0;
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
304 }
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
305
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
306 typedef struct {
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 60
diff changeset
307 int64_t time, file_time;
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 60
diff changeset
308 uint8_t buffer[100]; /* data chunks */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
309 } GIFContext;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
310
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
311 static int gif_write_header(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
312 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
313 GIFContext *gif = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
314 ByteIOContext *pb = &s->pb;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
315 AVCodecContext *enc, *video_enc;
790
80aec794c2ed Animated GIF looping patch by (Todd Kirby // ffmpeg.php gmail com)
michael
parents: 743
diff changeset
316 int i, width, height, loop_count /*, rate*/;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
317
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
318 /* XXX: do we reject audio streams or just ignore them ?
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
319 if(s->nb_streams > 1)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
320 return -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
321 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
322 gif->time = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
323 gif->file_time = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
324
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
325 video_enc = NULL;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
326 for(i=0;i<s->nb_streams;i++) {
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 790
diff changeset
327 enc = s->streams[i]->codec;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
328 if (enc->codec_type != CODEC_TYPE_AUDIO)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
329 video_enc = enc;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
330 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
331
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
332 if (!video_enc) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
333 av_free(gif);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
334 return -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
335 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
336 width = video_enc->width;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
337 height = video_enc->height;
790
80aec794c2ed Animated GIF looping patch by (Todd Kirby // ffmpeg.php gmail com)
michael
parents: 743
diff changeset
338 loop_count = s->loop_output;
743
af4e24d6310c switch to native time bases
michael
parents: 628
diff changeset
339 // rate = video_enc->time_base.den;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
340 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
341
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
342 /* XXX: is it allowed ? seems to work so far... */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
343 video_enc->pix_fmt = PIX_FMT_RGB24;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
344
790
80aec794c2ed Animated GIF looping patch by (Todd Kirby // ffmpeg.php gmail com)
michael
parents: 743
diff changeset
345 gif_image_write_header(pb, width, height, loop_count, NULL);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
346
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
347 put_flush_packet(&s->pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
348 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
349 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
350
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
351 static int gif_write_video(AVFormatContext *s,
241
3d92f793fd67 64 bit pts for writing - more const usage
bellard
parents: 85
diff changeset
352 AVCodecContext *enc, const uint8_t *buf, int size)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
353 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
354 ByteIOContext *pb = &s->pb;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
355 GIFContext *gif = s->priv_data;
51
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
356 int jiffies;
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 60
diff changeset
357 int64_t delay;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
358
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
359 /* graphic control extension block */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
360 put_byte(pb, 0x21);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
361 put_byte(pb, 0xf9);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
362 put_byte(pb, 0x04); /* block size */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
363 put_byte(pb, 0x04); /* flags */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
364
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
365 /* 1 jiffy is 1/70 s */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
366 /* the delay_time field indicates the number of jiffies - 1 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
367 delay = gif->file_time - gif->time;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
368
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
369 /* XXX: should use delay, in order to be more accurate */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
370 /* instead of using the same rounded value each time */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
371 /* XXX: don't even remember if I really use it for now */
743
af4e24d6310c switch to native time bases
michael
parents: 628
diff changeset
372 jiffies = (70*enc->time_base.num/enc->time_base.den) - 1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
373
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
374 put_le16(pb, jiffies);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
375
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
376 put_byte(pb, 0x1f); /* transparent color index */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
377 put_byte(pb, 0x00);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
378
51
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
379 gif_image_write_image(pb, 0, 0, enc->width, enc->height,
60
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
380 buf, enc->width * 3, PIX_FMT_RGB24);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
381
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
382 put_flush_packet(&s->pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
383 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
384 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
385
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 326
diff changeset
386 static int gif_write_packet(AVFormatContext *s, AVPacket *pkt)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
387 {
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 790
diff changeset
388 AVCodecContext *codec = s->streams[pkt->stream_index]->codec;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
389 if (codec->codec_type == CODEC_TYPE_AUDIO)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
390 return 0; /* just ignore audio */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
391 else
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 326
diff changeset
392 return gif_write_video(s, codec, pkt->data, pkt->size);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
393 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
394
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
395 static int gif_write_trailer(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
396 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
397 ByteIOContext *pb = &s->pb;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
398
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
399 put_byte(pb, 0x3b);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
400 put_flush_packet(&s->pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
401 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
402 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
403
51
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
404 /* better than nothing gif image writer */
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
405 int gif_write(ByteIOContext *pb, AVImageInfo *info)
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
406 {
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
407 gif_image_write_header(pb, info->width, info->height, AVFMT_NOOUTPUTLOOP,
60
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
408 (uint32_t *)info->pict.data[1]);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
409 gif_image_write_image(pb, 0, 0, info->width, info->height,
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
410 info->pict.data[0], info->pict.linesize[0],
60
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
411 PIX_FMT_PAL8);
51
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
412 put_byte(pb, 0x3b);
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
413 put_flush_packet(pb);
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
414 return 0;
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
415 }
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
416
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
417 static AVOutputFormat gif_oformat = {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
418 "gif",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
419 "GIF Animation",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
420 "image/gif",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
421 "gif",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
422 sizeof(GIFContext),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
423 CODEC_ID_NONE,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
424 CODEC_ID_RAWVIDEO,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
425 gif_write_header,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
426 gif_write_packet,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
427 gif_write_trailer,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
428 };
51
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
429
46
890e9121a54d added animated GIF decoder (pts and various disposal handling are missing)
bellard
parents: 0
diff changeset
430 extern AVInputFormat gif_iformat;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
431
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
432 int gif_init(void)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
433 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
434 av_register_output_format(&gif_oformat);
46
890e9121a54d added animated GIF decoder (pts and various disposal handling are missing)
bellard
parents: 0
diff changeset
435 av_register_input_format(&gif_iformat);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
436 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
437 }