Mercurial > libavcodec.hg
annotate mlp.c @ 11352:6e0af2cfdcfe libavcodec
Do MC and IDCT in coding (hilbert) order
This increases the slice size to 64 pixels, due to having to decode an
entire chroma superblock row per slice.
This can be up to 6% slower depending on clip and CPU, but is necessary
for future optimizations that gain significantly more than was lost.
author | conrad |
---|---|
date | Wed, 03 Mar 2010 23:27:40 +0000 |
parents | 41bd795ae40b |
children |
rev | line source |
---|---|
7559
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
1 /* |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
2 * MLP codec common code |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
3 * Copyright (c) 2007-2008 Ian Caulfield |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
4 * |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
5 * This file is part of FFmpeg. |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
6 * |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Lesser General Public |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
9 * License as published by the Free Software Foundation; either |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
11 * |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
15 * Lesser General Public License for more details. |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
16 * |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
17 * You should have received a copy of the GNU Lesser General Public |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
20 */ |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
21 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
22 #include <stdint.h> |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
23 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
24 #include "libavutil/crc.h" |
8573
2acf0ae7b041
Fix build: Add intreadwrite.h and bswap.h #includes where necessary.
diego
parents:
8248
diff
changeset
|
25 #include "libavutil/intreadwrite.h" |
7559
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
26 #include "mlp.h" |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
27 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
28 const uint8_t ff_mlp_huffman_tables[3][18][2] = { |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
29 { /* Huffman table 0, -7 - +10 */ |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
30 {0x01, 9}, {0x01, 8}, {0x01, 7}, {0x01, 6}, {0x01, 5}, {0x01, 4}, {0x01, 3}, |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
31 {0x04, 3}, {0x05, 3}, {0x06, 3}, {0x07, 3}, |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
32 {0x03, 3}, {0x05, 4}, {0x09, 5}, {0x11, 6}, {0x21, 7}, {0x41, 8}, {0x81, 9}, |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
33 }, { /* Huffman table 1, -7 - +8 */ |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
34 {0x01, 9}, {0x01, 8}, {0x01, 7}, {0x01, 6}, {0x01, 5}, {0x01, 4}, {0x01, 3}, |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
35 {0x02, 2}, {0x03, 2}, |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
36 {0x03, 3}, {0x05, 4}, {0x09, 5}, {0x11, 6}, {0x21, 7}, {0x41, 8}, {0x81, 9}, |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
37 }, { /* Huffman table 2, -7 - +7 */ |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
38 {0x01, 9}, {0x01, 8}, {0x01, 7}, {0x01, 6}, {0x01, 5}, {0x01, 4}, {0x01, 3}, |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
39 {0x01, 1}, |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
40 {0x03, 3}, {0x05, 4}, {0x09, 5}, {0x11, 6}, {0x21, 7}, {0x41, 8}, {0x81, 9}, |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
41 } |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
42 }; |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
43 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
44 static int crc_init = 0; |
10414 | 45 #if CONFIG_SMALL |
46 #define CRC_TABLE_SIZE 257 | |
47 #else | |
48 #define CRC_TABLE_SIZE 1024 | |
49 #endif | |
50 static AVCRC crc_63[CRC_TABLE_SIZE]; | |
51 static AVCRC crc_1D[CRC_TABLE_SIZE]; | |
52 static AVCRC crc_2D[CRC_TABLE_SIZE]; | |
7559
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
53 |
8693
18737839ed27
Add missing void keyword to parameterless function declarations.
diego
parents:
8573
diff
changeset
|
54 av_cold void ff_mlp_init_crc(void) |
7559
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
55 { |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
56 if (!crc_init) { |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
57 av_crc_init(crc_63, 0, 8, 0x63, sizeof(crc_63)); |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
58 av_crc_init(crc_1D, 0, 8, 0x1D, sizeof(crc_1D)); |
8248
45cfe1d44e86
mlp: initialize all CRC tables in a common function.
ramiro
parents:
7566
diff
changeset
|
59 av_crc_init(crc_2D, 0, 16, 0x002D, sizeof(crc_2D)); |
7559
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
60 crc_init = 1; |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
61 } |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
62 } |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
63 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
64 uint16_t ff_mlp_checksum16(const uint8_t *buf, unsigned int buf_size) |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
65 { |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
66 uint16_t crc; |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
67 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
68 crc = av_crc(crc_2D, 0, buf, buf_size - 2); |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
69 crc ^= AV_RL16(buf + buf_size - 2); |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
70 return crc; |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
71 } |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
72 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
73 uint8_t ff_mlp_checksum8(const uint8_t *buf, unsigned int buf_size) |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
74 { |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
75 uint8_t checksum = av_crc(crc_63, 0x3c, buf, buf_size - 1); // crc_63[0xa2] == 0x3c |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
76 checksum ^= buf[buf_size-1]; |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
77 return checksum; |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
78 } |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
79 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
80 uint8_t ff_mlp_restart_checksum(const uint8_t *buf, unsigned int bit_size) |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
81 { |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
82 int i; |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
83 int num_bytes = (bit_size + 2) / 8; |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
84 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
85 int crc = crc_1D[buf[0] & 0x3f]; |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
86 crc = av_crc(crc_1D, crc, buf + 1, num_bytes - 2); |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
87 crc ^= buf[num_bytes - 1]; |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
88 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
89 for (i = 0; i < ((bit_size + 2) & 7); i++) { |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
90 crc <<= 1; |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
91 if (crc & 0x100) |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
92 crc ^= 0x11D; |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
93 crc ^= (buf[num_bytes] >> (7 - i)) & 1; |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
94 } |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
95 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
96 return crc; |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
97 } |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
98 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
99 uint8_t ff_mlp_calculate_parity(const uint8_t *buf, unsigned int buf_size) |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
100 { |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
101 uint32_t scratch = 0; |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
102 const uint8_t *buf_end = buf + buf_size; |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
103 |
9857
964d08f7b46f
Fix unaligned accesses by doing bytewise access until aligned, then
heydowns
parents:
8693
diff
changeset
|
104 for (; ((intptr_t) buf & 3) && buf < buf_end; buf++) |
964d08f7b46f
Fix unaligned accesses by doing bytewise access until aligned, then
heydowns
parents:
8693
diff
changeset
|
105 scratch ^= *buf; |
7559
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
106 for (; buf < buf_end - 3; buf += 4) |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
107 scratch ^= *((const uint32_t*)buf); |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
108 |
7566
d112b4655bbd
mlp: split simple inline function that xors 4 bytes into one.
ramiro
parents:
7559
diff
changeset
|
109 scratch = xor_32_to_8(scratch); |
7559
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
110 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
111 for (; buf < buf_end; buf++) |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
112 scratch ^= *buf; |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
113 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
114 return scratch; |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
115 } |