Mercurial > libavcodec.hg
annotate rle.c @ 12408:ae72506d4c2a libavcodec
acenc: LAME-inspired window decision
This performs quite a bit better than the current 3GPP-inspired window decision
on all the samples I have tested. On the castanets.wav sample it performs very
similar to iTunes window selection, and seems to perform better than Nero.
On fatboy.wav, it seems to perform at least as good as iTunes, if not better.
Nero performs horribly on this sample.
Patch by: Nathan Caldwell <saintdev@gmail.com>
author | alexc |
---|---|
date | Mon, 23 Aug 2010 20:00:03 +0000 |
parents | 0e9e36d55e5e |
children |
rev | line source |
---|---|
4673 | 1 /* |
4767
a3667e74f44b
generic rle encoder by Bartlomiej Wolowiec b.wolowiec students mimuw edu pl
michael
parents:
4678
diff
changeset
|
2 * RLE encoder |
4673 | 3 * Copyright (c) 2007 Bobby Bingham |
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 #include "avcodec.h" | |
4767
a3667e74f44b
generic rle encoder by Bartlomiej Wolowiec b.wolowiec students mimuw edu pl
michael
parents:
4678
diff
changeset
|
22 #include "rle.h" |
4673 | 23 |
4678
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
24 /** |
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
25 * Count up to 127 consecutive pixels which are either all the same or |
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
26 * all differ from the previous and next pixels. |
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
27 * @param start Pointer to the first pixel |
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
28 * @param len Maximum number of pixels |
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
29 * @param bpp Bytes per pixel |
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
30 * @param same 1 if searching for identical pixel values. 0 for differing |
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
31 * @return Number of matching consecutive pixels found |
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
32 */ |
4767
a3667e74f44b
generic rle encoder by Bartlomiej Wolowiec b.wolowiec students mimuw edu pl
michael
parents:
4678
diff
changeset
|
33 static int count_pixels(const uint8_t *start, int len, int bpp, int same) |
4678
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
34 { |
4767
a3667e74f44b
generic rle encoder by Bartlomiej Wolowiec b.wolowiec students mimuw edu pl
michael
parents:
4678
diff
changeset
|
35 const uint8_t *pos; |
4678
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
36 int count = 1; |
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
37 |
6546
18ab078a42ab
change rle encoder to count up to 127, sgi does not support 128
bcoudurier
parents:
5215
diff
changeset
|
38 for(pos = start + bpp; count < FFMIN(127, len); pos += bpp, count ++) { |
4678
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
39 if(same != !memcmp(pos-bpp, pos, bpp)) { |
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
40 if(!same) { |
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
41 /* if bpp == 1, then 0 1 1 0 is more efficiently encoded as a single |
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
42 * raw block of pixels. for larger bpp, RLE is as good or better */ |
6546
18ab078a42ab
change rle encoder to count up to 127, sgi does not support 128
bcoudurier
parents:
5215
diff
changeset
|
43 if(bpp == 1 && count + 1 < FFMIN(127, len) && *pos != *(pos+1)) |
4678
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
44 continue; |
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
45 |
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
46 /* if RLE can encode the next block better than as a raw block, |
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
47 * back up and leave _all_ the identical pixels for RLE */ |
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
48 count --; |
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
49 } |
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
50 break; |
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
51 } |
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
52 } |
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
53 |
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
54 return count; |
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
55 } |
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
56 |
4771
7cd3ffe4897f
Changed the rle encoder a little and made it more universal.
michael
parents:
4770
diff
changeset
|
57 int ff_rle_encode(uint8_t *outbuf, int out_size, const uint8_t *ptr , int bpp, int w, |
4772
3cd67a410b68
dont use *int8_t for the arguments (ive missed that in the patches ...)
michael
parents:
4771
diff
changeset
|
58 int add_rep, int xor_rep, int add_raw, int xor_raw) |
4678
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
59 { |
4767
a3667e74f44b
generic rle encoder by Bartlomiej Wolowiec b.wolowiec students mimuw edu pl
michael
parents:
4678
diff
changeset
|
60 int count, x; |
4770 | 61 uint8_t *out = outbuf; |
4678
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
62 |
4769
79db9e9df40a
fix indention (less work to fix it myself than to check if a indention fix patch is ok ...)
michael
parents:
4768
diff
changeset
|
63 for(x = 0; x < w; x += count) { |
79db9e9df40a
fix indention (less work to fix it myself than to check if a indention fix patch is ok ...)
michael
parents:
4768
diff
changeset
|
64 /* see if we can encode the next set of pixels with RLE */ |
79db9e9df40a
fix indention (less work to fix it myself than to check if a indention fix patch is ok ...)
michael
parents:
4768
diff
changeset
|
65 if((count = count_pixels(ptr, w-x, bpp, 1)) > 1) { |
79db9e9df40a
fix indention (less work to fix it myself than to check if a indention fix patch is ok ...)
michael
parents:
4768
diff
changeset
|
66 if(out + bpp + 1 > outbuf + out_size) return -1; |
4771
7cd3ffe4897f
Changed the rle encoder a little and made it more universal.
michael
parents:
4770
diff
changeset
|
67 *out++ = (count ^ xor_rep) + add_rep; |
4769
79db9e9df40a
fix indention (less work to fix it myself than to check if a indention fix patch is ok ...)
michael
parents:
4768
diff
changeset
|
68 memcpy(out, ptr, bpp); |
79db9e9df40a
fix indention (less work to fix it myself than to check if a indention fix patch is ok ...)
michael
parents:
4768
diff
changeset
|
69 out += bpp; |
79db9e9df40a
fix indention (less work to fix it myself than to check if a indention fix patch is ok ...)
michael
parents:
4768
diff
changeset
|
70 } else { |
79db9e9df40a
fix indention (less work to fix it myself than to check if a indention fix patch is ok ...)
michael
parents:
4768
diff
changeset
|
71 /* fall back on uncompressed */ |
79db9e9df40a
fix indention (less work to fix it myself than to check if a indention fix patch is ok ...)
michael
parents:
4768
diff
changeset
|
72 count = count_pixels(ptr, w-x, bpp, 0); |
7455 | 73 if(out + bpp*count >= outbuf + out_size) return -1; |
4771
7cd3ffe4897f
Changed the rle encoder a little and made it more universal.
michael
parents:
4770
diff
changeset
|
74 *out++ = (count ^ xor_raw) + add_raw; |
4678
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
75 |
4769
79db9e9df40a
fix indention (less work to fix it myself than to check if a indention fix patch is ok ...)
michael
parents:
4768
diff
changeset
|
76 memcpy(out, ptr, bpp * count); |
79db9e9df40a
fix indention (less work to fix it myself than to check if a indention fix patch is ok ...)
michael
parents:
4768
diff
changeset
|
77 out += bpp * count; |
4678
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
78 } |
ae5abc4dc946
Add RLE encoding support, patch by Bobby Bingham, uhmmmm gmail com.
diego
parents:
4677
diff
changeset
|
79 |
4767
a3667e74f44b
generic rle encoder by Bartlomiej Wolowiec b.wolowiec students mimuw edu pl
michael
parents:
4678
diff
changeset
|
80 ptr += count * bpp; |
4677
47237f2638b2
Move the encoding of the image data to its own function.
diego
parents:
4676
diff
changeset
|
81 } |
47237f2638b2
Move the encoding of the image data to its own function.
diego
parents:
4676
diff
changeset
|
82 |
47237f2638b2
Move the encoding of the image data to its own function.
diego
parents:
4676
diff
changeset
|
83 return out - outbuf; |
47237f2638b2
Move the encoding of the image data to its own function.
diego
parents:
4676
diff
changeset
|
84 } |