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
43 /**
44 * This array will contain at ith position the value of the best RLE code
45 * if the line started at pixel i
46 * There can be 3 values :
47 * skip (0) : skip as much as possible pixels because they are equal to the
48 * previous frame ones
49 * repeat (<-1) : repeat that pixel -rle_code times, still as much as
50 * possible
51 * copy (>0) : copy the raw next rle_code pixels */
53 /**
54 * This array will contain the length of the best rle encoding of the line
55 * starting at ith pixel */
57 /**
58 * Will contain at ith position the number of consecutive pixels equal to the previous
59 * frame starting from pixel i */
62
64 {
66
68
73 return 0;
74 }
75
77 {
80
83 }
86
91 break;
94 break;
97 break;
100 break;
101 default:
103 break;
104 }
106
113 }
117 }
118
120 + 15 /* header + footer */
123
128 }
129
130 return 0;
131 }
132
133 /**
134 * Compute the best RLE sequence for a line
135 */
137 {
139 int i;
140 signed char rlecode;
141
142 /* This will be the number of pixels equal to the preivous frame one's
143 * starting from the ith pixel */
144 unsigned int skipcount;
145 /* This will be the number of consecutive equal pixels in the current
146 * frame, starting from the ith one also */
148
149 /* The cost of the three different possibilities */
150 int total_skip_cost;
151 int total_repeat_cost;
152
153 int base_bulk_cost;
154 int lowest_bulk_cost;
155 int lowest_bulk_cost_index;
156 int sec_lowest_bulk_cost;
157 int sec_lowest_bulk_cost_index;
158
159 uint8_t *this_line = p->
data[0] + line*p-> linesize[0] +
163
165 skipcount = 0;
166
167 /* Initial values */
168 lowest_bulk_cost = INT_MAX / 2;
169 lowest_bulk_cost_index =
width;
170 sec_lowest_bulk_cost = INT_MAX / 2;
171 sec_lowest_bulk_cost_index =
width;
172
174
175 for (i = width - 1; i >= 0; i--) {
176
177 int prev_bulk_cost;
178
179 /* If our lowest bulk cost index is too far away, replace it
180 * with the next lowest bulk cost */
182 lowest_bulk_cost = sec_lowest_bulk_cost;
183 lowest_bulk_cost_index = sec_lowest_bulk_cost_index;
184
185 sec_lowest_bulk_cost = INT_MAX / 2;
186 sec_lowest_bulk_cost_index =
width;
187 }
188
189 /* Deal with the first pixel's bulk cost */
190 if (!i) {
191 base_bulk_cost++;
192 lowest_bulk_cost++;
193 sec_lowest_bulk_cost++;
194 }
195
196 /* Look at the bulk cost of the previous loop and see if it is
197 * a new lower bulk cost */
198 prev_bulk_cost = s->
length_table[i + 1] + base_bulk_cost;
199 if (prev_bulk_cost <= sec_lowest_bulk_cost) {
200 /* If it's lower than the 2nd lowest, then it may be lower
201 * than the lowest */
202 if (prev_bulk_cost <= lowest_bulk_cost) {
203
204 /* If we have found a new lowest bulk cost,
205 * then the 2nd lowest bulk cost is now farther than the
206 * lowest bulk cost, and will never be used */
207 sec_lowest_bulk_cost = INT_MAX / 2;
208
209 lowest_bulk_cost = prev_bulk_cost;
210 lowest_bulk_cost_index = i + 1;
211 } else {
212 /* Then it must be the 2nd lowest bulk cost */
213 sec_lowest_bulk_cost = prev_bulk_cost;
214 sec_lowest_bulk_cost_index = i + 1;
215 }
216 }
217
220 else
221 skipcount = 0;
222
225
226
229 else
230 repeatcount = 1;
231
233
234 /* skip code is free for the first pixel, it costs one byte for repeat and bulk copy
235 * so let's make it aware */
236 if (i == 0) {
237 total_skip_cost--;
238 total_repeat_cost++;
239 }
240
241 if (repeatcount > 1 && (skipcount == 0 || total_repeat_cost < total_skip_cost)) {
242 /* repeat is the best */
245 }
246 else if (skipcount > 0) {
247 /* skip is the best choice here */
250 }
251 else {
252 /* We cannot do neither skip nor repeat
253 * thus we use the best bulk copy */
254
257
258 }
259
260 /* These bulk costs increase every iteration */
263
266 }
267
268 /* Good ! Now we have the best sequence for this line, let's output it */
269
270 /* We do a special case for the first pixel so that we avoid testing it in
271 * the whole loop */
272
273 i=0;
275
277 bytestream_put_byte(buf, s->
skip_table[0] + 1);
279 }
280 else bytestream_put_byte(buf, 1);
281
282
283 while (i < width) {
285 bytestream_put_byte(buf, rlecode);
286 if (rlecode == 0) {
287 /* Write a skip sequence */
288 bytestream_put_byte(buf, s->
skip_table[i] + 1);
290 }
291 else if (rlecode > 0) {
292 /* bulk copy */
294 int j;
295 // QT grayscale colorspace has 0=white and 255=black, we will
296 // ignore the palette that is included in the AVFrame because
297 // AV_PIX_FMT_GRAY8 has defined color mapping
299 bytestream_put_byte(buf, *(this_line + i*s->
pixel_size + j) ^ 0xff);
300 } else {
302 }
303 i += rlecode;
304 }
305 else {
306 /* repeat the bits */
308 int j;
309 // QT grayscale colorspace has 0=white and 255=black, ...
311 bytestream_put_byte(buf, *(this_line + i*s->
pixel_size + j) ^ 0xff);
312 } else {
314 }
315 i -= rlecode;
316 }
317 }
318 bytestream_put_byte(buf, -1); // end RLE line
319 }
320
321 /** Encode frame including header */
323 {
324 int i;
325 int start_line = 0;
328
331 for (start_line = 0; start_line < s->
avctx->
height; start_line++)
334 line_size))
335 break;
336
337 for (end_line=s->
avctx->
height; end_line > start_line; end_line--)
340 line_size))
341 break;
342 }
343
344 bytestream_put_be32(&buf, 0); // CHUNK SIZE, patched later
345
347 bytestream_put_be16(&buf, 0); // header
348 else {
349 bytestream_put_be16(&buf, 8); // header
350 bytestream_put_be16(&buf, start_line); // starting line
351 bytestream_put_be16(&buf, 0); // unknown
352 bytestream_put_be16(&buf, end_line - start_line); // lines to update
353 bytestream_put_be16(&buf, 0); // unknown
354 }
355 for (i = start_line; i < end_line; i++)
357
358 bytestream_put_byte(&buf, 0); // zero skip code = frame finished
359 AV_WB32(orig_buf, buf - orig_buf);
// patch the chunk size
360 return buf - orig_buf;
361 }
362
364 const AVFrame *pict,
int *got_packet)
365 {
369
372
374 /* I-Frame */
377 } else {
378 /* P-Frame */
381 }
382
384
385 /* save the current frame */
388
391 *got_packet = 1;
392
393 return 0;
394 }
395
407 },
408 };