libavformat/gifdec.c
Go to the documentation of this file.
1 /*
2  * GIF demuxer
3  * Copyright (c) 2012 Vitaliy E Sugrobov
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 /**
23  * @file
24  * GIF demuxer.
25  */
26 
27 #include "avformat.h"
28 #include "libavutil/intreadwrite.h"
29 #include "libavutil/opt.h"
30 #include "internal.h"
31 #include "libavcodec/gif.h"
32 
33 typedef struct GIFDemuxContext {
34  const AVClass *class;
35  /**
36  * Time span in hundredths of second before
37  * the next frame should be drawn on screen.
38  */
39  int delay;
40  /**
41  * Minimum allowed delay between frames in hundredths of
42  * second. Values below this threshold considered to be
43  * invalid and set to value of default_delay.
44  */
45  int min_delay;
47 
48  /**
49  * loop options
50  */
55 
56 /**
57  * Major web browsers display gifs at ~10-15fps when rate
58  * is not explicitly set or have too low values. We assume default rate to be 10.
59  * Default delay = 100hundredths of second / 10fps = 10hos per frame.
60  */
61 #define GIF_DEFAULT_DELAY 10
62 /**
63  * By default delay values less than this threshold considered to be invalid.
64  */
65 #define GIF_MIN_DELAY 2
66 
67 static int gif_probe(AVProbeData *p)
68 {
69  /* check magick */
70  if (memcmp(p->buf, gif87a_sig, 6) && memcmp(p->buf, gif89a_sig, 6))
71  return 0;
72 
73  /* width or height contains zero? */
74  if (!AV_RL16(&p->buf[6]) || !AV_RL16(&p->buf[8]))
75  return 0;
76 
77  return AVPROBE_SCORE_MAX;
78 }
79 
80 static int resync(AVIOContext *pb)
81 {
82  int i;
83  for (i = 0; i < 6; i++) {
84  int b = avio_r8(pb);
85  if (b != gif87a_sig[i] && b != gif89a_sig[i])
86  i = -(b != 'G');
87  if (url_feof(pb))
88  return AVERROR_EOF;
89  }
90  return 0;
91 }
92 
94 {
95  GIFDemuxContext *gdc = s->priv_data;
96  AVIOContext *pb = s->pb;
97  AVStream *st;
98  int width, height, ret;
99 
100  if ((ret = resync(pb)) < 0)
101  return ret;
102 
103  gdc->delay = gdc->default_delay;
104  width = avio_rl16(pb);
105  height = avio_rl16(pb);
106 
107  if (width == 0 || height == 0)
108  return AVERROR_INVALIDDATA;
109 
110  st = avformat_new_stream(s, NULL);
111  if (!st)
112  return AVERROR(ENOMEM);
113 
114  /* GIF format operates with time in "hundredths of second",
115  * therefore timebase is 1/100 */
116  avpriv_set_pts_info(st, 64, 1, 100);
119  st->codec->width = width;
120  st->codec->height = height;
121 
122  /* jump to start because gif decoder needs header data too */
123  if (avio_seek(pb, 0, SEEK_SET) != 0)
124  return AVERROR(EIO);
125 
126  return 0;
127 }
128 
130 {
131  int sb_size, ret = 0;
132 
133  while (0x00 != (sb_size = avio_r8(pb))) {
134  if ((ret = avio_skip(pb, sb_size)) < 0)
135  return ret;
136  }
137 
138  return ret;
139 }
140 
142 {
143  GIFDemuxContext *gdc = s->priv_data;
144  AVIOContext *pb = s->pb;
145  int sb_size, ext_label = avio_r8(pb);
146  int ret;
147 
148  if (ext_label == GIF_GCE_EXT_LABEL) {
149  if ((sb_size = avio_r8(pb)) < 4) {
150  av_log(s, AV_LOG_FATAL, "Graphic Control Extension block's size less than 4.\n");
151  return AVERROR_INVALIDDATA;
152  }
153 
154  /* skip packed fields */
155  if ((ret = avio_skip(pb, 1)) < 0)
156  return ret;
157 
158  gdc->delay = avio_rl16(pb);
159 
160  if (gdc->delay < gdc->min_delay)
161  gdc->delay = gdc->default_delay;
162 
163  /* skip the rest of the Graphic Control Extension block */
164  if ((ret = avio_skip(pb, sb_size - 3)) < 0 )
165  return ret;
166  } else if (ext_label == GIF_APP_EXT_LABEL) {
167  uint8_t netscape_ext[sizeof(NETSCAPE_EXT_STR)-1 + 2];
168 
169  if ((sb_size = avio_r8(pb)) != strlen(NETSCAPE_EXT_STR))
170  return 0;
171  ret = avio_read(pb, netscape_ext, sizeof(netscape_ext));
172  if (ret < sizeof(netscape_ext))
173  return ret;
174  gdc->total_iter = avio_rl16(pb);
175  if (gdc->total_iter == 0)
176  gdc->total_iter = -1;
177  }
178 
179  if ((ret = gif_skip_subblocks(pb)) < 0)
180  return ret;
181 
182  return 0;
183 }
184 
186 {
187  GIFDemuxContext *gdc = s->priv_data;
188  AVIOContext *pb = s->pb;
189  int packed_fields, block_label, ct_size,
190  keyframe, frame_parsed = 0, ret;
191  int64_t frame_start = avio_tell(pb), frame_end;
192  unsigned char buf[6];
193 
194  if ((ret = avio_read(pb, buf, 6)) == 6) {
195  keyframe = memcmp(buf, gif87a_sig, 6) == 0 ||
196  memcmp(buf, gif89a_sig, 6) == 0;
197  } else if (ret < 0) {
198  return ret;
199  } else {
200  keyframe = 0;
201  }
202 
203  if (keyframe) {
204 parse_keyframe:
205  /* skip 2 bytes of width and 2 of height */
206  if ((ret = avio_skip(pb, 4)) < 0)
207  return ret;
208 
209  packed_fields = avio_r8(pb);
210 
211  /* skip 1 byte of Background Color Index and 1 byte of Pixel Aspect Ratio */
212  if ((ret = avio_skip(pb, 2)) < 0)
213  return ret;
214 
215  /* global color table presence */
216  if (packed_fields & 0x80) {
217  ct_size = 3 * (1 << ((packed_fields & 0x07) + 1));
218 
219  if ((ret = avio_skip(pb, ct_size)) < 0)
220  return ret;
221  }
222  } else {
223  avio_seek(pb, -ret, SEEK_CUR);
224  ret = AVERROR_EOF;
225  }
226 
227  while (GIF_TRAILER != (block_label = avio_r8(pb)) && !url_feof(pb)) {
228  if (block_label == GIF_EXTENSION_INTRODUCER) {
229  if ((ret = gif_read_ext (s)) < 0 )
230  goto resync;
231  } else if (block_label == GIF_IMAGE_SEPARATOR) {
232  /* skip to last byte of Image Descriptor header */
233  if ((ret = avio_skip(pb, 8)) < 0)
234  return ret;
235 
236  packed_fields = avio_r8(pb);
237 
238  /* local color table presence */
239  if (packed_fields & 0x80) {
240  ct_size = 3 * (1 << ((packed_fields & 0x07) + 1));
241 
242  if ((ret = avio_skip(pb, ct_size)) < 0)
243  return ret;
244  }
245 
246  /* read LZW Minimum Code Size */
247  if (avio_r8(pb) < 1) {
248  av_log(s, AV_LOG_ERROR, "lzw minimum code size must be >= 1\n");
249  goto resync;
250  }
251 
252  if ((ret = gif_skip_subblocks(pb)) < 0)
253  goto resync;
254 
255  frame_end = avio_tell(pb);
256 
257  if (avio_seek(pb, frame_start, SEEK_SET) != frame_start)
258  return AVERROR(EIO);
259 
260  ret = av_get_packet(pb, pkt, frame_end - frame_start);
261  if (ret < 0)
262  return ret;
263 
264  if (keyframe)
265  pkt->flags |= AV_PKT_FLAG_KEY;
266 
267  pkt->stream_index = 0;
268  pkt->duration = gdc->delay;
269 
270  /* Graphic Control Extension's scope is single frame.
271  * Remove its influence. */
272  gdc->delay = gdc->default_delay;
273  frame_parsed = 1;
274 
275  break;
276  } else {
277  av_log(s, AV_LOG_ERROR, "invalid block label\n");
278 resync:
279  if (!keyframe)
280  avio_seek(pb, frame_start, SEEK_SET);
281  if ((ret = resync(pb)) < 0)
282  return ret;
283  frame_start = avio_tell(pb) - 6;
284  keyframe = 1;
285  goto parse_keyframe;
286  }
287  }
288 
289  if ((ret >= 0 && !frame_parsed) || ret == AVERROR_EOF) {
290  /* This might happen when there is no image block
291  * between extension blocks and GIF_TRAILER or EOF */
292  if (!gdc->ignore_loop && (block_label == GIF_TRAILER || url_feof(pb))
293  && (gdc->total_iter < 0 || ++gdc->iter_count < gdc->total_iter))
294  return avio_seek(pb, 0, SEEK_SET);
295  return AVERROR_EOF;
296  } else
297  return ret;
298 }
299 
300 static const AVOption options[] = {
301  { "min_delay" , "minimum valid delay between frames (in hundredths of second)", offsetof(GIFDemuxContext, min_delay) , AV_OPT_TYPE_INT, {.i64 = GIF_MIN_DELAY} , 0, 100 * 60, AV_OPT_FLAG_DECODING_PARAM },
302  { "default_delay", "default delay between frames (in hundredths of second)" , offsetof(GIFDemuxContext, default_delay), AV_OPT_TYPE_INT, {.i64 = GIF_DEFAULT_DELAY}, 0, 100 * 60, AV_OPT_FLAG_DECODING_PARAM },
303  { "ignore_loop" , "ignore loop setting (netscape extension)" , offsetof(GIFDemuxContext, ignore_loop) , AV_OPT_TYPE_INT, {.i64 = 1} , 0, 1, AV_OPT_FLAG_DECODING_PARAM },
304  { NULL },
305 };
306 
307 static const AVClass demuxer_class = {
308  .class_name = "GIF demuxer",
309  .item_name = av_default_item_name,
310  .option = options,
311  .version = LIBAVUTIL_VERSION_INT,
312  .category = AV_CLASS_CATEGORY_DEMUXER,
313 };
314 
316  .name = "gif",
317  .long_name = NULL_IF_CONFIG_SMALL("CompuServe Graphics Interchange Format (GIF)"),
318  .priv_data_size = sizeof(GIFDemuxContext),
323  .priv_class = &demuxer_class,
324 };
static int gif_read_header(AVFormatContext *s)
const char * s
Definition: avisynth_c.h:668
Bytestream IO Context.
Definition: avio.h:68
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
AVOption.
Definition: opt.h:251
av_default_item_name
static const AVOption options[]
void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:199
static const uint8_t gif87a_sig[6]
Definition: gif.h:34
#define GIF_GCE_EXT_LABEL
Definition: gif.h:45
#define AV_RL16
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition: aviobuf.c:256
Format I/O context.
Definition: avformat.h:944
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:55
uint8_t
AVOptions.
static AVPacket pkt
Definition: demuxing.c:56
#define b
Definition: input.c:42
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
#define AV_LOG_FATAL
Something went wrong and recovery is not possible.
Definition: log.h:142
#define AVERROR_EOF
End of file.
Definition: error.h:55
int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
Allocate and read the payload of a packet and initialize its fields with default values.
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:248
int duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
struct GIFDemuxContext GIFDemuxContext
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:478
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
int flags
A combination of AV_PKT_FLAG values.
int avio_r8(AVIOContext *s)
Definition: aviobuf.c:469
AVCodecContext * codec
Codec context associated with this stream.
Definition: avformat.h:662
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
Definition: avformat.h:336
#define GIF_IMAGE_SEPARATOR
Definition: gif.h:44
static int gif_skip_subblocks(AVIOContext *pb)
int min_delay
Minimum allowed delay between frames in hundredths of second.
static const AVClass demuxer_class
static int read_probe(AVProbeData *pd)
ret
Definition: avfilter.c:821
int width
picture width / height.
#define GIF_APP_EXT_LABEL
Definition: gif.h:46
AVInputFormat ff_gif_demuxer
#define GIF_EXTENSION_INTRODUCER
Definition: gif.h:43
static int gif_probe(AVProbeData *p)
static int gif_read_packet(AVFormatContext *s, AVPacket *pkt)
int url_feof(AVIOContext *s)
feof() equivalent for AVIOContext.
Definition: aviobuf.c:280
LIBAVUTIL_VERSION_INT
Definition: eval.c:55
static int read_header(FFV1Context *f)
Definition: ffv1dec.c:517
Stream structure.
Definition: avformat.h:643
NULL
Definition: eval.c:55
static int width
Definition: tests/utils.c:158
enum AVMediaType codec_type
static int resync(AVIOContext *pb)
enum AVCodecID codec_id
AVIOContext * pb
I/O context.
Definition: avformat.h:977
GIF format definitions.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
int total_iter
loop options
void * buf
Definition: avisynth_c.h:594
static int read_packet(AVFormatContext *ctx, AVPacket *pkt)
Definition: libcdio.c:114
BYTE int const BYTE int int int height
Definition: avisynth_c.h:713
Describe the class of an AVClass context structure.
Definition: log.h:50
#define AVFMT_GENERIC_INDEX
Use generic index building code.
Definition: avformat.h:353
synthesis window for stochastic i
int delay
Time span in hundredths of second before the next frame should be drawn on screen.
#define AV_OPT_FLAG_DECODING_PARAM
a generic parameter which can be set by the user for demuxing or decoding
Definition: opt.h:282
#define GIF_TRAILER
Definition: gif.h:42
This structure contains the data a format has to probe a file.
Definition: avformat.h:334
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
static int gif_read_ext(AVFormatContext *s)
static int flags
Definition: cpu.c:23
#define AVPROBE_SCORE_MAX
maximum score, half of that is used for file-extension-based detection
Definition: avformat.h:340
unsigned int avio_rl16(AVIOContext *s)
Definition: aviobuf.c:563
Main libavformat public API header.
#define NETSCAPE_EXT_STR
Definition: gif.h:47
static const uint8_t gif89a_sig[6]
Definition: gif.h:35
#define GIF_DEFAULT_DELAY
Major web browsers display gifs at ~10-15fps when rate is not explicitly set or have too low values...
void * priv_data
Format private data.
Definition: avformat.h:964
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:461
#define GIF_MIN_DELAY
By default delay values less than this threshold considered to be invalid.
This structure stores compressed data.