MCPcopy Create free account
hub / github.com/FFmpeg/FFmpeg / gif_write_packet

Function gif_write_packet

libavformat/gif.c:89–164  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

87}
88
89static int gif_write_packet(AVFormatContext *s, AVPacket *new_pkt)
90{
91 GIFContext *gif = s->priv_data;
92 AVIOContext *pb = s->pb;
93 AVPacket *pkt = gif->prev_pkt;
94
95 if (!gif->prev_pkt) {
96 gif->prev_pkt = av_packet_alloc();
97 if (!gif->prev_pkt)
98 return AVERROR(ENOMEM);
99 return av_packet_ref(gif->prev_pkt, new_pkt);
100 }
101
102 gif->last_pos = avio_tell(pb);
103 if (pkt->size > 0)
104 gif->have_end = pkt->data[pkt->size - 1] == GIF_TRAILER;
105
106 if (!gif->last_pos) {
107 int delay_pos;
108 int off = 13;
109
110 if (pkt->size < 13)
111 return AVERROR(EINVAL);
112
113 if (pkt->data[10] & 0x80)
114 off += 3 * (1 << ((pkt->data[10] & 0x07) + 1));
115
116 if (pkt->size < off + 2)
117 return AVERROR(EINVAL);
118
119 avio_write(pb, pkt->data, off);
120
121 if (pkt->data[off] == GIF_EXTENSION_INTRODUCER && pkt->data[off + 1] == 0xff)
122 off += 19;
123
124 if (pkt->size <= off)
125 return AVERROR(EINVAL);
126
127 /* "NETSCAPE EXTENSION" for looped animation GIF */
128 if (gif->loop >= 0) {
129 avio_w8(pb, GIF_EXTENSION_INTRODUCER); /* GIF Extension code */
130 avio_w8(pb, GIF_APP_EXT_LABEL); /* Application Extension Label */
131 avio_w8(pb, 0x0b); /* Length of Application Block */
132 avio_write(pb, "NETSCAPE2.0", sizeof("NETSCAPE2.0") - 1);
133 avio_w8(pb, 0x03); /* Length of Data Sub-Block */
134 avio_w8(pb, 0x01);
135 avio_wl16(pb, (uint16_t)gif->loop);
136 avio_w8(pb, 0x00); /* Data Sub-block Terminator */
137 }
138
139 delay_pos = gif_parse_packet(s, pkt->data + off, pkt->size - off);
140 if (delay_pos > 0 && delay_pos < pkt->size - off - 2) {
141 avio_write(pb, pkt->data + off, delay_pos);
142 avio_wl16(pb, gif_get_delay(gif, pkt, new_pkt));
143 avio_write(pb, pkt->data + off + delay_pos + 2, pkt->size - off - delay_pos - 2);
144 } else {
145 avio_write(pb, pkt->data + off, pkt->size - off);
146 }

Callers 1

gif_write_trailerFunction · 0.85

Calls 9

av_packet_allocFunction · 0.85
av_packet_refFunction · 0.85
avio_tellFunction · 0.85
avio_writeFunction · 0.85
avio_w8Function · 0.85
avio_wl16Function · 0.85
gif_parse_packetFunction · 0.85
gif_get_delayFunction · 0.85
av_packet_unrefFunction · 0.85

Tested by

no test coverage detected