annotate gif.c @ 584:4e3bab6555ae libavformat

When playing ftp://ftp.mplayerhq.hu/MPlayer/samples/V-codecs/QPEG/VWbig6.avi with my decoder (should appear soon) it hadn't changed palette even there are palette change chunks in that AVI. Here is small patch to make it work (zero number of colors to change in that chunk actually means to change ALL colors). patch by (Kostya <cannonball>at<bw-team>dot<com>)
author michael
date Fri, 12 Nov 2004 01:32:35 +0000
parents f998b32632d6
children 8909a59c9461
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
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"
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
41
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
42 /* bitstream minipacket size */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
43 #define GIF_CHUNKS 100
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
44
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
45 /* slows down the decoding (and some browsers doesn't like it) */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
46 /* #define GIF_ADD_APP_HEADER */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
47
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
48 typedef struct {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
49 unsigned char r;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
50 unsigned char g;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
51 unsigned char b;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
52 } rgb_triplet;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
53
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
54 /* we use the standard 216 color palette */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
55
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
56 /* this script was used to create the palette:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
57 * 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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
58 * echo -n "{ 0x$r, 0x$g, 0x$b }, "; done; echo ""; done; done
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
59 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
60
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
61 static const rgb_triplet gif_clut[216] = {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
62 { 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
63 { 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
64 { 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
65 { 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
66 { 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
67 { 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
68 { 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
69 { 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
70 { 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
71 { 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
72 { 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
73 { 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
74 { 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
75 { 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
76 { 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
77 { 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
78 { 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
79 { 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
80 { 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
81 { 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
82 { 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
83 { 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
84 { 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
85 { 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
86 { 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
87 { 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
88 { 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
89 { 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
90 { 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
91 { 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
92 { 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
93 { 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
94 { 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
95 { 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
96 { 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
97 { 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
98 };
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
99
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
100 /* The GIF format uses reversed order for bitstreams... */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
101 /* at least they don't use PDP_ENDIAN :) */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
102 /* so we 'extend' PutBitContext. hmmm, OOP :) */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
103 /* seems this thing changed slightly since I wrote it... */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
104
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
105 #ifdef ALT_BITSTREAM_WRITER
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
106 # error no ALT_BITSTREAM_WRITER support for now
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
107 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
108
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
109 static void gif_put_bits_rev(PutBitContext *s, int n, unsigned int value)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
110 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
111 unsigned int bit_buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
112 int bit_cnt;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
113
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
114 #ifdef STATS
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
115 st_out_bit_counts[st_current_index] += n;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
116 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
117 // printf("put_bits=%d %x\n", n, value);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
118 assert(n == 32 || value < (1U << n));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
119
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
120 bit_buf = s->bit_buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
121 bit_cnt = 32 - s->bit_left; /* XXX:lazyness... was = s->bit_cnt; */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
122
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
123 // 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
124 /* XXX: optimize */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
125 if (n < (32-bit_cnt)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
126 bit_buf |= value << (bit_cnt);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
127 bit_cnt+=n;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
128 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
129 bit_buf |= value << (bit_cnt);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
130
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
131 *s->buf_ptr = bit_buf & 0xff;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
132 s->buf_ptr[1] = (bit_buf >> 8) & 0xff;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
133 s->buf_ptr[2] = (bit_buf >> 16) & 0xff;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
134 s->buf_ptr[3] = (bit_buf >> 24) & 0xff;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
135
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
136 //printf("bitbuf = %08x\n", bit_buf);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
137 s->buf_ptr+=4;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
138 if (s->buf_ptr >= s->buf_end)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
139 puts("bit buffer overflow !!"); // should never happen ! who got rid of the callback ???
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
140 // flush_buffer_rev(s);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
141 bit_cnt=bit_cnt + n - 32;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
142 if (bit_cnt == 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
143 bit_buf = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
144 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
145 bit_buf = value >> (n - bit_cnt);
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
149 s->bit_buf = bit_buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
150 s->bit_left = 32 - bit_cnt;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
151 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
152
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
153 /* pad the end of the output stream with zeros */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
154 static void gif_flush_put_bits_rev(PutBitContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
155 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
156 while (s->bit_left < 32) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
157 /* XXX: should test end of buffer */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
158 *s->buf_ptr++=s->bit_buf & 0xff;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
159 s->bit_buf>>=8;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
160 s->bit_left+=8;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
161 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
162 // flush_buffer_rev(s);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
163 s->bit_left=32;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
164 s->bit_buf=0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
165 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
166
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
167 /* !RevPutBitContext */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
168
51
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
169 /* GIF header */
60
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
170 static int gif_image_write_header(ByteIOContext *pb,
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
171 int width, int height, 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) {
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
187 put_buffer(pb, (unsigned char *)gif_clut, 216*3);
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
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
199 /* application extension header */
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
200 /* XXX: not really sure what to put in here... */
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
201 #ifdef GIF_ADD_APP_HEADER
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
202 put_byte(pb, 0x21);
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
203 put_byte(pb, 0xff);
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
204 put_byte(pb, 0x0b);
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
205 put_tag(pb, "NETSCAPE2.0");
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
206 put_byte(pb, 0x03);
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
207 put_byte(pb, 0x01);
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
208 put_byte(pb, 0x00);
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
209 put_byte(pb, 0x00);
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
210 #endif
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
211 return 0;
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
212 }
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
213
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
214 /* this is maybe slow, but allows for extensions */
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 60
diff changeset
215 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
216 {
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
217 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
218 }
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
219
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
220
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
221 static int gif_image_write_image(ByteIOContext *pb,
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
222 int x1, int y1, int width, int height,
241
3d92f793fd67 64 bit pts for writing - more const usage
bellard
parents: 85
diff changeset
223 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
224 {
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
225 PutBitContext p;
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 60
diff changeset
226 uint8_t buffer[200]; /* 100 * 9 / 8 = 113 */
60
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
227 int i, left, w, v;
241
3d92f793fd67 64 bit pts for writing - more const usage
bellard
parents: 85
diff changeset
228 const uint8_t *ptr;
51
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
229 /* image block */
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
230
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
231 put_byte(pb, 0x2c);
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
232 put_le16(pb, x1);
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
233 put_le16(pb, y1);
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
234 put_le16(pb, width);
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
235 put_le16(pb, height);
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
236 put_byte(pb, 0x00); /* flags */
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
237 /* no local clut */
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 put_byte(pb, 0x08);
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
240
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
241 left= width * height;
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
242
276
3dd3646e0164 init_put_bits changed
alex
parents: 241
diff changeset
243 init_put_bits(&p, buffer, 130);
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 /*
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
246 * 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
247 * 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
248 */
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
249 ptr = buf;
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
250 w = width;
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
251 while(left>0) {
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
252
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
253 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
254
507
f998b32632d6 * fixing a buffer overrun in gif.c
romansh
parents: 468
diff changeset
255 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
256 if (pix_fmt == PIX_FMT_RGB24) {
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
257 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
258 ptr+=3;
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
259 } else {
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
260 v = *ptr++;
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
261 }
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
262 gif_put_bits_rev(&p, 9, v);
51
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
263 if (--w == 0) {
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
264 w = width;
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
265 buf += linesize;
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
266 ptr = buf;
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
267 }
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
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
270 if(left<=GIF_CHUNKS) {
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
271 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
272 gif_flush_put_bits_rev(&p);
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
273 }
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
274 if(pbBufPtr(&p) - p.buf > 0) {
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
275 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
276 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
277 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
278 }
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
279 left-=GIF_CHUNKS;
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
280 }
507
f998b32632d6 * fixing a buffer overrun in gif.c
romansh
parents: 468
diff changeset
281 put_byte(pb, 0x00); /* end of image block */
f998b32632d6 * fixing a buffer overrun in gif.c
romansh
parents: 468
diff changeset
282
51
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
283 return 0;
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
284 }
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
285
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
286 typedef struct {
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 60
diff changeset
287 int64_t time, file_time;
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 60
diff changeset
288 uint8_t buffer[100]; /* data chunks */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
289 } GIFContext;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
290
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
291 static int gif_write_header(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
292 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
293 GIFContext *gif = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
294 ByteIOContext *pb = &s->pb;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
295 AVCodecContext *enc, *video_enc;
85
25062c9b1f86 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 65
diff changeset
296 int i, width, height/*, rate*/;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
297
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
298 /* XXX: do we reject audio streams or just ignore them ?
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
299 if(s->nb_streams > 1)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
300 return -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
301 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
302 gif->time = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
303 gif->file_time = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
304
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
305 video_enc = NULL;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
306 for(i=0;i<s->nb_streams;i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
307 enc = &s->streams[i]->codec;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
308 if (enc->codec_type != CODEC_TYPE_AUDIO)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
309 video_enc = enc;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
310 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
311
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
312 if (!video_enc) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
313 av_free(gif);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
314 return -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
315 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
316 width = video_enc->width;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
317 height = video_enc->height;
85
25062c9b1f86 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 65
diff changeset
318 // rate = video_enc->frame_rate;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
319 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
320
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
321 /* XXX: is it allowed ? seems to work so far... */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
322 video_enc->pix_fmt = PIX_FMT_RGB24;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
323
60
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
324 gif_image_write_header(pb, width, height, NULL);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
325
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
326 put_flush_packet(&s->pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
327 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
328 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
329
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
330 static int gif_write_video(AVFormatContext *s,
241
3d92f793fd67 64 bit pts for writing - more const usage
bellard
parents: 85
diff changeset
331 AVCodecContext *enc, const uint8_t *buf, int size)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
332 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
333 ByteIOContext *pb = &s->pb;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
334 GIFContext *gif = s->priv_data;
51
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
335 int jiffies;
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 60
diff changeset
336 int64_t delay;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
337
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
338 /* graphic control extension block */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
339 put_byte(pb, 0x21);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
340 put_byte(pb, 0xf9);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
341 put_byte(pb, 0x04); /* block size */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
342 put_byte(pb, 0x04); /* flags */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
343
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
344 /* 1 jiffy is 1/70 s */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
345 /* the delay_time field indicates the number of jiffies - 1 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
346 delay = gif->file_time - gif->time;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
347
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
348 /* XXX: should use delay, in order to be more accurate */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
349 /* instead of using the same rounded value each time */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
350 /* XXX: don't even remember if I really use it for now */
85
25062c9b1f86 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 65
diff changeset
351 jiffies = (70*enc->frame_rate_base/enc->frame_rate) - 1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
352
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
353 put_le16(pb, jiffies);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
354
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
355 put_byte(pb, 0x1f); /* transparent color index */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
356 put_byte(pb, 0x00);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
357
51
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
358 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
359 buf, enc->width * 3, PIX_FMT_RGB24);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
360
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
361 put_flush_packet(&s->pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
362 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
363 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
364
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 326
diff changeset
365 static int gif_write_packet(AVFormatContext *s, AVPacket *pkt)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
366 {
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 326
diff changeset
367 AVCodecContext *codec = &s->streams[pkt->stream_index]->codec;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
368 if (codec->codec_type == CODEC_TYPE_AUDIO)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
369 return 0; /* just ignore audio */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
370 else
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 326
diff changeset
371 return gif_write_video(s, codec, pkt->data, pkt->size);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
372 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
373
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
374 static int gif_write_trailer(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
375 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
376 ByteIOContext *pb = &s->pb;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
377
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
378 put_byte(pb, 0x3b);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
379 put_flush_packet(&s->pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
380 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
381 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
382
51
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
383 /* better than nothing gif image writer */
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
384 int gif_write(ByteIOContext *pb, AVImageInfo *info)
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
385 {
60
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
386 gif_image_write_header(pb, info->width, info->height,
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
387 (uint32_t *)info->pict.data[1]);
51
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
388 gif_image_write_image(pb, 0, 0, info->width, info->height,
60
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
389 info->pict.data[0], info->pict.linesize[0],
c89672a5f24e added 8 bit palette support for non animated GIF
bellard
parents: 51
diff changeset
390 PIX_FMT_PAL8);
51
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
391 put_byte(pb, 0x3b);
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
392 put_flush_packet(pb);
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
393 return 0;
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
394 }
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
395
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
396 static AVOutputFormat gif_oformat = {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
397 "gif",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
398 "GIF Animation",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
399 "image/gif",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
400 "gif",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
401 sizeof(GIFContext),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
402 CODEC_ID_NONE,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
403 CODEC_ID_RAWVIDEO,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
404 gif_write_header,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
405 gif_write_packet,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
406 gif_write_trailer,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
407 };
51
7c5d91c4ca14 added primitive image GIF encoder based on animated gif encoder
bellard
parents: 46
diff changeset
408
46
890e9121a54d added animated GIF decoder (pts and various disposal handling are missing)
bellard
parents: 0
diff changeset
409 extern AVInputFormat gif_iformat;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
410
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
411 int gif_init(void)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
412 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
413 av_register_output_format(&gif_oformat);
46
890e9121a54d added animated GIF decoder (pts and various disposal handling are missing)
bellard
parents: 0
diff changeset
414 av_register_input_format(&gif_iformat);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
415 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
416 }