mirror of https://git.ffmpeg.org/ffmpeg.git
remove dead rgb24 code, gif encoder now directly takes palette, patch by Daniel Verkamp, daniel at drv dot nu
Originally committed as revision 17095 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
c33030bd7b
commit
dacfaf2373
|
@ -53,58 +53,6 @@
|
||||||
/* bitstream minipacket size */
|
/* bitstream minipacket size */
|
||||||
#define GIF_CHUNKS 100
|
#define GIF_CHUNKS 100
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
unsigned char r;
|
|
||||||
unsigned char g;
|
|
||||||
unsigned char b;
|
|
||||||
} rgb_triplet;
|
|
||||||
|
|
||||||
/* we use the standard 216 color palette */
|
|
||||||
|
|
||||||
/* this script was used to create the palette:
|
|
||||||
* 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
|
|
||||||
* echo -n "{ 0x$r, 0x$g, 0x$b }, "; done; echo ""; done; done
|
|
||||||
*/
|
|
||||||
|
|
||||||
static const rgb_triplet gif_clut[216] = {
|
|
||||||
{ 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x33 }, { 0x00, 0x00, 0x66 }, { 0x00, 0x00, 0x99 }, { 0x00, 0x00, 0xcc }, { 0x00, 0x00, 0xff },
|
|
||||||
{ 0x00, 0x33, 0x00 }, { 0x00, 0x33, 0x33 }, { 0x00, 0x33, 0x66 }, { 0x00, 0x33, 0x99 }, { 0x00, 0x33, 0xcc }, { 0x00, 0x33, 0xff },
|
|
||||||
{ 0x00, 0x66, 0x00 }, { 0x00, 0x66, 0x33 }, { 0x00, 0x66, 0x66 }, { 0x00, 0x66, 0x99 }, { 0x00, 0x66, 0xcc }, { 0x00, 0x66, 0xff },
|
|
||||||
{ 0x00, 0x99, 0x00 }, { 0x00, 0x99, 0x33 }, { 0x00, 0x99, 0x66 }, { 0x00, 0x99, 0x99 }, { 0x00, 0x99, 0xcc }, { 0x00, 0x99, 0xff },
|
|
||||||
{ 0x00, 0xcc, 0x00 }, { 0x00, 0xcc, 0x33 }, { 0x00, 0xcc, 0x66 }, { 0x00, 0xcc, 0x99 }, { 0x00, 0xcc, 0xcc }, { 0x00, 0xcc, 0xff },
|
|
||||||
{ 0x00, 0xff, 0x00 }, { 0x00, 0xff, 0x33 }, { 0x00, 0xff, 0x66 }, { 0x00, 0xff, 0x99 }, { 0x00, 0xff, 0xcc }, { 0x00, 0xff, 0xff },
|
|
||||||
{ 0x33, 0x00, 0x00 }, { 0x33, 0x00, 0x33 }, { 0x33, 0x00, 0x66 }, { 0x33, 0x00, 0x99 }, { 0x33, 0x00, 0xcc }, { 0x33, 0x00, 0xff },
|
|
||||||
{ 0x33, 0x33, 0x00 }, { 0x33, 0x33, 0x33 }, { 0x33, 0x33, 0x66 }, { 0x33, 0x33, 0x99 }, { 0x33, 0x33, 0xcc }, { 0x33, 0x33, 0xff },
|
|
||||||
{ 0x33, 0x66, 0x00 }, { 0x33, 0x66, 0x33 }, { 0x33, 0x66, 0x66 }, { 0x33, 0x66, 0x99 }, { 0x33, 0x66, 0xcc }, { 0x33, 0x66, 0xff },
|
|
||||||
{ 0x33, 0x99, 0x00 }, { 0x33, 0x99, 0x33 }, { 0x33, 0x99, 0x66 }, { 0x33, 0x99, 0x99 }, { 0x33, 0x99, 0xcc }, { 0x33, 0x99, 0xff },
|
|
||||||
{ 0x33, 0xcc, 0x00 }, { 0x33, 0xcc, 0x33 }, { 0x33, 0xcc, 0x66 }, { 0x33, 0xcc, 0x99 }, { 0x33, 0xcc, 0xcc }, { 0x33, 0xcc, 0xff },
|
|
||||||
{ 0x33, 0xff, 0x00 }, { 0x33, 0xff, 0x33 }, { 0x33, 0xff, 0x66 }, { 0x33, 0xff, 0x99 }, { 0x33, 0xff, 0xcc }, { 0x33, 0xff, 0xff },
|
|
||||||
{ 0x66, 0x00, 0x00 }, { 0x66, 0x00, 0x33 }, { 0x66, 0x00, 0x66 }, { 0x66, 0x00, 0x99 }, { 0x66, 0x00, 0xcc }, { 0x66, 0x00, 0xff },
|
|
||||||
{ 0x66, 0x33, 0x00 }, { 0x66, 0x33, 0x33 }, { 0x66, 0x33, 0x66 }, { 0x66, 0x33, 0x99 }, { 0x66, 0x33, 0xcc }, { 0x66, 0x33, 0xff },
|
|
||||||
{ 0x66, 0x66, 0x00 }, { 0x66, 0x66, 0x33 }, { 0x66, 0x66, 0x66 }, { 0x66, 0x66, 0x99 }, { 0x66, 0x66, 0xcc }, { 0x66, 0x66, 0xff },
|
|
||||||
{ 0x66, 0x99, 0x00 }, { 0x66, 0x99, 0x33 }, { 0x66, 0x99, 0x66 }, { 0x66, 0x99, 0x99 }, { 0x66, 0x99, 0xcc }, { 0x66, 0x99, 0xff },
|
|
||||||
{ 0x66, 0xcc, 0x00 }, { 0x66, 0xcc, 0x33 }, { 0x66, 0xcc, 0x66 }, { 0x66, 0xcc, 0x99 }, { 0x66, 0xcc, 0xcc }, { 0x66, 0xcc, 0xff },
|
|
||||||
{ 0x66, 0xff, 0x00 }, { 0x66, 0xff, 0x33 }, { 0x66, 0xff, 0x66 }, { 0x66, 0xff, 0x99 }, { 0x66, 0xff, 0xcc }, { 0x66, 0xff, 0xff },
|
|
||||||
{ 0x99, 0x00, 0x00 }, { 0x99, 0x00, 0x33 }, { 0x99, 0x00, 0x66 }, { 0x99, 0x00, 0x99 }, { 0x99, 0x00, 0xcc }, { 0x99, 0x00, 0xff },
|
|
||||||
{ 0x99, 0x33, 0x00 }, { 0x99, 0x33, 0x33 }, { 0x99, 0x33, 0x66 }, { 0x99, 0x33, 0x99 }, { 0x99, 0x33, 0xcc }, { 0x99, 0x33, 0xff },
|
|
||||||
{ 0x99, 0x66, 0x00 }, { 0x99, 0x66, 0x33 }, { 0x99, 0x66, 0x66 }, { 0x99, 0x66, 0x99 }, { 0x99, 0x66, 0xcc }, { 0x99, 0x66, 0xff },
|
|
||||||
{ 0x99, 0x99, 0x00 }, { 0x99, 0x99, 0x33 }, { 0x99, 0x99, 0x66 }, { 0x99, 0x99, 0x99 }, { 0x99, 0x99, 0xcc }, { 0x99, 0x99, 0xff },
|
|
||||||
{ 0x99, 0xcc, 0x00 }, { 0x99, 0xcc, 0x33 }, { 0x99, 0xcc, 0x66 }, { 0x99, 0xcc, 0x99 }, { 0x99, 0xcc, 0xcc }, { 0x99, 0xcc, 0xff },
|
|
||||||
{ 0x99, 0xff, 0x00 }, { 0x99, 0xff, 0x33 }, { 0x99, 0xff, 0x66 }, { 0x99, 0xff, 0x99 }, { 0x99, 0xff, 0xcc }, { 0x99, 0xff, 0xff },
|
|
||||||
{ 0xcc, 0x00, 0x00 }, { 0xcc, 0x00, 0x33 }, { 0xcc, 0x00, 0x66 }, { 0xcc, 0x00, 0x99 }, { 0xcc, 0x00, 0xcc }, { 0xcc, 0x00, 0xff },
|
|
||||||
{ 0xcc, 0x33, 0x00 }, { 0xcc, 0x33, 0x33 }, { 0xcc, 0x33, 0x66 }, { 0xcc, 0x33, 0x99 }, { 0xcc, 0x33, 0xcc }, { 0xcc, 0x33, 0xff },
|
|
||||||
{ 0xcc, 0x66, 0x00 }, { 0xcc, 0x66, 0x33 }, { 0xcc, 0x66, 0x66 }, { 0xcc, 0x66, 0x99 }, { 0xcc, 0x66, 0xcc }, { 0xcc, 0x66, 0xff },
|
|
||||||
{ 0xcc, 0x99, 0x00 }, { 0xcc, 0x99, 0x33 }, { 0xcc, 0x99, 0x66 }, { 0xcc, 0x99, 0x99 }, { 0xcc, 0x99, 0xcc }, { 0xcc, 0x99, 0xff },
|
|
||||||
{ 0xcc, 0xcc, 0x00 }, { 0xcc, 0xcc, 0x33 }, { 0xcc, 0xcc, 0x66 }, { 0xcc, 0xcc, 0x99 }, { 0xcc, 0xcc, 0xcc }, { 0xcc, 0xcc, 0xff },
|
|
||||||
{ 0xcc, 0xff, 0x00 }, { 0xcc, 0xff, 0x33 }, { 0xcc, 0xff, 0x66 }, { 0xcc, 0xff, 0x99 }, { 0xcc, 0xff, 0xcc }, { 0xcc, 0xff, 0xff },
|
|
||||||
{ 0xff, 0x00, 0x00 }, { 0xff, 0x00, 0x33 }, { 0xff, 0x00, 0x66 }, { 0xff, 0x00, 0x99 }, { 0xff, 0x00, 0xcc }, { 0xff, 0x00, 0xff },
|
|
||||||
{ 0xff, 0x33, 0x00 }, { 0xff, 0x33, 0x33 }, { 0xff, 0x33, 0x66 }, { 0xff, 0x33, 0x99 }, { 0xff, 0x33, 0xcc }, { 0xff, 0x33, 0xff },
|
|
||||||
{ 0xff, 0x66, 0x00 }, { 0xff, 0x66, 0x33 }, { 0xff, 0x66, 0x66 }, { 0xff, 0x66, 0x99 }, { 0xff, 0x66, 0xcc }, { 0xff, 0x66, 0xff },
|
|
||||||
{ 0xff, 0x99, 0x00 }, { 0xff, 0x99, 0x33 }, { 0xff, 0x99, 0x66 }, { 0xff, 0x99, 0x99 }, { 0xff, 0x99, 0xcc }, { 0xff, 0x99, 0xff },
|
|
||||||
{ 0xff, 0xcc, 0x00 }, { 0xff, 0xcc, 0x33 }, { 0xff, 0xcc, 0x66 }, { 0xff, 0xcc, 0x99 }, { 0xff, 0xcc, 0xcc }, { 0xff, 0xcc, 0xff },
|
|
||||||
{ 0xff, 0xff, 0x00 }, { 0xff, 0xff, 0x33 }, { 0xff, 0xff, 0x66 }, { 0xff, 0xff, 0x99 }, { 0xff, 0xff, 0xcc }, { 0xff, 0xff, 0xff },
|
|
||||||
};
|
|
||||||
|
|
||||||
/* GIF header */
|
/* GIF header */
|
||||||
static int gif_image_write_header(uint8_t **bytestream,
|
static int gif_image_write_header(uint8_t **bytestream,
|
||||||
int width, int height,
|
int width, int height,
|
||||||
|
@ -123,34 +71,21 @@ static int gif_image_write_header(uint8_t **bytestream,
|
||||||
bytestream_put_byte(bytestream, 0); /* aspect ratio */
|
bytestream_put_byte(bytestream, 0); /* aspect ratio */
|
||||||
|
|
||||||
/* the global palette */
|
/* the global palette */
|
||||||
if (!palette) {
|
for(i=0;i<256;i++) {
|
||||||
bytestream_put_buffer(bytestream, (const unsigned char *)gif_clut, 216*3);
|
v = palette[i];
|
||||||
for(i=0;i<((256-216)*3);i++)
|
bytestream_put_be24(bytestream, v);
|
||||||
bytestream_put_byte(bytestream, 0);
|
|
||||||
} else {
|
|
||||||
for(i=0;i<256;i++) {
|
|
||||||
v = palette[i];
|
|
||||||
bytestream_put_be24(bytestream, v);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* this is maybe slow, but allows for extensions */
|
|
||||||
static inline unsigned char gif_clut_index(uint8_t r, uint8_t g, uint8_t b)
|
|
||||||
{
|
|
||||||
return ((((r)/47)%6)*6*6+(((g)/47)%6)*6+(((b)/47)%6));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int gif_image_write_image(uint8_t **bytestream,
|
static int gif_image_write_image(uint8_t **bytestream,
|
||||||
int x1, int y1, int width, int height,
|
int x1, int y1, int width, int height,
|
||||||
const uint8_t *buf, int linesize, int pix_fmt)
|
const uint8_t *buf, int linesize, int pix_fmt)
|
||||||
{
|
{
|
||||||
PutBitContext p;
|
PutBitContext p;
|
||||||
uint8_t buffer[200]; /* 100 * 9 / 8 = 113 */
|
uint8_t buffer[200]; /* 100 * 9 / 8 = 113 */
|
||||||
int i, left, w, v;
|
int i, left, w;
|
||||||
const uint8_t *ptr;
|
const uint8_t *ptr;
|
||||||
/* image block */
|
/* image block */
|
||||||
|
|
||||||
|
@ -179,13 +114,7 @@ static int gif_image_write_image(uint8_t **bytestream,
|
||||||
put_bits(&p, 9, 0x0100); /* clear code */
|
put_bits(&p, 9, 0x0100); /* clear code */
|
||||||
|
|
||||||
for(i=(left<GIF_CHUNKS)?left:GIF_CHUNKS;i;i--) {
|
for(i=(left<GIF_CHUNKS)?left:GIF_CHUNKS;i;i--) {
|
||||||
if (pix_fmt == PIX_FMT_RGB24) {
|
put_bits(&p, 9, *ptr++);
|
||||||
v = gif_clut_index(ptr[0], ptr[1], ptr[2]);
|
|
||||||
ptr+=3;
|
|
||||||
} else {
|
|
||||||
v = *ptr++;
|
|
||||||
}
|
|
||||||
put_bits(&p, 9, v);
|
|
||||||
if (--w == 0) {
|
if (--w == 0) {
|
||||||
w = width;
|
w = width;
|
||||||
buf += linesize;
|
buf += linesize;
|
||||||
|
|
Loading…
Reference in New Issue