1 /*
2 * Quicktime Animation (RLE) Video Encoder
3 * Copyright (C) 2007 Clemens Fruhwirth
4 * Copyright (C) 2007 Alexis Ballier
5 *
6 * This file is based on flashsvenc.c.
7 *
8 * This file is part of FFmpeg.
9 *
10 * FFmpeg is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
14 *
15 * FFmpeg is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
19 *
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with FFmpeg; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 */
24
29
30 /** Maximum RLE code for bulk copy */
31 #define MAX_RLE_BULK 127
32 /** Maximum RLE code for repeat */
33 #define MAX_RLE_REPEAT 128
34 /** Maximum RLE code for skip */
35 #define MAX_RLE_SKIP 254
36
44 /**
45 * This array will contain at ith position the value of the best RLE code
46 * if the line started at pixel i
47 * There can be 3 values :
48 * skip (0) : skip as much as possible pixels because they are equal to the
49 * previous frame ones
50 * repeat (<-1) : repeat that pixel -rle_code times, still as much as
51 * possible
52 * copy (>0) : copy the raw next rle_code pixels */
54 /**
55 * This array will contain the length of the best rle encoding of the line
56 * starting at ith pixel */
58 /**
59 * Will contain at ith position the number of consecutive pixels equal to the previous
60 * frame starting from pixel i */
63
65 {
68
71 }
74
79 break;
82 break;
85 break;
88 break;
89 default:
91 break;
92 }
94
101 }
105 }
106
108 + 15 /* header + footer */
112 return 0;
113 }
114
115 /**
116 * Compute the best RLE sequence for a line
117 */
119 {
121 int i;
122 signed char rlecode;
123
124 /* This will be the number of pixels equal to the preivous frame one's
125 * starting from the ith pixel */
126 unsigned int skipcount;
127 /* This will be the number of consecutive equal pixels in the current
128 * frame, starting from the ith one also */
130
131 /* The cost of the three different possibilities */
132 int total_skip_cost;
133 int total_repeat_cost;
134
135 int base_bulk_cost;
136 int lowest_bulk_cost;
137 int lowest_bulk_cost_index;
138 int sec_lowest_bulk_cost;
139 int sec_lowest_bulk_cost_index;
140
141 uint8_t *this_line = p->
data[0] + line*p-> linesize[0] +
145
147 skipcount = 0;
148
149 /* Initial values */
150 lowest_bulk_cost = INT_MAX / 2;
151 lowest_bulk_cost_index =
width;
152 sec_lowest_bulk_cost = INT_MAX / 2;
153 sec_lowest_bulk_cost_index =
width;
154
156
157 for (i = width - 1; i >= 0; i--) {
158
159 int prev_bulk_cost;
160
161 /* If our lowest bulk cost index is too far away, replace it
162 * with the next lowest bulk cost */
164 lowest_bulk_cost = sec_lowest_bulk_cost;
165 lowest_bulk_cost_index = sec_lowest_bulk_cost_index;
166
167 sec_lowest_bulk_cost = INT_MAX / 2;
168 sec_lowest_bulk_cost_index =
width;
169 }
170
171 /* Deal with the first pixel's bulk cost */
172 if (!i) {
173 base_bulk_cost++;
174 lowest_bulk_cost++;
175 sec_lowest_bulk_cost++;
176 }
177
178 /* Look at the bulk cost of the previous loop and see if it is
179 * a new lower bulk cost */
180 prev_bulk_cost = s->
length_table[i + 1] + base_bulk_cost;
181 if (prev_bulk_cost <= sec_lowest_bulk_cost) {
182 /* If it's lower than the 2nd lowest, then it may be lower
183 * than the lowest */
184 if (prev_bulk_cost <= lowest_bulk_cost) {
185
186 /* If we have found a new lowest bulk cost,
187 * then the 2nd lowest bulk cost is now farther than the
188 * lowest bulk cost, and will never be used */
189 sec_lowest_bulk_cost = INT_MAX / 2;
190
191 lowest_bulk_cost = prev_bulk_cost;
192 lowest_bulk_cost_index = i + 1;
193 } else {
194 /* Then it must be the 2nd lowest bulk cost */
195 sec_lowest_bulk_cost = prev_bulk_cost;
196 sec_lowest_bulk_cost_index = i + 1;
197 }
198 }
199
202 else
203 skipcount = 0;
204
207
208
211 else
212 repeatcount = 1;
213
215
216 /* skip code is free for the first pixel, it costs one byte for repeat and bulk copy
217 * so let's make it aware */
218 if (i == 0) {
219 total_skip_cost--;
220 total_repeat_cost++;
221 }
222
223 if (repeatcount > 1 && (skipcount == 0 || total_repeat_cost < total_skip_cost)) {
224 /* repeat is the best */
227 }
228 else if (skipcount > 0) {
229 /* skip is the best choice here */
232 }
233 else {
234 /* We cannot do neither skip nor repeat
235 * thus we use the best bulk copy */
236
239
240 }
241
242 /* These bulk costs increase every iteration */
245
248 }
249
250 /* Good ! Now we have the best sequence for this line, let's output it */
251
252 /* We do a special case for the first pixel so that we avoid testing it in
253 * the whole loop */
254
255 i=0;
257
259 bytestream_put_byte(buf, s->
skip_table[0] + 1);
261 }
262 else bytestream_put_byte(buf, 1);
263
264
265 while (i < width) {
267 bytestream_put_byte(buf, rlecode);
268 if (rlecode == 0) {
269 /* Write a skip sequence */
270 bytestream_put_byte(buf, s->
skip_table[i] + 1);
272 }
273 else if (rlecode > 0) {
274 /* bulk copy */
276 int j;
277 // QT grayscale colorspace has 0=white and 255=black, we will
278 // ignore the palette that is included in the AVFrame because
279 // AV_PIX_FMT_GRAY8 has defined color mapping
281 bytestream_put_byte(buf, *(this_line + i*s->
pixel_size + j) ^ 0xff);
282 } else {
284 }
285 i += rlecode;
286 }
287 else {
288 /* repeat the bits */
290 int j;
291 // QT grayscale colorspace has 0=white and 255=black, ...
293 bytestream_put_byte(buf, *(this_line + i*s->
pixel_size + j) ^ 0xff);
294 } else {
296 }
297 i -= rlecode;
298 }
299 }
300 bytestream_put_byte(buf, -1); // end RLE line
301 }
302
303 /** Encode frame including header */
305 {
306 int i;
307 int start_line = 0;
310
313 for (start_line = 0; start_line < s->
avctx->
height; start_line++)
316 line_size))
317 break;
318
319 for (end_line=s->
avctx->
height; end_line > start_line; end_line--)
322 line_size))
323 break;
324 }
325
326 bytestream_put_be32(&buf, 0); // CHUNK SIZE, patched later
327
329 bytestream_put_be16(&buf, 0); // header
330 else {
331 bytestream_put_be16(&buf, 8); // header
332 bytestream_put_be16(&buf, start_line); // starting line
333 bytestream_put_be16(&buf, 0); // unknown
334 bytestream_put_be16(&buf, end_line - start_line); // lines to update
335 bytestream_put_be16(&buf, 0); // unknown
336 }
337 for (i = start_line; i < end_line; i++)
339
340 bytestream_put_byte(&buf, 0); // zero skip code = frame finished
341 AV_WB32(orig_buf, buf - orig_buf);
// patch the chunk size
342 return buf - orig_buf;
343 }
344
346 const AVFrame *pict,
int *got_packet)
347 {
351
352 *p = *pict;
353
356
358 /* I-Frame */
361 } else {
362 /* P-Frame */
365 }
366
368
369 /* save the current frame */
371
374 *got_packet = 1;
375
376 return 0;
377 }
378
380 {
382
387 return 0;
388 }
389
400 },
402 };